From d4a622c2e24148c568994f3d019b2a3b5a014e17 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 16 May 2019 14:16:38 +0200 Subject: [PATCH 0001/1520] rnafusion v1.0.2 (#78) * Update nf-core pipeline template. * docs: updated usage.md (#70) * test: updated Travis CI testing * fix: fixed download path for STAR-Fusion (#71) * fix: wrapped COSMIC parameters into quotes (#75) * fix: implemented optional output for fusion tools (#72) * docs: markdownlint requires a new line at the end of file * chore: preparation for 1.0.2 release * chore: CHANGELOG 1.0.2 * test: updated Jenkinsfile * test: updated Jenkinsfile * test: added more Jenkins testing * fix: specified conda channel for fastqc and multiqc --- .github/CONTRIBUTING.md | 34 +- .github/ISSUE_TEMPLATE/bug_report.md | 31 ++ .github/ISSUE_TEMPLATE/feature_request.md | 16 + ...ll_request.md => PULL_REQUEST_TEMPLATE.md} | 2 +- .github/bug_report.md | 29 -- .github/feature_request.md | 16 - .github/markdownlint.yml | 1 - .gitignore | 4 +- .travis.yml | 37 ++- CHANGELOG.md | 14 +- CODE_OF_CONDUCT.md | 2 +- Dockerfile | 9 +- Jenkinsfile | 23 +- LICENSE | 2 +- README.md | 23 +- assets/email_template.html | 2 +- assets/email_template.txt | 17 - {conf => assets}/multiqc_config.yaml | 2 + assets/sendmail_template.txt | 31 +- bin/scrape_software_versions.py | 14 +- conf/awsbatch.config | 11 +- conf/base.config | 24 +- conf/test.config | 9 +- docs/README.md | 14 +- docs/configuration/local.md | 2 +- docs/configuration/uppmax.md | 2 +- docs/references.md | 2 +- docs/usage.md | 138 +++++--- download-references.nf | 62 ++-- download-singularity-img.nf | 59 ++-- environment.yml | 10 +- main.nf | 311 +++++++++++------- nextflow.config | 35 +- tools/star-fusion/Dockerfile | 1 + tools/star-fusion/environment.yml | 1 + 35 files changed, 615 insertions(+), 375 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md rename .github/{pull_request.md => PULL_REQUEST_TEMPLATE.md} (94%) delete mode 100644 .github/bug_report.md delete mode 100644 .github/feature_request.md rename {conf => assets}/multiqc_config.yaml (95%) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 0d9b7f8b..6a5ef862 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,12 +1,14 @@ -# nf-core/rnafusion Contributing Guidelines +# nf-core/rnafusion: Contributing Guidelines Hi there! Many thanks for taking an interest in improving nf-core/rnafusion. -We try to manage the required tasks for nf-core/rnafusion using GitHub issues, you probably came to this page when creating one. Please use the prefilled template to save time. +We try to manage the required tasks for nf-core/rnafusion using GitHub issues, you probably came to this page when creating one. Please use the pre-filled template to save time. However, don't be put off by this template - other more general issues and suggestions are welcome! Contributions to the code are even more welcome ;) -> If you need help using nf-core/rnafusion then the best place to go is the Gitter chatroom where you can ask us questions directly: https://gitter.im/nf-core/Lobby +> If you need help using or modifying nf-core/rnafusion then the best place to ask is on the pipeline channel on [Slack](https://nf-core-invite.herokuapp.com/). + + ## Contribution workflow If you'd like to write some code for nf-core/rnafusion, the standard workflow @@ -15,11 +17,31 @@ is as follows: 1. Check that there isn't already an issue about your idea in the [nf-core/rnafusion issues](https://github.com/nf-core/rnafusion/issues) to avoid duplicating work. - * Feel free to add a new issue here for the same reason. + * If there isn't one already, please create one so that others know you're working on this 2. Fork the [nf-core/rnafusion repository](https://github.com/nf-core/rnafusion) to your GitHub account 3. Make the necessary changes / additions within your forked repository -4. Submit a Pull Request against the master branch and wait for the code to be reviewed and merged. +4. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged. If you're not used to this workflow with git, you can start with some [basic docs from GitHub](https://help.github.com/articles/fork-a-repo/) or even their [excellent interactive tutorial](https://try.github.io/). -For further information/help, please consult the [nf-core/rnafusion documentation](https://github.com/nf-core/rnafusion#documentation) and don't hesitate to get in touch on [Gitter](https://gitter.im/nf-core/Lobby) + +## Tests +When you create a pull request with changes, [Travis CI](https://travis-ci.org/) will run automatic tests. +Typically, pull-requests are only fully reviewed when these tests are passing, though of course we can help out before then. + +There are typically two types of tests that run: + +### Lint Tests +The nf-core has a [set of guidelines](http://nf-co.re/guidelines) which all pipelines must adhere to. +To enforce these and ensure that all pipelines stay in sync, we have developed a helper tool which runs checks on the pipeline code. This is in the [nf-core/tools repository](https://github.com/nf-core/tools) and once installed can be run locally with the `nf-core lint ` command. + +If any failures or warnings are encountered, please follow the listed URL for more documentation. + +### Pipeline Tests +Each nf-core pipeline should be set up with a minimal set of test-data. +Travis CI then runs the pipeline on this data to ensure that it exists successfully. +If there are any failures then the automated tests fail. +These tests are run both with the latest available version of Nextflow and also the minimum required version that is stated in the pipeline code. + +## Getting help +For further information/help, please consult the [nf-core/rnafusion documentation](https://github.com/nf-core/rnafusion#documentation) and don't hesitate to get in touch on the pipeline channel on [Slack](https://nf-core-invite.herokuapp.com/). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..405f88fe --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,31 @@ +Hi there! + +Thanks for telling us about a problem with the pipeline. Please delete this text and anything that's not relevant from the template below: + +#### Describe 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_ + +#### Expected behaviour +A clear and concise description of what you expected to happen. + +#### System: + - Hardware: [e.g. HPC, Desktop, Cloud...] + - Executor: [e.g. slurm, local, awsbatch...] + - OS: [e.g. CentOS Linux, macOS, Linux Mint...] + - Version [e.g. 7, 10.13.6, 18.3...] + +#### Nextflow Installation: + - Version: [e.g. 0.31.0] + +#### Container engine: + - Engine: [e.g. Conda, Docker or Singularity] + - version: [e.g. 1.0.0] + - Image tag: [e.g. nfcore/rnafusion:1.0.0] + +#### 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 new file mode 100644 index 00000000..1f025b77 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,16 @@ +Hi there! + +Thanks for suggesting a new feature for the pipeline! Please delete this text and anything that's not relevant from the template below: + +#### 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.md b/.github/PULL_REQUEST_TEMPLATE.md similarity index 94% rename from .github/pull_request.md rename to .github/PULL_REQUEST_TEMPLATE.md index 8f9f1202..2eb3f51f 100644 --- a/.github/pull_request.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -5,7 +5,7 @@ Please fill in the appropriate checklist below (delete whatever is not relevant) ## PR checklist - [ ] This comment contains a description of changes (with reason) - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If 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/newnf-core/rnafusion) + - [ ] 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 diff --git a/.github/bug_report.md b/.github/bug_report.md deleted file mode 100644 index d0405d12..00000000 --- a/.github/bug_report.md +++ /dev/null @@ -1,29 +0,0 @@ -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Command line '...' -2. See error **Please provide your error message** - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**System (please complete the following information):** - - Hardware: [e.g. HPC, Desktop, Cloud...] - - Executor: [e.g. slurm, local, awsbatch...] - - OS: [e.g. CentOS Linux, macOS, Linux Mint...] - - Version [e.g. 7, 10.13.6, 18.3...] - -**Nextflow (please complete the following information):** - - Version: [e.g. 0.31.0] - -**Container engine (please complete the following information):** - - Engine: [e.g. Conda, Docker or Singularity] - - version: [e.g. 1.0.0] - -**Container (please complete the following information):** - - tag: [e.g. 1.0.0] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/feature_request.md b/.github/feature_request.md deleted file mode 100644 index 3616d75c..00000000 --- a/.github/feature_request.md +++ /dev/null @@ -1,16 +0,0 @@ -**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/markdownlint.yml b/.github/markdownlint.yml index b8881b50..e052a635 100644 --- a/.github/markdownlint.yml +++ b/.github/markdownlint.yml @@ -7,4 +7,3 @@ blanks-around-lists: false header-increment: false no-duplicate-header: siblings_only: true -no-bare-urls: false # tools only - the {{ jinja variables }} break URLs and cause this to error \ No newline at end of file diff --git a/.gitignore b/.gitignore index a3bd9df1..a0a8c962 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ .nextflow* work/ results/ -tests/ +.DS_Store +tests/test_data +*.pyc .vscode/ \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 2f11d3b6..176e3505 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ sudo: required language: python +jdk: openjdk8 services: docker python: '3.6' cache: pip @@ -7,14 +8,13 @@ matrix: fast_finish: true before_install: - # PRs made to 'master' branch should always orginate from another repo or the 'dev' branch + # PRs to master are only ok if coming from dev branch - '[ $TRAVIS_PULL_REQUEST = "false" ] || [ $TRAVIS_BRANCH != "master" ] || ([ $TRAVIS_PULL_REQUEST_SLUG = $TRAVIS_REPO_SLUG ] && [ $TRAVIS_PULL_REQUEST_BRANCH = "dev" ])' + # Pull the docker image first so the test doesn't wait for this - docker pull nfcore/rnafusion:dev - - docker tag nfcore/rnafusion:dev nfcore/rnafusion:1.0.1 - -env: - - NXF_VER='0.32.0' # Specify a minimum NF version that should be tested and work - - NXF_VER='' # Plus: get the latest NF version and check, that it works + # Fake the tag locally so that the pipeline runs properly + # Looks weird when this is :dev to :dev, but makes sense when testing code for a release (:dev to :1.0.1) + - docker tag nfcore/rnafusion:dev nfcore/rnafusion:1.0.2 install: # Install Nextflow @@ -22,22 +22,25 @@ install: - wget -qO- get.nextflow.io | bash - sudo ln -s /tmp/nextflow/nextflow /usr/local/bin/nextflow # Install nf-core/tools + - pip install --upgrade pip - pip install nf-core # Install markdownlint-cli - sudo apt-get install npm && npm install -g markdownlint-cli - # Reset - - mkdir ${TRAVIS_BUILD_DIR}/tests && cd ${TRAVIS_BUILD_DIR} + # Reset + - mkdir ${TRAVIS_BUILD_DIR}/tests && cd ${TRAVIS_BUILD_DIR}/tests + +env: + - NXF_VER='0.32.0' # Specify a minimum NF version that should be tested and work + - NXF_VER='' # Plus: get the latest NF version and check that it works script: - # Create and download test data - - | - touch tests/genome.fa tests/genes.gtf - mkdir tests/star_index tests/databases - wget http://github.com/nf-core/test-datasets/raw/rnafusion/testdata/human/reads_1.fq.gz -O tests/reads_1.fq.gz - wget http://github.com/nf-core/test-datasets/raw/rnafusion/testdata/human/reads_2.fq.gz -O tests/reads_2.fq.gz # Lint the pipeline code - nf-core lint ${TRAVIS_BUILD_DIR} - # Lint markdown + # Lint the documentation - markdownlint ${TRAVIS_BUILD_DIR} -c ${TRAVIS_BUILD_DIR}/.github/markdownlint.yml - # Running the pipeline - - nextflow run ${TRAVIS_BUILD_DIR} -profile test,docker + # Test pipeline help page + - nextflow run ${TRAVIS_BUILD_DIR} --help + # Test downloading references help page + - nextflow run ${TRAVIS_BUILD_DIR}/download-references.nf --help + # Test downloading singularity images help page + - nextflow run ${TRAVIS_BUILD_DIR}/download-singularity-img.nf --help \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index cb1115cb..a771fce8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # nfcore/rnafusion +## nfcore/rnafusion version 1.0.2 - 2018/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) + ## nfcore/rnafusion version 1.0.1 - 2018/04/06 ### Added @@ -54,4 +66,4 @@ at [SciLifeLab/NGI-RNAfusion](https://github.com/SciLifeLab/NGI-RNAfusion). The * STAR-Fusion * Fusioncatcher * FusionInspector - * Custom tool for fusion comparison - generates intersection of detected fusion genes from all tools \ No newline at end of file + * Custom tool for fusion comparison - generates intersection of detected fusion genes from all tools diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 21096193..09226d0d 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -34,7 +34,7 @@ This Code of Conduct applies both within project spaces and in public spaces whe ## Enforcement -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team on the [Gitter channel](https://gitter.im/nf-core/Lobby). The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team on [Slack](https://nf-core-invite.herokuapp.com/). The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. diff --git a/Dockerfile b/Dockerfile index fa5ceba4..a8967ec0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,7 @@ FROM nfcore/base - -LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin.proks@scilifelab.se" \ - description="Docker image containing all requirements for nfcore/rnafusion pipeline" +LABEL authors="Martin Proks " \ + description="Docker image containing all requirements for nf-core/rnafusion pipeline" COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/nf-core-rnafusion-1.0.1/bin:$PATH - -WORKDIR / \ No newline at end of file +ENV PATH /opt/conda/envs/nf-core-rnafusion-1.0.2/bin:$PATH diff --git a/Jenkinsfile b/Jenkinsfile index 399b83c7..eeaa816d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,16 +2,15 @@ pipeline { agent any environment { - NXF_VER = '0.32.0' JENKINS_API = credentials('api') + NXF_VER = 0.32.0 } stages { stage('Setup environment') { steps { sh "pip install nf-core" - sh "docker pull nfcore/rnafusion:dev" - sh "docker tag nfcore/rnafusion:dev nfcore/rnafusion:1.0.1" + sh "docker pull nfcore/rnafusion:1.0.2" } } stage('Lint markdown') { @@ -19,12 +18,20 @@ pipeline { sh "markdownlint $WORKSPACE -c $WORKSPACE/.github/markdownlint.yml" } } - stage('Build') { + stage('Nextflow legacy build') { steps { // sh "nextflow run kraken,jenkins nf-core/rnafusion" - sh "nextflow run nf-core/rnafusion -r dev --help" - sh "nextflow run nf-core/rnafusion/download-references.nf -r dev --help" - sh "nextflow run nf-core/rnafusion/download-singularity-img.nf -r dev --help" + sh "nextflow run nf-core/rnafusion -r 1.0.2 --help" + sh "nextflow run nf-core/rnafusion/download-references.nf -r 1.0.2 --help" + sh "nextflow run nf-core/rnafusion/download-singularity-img.nf -r 1.0.2 --help" + } + } + stage('Nextflow latest build') { + steps { + // sh "nextflow run kraken,jenkins nf-core/rnafusion" + sh "NXF_VER='' nextflow run nf-core/rnafusion -r 1.0.2 --help" + sh "NXF_VER='' nextflow run nf-core/rnafusion/download-references.nf -r 1.0.2 --help" + sh "NXF_VER='' nextflow run nf-core/rnafusion/download-singularity-img.nf -r 1.0.2 --help" } } } @@ -33,7 +40,7 @@ pipeline { failure { script { def response = sh(script: "curl -u ${JENKINS_API_USR}:${JENKINS_API_PSW} ${BUILD_URL}/consoleText", returnStdout: true).trim().replace('\n', '
') - def comment = pullRequest.comment("##:rotating_light: Buil log output:
${response}
") + def comment = pullRequest.comment("## :rotating_light: Build log output:
${response}
") } } } diff --git a/LICENSE b/LICENSE index cafb2810..8295c89b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 nf-core +Copyright (c) Rickard Hammarén, Martin Proks Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index f1de2888..c275193e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # ![nf-core/rnafusion](https://raw.githubusercontent.com/nf-core/rnafusion/master/docs/images/rnafusion_logo.png) +**Nextflow rnafusion analysis pipeline, part of the nf-core community.**. + [![Build Status](https://travis-ci.org/nf-core/rnafusion.svg?branch=master)](https://travis-ci.org/nf-core/rnafusion) [![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A50.32.0-brightgreen.svg)](https://www.nextflow.io/) [![DOI](https://zenodo.org/badge/151721952.svg)](https://zenodo.org/badge/latestdoi/151721952) @@ -9,15 +11,9 @@ [![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg)](http://bioconda.github.io/) [![Docker](https://img.shields.io/docker/automated/nfcore/rnafusion.svg)](https://hub.docker.com/r/nfcore/rnafusion) -**nfcore/rnafusion** uses RNA-seq data to detect fusions genes. - -The workflow processes RNA-sequencing data from FastQ files. It runs quality control on the raw data ([FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)), detects fusion genes ([STAR-Fusion](https://github.com/STAR-Fusion/STAR-Fusion), [Fusioncatcher](https://github.com/ndaniel/fusioncatcher), [Ericscript](https://sites.google.com/site/bioericscript/), [Pizzly](https://github.com/pmelsted/pizzly), [Squid](https://github.com/Kingsford-Group/squid)), gathers information ([FusionGDB](https://ccsm.uth.edu/FusionGDB/index.html), [Mitelman](https://cgap.nci.nih.gov/Chromosomes/Mitelman), [COSMIC](https://cancer.sanger.ac.uk/cosmic/fusion)), visualizes the fusions ([FusionInspector](https://github.com/FusionInspector/FusionInspector)), performs quality-control on the results ([MultiQC](http://multiqc.info)) and finally generates custom summary report witch scored fusions ([fusion-report](https://github.com/matq007/fusion-report)). - -> Live **demo** output **[here](https://matq007.github.io/fusion-report/example/)**. - -The pipeline works with both single-end and paired-end data, though not all fusion detection tools work with single-end data (Ericscript, Pizzly, Squid and FusionInspector). +## Introduction -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 / singularity containers making installation trivial and results highly reproducible. +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. | Tool | Single-end reads | CPU (recommended) | RAM (recommended) | | --------------- |:----------------:|:-----------------:|:-----------------:| @@ -38,14 +34,15 @@ nextflow run nf-core/rnafusion --help The nf-core/rnafusion pipeline comes with documentation about the pipeline, found in the `docs/` directory: -1. [Installation](docs/installation.md) +1. [Installation](https://nf-co.re/usage/installation) 2. Pipeline configuration * [Download references for tools](docs/references.md) - * [Local installation](docs/configuration/local.md) - * [Adding your own system](docs/configuration/adding_your_own.md) + * [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](docs/troubleshooting.md) +5. [Troubleshooting](https://nf-co.re/usage/troubleshooting) Use predefined configuration for desired Institution cluster provided at [nfcore/config](https://github.com/nf-core/configs) repository. @@ -65,7 +62,7 @@ bioRxiv 120295; doi: [https://doi.org/10.1101/120295](https://doi.org/10.1101/12 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) -* Martin Proks. (2019, March 26). matq007/fusion-report: **fusion-report:1.0** (Version 1.0). Zenodo. http://doi.org/10.5281/zenodo.2609227 +* Martin Proks. (2019, March 26). matq007/fusion-report: **fusion-report:1.0** (Version 1.0). Zenodo. [http://doi.org/10.5281/zenodo.2609227](http://doi.org/10.5281/zenodo.2609227) * **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/) diff --git a/assets/email_template.html b/assets/email_template.html index b1f8f613..af566215 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -5,7 +5,7 @@ - + nf-core/rnafusion Pipeline Report diff --git a/assets/email_template.txt b/assets/email_template.txt index fab10f4d..7efad5be 100644 --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -17,23 +17,6 @@ ${errorReport} } %> -<% if (!success){ - out << """#################################################### -## nf-core/rnafusion execution completed unsuccessfully! ## -#################################################### -The exit status of the task that caused the workflow execution to fail was: $exitStatus. -The full error message was: - -${errorReport} -""" -} else { - out << "## nf-core/rnafusion execution completed successfully! ##" -} -%> - - - - The workflow was completed at $dateComplete (duration: $duration) The command used to launch the workflow was as follows: diff --git a/conf/multiqc_config.yaml b/assets/multiqc_config.yaml similarity index 95% rename from conf/multiqc_config.yaml rename to assets/multiqc_config.yaml index 441bd13c..bdd59b85 100644 --- a/conf/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -5,3 +5,5 @@ report_comment: > report_section_order: nf-core/rnafusion-software-versions: order: -1000 + +export_plots: true diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index fd1cd739..2d671220 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -1,11 +1,36 @@ To: $email Subject: $subject Mime-Version: 1.0 -Content-Type: multipart/related;boundary="nfmimeboundary" +Content-Type: multipart/related;boundary="nfcoremimeboundary" ---nfmimeboundary +--nfcoremimeboundary Content-Type: text/html; charset=utf-8 $email_html ---nfmimeboundary-- +<% +if (mqcFile){ +def mqcFileObj = new File("$mqcFile") +if (mqcFileObj.length() < mqcMaxSize){ +out << """ +--nfcoremimeboundary +Content-Type: text/html; name=\"multiqc_report\" +Content-Transfer-Encoding: base64 +Content-ID: +Content-Disposition: attachment; filename=\"${mqcFileObj.getName()}\" + +${mqcFileObj. + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' )} +""" +}} +%> + +--nfcoremimeboundary-- diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index f5a5a011..40b0d1b7 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -38,9 +38,14 @@ if match: results[k] = "v{}".format(match.group(1)) +# Remove software set to false in results +for k in results: + if not results[k]: + del(results[k]) + # Dump to YAML print (''' -id: 'nf-core/rnafusion-software-versions' +id: 'software_versions' section_name: 'nf-core/rnafusion Software Versions' section_href: 'https://github.com/nf-core/rnafusion' plot_type: 'html' @@ -49,5 +54,10 @@
''') for k,v in results.items(): - print("
{}
{}
".format(k,v)) + 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)) diff --git a/conf/awsbatch.config b/conf/awsbatch.config index 79078c7b..14af5866 100644 --- a/conf/awsbatch.config +++ b/conf/awsbatch.config @@ -1,10 +1,15 @@ /* * ------------------------------------------------- - * Nextflow config file for AWS Batch + * Nextflow config file for running on AWS batch * ------------------------------------------------- - * Imported under the 'awsbatch' Nextflow profile in nextflow.config - * Uses docker for software depedencies automagically, so not specified here. + * Base config needed for running with -profile awsbatch */ +params { + config_profile_name = 'AWSBATCH' + config_profile_description = 'AWSBATCH Cloud Profile' + config_profile_contact = 'Alexander Peltzer (@apeltzer)' + config_profile_url = 'https://aws.amazon.com/de/batch/' +} aws.region = params.awsregion process.executor = 'awsbatch' diff --git a/conf/base.config b/conf/base.config index d77cf43c..ffc0f589 100644 --- a/conf/base.config +++ b/conf/base.config @@ -9,25 +9,17 @@ * run on the logged in environment. */ -params { - // Defaults only, expecting to be overwritten - max_memory = 128.GB - max_cpus = 16 - max_time = 240.h - igenomes_base = 's3://ngi-igenomes/igenomes/' -} - -process { +process{ - cpus = { check_max( 1, 'cpus' ) } + cpus = { check_max( 1 * task.attempt, 'cpus' ) } memory = { check_max( 8.GB * task.attempt, 'memory' ) } time = { check_max( 2.h * task.attempt, 'time' ) } - errorStrategy = { task.exitStatus in [143,137] ? 'retry' : 'finish' } + errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' - // Process-specific resource requirements + // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors withName: "multiqc|get_software_versions|summary" { memory = { check_max( 2.GB * task.attempt, 'memory' ) } cache = false @@ -81,3 +73,11 @@ process { container = "nfcore/rnafusion:star-fusion_v${params.star_fusion_version}" } } + +params { + // Defaults only, expecting to be overwritten + max_memory = 128.GB + max_cpus = 16 + max_time = 240.h + igenomes_base = 's3://ngi-igenomes/igenomes/' +} diff --git a/conf/test.config b/conf/test.config index 508006a7..6f076005 100644 --- a/conf/test.config +++ b/conf/test.config @@ -2,8 +2,8 @@ * ------------------------------------------------- * Nextflow config file for running tests * ------------------------------------------------- - * Testing profile for checking just the syntax - * of the pipeline. To run use: + * Defines bundled input files and everything required + * to run a fast and simple test. Use as follows: * nextflow run nf-core/rnafusion -profile test */ @@ -12,6 +12,9 @@ executor { } params { + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' + // Limit resources so that this can run on Travis max_cpus = 2 max_memory = 6.GB max_time = 48.h @@ -23,4 +26,4 @@ params { gtf = 'tests/genes.gtf' star_index = 'tests/star_index' databases = '/tests/databases' -} \ No newline at end of file +} diff --git a/docs/README.md b/docs/README.md index 421cf982..1a6b6ba9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,13 +2,13 @@ The nf-core/rnafusion documentation is split into the following files: -1. [Installation](installation.md) -2. [Running the pipeline](usage.md) -3. Pipeline configuration +1. [Installation](https://nf-co.re/usage/installation) +2. Pipeline configuration * [Download references for tools](references.md) - * [Local installation](configuration/local.md) - * [Adding your own system](configuration/adding_your_own.md) - * [Reference genomes](configuration/reference_genomes.md) + * [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) * [UPPMAX configuration](configuration/uppmax.md) +3. [Running the pipeline](usage.md) 4. [Output and how to interpret the results](output.md) -5. [Troubleshooting](troubleshooting.md) +5. [Troubleshooting](https://nf-co.re/usage/troubleshooting) diff --git a/docs/configuration/local.md b/docs/configuration/local.md index 744febf5..fad35bc0 100644 --- a/docs/configuration/local.md +++ b/docs/configuration/local.md @@ -46,4 +46,4 @@ Then transfer this file and run the pipeline with this path: ```bash nextflow run /path/to/nfcore-rnafusion -with-singularity /path/to/nfcore-rnafusion-1.0.1.img -``` \ No newline at end of file +``` diff --git a/docs/configuration/uppmax.md b/docs/configuration/uppmax.md index dbf8a4c2..1feeefc1 100644 --- a/docs/configuration/uppmax.md +++ b/docs/configuration/uppmax.md @@ -59,4 +59,4 @@ nextflow run /path/to/nfcore-rnafusion-1.0.1 -with-singularity /path/to/singular If you would prefer to use environment modules instead of singularity, you can use the old version of the configuration by specifying `-profile uppmax_modules` (we don't recommend this). -For pipeline development work on `milou`, use `-profile uppmax_devel` - this uses the milou [devel partition](http://www.uppmax.uu.se/support/user-guides/slurm-user-guide/#tocjump_030509106905141747_8) for testing the pipeline quickly. Please note that this is _not_ suitable for proper analysis runs - only tiny test datasets. \ No newline at end of file +For pipeline development work on `milou`, use `-profile uppmax_devel` - this uses the milou [devel partition](http://www.uppmax.uu.se/support/user-guides/slurm-user-guide/#tocjump_030509106905141747_8) for testing the pipeline quickly. Please note that this is _not_ suitable for proper analysis runs - only tiny test datasets. diff --git a/docs/references.md b/docs/references.md index b2c2de02..a6e0bffc 100644 --- a/docs/references.md +++ b/docs/references.md @@ -151,4 +151,4 @@ aws s3 --no-sign-request --region eu-west-1 sync s3://ngi-igenomes/igenomes/Homo ```bash fusion_report download --cosmic_usr --cosmic_passwd /output/databases -``` \ No newline at end of file +``` diff --git a/docs/usage.md b/docs/usage.md index 2d1b19be..60f8e044 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -2,10 +2,13 @@ ## Table of contents -* [Introduction](#general-nextflow-info) + + +* [Table of contents](#table-of-contents) +* [Introduction](#introduction) * [Running the pipeline](#running-the-pipeline) - * [using Docker](#running-the-pipeline-using-docker) - * [using Singularity](#running-the-pipeline-using-singularity) + * [Using Docker](#running-the-pipeline-using-docker) + * [Using Singularity](#running-the-pipeline-using-singularity) * [Updating the pipeline](#updating-the-pipeline) * [Reproducibility](#reproducibility) * [Main arguments](#main-arguments) @@ -16,6 +19,7 @@ * [`singularity`](#singularity) * [`test`](#test) * [`--reads`](#--reads) + * [`--singleEnd`](#--singleend) * [Tool flags](#tool-flags) * [`--star_fusion`](#--star_fusion) * [`--star_fusion_opt`](#--star_fusion_opt) @@ -28,7 +32,7 @@ * [`--debug`](#--debug) * [Visualization flags](#visualization-flags) * [`--fusion_inspector`](#--fusion_inspector) -* [References](#references) +* [Reference genomes](#reference-genomes) * [`--fasta`](#--fasta) * [`--gtf`](#--gtf) * [`--star_index`](#--star_index) @@ -37,31 +41,32 @@ * [`--ericscript_ref`](#--ericscript_ref) * [`--pizzly_fasta`](#--pizzly_fasta) * [`--pizzly_gtf`](#--pizzly_gtf) -* [Options](#options-flags) - * [`--genome`](#--genome) - * [`--read_length`](#--read_length) - * [`--singleEnd`](#--singleEnd) -* [Job Resources](#job-resources) -* [Automatic resubmission](#automatic-resubmission) -* [Custom resource requests](#custom-resource-requests) -* [AWS batch specific parameters](#aws-batch-specific-parameters) - * [`-awsbatch`](#-awsbatch) - * [`--awsqueue`](#--awsqueue) - * [`--awsregion`](#--awsregion) + * [`--genome` (using iGenomes)](#--genome-using-igenomes) + * [`--igenomesIgnore`](#--igenomesignore) +* [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) * [Other command line parameters](#other-command-line-parameters) + * [`--read_length`](#--read_length) * [`--outdir`](#--outdir) * [`--email`](#--email) - * [`-name`](#-name-single-dash) - * [`-resume`](#-resume-single-dash) - * [`-c`](#-c-single-dash) + * [`-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_emails`](#--plaintext_emails) - * [`--sampleLevel`](#--sampleLevel) + * [`--plaintext_email`](#--plaintext_email) + * [`--monochrome_logs`](#--monochrome_logs) * [`--multiqc_config`](#--multiqc_config) + -## General Nextflow info +## 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. @@ -111,7 +116,7 @@ nextflow run nf-core/rnafusion First start by downloading singularity images. Sometimes the pipeline can crash if you are not using downloaded images (might be some network issues). ```bash -nextflow run nf-core/rnafusion/download-singularity-img.nf --all --outdir /path +nextflow run nf-core/rnafusion/download-singularity-img.nf --download_all --outdir /path # or @@ -184,25 +189,28 @@ 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 +## Main arguments ### `-profile` Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. Note that multiple profiles can be loaded, for example: `-profile docker` - the order of arguments is important! +If `-profile` is not specified at all the pipeline will be run locally and expects all software to be installed and available on the `PATH`. + * `awsbatch` * A generic configuration profile to be used with AWS Batch. * `conda` * A generic configuration profile to be used with [conda](https://conda.io/docs/) + * Pulls most software from [Bioconda](https://bioconda.github.io/) * `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/) + * Pulls software from dockerhub: [`nfcore/rnafusion`](http://hub.docker.com/r/nfcore/rnafusion/) * `singularity` * A generic configuration profile to be used with [Singularity](http://singularity.lbl.gov/) - * Pulls software from docker-hub + * Pulls software from DockerHub: [`nfcore/rnafusion`](http://hub.docker.com/r/nfcore/rnafusion/) * `test` * A profile with a complete configuration for automated testing - * Includes links to test data so needs no other parameters + * Includes links to test data so needs no other parameters ### `--reads` @@ -222,6 +230,14 @@ If left unspecified, a default pattern is used: `data/*{1,2}.fastq.gz` It is not possible to run a mixture of single-end and paired-end files in one run. +### `--singleEnd` + +By default, the pipeline expects paired-end data. If you have single-end data, you need to specify `--singleEnd` 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 +--singleEnd --reads '*.fastq.gz' +``` + ## Tool flags ### `--star_fusion` @@ -271,7 +287,7 @@ nextflow run nf-core/rnafusion --reads '*_R{1,2}.fastq.gz' --genome GRCh38 -prof If enabled, executes `Fusion-Inspector` tool. -## References +## 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. @@ -339,8 +355,6 @@ Required reference in order to run `Pizzly`. --pizzly_gtf '[path to Pizzly GTF annotation]' ``` -## Options - ### `--genome` (using iGenomes) There are 31 different species supported in the iGenomes references. To run the pipeline, you must specify which to use with the `--genome` flag. @@ -358,7 +372,7 @@ The syntax for this reference configuration is as follows: ```nextflow params { genomes { - 'GRCh37' { + 'GRCh38' { fasta = '' // Used if no star index given } // Any number of additional genomes, key is used with --genome @@ -366,19 +380,11 @@ params { } ``` -### `--read_length` - -Length is used to build a STAR index. Default is 100bp (Illumina). - -### `--singleEnd` +### `--igenomesIgnore` -By default, the pipeline expects paired-end data. If you have single-end data, you need to specify `--singleEnd` 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 ---singleEnd --reads '*.fastq.gz' -``` +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 +## Job resources ### Automatic resubmission @@ -386,7 +392,11 @@ Each step in the pipeline has a default set of requirements for number of CPUs, ### 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 in [`conf`](../conf) for examples. +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. + +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-core-invite.herokuapp.com/). ## AWS Batch specific parameters @@ -403,13 +413,17 @@ Please make sure to also set the `-w/--work-dir` and `--outdir` parameters to a ## Other command line parameters +### `--read_length` + +Length is used to build a STAR index. Default is 100bp (Illumina). + ### `--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 speicfy this on the command line for every run. +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. ### `-name` @@ -431,16 +445,42 @@ 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 defaults. For example, you can specify a config file using `-c` that contains the following: +Note - you can use this to override pipeline defaults. -```nextflow -process.$multiqc.module = [] +### `--custom_config_version` + +Provide git commit id for custom Institutional configs hosted at `nf-core/configs`. This was implemented for reproducibility purposes. Default is set to `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: + +```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/ ``` +> 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'`` +Should be a string in the format integer-unit. eg. `--max_memory '8.GB'` ### `--max_time` @@ -456,6 +496,10 @@ Should be a string in the format integer-unit. eg. `--max_cpus 1` 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/download-references.nf b/download-references.nf index 8034d881..4f5b14b0 100644 --- a/download-references.nf +++ b/download-references.nf @@ -9,18 +9,9 @@ ---------------------------------------------------------------------------------------- */ -nfcore_logo = """======================================================= - ,--./,-. - ___ __ __ __ ___ /,-._.--~\' - |\\ | |__ __ / ` / \\ |__) |__ } { - | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, - `._,._,\' - -nf-core/rnafusion v${workflow.manifest.version} -=======================================================""" - def helpMessage() { - nfcore_help = """ + log.info nfcoreHeader() + log.info""" Usage: The typical command for downloading references is as follows: @@ -44,7 +35,6 @@ def helpMessage() { --igenomesIgnore Download iGenome Homo Sapiens version NCBI/GRCh38. Ignored on default """.stripIndent() - log.info "${nfcore_logo}${nfcore_help}" } /* @@ -87,27 +77,28 @@ if (params.fusion_report) { } // Header log info -log.info nfcore_logo +log.info nfcoreHeader() def summary = [:] summary['Pipeline Name'] = 'nf-core/rnafusion/download-references.nf' summary['Pipeline Version'] = workflow.manifest.version summary['References'] = params.running_tools.size() == 0 ? 'None' : params.running_tools.join(", ") -summary['Max Memory'] = params.max_memory -summary['Max CPUs'] = params.max_cpus -summary['Max Time'] = params.max_time +summary['Max Resources'] = "$params.max_memory memory, $params.max_cpus cpus, $params.max_time time per job" summary['Output dir'] = params.outdir summary['Working dir'] = workflow.workDir -summary['Current home'] = "$HOME" -summary['Current user'] = "$USER" -summary['Current path'] = "$PWD" -summary['Script dir'] = workflow.projectDir +summary['Launch dir'] = workflow.launchDir +summary['Working dir'] = workflow.workDir +summary['Script dir'] = workflow.projectDir +summary['User'] = workflow.userName 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(workflow.profile == 'awsbatch'){ summary['AWS Region'] = params.awsregion summary['AWS Queue'] = params.awsqueue } -log.info summary.collect { k,v -> "${k.padRight(15)}: $v" }.join("\n") -log.info "=========================================" +log.info summary.collect { k,v -> "${k.padRight(18)}: $v" }.join("\n") +log.info "\033[2m----------------------------------------------------\033[0m" process download_star_fusion { publishDir "${params.outdir}/star_fusion_ref", mode: 'copy' @@ -120,7 +111,7 @@ process download_star_fusion { script: """ - wget -N https://data.broadinstitute.org/Trinity/CTAT_RESOURCE_LIB/GRCh38_v27_CTAT_lib_Feb092018.plug-n-play.tar.gz -O GRCh38_v27_CTAT_lib_Feb092018.plug-n-play.tar.gz + wget -N https://data.broadinstitute.org/Trinity/CTAT_RESOURCE_LIB/__genome_libs_StarFv1.3/GRCh38_v27_CTAT_lib_Feb092018.plug-n-play.tar.gz -O GRCh38_v27_CTAT_lib_Feb092018.plug-n-play.tar.gz tar -xvzf GRCh38_v27_CTAT_lib_Feb092018.plug-n-play.tar.gz && rm GRCh38_v27_CTAT_lib_Feb092018.plug-n-play.tar.gz """ } @@ -216,7 +207,7 @@ process download_databases { script: """ - fusion_report download --cosmic_usr ${params.cosmic_usr} --cosmic_passwd ${params.cosmic_passwd} . + fusion_report download --cosmic_usr "${params.cosmic_usr}" --cosmic_passwd "${params.cosmic_passwd}" . """ } @@ -240,4 +231,27 @@ process download_igenome { */ workflow.onComplete { log.info "[nf-core/rnafusion] Pipeline Complete" +} + +def nfcoreHeader(){ + // Log colors ANSI codes + c_reset = params.monochrome_logs ? '' : "\033[0m"; + c_dim = params.monochrome_logs ? '' : "\033[2m"; + c_black = params.monochrome_logs ? '' : "\033[0;30m"; + c_green = params.monochrome_logs ? '' : "\033[0;32m"; + c_yellow = params.monochrome_logs ? '' : "\033[0;33m"; + c_blue = params.monochrome_logs ? '' : "\033[0;34m"; + c_purple = params.monochrome_logs ? '' : "\033[0;35m"; + c_cyan = params.monochrome_logs ? '' : "\033[0;36m"; + c_white = params.monochrome_logs ? '' : "\033[0;37m"; + + 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() } \ No newline at end of file diff --git a/download-singularity-img.nf b/download-singularity-img.nf index 7bbefee7..b490399d 100644 --- a/download-singularity-img.nf +++ b/download-singularity-img.nf @@ -9,18 +9,10 @@ ---------------------------------------------------------------------------------------- */ -nfcore_logo = """======================================================= - ,--./,-. - ___ __ __ __ ___ /,-._.--~\' - |\\ | |__ __ / ` / \\ |__) |__ } { - | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, - `._,._,\' - -nf-core/rnafusion v${workflow.manifest.version} -=======================================================""" - def helpMessage() { - nfcore_help = """ + log.info nfcoreHeader() + log.info""" + Usage: The typical command for downloading singularity images is as follows: @@ -43,7 +35,6 @@ def helpMessage() { --squid Download Squid image --fusion_inspector Download Fusion-Inspector image """.stripIndent() - log.info "${nfcore_logo}${nfcore_help}" } /* @@ -83,27 +74,28 @@ if (params.fusion_inspector) { } // Header log info -log.info nfcore_logo +log.info nfcoreHeader() def summary = [:] summary['Pipeline Name'] = 'nf-core/rnafusion/download-singularity-img.nf' summary['Pipeline Version'] = workflow.manifest.version summary['Tool images'] = params.running_tools.size() == 0 ? 'None' : params.running_tools.join(", ") -summary['Max Memory'] = params.max_memory -summary['Max CPUs'] = params.max_cpus -summary['Max Time'] = params.max_time +summary['Max Resources'] = "$params.max_memory memory, $params.max_cpus cpus, $params.max_time time per job" summary['Output dir'] = params.outdir summary['Working dir'] = workflow.workDir -summary['Current home'] = "$HOME" -summary['Current user'] = "$USER" -summary['Current path'] = "$PWD" -summary['Script dir'] = workflow.projectDir +summary['Launch dir'] = workflow.launchDir +summary['Working dir'] = workflow.workDir +summary['Script dir'] = workflow.projectDir +summary['User'] = workflow.userName 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(workflow.profile == 'awsbatch'){ summary['AWS Region'] = params.awsregion summary['AWS Queue'] = params.awsqueue } -log.info summary.collect { k,v -> "${k.padRight(15)}: $v" }.join("\n") -log.info "=========================================" +log.info summary.collect { k,v -> "${k.padRight(18)}: $v" }.join("\n") +log.info "\033[2m----------------------------------------------------\033[0m" process download_base_image { publishDir "${params.outdir}", mode: 'copy' @@ -215,4 +207,27 @@ process download_fusion_inspector { */ workflow.onComplete { log.info "[nf-core/rnafusion] Pipeline Complete" +} + +def nfcoreHeader(){ + // Log colors ANSI codes + c_reset = params.monochrome_logs ? '' : "\033[0m"; + c_dim = params.monochrome_logs ? '' : "\033[2m"; + c_black = params.monochrome_logs ? '' : "\033[0;30m"; + c_green = params.monochrome_logs ? '' : "\033[0;32m"; + c_yellow = params.monochrome_logs ? '' : "\033[0;33m"; + c_blue = params.monochrome_logs ? '' : "\033[0;34m"; + c_purple = params.monochrome_logs ? '' : "\033[0;35m"; + c_cyan = params.monochrome_logs ? '' : "\033[0;36m"; + c_white = params.monochrome_logs ? '' : "\033[0;37m"; + + 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() } \ No newline at end of file diff --git a/environment.yml b/environment.yml index b7157748..2c4c5ae5 100644 --- a/environment.yml +++ b/environment.yml @@ -1,15 +1,17 @@ -name: nf-core-rnafusion-1.0.1 +# You can use this file to create a conda environment for this pipeline: +# conda env create -f environment.yml +name: nf-core-rnafusion-1.0.2 channels: - - bioconda - conda-forge + - bioconda - defaults dependencies: - anaconda::openjdk=8.0.152 # Needed for FastQC - conda build hangs without this - - bioconda::fastqc=0.11.8 - bioconda::star=2.6.1b # update STAR-Fusion and Fusion-Inspector - - bioconda::multiqc=1.7 - conda-forge::r-data.table=1.12.0 - conda-forge::r-gplots=3.0.1.1 - bioconda::bioconductor-edger=3.24.1 - conda-forge::r-markdown=0.9 - bioconda::fusion-report=1.0.0 + - bioconda::fastqc=0.11.8 + - bioconda::multiqc=1.7 diff --git a/main.nf b/main.nf index 1f13d6f6..a6a2302a 100644 --- a/main.nf +++ b/main.nf @@ -9,18 +9,10 @@ ---------------------------------------------------------------------------------------- */ -nfcore_logo = """======================================================= - ,--./,-. - ___ __ __ __ ___ /,-._.--~\' - |\\ | |__ __ / ` / \\ |__) |__ } { - | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, - `._,._,\' - -nf-core/rnafusion v${workflow.manifest.version} -=======================================================""" - def helpMessage() { - nfcore_help = """ + log.info nfcoreHeader() + log.info""" + Usage: The typical command for running the pipeline is as follows: @@ -30,7 +22,7 @@ def helpMessage() { Mandatory arguments: --reads Path to input data (must be surrounded with quotes) -profile Configuration profile to use. Can use multiple (comma separated) - Available: standard, conda, docker, singularity, awsbatch, test + Available: conda, docker, singularity, awsbatch, test and more. Tool flags: --star_fusion Run STAR-Fusion @@ -65,80 +57,46 @@ def helpMessage() { Other Options: --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 + --maxMultiqcEmailFileSize 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) -name Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic. AWSBatch options: --awsqueue The AWSBatch JobQueue that needs to be set when running on AWSBatch --awsregion The AWS Region for your AWS Batch job to run on """.stripIndent() - log.info "${nfcore_logo}${nfcore_help}" } /* * SET UP CONFIGURATION VARIABLES */ +params.running_tools = [] + // Show help emssage if (params.help){ helpMessage() exit 0 } -// Configurable variables -params.name = false -params.fasta = params.genome ? params.genomes[ params.genome ].fasta ?: false : false -params.gtf = params.genome ? params.genomes[ params.genome ].gtf ?: false : false -params.running_tools = [] -params.multiqc_config = "$baseDir/conf/multiqc_config.yaml" -params.email = false -params.plaintext_email = false - -multiqc_config = file(params.multiqc_config) -output_docs = file("$baseDir/docs/output.md") - -// Reference variables required by tools -// These are needed in order to run the pipeline -fasta = false -gtf = false -pizzly_fasta = false -pizzly_gtf = false -star_fusion_ref = false -fusioncatcher_ref = false -fusion_inspector_ref = false -ericscript_ref = false - -// AWSBatch sanity checking -if(workflow.profile == 'awsbatch'){ - if (!params.awsqueue || !params.awsregion) exit 1, "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" - if (!workflow.workDir.startsWith('s3') || !params.outdir.startsWith('s3')) exit 1, "Specify S3 URLs for workDir and outdir parameters on AWSBatch!" +// Check if genome exists in the config file +if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { + exit 1, "The provided genome '${params.genome}' is not available in the iGenomes file. Currently the available genomes are ${params.genomes.keySet().join(", ")}" } -// Has the run name been specified by the user? -// 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 workDir/outdir paths to be S3 buckets if running on AWSBatch -// related: https://github.com/nextflow-io/nextflow/issues/813 -if( workflow.profile == 'awsbatch') { - if(!workflow.workDir.startsWith('s3:') || !params.outdir.startsWith('s3:')) exit 1, "Workdir or Outdir not on S3 - specify S3 Buckets for each to run on AWSBatch!" -} +// Configurable reference genomes +params.fasta = params.genome ? params.genomes[ params.genome ].fasta ?: false : false +params.gtf = params.genome ? params.genomes[ params.genome ].gtf ?: false : false -// Validate pipeline variables -// These variable have to be defined in the profile configuration which is referenced in nextflow.config -if (params.fasta) { - fasta = file(params.fasta) - if(!fasta.exists()) exit 1, "Fasta file not found: ${params.fasta}" -} +fasta = Channel + .fromPath(params.fasta) + .ifEmpty { exit 1, "Fasta file not found: ${params.fasta}" } -if (params.gtf) { - gtf = file(params.gtf) - if(!gtf.exists()) exit 1, "GTF file not found: ${params.fasta}" -} +Channel + .fromPath(params.gtf) + .ifEmpty { exit 1, "GTF annotation file not found: ${params.gtf}" } + .into { gtf; gtf_squid } -if (!params.star_index && (!params.fasta && !params.gtf)) { +if (!params.star_index && (!params.fasta && !params..gtf)) { exit 1, "Either specify STAR-INDEX or fasta and gtf file!" } @@ -146,6 +104,7 @@ if (!params.databases) { exit 1, "Database path for fusion-report has to be specified!" } +star_fusion_ref = false if (params.star_fusion) { params.running_tools.add("STAR-Fusion") if (!params.star_fusion_ref) { @@ -157,6 +116,7 @@ if (params.star_fusion) { } } +fusioncatcher_ref = false if (params.fusioncatcher) { params.running_tools.add("Fusioncatcher") if (!params.fusioncatcher_ref) { @@ -168,6 +128,7 @@ if (params.fusioncatcher) { } } +ericscript_ref = false if (params.ericscript) { params.running_tools.add("Ericscript") if (!params.ericscript_ref) { @@ -179,6 +140,8 @@ if (params.ericscript) { } } +pizzly_fasta = false +pizzly_gtf = false if (params.pizzly) { params.running_tools.add("Pizzly") if (params.pizzly_fasta) { @@ -196,11 +159,12 @@ if (params.pizzly) { if (params.squid) { params.running_tools.add("Squid") - if (!gtf) { + if (!gtf_squid) { exit 1, "Missing GTF annotation file for squid!" } } +fusion_inspector_ref = false if (params.fusion_inspector) { params.running_tools.add("FusionInspector") if (!params.star_fusion_ref) { @@ -212,21 +176,58 @@ if (params.fusion_inspector) { } } +// Has the run name been specified by the user? +// 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 +} + +if( workflow.profile == 'awsbatch') { + // AWSBatch sanity checking + if (!params.awsqueue || !params.awsregion) exit 1, "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" + // Check outdir paths to be S3 buckets if running on AWSBatch + // related: https://github.com/nextflow-io/nextflow/issues/813 + if (!params.outdir.startsWith('s3:')) exit 1, "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" + // Prevent trace files to be stored on S3 since S3 does not support rolling files. + if (workflow.tracedir.startsWith('s3:')) exit 1, "Specify a local tracedir or run without trace! S3 cannot be used for tracefiles." +} + +// Stage config files +ch_multiqc_config = Channel.fromPath(params.multiqc_config) +ch_output_docs = Channel.fromPath("$baseDir/docs/output.md") + /* * Create a channel for input read files */ -Channel - .fromFilePairs( params.reads, size: params.singleEnd ? 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 --singleEnd on the command line." } - .into { read_files_fastqc; read_files_summary; read_files_multiqc; read_files_star_fusion; read_files_fusioncatcher; +if(params.readPaths){ + if(params.singleEnd){ + Channel + .from(params.readPaths) + .map { row -> [ row[0], [file(row[1][0])]] } + .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } + .into { read_files_fastqc; read_files_summary; read_files_multiqc; read_files_star_fusion; read_files_fusioncatcher; + read_files_gfusion; read_files_fusion_inspector; read_files_ericscript; read_files_pizzly; read_files_squid } + } else { + Channel + .from(params.readPaths) + .map { row -> [ row[0], [file(row[1][0]), file(row[1][1])]] } + .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } + .into { read_files_fastqc; read_files_summary; read_files_multiqc; read_files_star_fusion; read_files_fusioncatcher; + read_files_gfusion; read_files_fusion_inspector; read_files_ericscript; read_files_pizzly; read_files_squid } + } +} else { + Channel + .fromFilePairs( params.reads, size: params.singleEnd ? 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 --singleEnd on the command line." } + .into { read_files_fastqc; read_files_summary; read_files_multiqc; read_files_star_fusion; read_files_fusioncatcher; read_files_gfusion; read_files_fusion_inspector; read_files_ericscript; read_files_pizzly; read_files_squid } - +} // Header log info -log.info nfcore_logo +log.info nfcoreHeader() def summary = [:] -summary['Pipeline Name'] = 'nf-core/rnafusion' -summary['Pipeline Version'] = workflow.manifest.version +if(workflow.revision) summary['Pipeline Release'] = workflow.revision summary['Run Name'] = custom_runName ?: workflow.runName summary['Reads'] = params.reads summary['Fasta Ref'] = params.fasta @@ -234,31 +235,32 @@ summary['GTF Ref'] = params.gtf summary['STAR Index'] = params.star_index ? params.star_index : 'Not specified, building' summary['Tools'] = params.running_tools.size() == 0 ? 'None' : params.running_tools.join(", ") summary['Data Type'] = params.singleEnd ? 'Single-End' : 'Paired-End' -summary['Max Memory'] = params.max_memory -summary['Max CPUs'] = params.max_cpus -summary['Max Time'] = params.max_time +summary['Max Resources'] = "$params.max_memory memory, $params.max_cpus cpus, $params.max_time time per job" +if(workflow.containerEngine) summary['Container'] = "$workflow.containerEngine - $workflow.container" summary['Output dir'] = params.outdir +summary['Launch dir'] = workflow.launchDir summary['Working dir'] = workflow.workDir -summary['Container Engine'] = workflow.containerEngine -if(workflow.containerEngine) summary['Container'] = workflow.container -summary['Current home'] = "$HOME" -summary['Current user'] = "$USER" -summary['Current path'] = "$PWD" -summary['Working dir'] = workflow.workDir -summary['Output dir'] = params.outdir -summary['Script dir'] = workflow.projectDir -summary['Config Profile'] = workflow.profile +summary['Script dir'] = workflow.projectDir +summary['User'] = workflow.userName if(workflow.profile == 'awsbatch'){ - summary['AWS Region'] = params.awsregion - summary['AWS Queue'] = params.awsqueue + summary['AWS Region'] = params.awsregion + summary['AWS Queue'] = params.awsqueue +} +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.email) { + summary['E-mail Address'] = params.email + summary['MultiQC maxsize'] = params.maxMultiqcEmailFileSize } -if(params.email) summary['E-mail Address'] = params.email -log.info summary.collect { k,v -> "${k.padRight(15)}: $v" }.join("\n") -log.info "=========================================" +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() def create_workflow_summary(summary) { - def yaml_file = workDir.resolve('workflow_summary_mqc.yaml') yaml_file.text = """ id: 'nf-core-rnafusion-summary' @@ -335,7 +337,7 @@ process star_fusion { file reference from star_fusion_ref output: - file '*fusion_predictions.tsv' into star_fusion_fusions + file '*fusion_predictions.tsv' optional true into star_fusion_fusions file '*.{tsv,txt}' into star_fusion_output script: @@ -385,7 +387,7 @@ process fusioncatcher { file data_dir from fusioncatcher_ref output: - file 'final-list_candidate-fusion-genes.txt' into fusioncatcher_fusions + file 'final-list_candidate-fusion-genes.txt' optional true into fusioncatcher_fusions file '*.{txt,zip,log}' into fusioncatcher_output script: @@ -416,8 +418,8 @@ process ericscript { file reference from ericscript_ref output: - file './tmp/fusions.results.filtered.tsv' into ericscript_fusions - file './tmp/fusions.results.total.tsv' into ericscript_output + file './tmp/fusions.results.filtered.tsv' optional true into ericscript_fusions + file './tmp/fusions.results.total.tsv' optional true into ericscript_output script: """ @@ -447,7 +449,7 @@ process pizzly { file gtf from pizzly_gtf output: - file 'pizzly_fusions.txt' into pizzly_fusions + file 'pizzly_fusions.txt' optional true into pizzly_fusions file '*.{json,txt}' into pizzly_output script: @@ -478,10 +480,10 @@ process squid { input: set val(name), file(reads) from read_files_squid file star_index_squid - file gtf + file gtf from gtf_squid output: - file '*_annotated.txt' into squid_fusions + file '*_annotated.txt' optional true into squid_fusions file '*.txt' into squid_output script: @@ -528,11 +530,11 @@ process summary { script: def extra_params = params.fusion_report_opt ? "${params.fusion_report_opt}" : '' - def tools = params.fusioncatcher ? "--fusioncatcher ${fusioncatcher} " : '' - tools += params.star_fusion ? "--starfusion ${starfusion} " : '' - tools += params.ericscript ? "--ericscript ${ericscript} " : '' - tools += params.pizzly ? "--pizzly ${pizzly} " : '' - tools += params.squid ? "--squid ${squid} " : '' + def tools = !fusioncatcher.empty() ? "--fusioncatcher ${fusioncatcher} " : '' + tools += !starfusion.empty() ? "--starfusion ${starfusion} " : '' + tools += !ericscript.empty() ? "--ericscript ${ericscript} " : '' + tools += !pizzly.empty() ? "--pizzly ${pizzly} " : '' + tools += !squid.empty() ? "--squid ${squid} " : '' """ fusion_report run ${name} . ${params.databases} \\ ${tools} ${extra_params} @@ -576,19 +578,25 @@ process fusion_inspector { } /************************************************************* - * Building report + * Quality check & software verions ************************************************************/ /* * Parse software version numbers */ process get_software_versions { + publishDir "${params.outdir}/pipeline_info", mode: 'copy', + saveAs: {filename -> + if (filename.indexOf(".csv") > 0) filename + else null + } when: !params.debug output: file 'software_versions_mqc.yaml' into software_versions_yaml + file "software_versions.csv" script: """ @@ -603,7 +611,7 @@ process get_software_versions { cat $baseDir/tools/pizzly/environment.yml > v_pizzly.txt cat $baseDir/tools/squid/environment.yml > v_squid.txt cat $baseDir/environment.yml > v_fusion_report.txt - scrape_software_versions.py > software_versions_mqc.yaml + scrape_software_versions.py &> software_versions_mqc.yaml """ } @@ -641,16 +649,16 @@ process multiqc { !params.debug input: - set val(name), file(reads) from read_files_multiqc - file multiqc_config - file ('fastqc/*') from fastqc_results.collect() - file ('software_versions/*') from software_versions_yaml + file multiqc_config from ch_multiqc_config + file ('fastqc/*') from fastqc_results.collect().ifEmpty([]) + file ('software_versions/*') from software_versions_yaml.collect() file workflow_summary from create_workflow_summary(summary) file fusions_mq from summary_fusions_mq.ifEmpty('') output: file "*multiqc_report.html" into multiqc_report file "*_data" + file "multiqc_plots" script: rtitle = custom_runName ? "--title \"$custom_runName\"" : '' @@ -664,13 +672,13 @@ process multiqc { * Output Description HTML */ process output_documentation { - publishDir "${params.outdir}/Documentation", mode: 'copy' + publishDir "${params.outdir}/pipeline_info", mode: 'copy' when: !params.debug input: - file output_docs + file output_docs from ch_output_docs output: file "results_description.html" @@ -710,10 +718,25 @@ workflow.onComplete { if(workflow.repository) email_fields['summary']['Pipeline repository Git URL'] = workflow.repository if(workflow.commitId) email_fields['summary']['Pipeline repository Git Commit'] = workflow.commitId if(workflow.revision) email_fields['summary']['Pipeline Git branch/tag'] = workflow.revision + if(workflow.container) email_fields['summary']['Docker image'] = workflow.container email_fields['summary']['Nextflow Version'] = workflow.nextflow.version email_fields['summary']['Nextflow Build'] = workflow.nextflow.build email_fields['summary']['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp + // On success try attach the multiqc report + def mqc_report = null + try { + if (workflow.success) { + mqc_report = multiqc_report.getVal() + if (mqc_report.getClass() == ArrayList){ + log.warn "[nf-core/rnafusion] Found multiple reports from process 'multiqc', will use only one" + mqc_report = mqc_report[0] + } + } + } catch (all) { + log.warn "[nf-core/rnafusion] Could not attach MultiQC report to summary email" + } + // Render the TXT template def engine = new groovy.text.GStringTemplateEngine() def tf = new File("$baseDir/assets/email_template.txt") @@ -726,7 +749,7 @@ workflow.onComplete { def email_html = html_template.toString() // Render the sendmail template - def smail_fields = [ email: params.email, subject: subject, email_txt: email_txt, email_html: email_html, baseDir: "$baseDir" ] + def smail_fields = [ email: params.email, subject: subject, email_txt: email_txt, email_html: email_html, baseDir: "$baseDir", mqcFile: mqc_report, mqcMaxSize: params.maxMultiqcEmailFileSize.toBytes() ] def sf = new File("$baseDir/assets/sendmail_template.txt") def sendmail_template = engine.createTemplate(sf).make(smail_fields) def sendmail_html = sendmail_template.toString() @@ -746,7 +769,7 @@ workflow.onComplete { } // Write summary e-mail HTML to a file - def output_d = new File( "${params.outdir}/Documentation/" ) + def output_d = new File( "${params.outdir}/pipeline_info/" ) if( !output_d.exists() ) { output_d.mkdirs() } @@ -755,6 +778,66 @@ workflow.onComplete { def output_tf = new File( output_d, "pipeline_report.txt" ) output_tf.withWriter { w -> w << email_txt } - log.info "[nf-core/rnafusion] Pipeline Complete" + c_reset = params.monochrome_logs ? '' : "\033[0m"; + c_purple = params.monochrome_logs ? '' : "\033[0;35m"; + c_green = params.monochrome_logs ? '' : "\033[0;32m"; + c_red = params.monochrome_logs ? '' : "\033[0;31m"; + + if (workflow.stats.ignoredCountFmt > 0 && workflow.success) { + log.info "${c_purple}Warning, pipeline completed, but with errored process(es) ${c_reset}" + log.info "${c_red}Number of ignored errored process(es) : ${workflow.stats.ignoredCountFmt} ${c_reset}" + log.info "${c_green}Number of successfully ran process(es) : ${workflow.stats.succeedCountFmt} ${c_reset}" + } -} \ No newline at end of file + if(workflow.success){ + log.info "${c_purple}[nf-core/rnafusion]${c_green} Pipeline completed successfully${c_reset}" + } else { + checkHostname() + log.info "${c_purple}[nf-core/rnafusion]${c_red} Pipeline completed with errors${c_reset}" + } + +} + +def nfcoreHeader(){ + // Log colors ANSI codes + c_reset = params.monochrome_logs ? '' : "\033[0m"; + c_dim = params.monochrome_logs ? '' : "\033[2m"; + c_black = params.monochrome_logs ? '' : "\033[0;30m"; + c_green = params.monochrome_logs ? '' : "\033[0;32m"; + c_yellow = params.monochrome_logs ? '' : "\033[0;33m"; + c_blue = params.monochrome_logs ? '' : "\033[0;34m"; + c_purple = params.monochrome_logs ? '' : "\033[0;35m"; + c_cyan = params.monochrome_logs ? '' : "\033[0;36m"; + c_white = params.monochrome_logs ? '' : "\033[0;37m"; + + 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/nextflow.config b/nextflow.config index b0fc73b0..a5a23c62 100644 --- a/nextflow.config +++ b/nextflow.config @@ -3,9 +3,6 @@ * nf-core/rnafusion Nextflow config file * ------------------------------------------------- * Default config options for all environments. - * Cluster-specific config options should be saved - * in the conf folder and imported under a profile - * name here. */ // Global default params, used in configs @@ -65,14 +62,26 @@ params { outdir = './results' tracedir = "${params.outdir}/pipeline_info" - // Options: Default + // Boilerplate options + name = false + multiqc_config = "$baseDir/assets/multiqc_config.yaml" + email = false + maxMultiqcEmailFileSize = 25.MB + plaintext_email = false + monochrome_logs = false help = false genome = false custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" + hostnames = false + config_profile_description = false + config_profile_contact = false + config_profile_url = false } -process.container = 'nfcore/rnafusion:1.0.1' // Container slug. Stable releases should specify release tag! +// Container slug. Stable releases should specify release tag! +// Developmental code should specify :dev +process.container = 'nfcore/rnafusion:1.0.2' // Load base.config by default for all pipelines includeConfig 'conf/base.config' @@ -87,6 +96,7 @@ try { profiles { awsbatch { includeConfig 'conf/awsbatch.config' } conda { process.conda = "$baseDir/environment.yml" } + debug { process.beforeScript = 'echo $HOSTNAME' } docker { docker.enabled = true } singularity { singularity.enabled = true } test { includeConfig 'conf/test.config' } @@ -102,28 +112,29 @@ process.shell = ['/bin/bash', '-euo', 'pipefail'] timeline { enabled = true - file = "${params.tracedir}/pipeline_info/nf-core/rnafusion_timeline.html" + file = "${params.tracedir}/execution_timeline.html" } report { enabled = true - file = "${params.tracedir}/pipeline_info/nf-core/rnafusion_report.html" + file = "${params.tracedir}/execution_report.html" } trace { enabled = true - file = "${params.tracedir}/pipeline_info/nf-core/rnafusion_trace.txt" + file = "${params.tracedir}/execution_trace.txt" } dag { enabled = true - file = "${params.tracedir}/pipeline_info/nf-core/rnafusion_dag.svg" + file = "${params.tracedir}/pipeline_dag.svg" } manifest { name = 'nf-core/rnafusion' - description = 'Nextflow rnafusion analysis pipeline, part of the nf-core community.' + author = 'Martin Proks' homePage = 'https://github.com/nf-core/rnafusion' - version = '1.0.1' + description = 'Nextflow rnafusion analysis pipeline, part of the nf-core community.' mainScript = 'main.nf' nextflowVersion = '>=0.32.0' + version = '1.0.2' } // Function to ensure that resource requirements don't go beyond @@ -157,4 +168,4 @@ def check_max(obj, type) { return obj } } -} +} \ No newline at end of file diff --git a/tools/star-fusion/Dockerfile b/tools/star-fusion/Dockerfile index 3dc4821f..ddf875fd 100644 --- a/tools/star-fusion/Dockerfile +++ b/tools/star-fusion/Dockerfile @@ -6,6 +6,7 @@ LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin. COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a ENV PATH /opt/conda/envs/star-fusion/bin:$PATH +ENV TRINITY_HOME /opt/conda/opt/trinity-2.6.6 RUN apt-get install make && perl -MCPAN -e 'install Carp::Assert' RUN ln -s /lib/x86_64-linux-gnu/libcrypt.so.1 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 \ No newline at end of file diff --git a/tools/star-fusion/environment.yml b/tools/star-fusion/environment.yml index 2aa1a3d6..8e28080b 100644 --- a/tools/star-fusion/environment.yml +++ b/tools/star-fusion/environment.yml @@ -4,3 +4,4 @@ channels: dependencies: - bioconda::star=2.6.1b - star-fusion=1.5.0 + - trinity=2.6.6 From c0b588d6baccfe68df887047c1adb307231830fb Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 28 Oct 2019 19:50:54 +0100 Subject: [PATCH 0002/1520] fix: name conda environment by tool followed by version tag --- tools/arriba/Dockerfile | 2 +- tools/arriba/environment.yml | 2 +- tools/build.sh | 7 +++---- tools/ericscript/Dockerfile | 4 ++-- tools/ericscript/environment.yml | 2 +- tools/fusion-inspector/Dockerfile | 2 +- tools/fusion-inspector/environment.yml | 4 ++-- tools/fusioncatcher/Dockerfile | 2 +- tools/fusioncatcher/environment.yml | 2 +- tools/pizzly/Dockerfile | 2 +- tools/pizzly/environment.yml | 8 +++++--- tools/squid/Dockerfile | 4 ++-- tools/squid/environment.yml | 2 +- tools/star-fusion/Dockerfile | 14 +++++++++++++- tools/star-fusion/environment.yml | 7 +++++-- 15 files changed, 40 insertions(+), 24 deletions(-) diff --git a/tools/arriba/Dockerfile b/tools/arriba/Dockerfile index 2acb0f46..9cfb6c8b 100644 --- a/tools/arriba/Dockerfile +++ b/tools/arriba/Dockerfile @@ -5,4 +5,4 @@ LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin. COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/arriba/bin:$PATH +ENV PATH /opt/conda/envs/arriba_v1.1.0/bin:$PATH diff --git a/tools/arriba/environment.yml b/tools/arriba/environment.yml index 2228d674..539f9527 100644 --- a/tools/arriba/environment.yml +++ b/tools/arriba/environment.yml @@ -1,4 +1,4 @@ -name: arriba +name: arriba_v1.1.0 channels: - conda-forge - bioconda diff --git a/tools/build.sh b/tools/build.sh index 4c0f2577..daa57cf5 100644 --- a/tools/build.sh +++ b/tools/build.sh @@ -4,9 +4,8 @@ PREFIX="nfcore/rnafusion" create_container() { TOOL_PATH=$1 - TOOL=$2 - VERSION="$(cat $TOOL_PATH/environment.yml | grep "$TOOL=" | cut -d"=" -f2)" - CONTAINER_NAME="$PREFIX:${TOOL}_v$VERSION" + VERSION="$(cat $TOOL_PATH/environment.yml | grep "name:" | cut -d":" -f2 | cut -d " " -f2)" + CONTAINER_NAME="$PREFIX:$VERSION" echo "Building [$CONTAINER_NAME]" docker build $TOOL_PATH -t $CONTAINER_NAME docker push $CONTAINER_NAME @@ -45,6 +44,6 @@ else echo "The tool doesn't exist" exit 1 else - create_container $TOOL_PATH $TOOL + create_container $TOOL_PATH fi fi diff --git a/tools/ericscript/Dockerfile b/tools/ericscript/Dockerfile index c2bd562b..2eba204b 100644 --- a/tools/ericscript/Dockerfile +++ b/tools/ericscript/Dockerfile @@ -8,5 +8,5 @@ RUN conda env create -f /environment.yml && conda clean -a ENV PATH /opt/conda/envs/ericscript/bin:$PATH RUN ln -s /lib/x86_64-linux-gnu/libreadline.so.7.0 /lib/x86_64-linux-gnu/libreadline.so.6 -RUN sed -i 's/system("R.*CheckDB.R");/#&/' /opt/conda/envs/ericscript/share/ericscript-0.5.5-3/ericscript.pl -RUN echo 1 > /opt/conda/envs/ericscript/share/ericscript-0.5.5-3/lib/data/_resources/.flag.dbexists \ No newline at end of file +RUN sed -i 's/system("R.*CheckDB.R");/#&/' /opt/conda/envs/ericscript_v0.5.5/bin/ericscript.pl +RUN echo 1 > /opt/conda/envs/ericscript_v0.5.5/share/ericscript-0.5.5-3/lib/data/_resources/.flag.dbexists \ No newline at end of file diff --git a/tools/ericscript/environment.yml b/tools/ericscript/environment.yml index b97a101a..415e1908 100644 --- a/tools/ericscript/environment.yml +++ b/tools/ericscript/environment.yml @@ -1,4 +1,4 @@ -name: ericscript +name: ericscript_v0.5.5 channels: - bioconda dependencies: diff --git a/tools/fusion-inspector/Dockerfile b/tools/fusion-inspector/Dockerfile index bd6868c9..00a48364 100644 --- a/tools/fusion-inspector/Dockerfile +++ b/tools/fusion-inspector/Dockerfile @@ -5,6 +5,6 @@ LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin. COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/fusion-inspector/bin:$PATH +ENV PATH /opt/conda/envs/fusion-inspector_v1.3.1-star2.7.0f/bin:$PATH RUN ln -s /lib/x86_64-linux-gnu/libcrypt.so.1 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 \ No newline at end of file diff --git a/tools/fusion-inspector/environment.yml b/tools/fusion-inspector/environment.yml index e822d623..aa7c4517 100644 --- a/tools/fusion-inspector/environment.yml +++ b/tools/fusion-inspector/environment.yml @@ -1,6 +1,6 @@ -name: fusion-inspector +name: fusion-inspector_v1.3.1-star2.7.0f channels: - bioconda dependencies: - - bioconda::star=2.6.1b + - bioconda::star=2.7.0f - fusion-inspector=1.3.1 diff --git a/tools/fusioncatcher/Dockerfile b/tools/fusioncatcher/Dockerfile index 7cc59290..37672a55 100644 --- a/tools/fusioncatcher/Dockerfile +++ b/tools/fusioncatcher/Dockerfile @@ -5,4 +5,4 @@ LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin. COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/fusioncatcher/bin:$PATH +ENV PATH /opt/conda/envs/fusioncatcher_v1.00/bin:$PATH diff --git a/tools/fusioncatcher/environment.yml b/tools/fusioncatcher/environment.yml index ba3f4629..5e4f7098 100644 --- a/tools/fusioncatcher/environment.yml +++ b/tools/fusioncatcher/environment.yml @@ -1,4 +1,4 @@ -name: fusioncatcher +name: fusioncatcher_v1.00 channels: - bioconda - conda-forge diff --git a/tools/pizzly/Dockerfile b/tools/pizzly/Dockerfile index af6f7f8a..2c221bfb 100644 --- a/tools/pizzly/Dockerfile +++ b/tools/pizzly/Dockerfile @@ -5,4 +5,4 @@ LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin. COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/pizzly/bin:$PATH +ENV PATH /opt/conda/envs/pizzly_v0.37.3/bin:$PATH diff --git a/tools/pizzly/environment.yml b/tools/pizzly/environment.yml index 47a88cd8..a64e87c9 100644 --- a/tools/pizzly/environment.yml +++ b/tools/pizzly/environment.yml @@ -1,6 +1,8 @@ -name: pizzly +name: pizzly_v0.37.3 channels: - bioconda + - conda-forge dependencies: - - pizzly=0.37.3 - - kallisto=0.44.0 + - bioconda::pizzly=0.37.3 + - bioconda::kallisto=0.44.0 + - conda-forge::pigz=2.3.4 diff --git a/tools/squid/Dockerfile b/tools/squid/Dockerfile index 2b0ed4ff..48927f64 100644 --- a/tools/squid/Dockerfile +++ b/tools/squid/Dockerfile @@ -5,11 +5,11 @@ LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin. COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/squid/bin:$PATH +ENV PATH /opt/conda/envs/squid_v1.5-star2.7.0f/bin:$PATH RUN wget https://raw.githubusercontent.com/Kingsford-Group/squid/master/utils/AnnotateSQUIDOutput.py -O /AnnotateSQUIDOutput.py \ && chmod +x /AnnotateSQUIDOutput.py \ && ln -s /AnnotateSQUIDOutput.py /usr/local/bin \ - && ln -s /opt/conda/envs/squid/bin/python3 /bin/python + && ln -s /opt/conda/envs/squid_v1.5-star2.7.0f/bin/python3 /bin/python RUN ln -s /lib/x86_64-linux-gnu/libcrypt.so.1 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 diff --git a/tools/squid/environment.yml b/tools/squid/environment.yml index 9e3fdd2a..fa4e5dac 100644 --- a/tools/squid/environment.yml +++ b/tools/squid/environment.yml @@ -1,4 +1,4 @@ -name: squid +name: squid_v1.5-star2.7.0f channels: - bioconda - conda-forge diff --git a/tools/star-fusion/Dockerfile b/tools/star-fusion/Dockerfile index 862efe0f..7e18775e 100644 --- a/tools/star-fusion/Dockerfile +++ b/tools/star-fusion/Dockerfile @@ -6,4 +6,16 @@ LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin. COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/star-fusion/bin:$PATH \ No newline at end of file +ENV PATH /opt/conda/envs/star-fusion_v1.6.0/bin:$PATH + +# ctat-genome-lib-builder +RUN cd /opt/conda/envs/star-fusion_v1.6.0/ && \ + wget https://github.com/NCIP/ctat-genome-lib-builder/archive/2830cd708c5bb9353878ca98069427e83acdd625.zip && \ + unzip 2830cd708c5bb9353878ca98069427e83acdd625.zip && \ + cd ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625 && \ + rm /opt/conda/envs/star-fusion_v1.6.0/bin/prep_genome_lib.pl + +ENV PATH /opt/conda/envs/star-fusion_v1.6.0/ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625/:$PATH + +RUN ln -s /opt/conda/envs/star-fusion_v1.6.0/lib/libssl.so /opt/conda/envs/star-fusion_v1.6.0/lib/libssl.so.1.0.0 && \ + ln -s /opt/conda/envs/star-fusion_v1.6.0/lib/libcrypto.so /opt/conda/envs/star-fusion_v1.6.0/lib/libcrypto.so.1.0.0 diff --git a/tools/star-fusion/environment.yml b/tools/star-fusion/environment.yml index 49695d4d..22dd1dee 100644 --- a/tools/star-fusion/environment.yml +++ b/tools/star-fusion/environment.yml @@ -1,4 +1,4 @@ -name: star-fusion +name: star-fusion_v1.6.0 channels: - bioconda - conda-forge @@ -6,4 +6,7 @@ dependencies: - bioconda::star=2.7.0f - bioconda::star-fusion=1.6.0 - bioconda::trinity=2.6.6 - - conda-forge::perl-carp-assert \ No newline at end of file + - conda-forge::perl-carp-assert + - bioconda::hmmer=3.2.1 + - conda-forge::unzip=6.0 + - bioconda::dfam=2.0 \ No newline at end of file From 48e20980793778e50c95db7b4db6582529dd5840 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 28 Oct 2019 19:52:52 +0100 Subject: [PATCH 0003/1520] fix: updated tool version Using specific version of matplotlib for MultiQC --- Dockerfile | 2 +- environment.yml | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index a8967ec0..d8b5f84a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,4 +4,4 @@ LABEL authors="Martin Proks " \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/nf-core-rnafusion-1.0.2/bin:$PATH +ENV PATH /opt/conda/envs/nf-core-rnafusion-1.1.0/bin:$PATH diff --git a/environment.yml b/environment.yml index ebb0984c..dfa9927a 100644 --- a/environment.yml +++ b/environment.yml @@ -1,17 +1,18 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: nf-core-rnafusion-1.0.2 +name: nf-core-rnafusion-1.1.0 channels: - conda-forge - bioconda - defaults dependencies: - anaconda::openjdk=8.0.152 # Needed for FastQC - conda build hangs without this - - bioconda::star=2.7.0f # update STAR-Fusion and Fusion-Inspector + - bioconda::star=2.7.0f # update STAR-Fusion and Fusion-Inspector, Arriba - conda-forge::r-data.table=1.12.0 - conda-forge::r-gplots=3.0.1.1 - bioconda::bioconductor-edger=3.24.1 - conda-forge::r-markdown=0.9 - - bioconda::fusion-report=1.0.0 + - bioconda::fusion-report=2.0.1 - bioconda::fastqc=0.11.8 - bioconda::multiqc=1.7 + - matplotlib=3.0.3 # Current 3.1.0 build incompatible with multiqc=1.7 From 52a63913f2e7657099caa40e4a33096ceb91911f Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 28 Oct 2019 19:56:49 +0100 Subject: [PATCH 0004/1520] fix: redone the whole reference downloading In the upcomming release only Ensembl version will be supported --- conf/base.config | 10 +-- download-references.nf | 163 ++++++++++++++++------------------------- 2 files changed, 69 insertions(+), 104 deletions(-) diff --git a/conf/base.config b/conf/base.config index 52b2cbf3..79b34450 100644 --- a/conf/base.config +++ b/conf/base.config @@ -71,11 +71,10 @@ process{ time = { check_max( 4.h * task.attempt, 'time' ) } container = "nfcore/rnafusion:squid_v${params.squid_version}" } - // Download references - withName:download_star_fusion_ensembl { - cpus = { check_max (4, 'cpus')} - memory = { check_max( 4.GB * task.attempt, 'memory' ) } - time = { check_max( 12.h * task.attempt, 'time' ) } + withName:download_star_fusion { + cpus = { check_max (8, 'cpus')} + memory = { check_max( 20.GB * task.attempt, 'memory' ) } + time = { check_max( 24.h * task.attempt, 'time' ) } container = "nfcore/rnafusion:star-fusion_v${params.star_fusion_version}" } } @@ -85,5 +84,4 @@ params { max_memory = 128.GB max_cpus = 16 max_time = 240.h - igenomes_base = 's3://ngi-igenomes/igenomes/' } diff --git a/download-references.nf b/download-references.nf index 3fd65458..9e5656b5 100644 --- a/download-references.nf +++ b/download-references.nf @@ -19,21 +19,20 @@ def helpMessage() { nextflow run nf-core/rnafusion/download-references.nf -profile [PROFILE] [OPTIONS] --outdir /path/to/output Mandatory arguments: + --reference_release Release number of Ensembl reference for FASTA and GTF + example: 97 -> ftp://ftp.ensembl.org/pub/release-97 --outdir Output directory for downloading - -profile Configuration profile to use. Can use multiple (comma separated) - Available: standard, conda, docker, singularity, awsbatch, test + -profile Configuration profile [https://github.com/nf-core/configs] Options: + --download_all Download all references --arriba Download Arriba references - --star_fusion Download STAR-Fusion references [NCBI version by default] - --star_fusion_ensembl Download STAR-Fusion references [Ensebml, have to build manually] + --star_fusion Build STAR-Fusion references from FASTA ANF GTF --fusioncatcher Download Fusioncatcher references --ericscript Download Ericscript references - --pizzly Download pizzly references --fusion_report Download databases for fusion-report --cosmic_usr [Required] COSMIC username --cosmic_passwd [Required] COSMIC password - --igenomes Download iGenome Homo Sapiens version NCBI/GRCh38. """.stripIndent() } @@ -47,36 +46,31 @@ if (params.help){ exit 0 } +if (!params.reference_release) { + exit 1, "You did not specify the release number of reference!" +} + params.running_tools = [] if (!params.outdir) { exit 1, "Output directory not specified!" } -if (params.arriba) { +if (params.arriba || params.download_all) { params.running_tools.add("Arriba") } -if (params.igenomes) { - params.running_tools.add("iGenome") -} -if (params.star_fusion) { - params.running_tools.add("STAR-Fusion NCBI version") -} -if (params.star_fusion_ensembl) { - params.running_tools.add("STAR-Fusion Ensembl version") +if (params.star_fusion || params.download_all) { + params.running_tools.add("STAR-Fusion") } -if (params.fusioncatcher) { +if (params.fusioncatcher || params.download_all) { params.running_tools.add("Fusioncatcher") } -if (params.ericscript) { +if (params.ericscript || params.download_all) { params.running_tools.add("Ericscript") } -if (params.pizzly) { - params.running_tools.add("Pizzly") -} -if (params.fusion_report) { +if (params.download_all) { + params.running_tools.add('fusion-report') if (!params.cosmic_usr || !params.cosmic_passwd) { exit 1, "Database credentials are required parameter!" } - params.running_tools.add('fusion-report') } // Header log info @@ -85,86 +79,93 @@ def summary = [:] summary['Pipeline Name'] = 'nf-core/rnafusion/download-references.nf' summary['Pipeline Version'] = workflow.manifest.version summary['References'] = params.running_tools.size() == 0 ? 'None' : params.running_tools.join(", ") +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['Working dir'] = workflow.workDir -summary['Launch dir'] = workflow.launchDir -summary['Working dir'] = workflow.workDir -summary['Script dir'] = workflow.projectDir summary['User'] = workflow.userName -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(workflow.profile == 'awsbatch'){ - summary['AWS Region'] = params.awsregion - summary['AWS Queue'] = params.awsqueue -} log.info summary.collect { k,v -> "${k.padRight(18)}: $v" }.join("\n") log.info "\033[2m----------------------------------------------------\033[0m" -process download_arriba { - publishDir "${params.outdir}/arriba_ref", mode: 'copy' +process download_base { + publishDir "${params.outdir}/", mode: 'move' - when: - params.arriba - output: - file '*' + 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_${params.reference_release}.cdna.all.fa.gz" into transcript + script: """ - wget -N https://github.com/suhrig/arriba/releases/download/v1.1.0/arriba_v1.1.0.tar.gz -O arriba_v1.1.0.tar.gz - tar -xvzf arriba_v1.1.0.tar.gz && mv arriba_v1.1.0/database/* . && gunzip * && rm -rf arriba_* + 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_${params.reference_release}.cdna.all.fa.gz """ } -process download_star_fusion { - publishDir "${params.outdir}/star_fusion_ref", mode: 'copy' +process download_arriba { + publishDir "${params.outdir}/arriba", mode: 'move' when: - params.star_fusion + params.arriba || params.download_all output: file '*' script: """ - wget -N https://data.broadinstitute.org/Trinity/CTAT_RESOURCE_LIB/GRCh38_gencode_v29_CTAT_lib_Mar272019.plug-n-play.tar.gz -O GRCh38_gencode_v29_CTAT_lib_Mar272019.plug-n-play.tar.gz - tar -xvzf GRCh38_gencode_v29_CTAT_lib_Mar272019.plug-n-play.tar.gz && rm GRCh38_gencode_v29_CTAT_lib_Mar272019.plug-n-play.tar.gz + wget -N https://github.com/suhrig/arriba/releases/download/v1.1.0/arriba_v1.1.0.tar.gz -O arriba_v1.1.0.tar.gz + tar -xvzf arriba_v1.1.0.tar.gz && mv arriba_v1.1.0/database/* . && gunzip * && rm -rf arriba_* """ } -process download_star_fusion_ensembl { - publishDir "${params.outdir}/star_fusion_ensembl_ref", mode: 'copy' +process download_star_fusion { + publishDir "${params.outdir}/star-fusion", mode: 'move' when: - params.star_fusion_ensembl + params.star_fusion || params.download_all + + input: + file fasta + file gtf output: file '*' script: - """ - wget -N ftp://ftp.ensembl.org/pub/release-77/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.{1..22}.fa.gz - wget -N ftp://ftp.ensembl.org/pub/release-77/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.{MT,X,Y}.fa.gz - gunzip -c Homo_sapiens.GRCh38.dna.chromosome.* > Homo_sapiens.GRCh38_r77.all.fa - wget -N ftp://ftp.ensembl.org/pub/release-77/gtf/homo_sapiens/Homo_sapiens.GRCh38.77.chr.gtf.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 + + # 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 + prep_genome_lib.pl \\ - --genome_fa Homo_sapiens.GRCh38_r77.all.fa \\ - --gtf Homo_sapiens.GRCh38.77.chr.gtf \\ + --genome_fa ${fasta} \\ + --gtf ${gtf} \\ + --fusion_annot_lib CTAT_HumanFusionLib.dat.gz \\ + --annot_filter_rule AnnotFilterRule.pm \\ --pfam_db Pfam-A.hmm \\ - --CPU 10 + --dfam_db homo_sapiens_dfam.hmm \\ + --human_gencode_filter \\ + --CPU ${task.cpus} """ } process download_fusioncatcher { - publishDir "${params.outdir}/fusioncatcher_ref", mode: 'copy' + publishDir "${params.outdir}/fusioncatcher", mode: 'move' when: - params.fusioncatcher + params.fusioncatcher || params.download_all output: file '*' @@ -181,10 +182,10 @@ process download_fusioncatcher { } process download_ericscript { - publishDir "${params.outdir}/ericscript_ref", mode: 'copy' + publishDir "${params.outdir}/ericscript", mode: 'move' when: - params.ericscript + params.ericscript || params.download_all output: file '*' @@ -199,27 +200,8 @@ process download_ericscript { """ } -process download_pizzly { - publishDir "${params.outdir}/pizzly_ref", mode: 'copy' - - when: - params.pizzly - - output: - file '*' - - script: - """ - wget -N ftp://ftp.ensembl.org/pub/release-94/fasta/homo_sapiens/cdna/Homo_sapiens.GRCh38.cdna.all.fa.gz - wget -N ftp://ftp.ensembl.org/pub/release-94/gtf/homo_sapiens/Homo_sapiens.GRCh38.94.gtf.gz && gunzip Homo_sapiens.GRCh38.94.gtf.gz - """ -} - process download_databases { - publishDir "${params.outdir}/databases", mode: 'copy' - - when: - params.fusion_report + publishDir "${params.outdir}/databases", mode: 'move' output: file '*' @@ -230,26 +212,11 @@ process download_databases { """ } -process download_igenome { - publishDir "${params.outdir}/igenome", mode: 'copy' - - when: - params.igenomes - - output: - file '*' - - script: - """ - aws s3 --no-sign-request --region eu-west-1 sync s3://ngi-igenomes/igenomes/Homo_sapiens/NCBI/GRCh38/ . - """ -} - /* * Completion */ workflow.onComplete { - log.info "[nf-core/rnafusion] Pipeline Complete" + log.info "[nf-core/rnafusion/download-references.nf] Pipeline Complete" } def nfcoreHeader(){ From 9da087bc9178d5882d8c1872b86cb16b92944256 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 28 Oct 2019 19:58:11 +0100 Subject: [PATCH 0005/1520] refactor: simplified downloading Singularity images --- download-singularity-img.nf | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/download-singularity-img.nf b/download-singularity-img.nf index 42fa588c..7aeb69c6 100644 --- a/download-singularity-img.nf +++ b/download-singularity-img.nf @@ -53,28 +53,25 @@ params.running_tools = ["nf-core/rnafusion/${workflow.manifest.version}"] if (!params.outdir) { exit 1, "Output directory not specified!" } -if (params.download_all) { - params.running_tools.add("All") -} -if (params.arriba) { +if (params.arriba || download_all) { params.running_tools.add("Arriba") } -if (params.star_fusion) { +if (params.star_fusion || download_all) { params.running_tools.add("STAR-Fusion") } -if (params.fusioncatcher) { +if (params.fusioncatcher || download_all) { params.running_tools.add("Fusioncatcher") } -if (params.ericscript) { +if (params.ericscript || download_all) { params.running_tools.add("Ericscript") } -if (params.pizzly) { +if (params.pizzly || download_all) { params.running_tools.add("Pizzly") } -if (params.squid) { +if (params.squid || download_all) { params.running_tools.add("Squid") } -if (params.fusion_inspector) { +if (params.fusion_inspector || download_all) { params.running_tools.add("Fusion-Inspector") } @@ -84,21 +81,11 @@ def summary = [:] summary['Pipeline Name'] = 'nf-core/rnafusion/download-singularity-img.nf' summary['Pipeline Version'] = workflow.manifest.version summary['Tool images'] = params.running_tools.size() == 0 ? 'None' : params.running_tools.join(", ") +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['Working dir'] = workflow.workDir -summary['Launch dir'] = workflow.launchDir -summary['Working dir'] = workflow.workDir -summary['Script dir'] = workflow.projectDir summary['User'] = workflow.userName 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(workflow.profile == 'awsbatch'){ - summary['AWS Region'] = params.awsregion - summary['AWS Queue'] = params.awsqueue -} log.info summary.collect { k,v -> "${k.padRight(18)}: $v" }.join("\n") log.info "\033[2m----------------------------------------------------\033[0m" @@ -226,7 +213,7 @@ process download_star_fusion { * Completion */ workflow.onComplete { - log.info "[nf-core/rnafusion] Pipeline Complete" + log.info "[nf-core/rnafusion/download-singularity-img.nf] Pipeline Complete" } def nfcoreHeader(){ From 30dea3c1471bbc73087e57e91e79e9e00b46f68b Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 28 Oct 2019 20:00:13 +0100 Subject: [PATCH 0006/1520] fix: working main script with all new features --- main.nf | 169 +++++++++++++++++------------------------------- nextflow.config | 21 ++---- 2 files changed, 68 insertions(+), 122 deletions(-) diff --git a/main.nf b/main.nf index 04b7f2f0..dec1b8a5 100644 --- a/main.nf +++ b/main.nf @@ -34,7 +34,6 @@ def helpMessage() { --ericscript Run Ericscript --pizzly Run Pizzly --squid Run Squid - --debug Flag to run only specific fusion tool/s and not the whole pipeline. Only works on tool flags. --databases Database path for fusion-report --fusion_report_opt fusion-report extra parameters @@ -45,19 +44,19 @@ def helpMessage() { References If not specified in the configuration file or you wish to overwrite any of the references. --fasta Path to Fasta reference --gtf Path to GTF annotation + --transcript Path to transcript --star_index Path to STAR-Index reference --star_fusion_ref Path to STAR-Fusion reference --fusioncatcher_ref Path to Fusioncatcher reference --ericscript_ref Path to Ericscript reference - --pizzly_fasta Path to Pizzly FASTA reference - --pizzly_gtf Path to Pizzly GTF annotation + --arriba_ref Path to Arriba references Options: - --genome Name of iGenomes reference --read_length Length of the reads. Default: 100 --singleEnd Specifies that the input is single end reads Other Options: + --debug Flag to run only specific fusion tool/s and not the whole pipeline. Only works on tool flags. --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 --maxMultiqcEmailFileSize 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) @@ -73,8 +72,16 @@ def helpMessage() { * SET UP CONFIGURATION VARIABLES */ -params.running_tools = [] -params.visualization_tools = [] +running_tools = [] +visualization_tools = [] +reference = [ + arriba: false, + arriba_vis: false, + star_fusion: false, + fusioncatcher: false, + ericscript: false, + fusion_inspector: false +] // Show help emssage if (params.help){ @@ -82,121 +89,66 @@ if (params.help){ exit 0 } -// Check if genome exists in the config file -if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - exit 1, "The provided genome '${params.genome}' is not available in the iGenomes file. Currently the available genomes are ${params.genomes.keySet().join(", ")}" -} - -// Configurable reference genomes -params.fasta = params.genome ? params.genomes[ params.genome ].fasta ?: false : false -params.gtf = params.genome ? params.genomes[ params.genome ].gtf ?: false : false - -Channel - .fromPath(params.fasta) +Channel.fromPath(params.fasta, checkIfExists: true) .ifEmpty { exit 1, "Fasta file not found: ${params.fasta}" } .into { fasta; fasta_arriba } -Channel - .fromPath(params.gtf) +Channel.fromPath(params.gtf, checkIfExists: true) .ifEmpty { exit 1, "GTF annotation file not found: ${params.gtf}" } - .into { gtf; gtf_arriba; gtf_arriba_vis; gtf_squid } + .into { gtf; gtf_arriba; gtf_arriba_vis; gtf_squid; pizzly_gtf } + +Channel.fromPath(params.transcript, checkIfExists: true) + .ifEmpty { exit 1, "Transcript file not found: ${params.transcript}" } + .set { transcript } if (!params.star_index && (!params.fasta && !params.gtf)) { - exit 1, "Either specify STAR-INDEX or fasta and gtf file!" + exit 1, "Either specify STAR-INDEX or Fasta and GTF!" } if (!params.databases) { exit 1, "Database path for fusion-report has to be specified!" } -arriba_ref = false if (params.arriba) { - params.running_tools.add("Arriba") - params.visualization_tools.add("Arriba") - arriba_ref = Channel - .fromPath(params.arriba_ref) + running_tools.add("Arriba") + reference.arriba = Channel.fromPath(params.arriba_ref, checkIfExists: true) .ifEmpty { exit 1, "Arriba reference directory not found!" } } -arriba_vis_ref = false if (params.arriba_vis) { - params.running_tools.add("ArribaVisualization") - arriba_vis_ref = Channel - .fromPath(params.arriba_ref) - .ifEmpty { exit 1, "Arriba reference directory not found!" } + visualization_tools.add("Arriba") + reference.arriba_vis = Channel.fromPath(params.arriba_ref, checkIfExists: true) + .ifEmpty { exit 1, "Arriba visualization reference directory not found!" } } -star_fusion_ref = false if (params.star_fusion) { - params.running_tools.add("STAR-Fusion") - if (!params.star_fusion_ref) { - exit 1, "Star-Fusion reference not specified!" - } else { - star_fusion_ref = Channel - .fromPath(params.star_fusion_ref) - .ifEmpty { exit 1, "Star-Fusion reference directory not found!" } - } + running_tools.add("STAR-Fusion") + reference.star_fusion = Channel.fromPath(params.star_fusion_ref, checkIfExists: true) + .ifEmpty { exit 1, "Star-Fusion reference directory not found!" } +} + +if (params.fusion_inspector) { + visualization_tools.add("Fusion-Inspector") + reference.fusion_inspector = Channel.fromPath(params.star_fusion_ref, checkIfExists: true) + .ifEmpty { exit 1, "Fusion-Inspector reference not found" } } -fusioncatcher_ref = false if (params.fusioncatcher) { - params.running_tools.add("Fusioncatcher") - if (!params.fusioncatcher_ref) { - exit 1, "Fusioncatcher data directory not specified!" - } else { - fusioncatcher_ref = Channel - .fromPath(params.fusioncatcher_ref) - .ifEmpty { exit 1, "Fusioncatcher data directory not found!" } - } + running_tools.add("Fusioncatcher") + reference.fusioncatcher = Channel.fromPath(params.fusioncatcher_ref, checkIfExists: true) + .ifEmpty { exit 1, "Fusioncatcher data directory not found!" } } -ericscript_ref = false if (params.ericscript) { - params.running_tools.add("Ericscript") - if (!params.ericscript_ref) { - exit 1, "Reference not specified!" - } else { - ericscript_ref = Channel - .fromPath(params.ericscript_ref) - .ifEmpty { exit 1, "Ericscript reference not found" } - } + running_tools.add("EricScript") + reference.ericscript = Channel.fromPath(params.ericscript_ref, checkIfExists: true) + .ifEmpty { exit 1, "EricsSript reference not found!" } } -pizzly_fasta = false -pizzly_gtf = false -if (params.pizzly) { - params.running_tools.add("Pizzly") - if (params.pizzly_fasta) { - pizzly_fasta = Channel - .fromPath(params.pizzly_fasta) - .ifEmpty { exit 1, "Pizzly FASTA file not found!" } - } +if (params.squid) { running_tools.add("Squid") } - if (params.pizzly_gtf) { - pizzly_gtf = Channel - .fromPath(params.pizzly_gtf) - .ifEmpty { exit 1, "Pizzly GTF file not found!" } - } -} +if (params.pizzly) { running_tools.add("Pizzly") } -if (params.squid) { - params.running_tools.add("Squid") - if (!gtf_squid) { - exit 1, "Missing GTF annotation file for squid!" - } -} - -fusion_inspector_ref = false -if (params.fusion_inspector) { - params.visualization_tools.add("FusionInspector") - if (!params.star_fusion_ref) { - exit 1, "Reference not specified (using star-fusion reference path)!" - } else { - fusion_inspector_ref = Channel - .fromPath(params.star_fusion_ref) - .ifEmpty { exit 1, "Fusion-Inspector reference not found" } - } -} // Has the run name been specified by the user? // this has the bonus effect of catching both -name and --name @@ -255,9 +207,9 @@ summary['Reads'] = params.reads summary['Fasta Ref'] = params.fasta summary['GTF Ref'] = params.gtf summary['STAR Index'] = params.star_index ? params.star_index : 'Not specified, building' -summary['Fusion tools'] = params.running_tools.size() == 0 ? 'None' : params.running_tools.join(", ") -summary['Visualization tools'] = params.visualization_tools.size() == 0 ? 'None': params.visualization_tools.join(", ") -summary['Data Type'] = params.singleEnd ? 'Single-End' : 'Paired-End' +summary['Fusion tools'] = running_tools.size() == 0 ? 'None' : running_tools.join(", ") +summary['Visualization tools'] = visualization_tools.size() == 0 ? 'None': visualization_tools.join(", ") +summary['Data Type'] = params.singleEnd ? 'Single-End' : 'Paired-End' summary['Max Resources'] = "$params.max_memory memory, $params.max_cpus cpus, $params.max_time time per job" if(workflow.containerEngine) summary['Container'] = "$workflow.containerEngine - $workflow.container" summary['Output dir'] = params.outdir @@ -315,7 +267,7 @@ if (params.star_index) { } else { process build_star_index { tag "$fasta" - publishDir "${params.outdir}/star_index", mode: 'copy' + publishDir "${params.outdir}/star-index", mode: 'copy' input: file fasta @@ -356,7 +308,7 @@ process arriba { input: set val(name), file(reads) from read_files_arriba - file reference from arriba_ref + file reference from reference.arriba file star_index_arriba file fasta_arriba file gtf_arriba @@ -409,15 +361,15 @@ process arriba { */ process star_fusion { tag "$name" - publishDir "${params.outdir}/tools/StarFusion", mode: 'copy' + publishDir "${params.outdir}/tools/Star-Fusion", mode: 'copy' when: params.star_fusion || (params.star_fusion && params.debug) input: set val(name), file(reads) from read_files_star_fusion + file reference from reference.star_fusion file star_index_star_fusion - file reference from star_fusion_ref output: file '*fusion_predictions.tsv' optional true into star_fusion_fusions @@ -476,7 +428,7 @@ process fusioncatcher { input: set val(name), file(reads) from read_files_fusioncatcher - file data_dir from fusioncatcher_ref + file data_dir from reference.fusioncatcher output: file 'final-list_candidate-fusion-genes.txt' optional true into fusioncatcher_fusions @@ -500,14 +452,14 @@ process fusioncatcher { */ process ericscript { tag "$name" - publishDir "${params.outdir}/tools/Ericscript", mode: 'copy' + publishDir "${params.outdir}/tools/EricScript", mode: 'copy' when: params.ericscript && (!params.singleEnd || params.debug) input: set val(name), file(reads) from read_files_ericscript - file reference from ericscript_ref + file reference from reference.ericscript output: file './tmp/fusions.results.filtered.tsv' optional true into ericscript_fusions @@ -537,8 +489,8 @@ process pizzly { input: set val(name), file(reads) from read_files_pizzly - file fasta from pizzly_fasta file gtf from pizzly_gtf + file transcript output: file 'pizzly_fusions.txt' optional true into pizzly_fusions @@ -546,14 +498,14 @@ process pizzly { script: """ - kallisto index -i index.idx -k ${params.pizzly_k} ${fasta} + kallisto index -i index.idx -k ${params.pizzly_k} ${transcript} kallisto quant -t ${task.cpus} -i index.idx --fusion -o output ${reads[0]} ${reads[1]} pizzly -k ${params.pizzly_k} \\ --gtf ${gtf} \\ --cache index.cache.txt \\ --align-score 2 \\ --insert-size 400 \\ - --fasta ${fasta} \\ + --fasta ${transcript} \\ --output pizzly_fusions output/fusion.txt pizzly_flatten_json.py pizzly_fusions.json pizzly_fusions.txt """ @@ -617,7 +569,7 @@ process summary { file squid from squid_fusions.ifEmpty('') output: - file 'fusions_list.txt' into fusion_inspector_input_list + file 'fusion_list.tsv' into fusion_inspector_input_list file 'fusion_genes_mqc.json' into summary_fusions_mq file '*' into report @@ -650,7 +602,7 @@ process arriba_visualization { params.arriba_vis && (!params.singleEnd || params.debug) input: - file reference from arriba_vis_ref + file reference from reference.arriba_vis file fusions from arriba_fusions2 file bam from arriba_bam file gtf from gtf_arriba_vis @@ -686,13 +638,14 @@ process fusion_inspector { input: set val(name), file(reads) from read_files_fusion_inspector - file reference from fusion_inspector_ref + file reference from reference.fusion_inspector file fusion_inspector_input_list output: file '*.{fa,gtf,bed,bam,bai,txt}' into fusion_inspector_output script: + def extra_params = params.fusion_inspector_opt ? "${params.fusion_inspector_opt}" : '' """ FusionInspector \\ --fusions ${fusion_inspector_input_list} \\ @@ -702,7 +655,7 @@ process fusion_inspector { --CPU ${task.cpus} \\ --out_dir . \\ --out_prefix finspector \\ - --prep_for_IGV + --vis ${extra_params} """ } diff --git a/nextflow.config b/nextflow.config index be7a4aee..0dcb1539 100644 --- a/nextflow.config +++ b/nextflow.config @@ -12,9 +12,9 @@ params { arriba_version = '1.1.0' ericscript_version = '0.5.5' fusioncatcher_version = '1.00' - fusion_inspector_version = '1.3.1' + fusion_inspector_version = '1.3.1-star2.7.0f' pizzly_version = '0.37.3' - squid_version = '1.5' + squid_version = '1.5-star2.7.0f' star_fusion_version = '1.6.0' // Options: Building STAR-star_index @@ -43,6 +43,9 @@ params { // Options: Pizzly pizzly_k = 31 + // Options: Fusion-Inspector + fusion_inspector_opt = false + // Options: fusion-report fusion_report_opt = false @@ -56,15 +59,11 @@ params { debug = false // Options: download-references.nf - fusion_report = false + download_all = false cosmic_usr = false cosmic_passwd = false - star_fusion_ensembl = false // Shared default variables across different scripts - download_db = false - igenomes = true - igenomes_base = "./iGenomes" outdir = './results' tracedir = "${params.outdir}/pipeline_info" @@ -76,7 +75,6 @@ params { plaintext_email = false monochrome_logs = false help = false - genome = false custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" hostnames = false @@ -92,11 +90,6 @@ process.container = 'nfcore/rnafusion:dev' // Load base.config by default for all pipelines includeConfig 'conf/base.config' -// Load igenomes.config if required -if(params.igenomes){ - includeConfig 'conf/igenomes.config' -} - // Load nf-core custom profiles from different Institutions try { includeConfig "${params.custom_config_base}/nfcore_custom.config" @@ -140,7 +133,7 @@ manifest { description = 'Nextflow rnafusion analysis pipeline, part of the nf-core community.' mainScript = 'main.nf' nextflowVersion = '>=0.32.0' - version = '1.0.2' + version = '1.1.0' } // Function to ensure that resource requirements don't go beyond From 5f8106761ff28df2be73859863fff48761165b05 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 28 Oct 2019 20:05:24 +0100 Subject: [PATCH 0007/1520] chore: updated CHANGELOG --- CHANGELOG.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30a22fa7..bd40248c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # nfcore/rnafusion -## nfcore/rnafusion version 1.0.3 - +## nfcore/rnafusion version 1.1.0 - ### Added @@ -8,12 +8,17 @@ ### Changed +* Upgraded `fusion-report v1.0.0` to `fusion-report v2.0` * Divided `running_tools` into fusion and visualization tools -* Updated `Squid STAR` 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) +* Updated `STAR` in `Squid`, `Fusion-Inspector` version to `2.7.0f` +* Upgraded `STAR-Fusion v1.5.0` to `STAR-Fusion v1.7.0` [#83](https://github.com/nf-core/rnafusion/issues/83) * Parameter `igenomesIgnore` renamed to `igenome` [#81](https://github.com/nf-core/rnafusion/issues/81) -## nfcore/rnafusion version 1.0.2 - 2018/05/13 +### Fixed + +* iGenomes optional, but not really [#91](https://github.com/nf-core/rnafusion/issues/91) + +## nfcore/rnafusion version 1.0.2 - 2019/05/13 ### Changed @@ -25,7 +30,7 @@ * 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) -## nfcore/rnafusion version 1.0.1 - 2018/04/06 +## nfcore/rnafusion version 1.0.1 - 2019/04/06 ### Added From fc254447592d1bcebba31b5bbd6159b4074b961f Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sun, 10 Nov 2019 20:41:54 +0100 Subject: [PATCH 0008/1520] feat: implemented batch mode --- main.nf | 162 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 87 insertions(+), 75 deletions(-) diff --git a/main.nf b/main.nf index dec1b8a5..09d84a12 100644 --- a/main.nf +++ b/main.nf @@ -300,29 +300,34 @@ if (params.star_index) { * Arriba */ process arriba { - tag "$name" - publishDir "${params.outdir}/tools/Arriba", mode: 'copy' + tag "$sample" + publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy', + saveAs: {filename -> + if (filename == "fusions.tsv") "${sample}_arriba.tsv" + else if (filename == "Aligned.out.bam") "${sample}_arriba.bam" + else filename + } when: params.arriba && (!params.singleEnd || params.debug) input: - set val(name), file(reads) from read_files_arriba - file reference from reference.arriba - file star_index_arriba - file fasta_arriba - file gtf_arriba + set val(sample), file(reads) from read_files_arriba + file reference from reference.arriba.collect() + file star_index from star_index_arriba.collect() + file fasta from fasta_arriba.collect() + file gtf from gtf_arriba.collect() output: - file 'fusions.tsv' optional true into arriba_fusions1, arriba_fusions2 - file 'Aligned.out.bam' optional true into arriba_bam + file "${sample}_arriba.tsv" optional true into arriba_fusions1, arriba_fusions2 + file "${sample}_arriba.bam" optional true into arriba_bam file '*.{tsv,txt}' into arriba_output script: def extra_params = params.arriba_opt ? "${params.arriba_opt}" : '' """ STAR \\ - --genomeDir ${star_index_arriba} \\ + --genomeDir ${star_index} \\ --runThreadN ${task.cpus} \\ --readFilesIn ${reads} \\ --outStd BAM_Unsorted \\ @@ -347,8 +352,8 @@ process arriba { arriba \\ -x /dev/stdin \\ - -a ${fasta_arriba} \\ - -g ${gtf_arriba} \\ + -a ${fasta} \\ + -g ${gtf} \\ -b ${reference}/blacklist_hg38_GRCh38_2018-11-04.tsv \\ -o fusions.tsv -O fusions.discarded.tsv \\ -T -P \\ @@ -360,19 +365,20 @@ process arriba { * STAR-Fusion */ process star_fusion { - tag "$name" - publishDir "${params.outdir}/tools/Star-Fusion", mode: 'copy' + tag "$sample" + publishDir "${params.outdir}/tools/Star-Fusion/${sample}", mode: 'copy', + saveAs: {filename -> filename == "star-fusion.fusion_predictions.tsv" ? "${sample}_star-fusion.tsv" : filename} when: params.star_fusion || (params.star_fusion && params.debug) input: - set val(name), file(reads) from read_files_star_fusion - file reference from reference.star_fusion - file star_index_star_fusion + set val(sample), file(reads) from read_files_star_fusion + file reference from reference.star_fusion.collect() + file star_index from star_index_star_fusion.collect() output: - file '*fusion_predictions.tsv' optional true into star_fusion_fusions + file "${sample}_star-fusion.tsv" optional true into star_fusion_fusions file '*.{tsv,txt}' into star_fusion_output script: @@ -381,7 +387,7 @@ process star_fusion { def extra_params = params.star_fusion_opt ? "${params.star_fusion_opt}" : '' """ STAR \\ - --genomeDir ${star_index_star_fusion} \\ + --genomeDir ${star_index} \\ --readFilesIn ${reads} \\ --twopassMode Basic \\ --outReadsUnmapped None \\ @@ -420,18 +426,19 @@ process star_fusion { * Fusioncatcher */ process fusioncatcher { - tag "$name" - publishDir "${params.outdir}/tools/Fusioncatcher", mode: 'copy' + tag "$sample" + publishDir "${params.outdir}/tools/Fusioncatcher/${sample}", mode: 'copy', + saveAs: {filename -> filename == "final-list_candidate-fusion-genes.txt" ? "${sample}_fusioncatcher.txt" : filename} when: params.fusioncatcher || (params.fusioncatcher && params.debug) input: - set val(name), file(reads) from read_files_fusioncatcher - file data_dir from reference.fusioncatcher + set val(sample), file(reads) from read_files_fusioncatcher + file data_dir from reference.fusioncatcher.collect() output: - file 'final-list_candidate-fusion-genes.txt' optional true into fusioncatcher_fusions + file "${sample}_fusioncatcher.txt" optional true into fusioncatcher_fusions file '*.{txt,zip,log}' into fusioncatcher_output script: @@ -451,18 +458,19 @@ process fusioncatcher { * Ericscript */ process ericscript { - tag "$name" - publishDir "${params.outdir}/tools/EricScript", mode: 'copy' + tag "$sample" + publishDir "${params.outdir}/tools/EricScript/${sample}", mode: 'copy', + saveAs: {filename -> filename == "fusions.results.filtered.tsv" ? "${sample}_ericscript.tsv" : filename} when: params.ericscript && (!params.singleEnd || params.debug) input: - set val(name), file(reads) from read_files_ericscript - file reference from reference.ericscript + set val(sample), file(reads) from read_files_ericscript + file reference from reference.ericscript.collect() output: - file './tmp/fusions.results.filtered.tsv' optional true into ericscript_fusions + file "./tmp/${sample}_ericscript.tsv" optional true into ericscript_fusions file './tmp/fusions.results.total.tsv' optional true into ericscript_output script: @@ -472,8 +480,7 @@ process ericscript { -name fusions \\ -p ${task.cpus} \\ -o ./tmp \\ - ${reads[0]} \\ - ${reads[1]} + ${reads} """ } @@ -481,19 +488,20 @@ process ericscript { * Pizzly */ process pizzly { - tag "$name" - publishDir "${params.outdir}/tools/Pizzly", mode: 'copy' + tag "$sample" + publishDir "${params.outdir}/tools/Pizzly/${sample}", mode: 'copy', + saveAs: {filename -> filename == "pizzly_fusions.txt" ? "${sample}_pizzly.txt" : filename} when: params.pizzly && (!params.singleEnd || params.debug) input: - set val(name), file(reads) from read_files_pizzly - file gtf from pizzly_gtf - file transcript + set val(sample), file(reads) from read_files_pizzly + file gtf from pizzly_gtf.collect() + file transcript from transcript.collect() output: - file 'pizzly_fusions.txt' optional true into pizzly_fusions + file "${sample}_pizzly.txt" optional true into pizzly_fusions file '*.{json,txt}' into pizzly_output script: @@ -515,36 +523,37 @@ process pizzly { * Squid */ process squid { - tag "$name" - publishDir "${params.outdir}/tools/Squid", mode: 'copy' + tag "$sample" + publishDir "${params.outdir}/tools/Squid/${sample}", mode: 'copy', + saveAs: {filename -> filename == "fusions_annotated.txt" ? "${sample}_fusions_annotated.txt" : filename} when: params.squid && (!params.singleEnd || params.debug) input: - set val(name), file(reads) from read_files_squid - file star_index_squid - file gtf from gtf_squid + set val(sample), file(reads) from read_files_squid + file star_index from star_index_squid.collect() + file gtf from gtf_squid.collect() output: - file '*_annotated.txt' optional true into squid_fusions + file "${sample}_fusions_annotated.txt" optional true into squid_fusions file '*.txt' into squid_output script: def avail_mem = task.memory ? "--limitBAMsortRAM ${task.memory.toBytes() - 100000000}" : '' """ STAR \\ - --genomeDir ${star_index_squid} \\ + --genomeDir ${star_index} \\ --sjdbGTFfile ${gtf} \\ --runThreadN ${task.cpus} \\ - --readFilesIn ${reads[0]} ${reads[1]} \\ + --readFilesIn ${reads} \\ --twopassMode Basic \\ --chimOutType SeparateSAMold --chimSegmentMin 20 --chimJunctionOverhangMin 12 --alignSJDBoverhangMin 10 --outReadsUnmapped Fastx --outSAMstrandField intronMotif \\ --outSAMtype BAM SortedByCoordinate ${avail_mem} \\ --readFilesCommand zcat - mv Aligned.sortedByCoord.out.bam ${name}Aligned.sortedByCoord.out.bam - samtools view -bS Chimeric.out.sam > ${name}Chimeric.out.bam - squid -b ${name}Aligned.sortedByCoord.out.bam -c ${name}Chimeric.out.bam -o fusions + mv Aligned.sortedByCoord.out.bam ${sample}Aligned.sortedByCoord.out.bam + samtools view -bS Chimeric.out.sam > ${sample}Chimeric.out.bam + squid -b ${sample}Aligned.sortedByCoord.out.bam -c ${sample}Chimeric.out.bam -o fusions AnnotateSQUIDOutput.py ${gtf} fusions_sv.txt fusions_annotated.txt """ } @@ -552,25 +561,25 @@ process squid { /************************************************************* * Summarizing results from tools ************************************************************/ -process summary { - tag "$name" - publishDir "${params.outdir}/Report-${name}", mode: 'copy' + process summary { + tag "$sample" + publishDir "${params.outdir}/Reports/${sample}", mode: 'copy' when: !params.debug && (params.arriba || params.fusioncatcher || params.star_fusion || params.ericscript || params.pizzly || params.squid) input: - set val(name), file(reads) from read_files_summary - file arriba from arriba_fusions1.ifEmpty('') - file fusioncatcher from fusioncatcher_fusions.ifEmpty('') - file starfusion from star_fusion_fusions.ifEmpty('') - file ericscript from ericscript_fusions.ifEmpty('') - file pizzly from pizzly_fusions.ifEmpty('') - file squid from squid_fusions.ifEmpty('') + set val(sample), file(reads) from read_files_summary + file arriba from arriba_fusions1.collect().ifEmpty('') + file fusioncatcher from fusioncatcher_fusions.collect().ifEmpty('') + file starfusion from star_fusion_fusions.collect().ifEmpty('') + file ericscript from ericscript_fusions.collect().ifEmpty('') + file pizzly from pizzly_fusions.collect().ifEmpty('') + file squid from squid_fusions.collect().ifEmpty('') output: - file 'fusion_list.tsv' into fusion_inspector_input_list - file 'fusion_genes_mqc.json' into summary_fusions_mq + file "${sample}_fusion_list.tsv" into fusion_inspector_input_list + file "${sample}_fusion_genes_mqc.json" into summary_fusions_mq file '*' into report script: @@ -582,8 +591,10 @@ process summary { tools += !pizzly.empty() ? "--pizzly ${pizzly} " : '' tools += !squid.empty() ? "--squid ${squid} " : '' """ - fusion_report run ${name} . ${params.databases} \\ + fusion_report run ${sample} . ${params.databases} \\ ${tools} ${extra_params} + mv fusion_list.tsv ${sample}_fusion_list.tsv + mv fusion_genes_mqc.json ${sample}_fusion_genes_mqc.json """ } @@ -595,20 +606,21 @@ process summary { * Arriba Visualization */ process arriba_visualization { - tag "$name" - publishDir "${params.outdir}/tools/Arriba", mode: 'copy' + tag "$sample" + publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy', + saveAs: {filename -> filename == "visualization.pdf" ? "${sample}.pdf" : filename} when: params.arriba_vis && (!params.singleEnd || params.debug) input: - file reference from reference.arriba_vis - file fusions from arriba_fusions2 - file bam from arriba_bam - file gtf from gtf_arriba_vis + file reference from reference.arriba_vis.collect() + file fusions from arriba_fusions2.collect() + file bam from arriba_bam.collect() + file gtf from gtf_arriba_vis.collect() output: - file 'visualization.pdf' optional true into arriba_visualization_output + file "${sample}.pdf" optional true into arriba_visualization_output script: def suff_mem = ("${(task.memory.toBytes() - 6000000000) / task.cpus}" > 2000000000) ? 'true' : 'false' @@ -630,16 +642,16 @@ process arriba_visualization { * Fusion Inspector */ process fusion_inspector { - tag "$name" - publishDir "${params.outdir}/tools/FusionInspector", mode: 'copy' + tag "$sample" + publishDir "${params.outdir}/tools/FusionInspector/${sample}", mode: 'copy' when: params.fusion_inspector && (!params.singleEnd || params.debug) input: - set val(name), file(reads) from read_files_fusion_inspector - file reference from reference.fusion_inspector - file fusion_inspector_input_list + set val(sample), file(reads) from read_files_fusion_inspector + file reference from reference.fusion_inspector.collect() + file fi_input_list from fusion_inspector_input_list.collect() output: file '*.{fa,gtf,bed,bam,bai,txt}' into fusion_inspector_output @@ -648,7 +660,7 @@ process fusion_inspector { def extra_params = params.fusion_inspector_opt ? "${params.fusion_inspector_opt}" : '' """ FusionInspector \\ - --fusions ${fusion_inspector_input_list} \\ + --fusions ${fi_input_list} \\ --genome_lib ${reference} \\ --left_fq ${reads[0]} \\ --right_fq ${reads[1]} \\ @@ -736,7 +748,7 @@ process multiqc { file ('fastqc/*') from fastqc_results.collect().ifEmpty([]) file ('software_versions/*') from software_versions_yaml.collect() file workflow_summary from create_workflow_summary(summary) - file fusions_mq from summary_fusions_mq.ifEmpty('') + file fusions_mq from summary_fusions_mq.collect().ifEmpty([]) output: file "*multiqc_report.html" into multiqc_report From 968fcd85c14300d86c398f0ed023482c8365110e Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 21 Jan 2020 14:34:07 +0100 Subject: [PATCH 0009/1520] catching up with latest @matq007 dev --- main.nf | 180 +++++++++++++++++------------------ tools/arriba/environment.yml | 1 + 2 files changed, 87 insertions(+), 94 deletions(-) diff --git a/main.nf b/main.nf index 09d84a12..bcb84194 100644 --- a/main.nf +++ b/main.nf @@ -180,22 +180,22 @@ if(params.readPaths){ .from(params.readPaths) .map { row -> [ row[0], [file(row[1][0])]] } .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } - .into { read_files_fastqc; read_files_summary; read_files_multiqc; read_files_star_fusion; read_files_fusioncatcher; - read_files_gfusion; read_files_fusion_inspector; read_files_ericscript; read_files_pizzly; read_files_squid; read_files_arriba } + .into { read_files_fastqc; read_files_multiqc; read_files_star_fusion; read_files_fusioncatcher; + read_files_fusion_inspector; read_files_ericscript; read_files_pizzly; read_files_squid; read_files_arriba; read_files_summary; read_arriba_vis } } else { Channel .from(params.readPaths) .map { row -> [ row[0], [file(row[1][0]), file(row[1][1])]] } .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } - .into { read_files_fastqc; read_files_summary; read_files_multiqc; read_files_star_fusion; read_files_fusioncatcher; - read_files_gfusion; read_files_fusion_inspector; read_files_ericscript; read_files_pizzly; read_files_squid; read_files_arriba } + .into { read_files_fastqc; read_files_multiqc; read_files_star_fusion; read_files_fusioncatcher; + read_files_fusion_inspector; read_files_ericscript; read_files_pizzly; read_files_squid; read_files_arriba; read_files_summary; read_arriba_vis } } } else { Channel .fromFilePairs( params.reads, size: params.singleEnd ? 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 --singleEnd on the command line." } - .into { read_files_fastqc; read_files_summary; read_files_multiqc; read_files_star_fusion; read_files_fusioncatcher; - read_files_gfusion; read_files_fusion_inspector; read_files_ericscript; read_files_pizzly; read_files_squid; read_files_arriba } + .into { read_files_fastqc; read_files_multiqc; read_files_star_fusion; read_files_fusioncatcher; + read_files_fusion_inspector; read_files_ericscript; read_files_pizzly; read_files_squid; read_files_arriba; read_files_summary; read_arriba_vis } } // Header log info @@ -319,7 +319,7 @@ process arriba { file gtf from gtf_arriba.collect() output: - file "${sample}_arriba.tsv" optional true into arriba_fusions1, arriba_fusions2 + file "${sample}_arriba.tsv" optional true into (arriba_fusions1, arriba_fusions2) file "${sample}_arriba.bam" optional true into arriba_bam file '*.{tsv,txt}' into arriba_output @@ -561,42 +561,42 @@ process squid { /************************************************************* * Summarizing results from tools ************************************************************/ - process summary { - tag "$sample" - publishDir "${params.outdir}/Reports/${sample}", mode: 'copy' +// process summary { +// tag "$sample" +// publishDir "${params.outdir}/Reports/${sample}", mode: 'copy' - when: - !params.debug && (params.arriba || params.fusioncatcher || params.star_fusion || params.ericscript || params.pizzly || params.squid) +// when: +// !params.debug && (params.arriba || params.fusioncatcher || params.star_fusion || params.ericscript || params.pizzly || params.squid) - input: - set val(sample), file(reads) from read_files_summary - file arriba from arriba_fusions1.collect().ifEmpty('') - file fusioncatcher from fusioncatcher_fusions.collect().ifEmpty('') - file starfusion from star_fusion_fusions.collect().ifEmpty('') - file ericscript from ericscript_fusions.collect().ifEmpty('') - file pizzly from pizzly_fusions.collect().ifEmpty('') - file squid from squid_fusions.collect().ifEmpty('') - - output: - file "${sample}_fusion_list.tsv" into fusion_inspector_input_list - file "${sample}_fusion_genes_mqc.json" into summary_fusions_mq - file '*' into report +// input: +// set val(sample), file(reads) from read_files_summary +// file arriba from arriba_fusions1.collect().ifEmpty('') +// file fusioncatcher from fusioncatcher_fusions.collect().ifEmpty('') +// file starfusion from star_fusion_fusions.collect().ifEmpty('') +// file ericscript from ericscript_fusions.collect().ifEmpty('') +// file pizzly from pizzly_fusions.collect().ifEmpty('') +// file squid from squid_fusions.collect().ifEmpty('') + +// output: +// file "${sample}_fusion_list.tsv" into fusion_inspector_input_list +// file "${sample}_fusion_genes_mqc.json" into summary_fusions_mq +// file '*' into report - script: - def extra_params = params.fusion_report_opt ? "${params.fusion_report_opt}" : '' - def tools = !arriba.empty() ? "--arriba ${arriba} " : '' - tools += !fusioncatcher.empty() ? "--fusioncatcher ${fusioncatcher} " : '' - tools += !starfusion.empty() ? "--starfusion ${starfusion} " : '' - tools += !ericscript.empty() ? "--ericscript ${ericscript} " : '' - tools += !pizzly.empty() ? "--pizzly ${pizzly} " : '' - tools += !squid.empty() ? "--squid ${squid} " : '' - """ - fusion_report run ${sample} . ${params.databases} \\ - ${tools} ${extra_params} - mv fusion_list.tsv ${sample}_fusion_list.tsv - mv fusion_genes_mqc.json ${sample}_fusion_genes_mqc.json - """ -} +// script: +// def extra_params = params.fusion_report_opt ? "${params.fusion_report_opt}" : '' +// def tools = !arriba.empty() ? "--arriba ${arriba} " : '' +// tools += !fusioncatcher.empty() ? "--fusioncatcher ${fusioncatcher} " : '' +// tools += !starfusion.empty() ? "--starfusion ${starfusion} " : '' +// tools += !ericscript.empty() ? "--ericscript ${ericscript} " : '' +// tools += !pizzly.empty() ? "--pizzly ${pizzly} " : '' +// tools += !squid.empty() ? "--squid ${squid} " : '' +// """ +// fusion_report run ${sample} . ${params.databases} \\ +// ${tools} ${extra_params} +// mv fusion_list.tsv ${sample}_fusion_list.tsv +// mv fusion_genes_mqc.json ${sample}_fusion_genes_mqc.json +// """ +// } /************************************************************* * Visualization @@ -607,69 +607,61 @@ process squid { */ process arriba_visualization { tag "$sample" - publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy', - saveAs: {filename -> filename == "visualization.pdf" ? "${sample}.pdf" : filename} - - when: - params.arriba_vis && (!params.singleEnd || params.debug) + publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy' + + // when: + // params.arriba_vis && (!params.singleEnd || params.debug) input: - file reference from reference.arriba_vis.collect() - file fusions from arriba_fusions2.collect() - file bam from arriba_bam.collect() - file gtf from gtf_arriba_vis.collect() - - output: - file "${sample}.pdf" optional true into arriba_visualization_output - + set val(sample), file(reads) from read_arriba_vis + // file fusions from arriba_fusions1.collect().ifEmpty([]) + file reference from reference.arriba_vis.collect().ifEmpty([]) + file bam from arriba_bam.collect().ifEmpty([]) + file gtf from gtf_arriba_vis.collect().ifEmpty([]) + + // output: + // file "${sample}.pdf" optional true into arriba_visualization_output + println(arriba_fusions1) 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}" : '' """ - samtools sort -@ ${task.cpus} ${avail_mem} -O bam ${bam} > Aligned.sortedByCoord.out.bam - samtools index Aligned.sortedByCoord.out.bam - draw_fusions.R \\ - --fusions=${fusions} \\ - --alignments=Aligned.sortedByCoord.out.bam \\ - --output=visualization.pdf \\ - --annotation=${gtf} \\ - --cytobands=${reference}/cytobands_hg38_GRCh38_2018-02-23.tsv \\ - --proteinDomains=${reference}/protein_domains_hg38_GRCh38_2018-03-06.gff3 + echo "hi" """ + // 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}" : '' } /* * Fusion Inspector */ -process fusion_inspector { - tag "$sample" - publishDir "${params.outdir}/tools/FusionInspector/${sample}", mode: 'copy' - - when: - params.fusion_inspector && (!params.singleEnd || params.debug) - - input: - set val(sample), file(reads) from read_files_fusion_inspector - file reference from reference.fusion_inspector.collect() - file fi_input_list from fusion_inspector_input_list.collect() - - output: - file '*.{fa,gtf,bed,bam,bai,txt}' into fusion_inspector_output - - script: - def extra_params = params.fusion_inspector_opt ? "${params.fusion_inspector_opt}" : '' - """ - FusionInspector \\ - --fusions ${fi_input_list} \\ - --genome_lib ${reference} \\ - --left_fq ${reads[0]} \\ - --right_fq ${reads[1]} \\ - --CPU ${task.cpus} \\ - --out_dir . \\ - --out_prefix finspector \\ - --vis ${extra_params} - """ -} +// process fusion_inspector { +// tag "$sample" +// publishDir "${params.outdir}/tools/FusionInspector/${sample}", mode: 'copy' + +// when: +// params.fusion_inspector && (!params.singleEnd || params.debug) + +// input: +// set val(sample), file(reads) from read_files_fusion_inspector +// file reference from reference.fusion_inspector.collect() +// file fi_input_list from fusion_inspector_input_list.collect() + +// output: +// file '*' into fusion_inspector_output + +// script: +// def extra_params = params.fusion_inspector_opt ? "${params.fusion_inspector_opt}" : '' +// """ +// FusionInspector \\ +// --fusions ${fi_input_list} \\ +// --genome_lib ${reference} \\ +// --left_fq ${reads[0]} \\ +// --right_fq ${reads[1]} \\ +// --CPU ${task.cpus} \\ +// --out_dir . \\ +// --out_prefix finspector \\ +// --vis ${extra_params} +// """ +// } /************************************************************* * Quality check & software verions @@ -748,7 +740,7 @@ process multiqc { file ('fastqc/*') from fastqc_results.collect().ifEmpty([]) file ('software_versions/*') from software_versions_yaml.collect() file workflow_summary from create_workflow_summary(summary) - file fusions_mq from summary_fusions_mq.collect().ifEmpty([]) + // file fusions_mq from summary_fusions_mq.collect().ifEmpty([]) output: file "*multiqc_report.html" into multiqc_report diff --git a/tools/arriba/environment.yml b/tools/arriba/environment.yml index 539f9527..52b0f59d 100644 --- a/tools/arriba/environment.yml +++ b/tools/arriba/environment.yml @@ -7,5 +7,6 @@ dependencies: - bioconda::star=2.7.0f - bioconda::samtools=1.9 - conda-forge::r-circlize + - conda-forge::readline=6.2 - bioconda::bioconductor-genomicalignments - bioconda::bioconductor-genomicranges \ No newline at end of file From ea54dab1c70f6115dc4001d4e41761cc1d50fb6d Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 21 Jan 2020 14:57:00 +0100 Subject: [PATCH 0010/1520] comment arriva_visualization process --- main.nf | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/main.nf b/main.nf index bcb84194..718fcf7c 100644 --- a/main.nf +++ b/main.nf @@ -605,30 +605,30 @@ process squid { /* * Arriba Visualization */ -process arriba_visualization { - tag "$sample" - publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy' +// process arriba_visualization { +// tag "$sample" +// publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy' - // when: - // params.arriba_vis && (!params.singleEnd || params.debug) +// // when: +// // params.arriba_vis && (!params.singleEnd || params.debug) - input: - set val(sample), file(reads) from read_arriba_vis - // file fusions from arriba_fusions1.collect().ifEmpty([]) - file reference from reference.arriba_vis.collect().ifEmpty([]) - file bam from arriba_bam.collect().ifEmpty([]) - file gtf from gtf_arriba_vis.collect().ifEmpty([]) - - // output: - // file "${sample}.pdf" optional true into arriba_visualization_output - println(arriba_fusions1) - script: - """ - echo "hi" - """ - // 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}" : '' -} +// input: +// set val(sample), file(reads) from read_arriba_vis +// // file fusions from arriba_fusions1.collect().ifEmpty([]) +// file reference from reference.arriba_vis.collect().ifEmpty([]) +// file bam from arriba_bam.collect().ifEmpty([]) +// file gtf from gtf_arriba_vis.collect().ifEmpty([]) + +// // output: +// // file "${sample}.pdf" optional true into arriba_visualization_output +// println(arriba_fusions1) +// script: +// """ +// echo "hi" +// """ +// // 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}" : '' +// } /* * Fusion Inspector From b8e134efb15c098e64ea942358442c83a95de6f2 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 21 Jan 2020 15:02:45 +0100 Subject: [PATCH 0011/1520] uncommenting process summary --- main.nf | 64 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/main.nf b/main.nf index 718fcf7c..468916a8 100644 --- a/main.nf +++ b/main.nf @@ -561,42 +561,42 @@ process squid { /************************************************************* * Summarizing results from tools ************************************************************/ -// process summary { -// tag "$sample" -// publishDir "${params.outdir}/Reports/${sample}", mode: 'copy' + process summary { + tag "$sample" + publishDir "${params.outdir}/Reports/${sample}", mode: 'copy' -// when: -// !params.debug && (params.arriba || params.fusioncatcher || params.star_fusion || params.ericscript || params.pizzly || params.squid) + when: + !params.debug && (params.arriba || params.fusioncatcher || params.star_fusion || params.ericscript || params.pizzly || params.squid) -// input: -// set val(sample), file(reads) from read_files_summary -// file arriba from arriba_fusions1.collect().ifEmpty('') -// file fusioncatcher from fusioncatcher_fusions.collect().ifEmpty('') -// file starfusion from star_fusion_fusions.collect().ifEmpty('') -// file ericscript from ericscript_fusions.collect().ifEmpty('') -// file pizzly from pizzly_fusions.collect().ifEmpty('') -// file squid from squid_fusions.collect().ifEmpty('') + input: + set val(sample), file(reads) from read_files_summary + file arriba from arriba_fusions1.collect().ifEmpty('') + file fusioncatcher from fusioncatcher_fusions.collect().ifEmpty('') + file starfusion from star_fusion_fusions.collect().ifEmpty('') + file ericscript from ericscript_fusions.collect().ifEmpty('') + file pizzly from pizzly_fusions.collect().ifEmpty('') + file squid from squid_fusions.collect().ifEmpty('') -// output: -// file "${sample}_fusion_list.tsv" into fusion_inspector_input_list -// file "${sample}_fusion_genes_mqc.json" into summary_fusions_mq -// file '*' into report + output: + file "${sample}_fusion_list.tsv" into fusion_inspector_input_list + file "${sample}_fusion_genes_mqc.json" into summary_fusions_mq + file '*' into report -// script: -// def extra_params = params.fusion_report_opt ? "${params.fusion_report_opt}" : '' -// def tools = !arriba.empty() ? "--arriba ${arriba} " : '' -// tools += !fusioncatcher.empty() ? "--fusioncatcher ${fusioncatcher} " : '' -// tools += !starfusion.empty() ? "--starfusion ${starfusion} " : '' -// tools += !ericscript.empty() ? "--ericscript ${ericscript} " : '' -// tools += !pizzly.empty() ? "--pizzly ${pizzly} " : '' -// tools += !squid.empty() ? "--squid ${squid} " : '' -// """ -// fusion_report run ${sample} . ${params.databases} \\ -// ${tools} ${extra_params} -// mv fusion_list.tsv ${sample}_fusion_list.tsv -// mv fusion_genes_mqc.json ${sample}_fusion_genes_mqc.json -// """ -// } + script: + def extra_params = params.fusion_report_opt ? "${params.fusion_report_opt}" : '' + def tools = !arriba.empty() ? "--arriba ${arriba} " : '' + tools += !fusioncatcher.empty() ? "--fusioncatcher ${fusioncatcher} " : '' + tools += !starfusion.empty() ? "--starfusion ${starfusion} " : '' + tools += !ericscript.empty() ? "--ericscript ${ericscript} " : '' + tools += !pizzly.empty() ? "--pizzly ${pizzly} " : '' + tools += !squid.empty() ? "--squid ${squid} " : '' + """ + fusion_report run ${sample} . ${params.databases} \\ + ${tools} ${extra_params} + mv fusion_list.tsv ${sample}_fusion_list.tsv + mv fusion_genes_mqc.json ${sample}_fusion_genes_mqc.json + """ +} /************************************************************* * Visualization From 626155eeb43158da95078896ee58c2a710a1505f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 21 Jan 2020 16:16:06 +0100 Subject: [PATCH 0012/1520] catching up with latest dev from @matq007 --- main.nf | 246 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 131 insertions(+), 115 deletions(-) diff --git a/main.nf b/main.nf index 468916a8..04fcb88f 100644 --- a/main.nf +++ b/main.nf @@ -3,10 +3,18 @@ ======================================================================================== nf-core/rnafusion ======================================================================================== - nf-core/rnafusion Analysis Pipeline. - #### Homepage / Documentation +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() { @@ -26,11 +34,11 @@ def helpMessage() { Tool flags: --arriba Run Arriba - --arriba_opt Extra parameter for Arriba + --arriba_opt Extra parameter for Arriba --star_fusion Run STAR-Fusion - --star_fusion_opt Extra parameter for STAR-Fusion + --star_fusion_opt Extra parameter for STAR-Fusion --fusioncatcher Run FusionCatcher - --fusioncatcher_opt Extra parameters for FusionCatcher + --fusioncatcher_opt Extra parameters for FusionCatcher --ericscript Run Ericscript --pizzly Run Pizzly --squid Run Squid @@ -69,8 +77,13 @@ def helpMessage() { } /* - * SET UP CONFIGURATION VARIABLES - */ +================================================================================ + SET UP CONFIGURATION VARIABLES +================================================================================ +*/ + +// Show help message +if (params.help) exit 0, helpMessage() running_tools = [] visualization_tools = [] @@ -83,19 +96,13 @@ reference = [ fusion_inspector: false ] -// Show help emssage -if (params.help){ - helpMessage() - exit 0 -} - Channel.fromPath(params.fasta, checkIfExists: true) .ifEmpty { exit 1, "Fasta file not found: ${params.fasta}" } - .into { fasta; fasta_arriba } + .into{ fasta; fasta_arriba } Channel.fromPath(params.gtf, checkIfExists: true) .ifEmpty { exit 1, "GTF annotation file not found: ${params.gtf}" } - .into { gtf; gtf_arriba; gtf_arriba_vis; gtf_squid; pizzly_gtf } + .into{ gtf; gtf_arriba; gtf_arriba_vis; gtf_squid; pizzly_gtf } Channel.fromPath(params.transcript, checkIfExists: true) .ifEmpty { exit 1, "Transcript file not found: ${params.transcript}" } @@ -149,22 +156,19 @@ if (params.squid) { running_tools.add("Squid") } if (params.pizzly) { running_tools.add("Pizzly") } - // 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 -} - -if( workflow.profile == 'awsbatch') { - // AWSBatch sanity checking - if (!params.awsqueue || !params.awsregion) exit 1, "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" - // Check outdir paths to be S3 buckets if running on AWSBatch - // related: https://github.com/nextflow-io/nextflow/issues/813 - if (!params.outdir.startsWith('s3:')) exit 1, "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" - // Prevent trace files to be stored on S3 since S3 does not support rolling files. - if (workflow.tracedir.startsWith('s3:')) exit 1, "Specify a local tracedir or run without trace! S3 cannot be used for tracefiles." +if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) custom_runName = workflow.runName + +if (workflow.profile == 'awsbatch') { + // AWSBatch sanity checking + if (!params.awsqueue || !params.awsregion) exit 1, "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" + // Check outdir paths to be S3 buckets if running on AWSBatch + // related: https://github.com/nextflow-io/nextflow/issues/813 + if (!params.outdir.startsWith('s3:')) exit 1, "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" + // Prevent trace files to be stored on S3 since S3 does not support rolling files. + if (workflow.tracedir.startsWith('s3:')) exit 1, "Specify a local tracedir or run without trace! S3 cannot be used for tracefiles." } // Stage config files @@ -174,30 +178,30 @@ ch_output_docs = Channel.fromPath("$baseDir/docs/output.md") /* * Create a channel for input read files */ -if(params.readPaths){ - if(params.singleEnd){ - Channel - .from(params.readPaths) +if(params.readPaths) { + if(params.singleEnd) { + Channel.from(params.readPaths) .map { row -> [ row[0], [file(row[1][0])]] } .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } - .into { read_files_fastqc; read_files_multiqc; read_files_star_fusion; read_files_fusioncatcher; - read_files_fusion_inspector; read_files_ericscript; read_files_pizzly; read_files_squid; read_files_arriba; read_files_summary; read_arriba_vis } + .into{read_files_arriba; read_files_ericscript; read_files_fastqc; read_files_fusion_inspector; read_files_fusioncatcher; read_files_multiqc; read_files_pizzly; read_files_squid; read_files_star_fusion; read_files_summary} } else { - Channel - .from(params.readPaths) + Channel.from(params.readPaths) .map { row -> [ row[0], [file(row[1][0]), file(row[1][1])]] } .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } - .into { read_files_fastqc; read_files_multiqc; read_files_star_fusion; read_files_fusioncatcher; - read_files_fusion_inspector; read_files_ericscript; read_files_pizzly; read_files_squid; read_files_arriba; read_files_summary; read_arriba_vis } + .into{read_files_arriba; read_files_ericscript; read_files_fastqc; read_files_fusion_inspector; read_files_fusioncatcher; read_files_multiqc; read_files_pizzly; read_files_squid; read_files_star_fusion; read_files_summary} } } else { - Channel - .fromFilePairs( params.reads, size: params.singleEnd ? 1 : 2 ) + Channel.fromFilePairs( params.reads, size: params.singleEnd ? 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 --singleEnd on the command line." } - .into { read_files_fastqc; read_files_multiqc; read_files_star_fusion; read_files_fusioncatcher; - read_files_fusion_inspector; read_files_ericscript; read_files_pizzly; read_files_squid; read_files_arriba; read_files_summary; read_arriba_vis } + .into{read_files_arriba; read_files_ericscript; read_files_fastqc; read_files_fusion_inspector; read_files_fusioncatcher; read_files_multiqc; read_files_pizzly; read_files_squid; read_files_star_fusion; read_files_summary} } +/* +================================================================================ + PRINTING SUMMARY +================================================================================ +*/ + // Header log info log.info nfcoreHeader() def summary = [:] @@ -217,7 +221,7 @@ summary['Launch dir'] = workflow.launchDir summary['Working dir'] = workflow.workDir summary['Script dir'] = workflow.projectDir summary['User'] = workflow.userName -if(workflow.profile == 'awsbatch'){ +if(workflow.profile == 'awsbatch') { summary['AWS Region'] = params.awsregion summary['AWS Queue'] = params.awsqueue } @@ -252,9 +256,11 @@ ${summary.collect { k,v -> "
$k
${v ?: ' 2000000000) ? 'true' : 'false' -// // def avail_mem = (task.memory && suff_mem) ? "-m" + "${(task.memory.toBytes() - 6000000000) / task.cpus}" : '' -// } +process arriba_visualization { + tag "$sample" + publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy', + saveAs: {filename -> filename == "visualization.pdf" ? "${sample}.pdf" : filename} + + when: + params.arriba_vis && (!params.singleEnd || params.debug) + + input: + file reference from reference.arriba_vis.collect() + file fusions from arriba_fusions2.collect() + file bam from arriba_bam.collect() + file gtf from gtf_arriba_vis.collect() + + output: + file "${sample}.pdf" optional true into arriba_visualization_output + + 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}" : '' + """ + samtools sort -@ ${task.cpus} ${avail_mem} -O bam ${bam} > Aligned.sortedByCoord.out.bam + samtools index Aligned.sortedByCoord.out.bam + draw_fusions.R \\ + --fusions=${fusions} \\ + --alignments=Aligned.sortedByCoord.out.bam \\ + --output=visualization.pdf \\ + --annotation=${gtf} \\ + --cytobands=${reference}/cytobands_hg38_GRCh38_2018-02-23.tsv \\ + --proteinDomains=${reference}/protein_domains_hg38_GRCh38_2018-03-06.gff3 + """ +} /* * Fusion Inspector */ -// process fusion_inspector { -// tag "$sample" -// publishDir "${params.outdir}/tools/FusionInspector/${sample}", mode: 'copy' - -// when: -// params.fusion_inspector && (!params.singleEnd || params.debug) - -// input: -// set val(sample), file(reads) from read_files_fusion_inspector -// file reference from reference.fusion_inspector.collect() -// file fi_input_list from fusion_inspector_input_list.collect() - -// output: -// file '*' into fusion_inspector_output - -// script: -// def extra_params = params.fusion_inspector_opt ? "${params.fusion_inspector_opt}" : '' -// """ -// FusionInspector \\ -// --fusions ${fi_input_list} \\ -// --genome_lib ${reference} \\ -// --left_fq ${reads[0]} \\ -// --right_fq ${reads[1]} \\ -// --CPU ${task.cpus} \\ -// --out_dir . \\ -// --out_prefix finspector \\ -// --vis ${extra_params} -// """ -// } +process fusion_inspector { + tag "$sample" + publishDir "${params.outdir}/tools/FusionInspector/${sample}", mode: 'copy' + + when: + params.fusion_inspector && (!params.singleEnd || params.debug) + + input: + set val(sample), file(reads) from read_files_fusion_inspector + file reference from reference.fusion_inspector.collect() + file fi_input_list from fusion_inspector_input_list.collect() + + output: + file '*.{fa,gtf,bed,bam,bai,txt}' into fusion_inspector_output + + script: + def extra_params = params.fusion_inspector_opt ? "${params.fusion_inspector_opt}" : '' + """ + FusionInspector \\ + --fusions ${fi_input_list} \\ + --genome_lib ${reference} \\ + --left_fq ${reads[0]} \\ + --right_fq ${reads[1]} \\ + --CPU ${task.cpus} \\ + --out_dir . \\ + --out_prefix finspector \\ + --vis ${extra_params} + """ +} /************************************************************* * Quality check & software verions @@ -740,7 +756,7 @@ process multiqc { file ('fastqc/*') from fastqc_results.collect().ifEmpty([]) file ('software_versions/*') from software_versions_yaml.collect() file workflow_summary from create_workflow_summary(summary) - // file fusions_mq from summary_fusions_mq.collect().ifEmpty([]) + file fusions_mq from summary_fusions_mq.collect().ifEmpty([]) output: file "*multiqc_report.html" into multiqc_report @@ -783,7 +799,7 @@ workflow.onComplete { // Set up the e-mail variables def subject = "[nf-core/rnafusion] Successful: $workflow.runName" - if(!workflow.success){ + if(!workflow.success) { subject = "[nf-core/rnafusion] FAILED: $workflow.runName" } def email_fields = [:] @@ -815,7 +831,7 @@ workflow.onComplete { try { if (workflow.success) { mqc_report = multiqc_report.getVal() - if (mqc_report.getClass() == ArrayList){ + if (mqc_report.getClass() == ArrayList) { log.warn "[nf-core/rnafusion] Found multiple reports from process 'multiqc', will use only one" mqc_report = mqc_report[0] } @@ -844,7 +860,7 @@ workflow.onComplete { // Send the HTML e-mail if (params.email) { try { - if( params.plaintext_email ){ throw GroovyException('Send plaintext e-mail, not HTML') } + if( params.plaintext_email ) { throw GroovyException('Send plaintext e-mail, not HTML') } // Try to send HTML e-mail using sendmail [ 'sendmail', '-t' ].execute() << sendmail_html log.info "[nf-core/rnafusion] Sent summary e-mail to $params.email (sendmail)" @@ -876,7 +892,7 @@ workflow.onComplete { log.info "${c_green}Number of successfully ran process(es) : ${workflow.stats.succeedCountFmt} ${c_reset}" } - if(workflow.success){ + if(workflow.success) { log.info "${c_purple}[nf-core/rnafusion]${c_green} Pipeline completed successfully${c_reset}" } else { checkHostname() @@ -885,7 +901,7 @@ workflow.onComplete { } -def nfcoreHeader(){ +def nfcoreHeader() { // Log colors ANSI codes c_reset = params.monochrome_logs ? '' : "\033[0m"; c_dim = params.monochrome_logs ? '' : "\033[2m"; @@ -908,16 +924,16 @@ def nfcoreHeader(){ """.stripIndent() } -def checkHostname(){ +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){ + 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)){ + 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" + From 4b0132939b925329dfb7ee1a85152bb604aaa126 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 21 Jan 2020 16:45:38 +0100 Subject: [PATCH 0013/1520] small refactoring --- main.nf | 87 +++++++++++++++++++++++++++------------------------------ 1 file changed, 41 insertions(+), 46 deletions(-) diff --git a/main.nf b/main.nf index 04fcb88f..792fedd0 100644 --- a/main.nf +++ b/main.nf @@ -1,8 +1,8 @@ #!/usr/bin/env nextflow /* -======================================================================================== - nf-core/rnafusion -======================================================================================== +================================================================================ + nf-core/rnafusion +================================================================================ nf-core/rnafusion: RNA-seq analysis pipeline for detection gene-fusions -------------------------------------------------------------------------------- @@ -90,71 +90,67 @@ visualization_tools = [] reference = [ arriba: false, arriba_vis: false, - star_fusion: false, - fusioncatcher: false, ericscript: false, - fusion_inspector: false + fusion_inspector: false, + fusioncatcher: false, + star_fusion: false ] Channel.fromPath(params.fasta, checkIfExists: true) - .ifEmpty { exit 1, "Fasta file not found: ${params.fasta}" } - .into{ fasta; fasta_arriba } + .ifEmpty{exit 1, "Fasta file not found: ${params.fasta}"} + .into{fasta; fasta_arriba} Channel.fromPath(params.gtf, checkIfExists: true) - .ifEmpty { exit 1, "GTF annotation file not found: ${params.gtf}" } - .into{ gtf; gtf_arriba; gtf_arriba_vis; gtf_squid; pizzly_gtf } + .ifEmpty{exit 1, "GTF annotation file not found: ${params.gtf}"} + .into{gtf; gtf_arriba; gtf_arriba_vis; gtf_pizzly; gtf_squid} Channel.fromPath(params.transcript, checkIfExists: true) - .ifEmpty { exit 1, "Transcript file not found: ${params.transcript}" } - .set { transcript } + .ifEmpty{exit 1, "Transcript file not found: ${params.transcript}"} + .set {transcript} -if (!params.star_index && (!params.fasta && !params.gtf)) { - exit 1, "Either specify STAR-INDEX or Fasta and GTF!" -} +if (!params.star_index && (!params.fasta && !params.gtf)) exit 1, "Either specify STAR-INDEX or Fasta and GTF!" -if (!params.databases) { - exit 1, "Database path for fusion-report has to be specified!" -} +if (!params.databases) exit 1, "Database path for fusion-report has to be specified!" if (params.arriba) { running_tools.add("Arriba") reference.arriba = Channel.fromPath(params.arriba_ref, checkIfExists: true) - .ifEmpty { exit 1, "Arriba reference directory not found!" } + .ifEmpty{exit 1, "Arriba reference directory not found!"} } if (params.arriba_vis) { visualization_tools.add("Arriba") reference.arriba_vis = Channel.fromPath(params.arriba_ref, checkIfExists: true) - .ifEmpty { exit 1, "Arriba visualization reference directory not found!" } + .ifEmpty{exit 1, "Arriba visualization reference directory not found!"} } -if (params.star_fusion) { - running_tools.add("STAR-Fusion") - reference.star_fusion = Channel.fromPath(params.star_fusion_ref, checkIfExists: true) - .ifEmpty { exit 1, "Star-Fusion reference directory not found!" } -} - -if (params.fusion_inspector) { - visualization_tools.add("Fusion-Inspector") - reference.fusion_inspector = Channel.fromPath(params.star_fusion_ref, checkIfExists: true) - .ifEmpty { exit 1, "Fusion-Inspector reference not found" } +if (params.ericscript) { + running_tools.add("EricScript") + reference.ericscript = Channel.fromPath(params.ericscript_ref, checkIfExists: true) + .ifEmpty{exit 1, "EricsSript reference not found!"} } if (params.fusioncatcher) { running_tools.add("Fusioncatcher") reference.fusioncatcher = Channel.fromPath(params.fusioncatcher_ref, checkIfExists: true) - .ifEmpty { exit 1, "Fusioncatcher data directory not found!" } + .ifEmpty{exit 1, "Fusioncatcher data directory not found!"} } -if (params.ericscript) { - running_tools.add("EricScript") - reference.ericscript = Channel.fromPath(params.ericscript_ref, checkIfExists: true) - .ifEmpty { exit 1, "EricsSript reference not found!" } +if (params.fusion_inspector) { + visualization_tools.add("Fusion-Inspector") + reference.fusion_inspector = Channel.fromPath(params.star_fusion_ref, checkIfExists: true) + .ifEmpty{exit 1, "Fusion-Inspector reference not found" } } -if (params.squid) { running_tools.add("Squid") } +if (params.pizzly) running_tools.add("Pizzly") -if (params.pizzly) { running_tools.add("Pizzly") } +if (params.star_fusion) { + running_tools.add("STAR-Fusion") + reference.star_fusion = Channel.fromPath(params.star_fusion_ref, checkIfExists: true) + .ifEmpty{exit 1, "Star-Fusion reference directory not found!"} +} + +if (params.squid) running_tools.add("Squid") // Has the run name been specified by the user? // This has the bonus effect of catching both -name and --name @@ -182,17 +178,17 @@ if(params.readPaths) { if(params.singleEnd) { Channel.from(params.readPaths) .map { row -> [ row[0], [file(row[1][0])]] } - .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } + .ifEmpty{exit 1, "params.readPaths was empty - no input files supplied" } .into{read_files_arriba; read_files_ericscript; read_files_fastqc; read_files_fusion_inspector; read_files_fusioncatcher; read_files_multiqc; read_files_pizzly; read_files_squid; read_files_star_fusion; read_files_summary} } else { Channel.from(params.readPaths) .map { row -> [ row[0], [file(row[1][0]), file(row[1][1])]] } - .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } + .ifEmpty{exit 1, "params.readPaths was empty - no input files supplied" } .into{read_files_arriba; read_files_ericscript; read_files_fastqc; read_files_fusion_inspector; read_files_fusioncatcher; read_files_multiqc; read_files_pizzly; read_files_squid; read_files_star_fusion; read_files_summary} } } else { Channel.fromFilePairs( params.reads, size: params.singleEnd ? 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 --singleEnd on the command line." } + .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 --singleEnd on the command line." } .into{read_files_arriba; read_files_ericscript; read_files_fastqc; read_files_fusion_inspector; read_files_fusioncatcher; read_files_multiqc; read_files_pizzly; read_files_squid; read_files_star_fusion; read_files_summary} } @@ -268,8 +264,8 @@ ${summary.collect { k,v -> "
$k
${v ?: ' Date: Tue, 21 Jan 2020 17:02:15 +0100 Subject: [PATCH 0014/1520] join all reports --- main.nf | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/main.nf b/main.nf index 792fedd0..acf7edb4 100644 --- a/main.nf +++ b/main.nf @@ -323,7 +323,8 @@ process arriba { file gtf from gtf_arriba.collect() output: - file "${sample}_arriba.tsv" optional true into arriba_fusions1, arriba_fusions2 + set val(sample), file("${sample}_arriba.tsv") optional true into arriba_fusions_summary + file "${sample}_arriba.tsv" optional true into arriba_fusions_visualization file "${sample}_arriba.bam" optional true into arriba_bam file '*.{tsv,txt}' into arriba_output @@ -382,7 +383,7 @@ process star_fusion { file star_index from star_index_star_fusion.collect() output: - file "${sample}_star-fusion.tsv" optional true into star_fusion_fusions + set val(sample), file("${sample}_star-fusion.tsv") optional true into star_fusion_fusions file '*.{tsv,txt}' into star_fusion_output script: @@ -442,7 +443,7 @@ process fusioncatcher { file data_dir from reference.fusioncatcher.collect() output: - file "${sample}_fusioncatcher.txt" optional true into fusioncatcher_fusions + set val(sample), file("${sample}_fusioncatcher.txt") optional true into fusioncatcher_fusions file '*.{txt,zip,log}' into fusioncatcher_output script: @@ -474,7 +475,7 @@ process ericscript { file reference from reference.ericscript.collect() output: - file "./tmp/${sample}_ericscript.tsv" optional true into ericscript_fusions + set val(sample), file("./tmp/${sample}_ericscript.tsv") optional true into ericscript_fusions file './tmp/fusions.results.total.tsv' optional true into ericscript_output script: @@ -505,7 +506,7 @@ process pizzly { file transcript from transcript.collect() output: - file "${sample}_pizzly.txt" optional true into pizzly_fusions + set val(sample), file("${sample}_pizzly.txt") optional true into pizzly_fusions file '*.{json,txt}' into pizzly_output script: @@ -540,7 +541,7 @@ process squid { file gtf from gtf_squid.collect() output: - file "${sample}_fusions_annotated.txt" optional true into squid_fusions + set val(sample), file("${sample}_fusions_annotated.txt") optional true into squid_fusions file '*.txt' into squid_output script: @@ -562,6 +563,14 @@ process squid { """ } +read_files_summary + .join(arriba_fusions_summary) + .join(ericscript_fusions) + .join(fusioncatcher_fusions + .join(pizzly_fusions) + .join(squid_fusions) + .join(star_fusion_fusions) + /************************************************************* * Summarizing results from tools ************************************************************/ @@ -573,13 +582,7 @@ process squid { !params.debug && (params.arriba || params.fusioncatcher || params.star_fusion || params.ericscript || params.pizzly || params.squid) input: - set val(sample), file(reads) from read_files_summary - file arriba from arriba_fusions1.collect().ifEmpty('') - file fusioncatcher from fusioncatcher_fusions.collect().ifEmpty('') - file starfusion from star_fusion_fusions.collect().ifEmpty('') - file ericscript from ericscript_fusions.collect().ifEmpty('') - file pizzly from pizzly_fusions.collect().ifEmpty('') - file squid from squid_fusions.collect().ifEmpty('') + set val(sample), file(reads), file(reports) from read_files_summary output: file "${sample}_fusion_list.tsv" into fusion_inspector_input_list @@ -619,7 +622,7 @@ process arriba_visualization { input: file reference from reference.arriba_vis.collect() - file fusions from arriba_fusions2.collect() + file fusions from arriba_fusions_visualization.collect() file bam from arriba_bam.collect() file gtf from gtf_arriba_vis.collect() From cf8cc3b799966d56342519b71510943fb522716f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 22 Jan 2020 12:48:03 +0100 Subject: [PATCH 0015/1520] fix channel --- main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index acf7edb4..754f3b17 100644 --- a/main.nf +++ b/main.nf @@ -563,7 +563,7 @@ process squid { """ } -read_files_summary +files_and_reports_summary = read_files_summary .join(arriba_fusions_summary) .join(ericscript_fusions) .join(fusioncatcher_fusions @@ -582,7 +582,7 @@ read_files_summary !params.debug && (params.arriba || params.fusioncatcher || params.star_fusion || params.ericscript || params.pizzly || params.squid) input: - set val(sample), file(reads), file(reports) from read_files_summary + set val(sample), file(reads), file(reports) from files_and_reports_summary output: file "${sample}_fusion_list.tsv" into fusion_inspector_input_list From 6cfa34338064be50ee5690ba3b48e5ec9d64ca7c Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 22 Jan 2020 12:50:16 +0100 Subject: [PATCH 0016/1520] fix typo --- main.nf | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/main.nf b/main.nf index 754f3b17..2966cd5a 100644 --- a/main.nf +++ b/main.nf @@ -566,15 +566,18 @@ process squid { files_and_reports_summary = read_files_summary .join(arriba_fusions_summary) .join(ericscript_fusions) - .join(fusioncatcher_fusions + .join(fusioncatcher_fusions) .join(pizzly_fusions) .join(squid_fusions) .join(star_fusion_fusions) -/************************************************************* - * Summarizing results from tools - ************************************************************/ - process summary { +/* +================================================================================ + SUMMARIZING RESULTS +================================================================================ +*/ + +process summary { tag "$sample" publishDir "${params.outdir}/Reports/${sample}", mode: 'copy' From 7114ade04fc9147a5222df3ff488b452cc54b32d Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 22 Jan 2020 12:58:01 +0100 Subject: [PATCH 0017/1520] understanding channel invocation --- main.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main.nf b/main.nf index 2966cd5a..44dce9e7 100644 --- a/main.nf +++ b/main.nf @@ -565,11 +565,11 @@ process squid { files_and_reports_summary = read_files_summary .join(arriba_fusions_summary) - .join(ericscript_fusions) - .join(fusioncatcher_fusions) - .join(pizzly_fusions) - .join(squid_fusions) - .join(star_fusion_fusions) +// .join(ericscript_fusions) +// .join(fusioncatcher_fusions) +// .join(pizzly_fusions) +// .join(squid_fusions) +// .join(star_fusion_fusions) /* ================================================================================ From 12e477a97480a2a81eecdf0ae092f26de6ccf1d7 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 22 Jan 2020 12:59:44 +0100 Subject: [PATCH 0018/1520] add dump --- main.nf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/main.nf b/main.nf index 44dce9e7..2b4dfad1 100644 --- a/main.nf +++ b/main.nf @@ -563,6 +563,9 @@ process squid { """ } +read_files_summary = read_files_summary.dump(tag:'read_files_summary') +arriba_fusions_summary = arriba_fusions_summary.dump(tag:'arriba_fusions_summary') + files_and_reports_summary = read_files_summary .join(arriba_fusions_summary) // .join(ericscript_fusions) From 9523f263a6aecf86bedea079b55172f5fd4e90d3 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 22 Jan 2020 13:18:18 +0100 Subject: [PATCH 0019/1520] refactor star index building --- main.nf | 68 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/main.nf b/main.nf index 2b4dfad1..46e889f3 100644 --- a/main.nf +++ b/main.nf @@ -261,39 +261,39 @@ ${summary.collect { k,v -> "
$k
${v ?: ' Date: Wed, 22 Jan 2020 13:22:26 +0100 Subject: [PATCH 0020/1520] fix channel value --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 46e889f3..9ce23cc2 100644 --- a/main.nf +++ b/main.nf @@ -290,7 +290,7 @@ process build_star_index { """ } -ch_star_index = params.star_index ? Channel.fromPath(params.star_index).ifEmpty{exit 1, "STAR index not found: ${params.star_index}" } : star_index +ch_star_index = params.star_index ? Channel.value(file(params.star_index)).ifEmpty{exit 1, "STAR index not found: ${params.star_index}" } : star_index ch_star_index = ch_star_index.dump(tag:'ch_star_index') From 96a7096fa9cf7a12670b154b17baf6067949b621 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 22 Jan 2020 13:39:07 +0100 Subject: [PATCH 0021/1520] refactor some channels --- main.nf | 102 ++++++++++++++++++++++++++------------------------------ 1 file changed, 47 insertions(+), 55 deletions(-) diff --git a/main.nf b/main.nf index 9ce23cc2..79a43892 100644 --- a/main.nf +++ b/main.nf @@ -96,17 +96,9 @@ reference = [ star_fusion: false ] -Channel.fromPath(params.fasta, checkIfExists: true) - .ifEmpty{exit 1, "Fasta file not found: ${params.fasta}"} - .into{fasta; fasta_arriba} - -Channel.fromPath(params.gtf, checkIfExists: true) - .ifEmpty{exit 1, "GTF annotation file not found: ${params.gtf}"} - .into{gtf; gtf_arriba; gtf_arriba_vis; gtf_pizzly; gtf_squid} - -Channel.fromPath(params.transcript, checkIfExists: true) - .ifEmpty{exit 1, "Transcript file not found: ${params.transcript}"} - .set {transcript} +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}"} +ch_transcript = Channel.value(file(params.transcript)).ifEmpty{exit 1, "Transcript file not found: ${params.transcript}"} if (!params.star_index && (!params.fasta && !params.gtf)) exit 1, "Either specify STAR-INDEX or Fasta and GTF!" @@ -267,11 +259,11 @@ process build_star_index { publishDir "${params.outdir}/star-index", mode: 'copy' input: - file fasta - file gtf + file(fasta) from ch_fasta + file(gtf) from ch_gtf output: - file "star" into star_index + file("star") into star_index when: !(params.star_index) @@ -317,16 +309,16 @@ process arriba { input: set val(sample), file(reads) from read_files_arriba - file reference from reference.arriba.collect() + file(reference) from reference.arriba.collect() file(star_index) from ch_star_index - file fasta from fasta_arriba.collect() - file gtf from gtf_arriba.collect() + file(fasta) from ch_fasta + file(gtf) from ch_gtf output: set val(sample), file("${sample}_arriba.tsv") optional true into arriba_fusions_summary - file "${sample}_arriba.tsv" optional true into arriba_fusions_visualization - file "${sample}_arriba.bam" optional true into arriba_bam - file '*.{tsv,txt}' into arriba_output + file("${sample}_arriba.tsv") optional true into arriba_fusions_visualization + file("${sample}_arriba.bam") optional true into arriba_bam + file("*.{tsv,txt}") into arriba_output script: def extra_params = params.arriba_opt ? "${params.arriba_opt}" : '' @@ -379,12 +371,12 @@ process star_fusion { input: set val(sample), file(reads) from read_files_star_fusion - file reference from reference.star_fusion.collect() + file(reference) from reference.star_fusion.collect() file(star_index) from ch_star_index output: set val(sample), file("${sample}_star-fusion.tsv") optional true into star_fusion_fusions - file '*.{tsv,txt}' into star_fusion_output + file("*.{tsv,txt}") into star_fusion_output script: def avail_mem = task.memory ? "--limitBAMsortRAM ${task.memory.toBytes() - 100000000}" : '' @@ -440,11 +432,11 @@ process fusioncatcher { input: set val(sample), file(reads) from read_files_fusioncatcher - file data_dir from reference.fusioncatcher.collect() + file(data_dir) from reference.fusioncatcher.collect() output: set val(sample), file("${sample}_fusioncatcher.txt") optional true into fusioncatcher_fusions - file '*.{txt,zip,log}' into fusioncatcher_output + file("*.{txt,zip,log}") into fusioncatcher_output script: option = params.singleEnd ? reads[0] : "${reads[0]},${reads[1]}" @@ -472,11 +464,11 @@ process ericscript { input: set val(sample), file(reads) from read_files_ericscript - file reference from reference.ericscript.collect() + file(reference) from reference.ericscript.collect() output: set val(sample), file("./tmp/${sample}_ericscript.tsv") optional true into ericscript_fusions - file './tmp/fusions.results.total.tsv' optional true into ericscript_output + file("./tmp/fusions.results.total.tsv") optional true into ericscript_output script: """ @@ -502,12 +494,12 @@ process pizzly { input: set val(sample), file(reads) from read_files_pizzly - file gtf from gtf_pizzly.collect() - file transcript from transcript.collect() + 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 + file("*.{json,txt}") into pizzly_output script: """ @@ -538,11 +530,11 @@ process squid { input: set val(sample), file(reads) from read_files_squid file(star_index) from ch_star_index - file gtf from gtf_squid.collect() + file(gtf) from ch_gtf output: set val(sample), file("${sample}_fusions_annotated.txt") optional true into squid_fusions - file '*.txt' into squid_output + file("*.txt") into squid_output script: def avail_mem = task.memory ? "--limitBAMsortRAM ${task.memory.toBytes() - 100000000}" : '' @@ -591,9 +583,9 @@ process summary { set val(sample), file(reads), file(reports) from files_and_reports_summary output: - file "${sample}_fusion_list.tsv" into fusion_inspector_input_list - file "${sample}_fusion_genes_mqc.json" into summary_fusions_mq - file '*' into report + file("${sample}_fusion_list.tsv") into fusion_inspector_input_list + file("${sample}_fusion_genes_mqc.json") into summary_fusions_mq + file("*") into report script: def extra_params = params.fusion_report_opt ? "${params.fusion_report_opt}" : '' @@ -627,13 +619,13 @@ process arriba_visualization { params.arriba_vis && (!params.singleEnd || params.debug) input: - file reference from reference.arriba_vis.collect() - file fusions from arriba_fusions_visualization.collect() - file bam from arriba_bam.collect() - file gtf from gtf_arriba_vis.collect() + file(reference) from reference.arriba_vis.collect() + file(fusions) from arriba_fusions_visualization.collect() + file(bam) from arriba_bam.collect() + file(gtf) from ch_gtf output: - file "${sample}.pdf" optional true into arriba_visualization_output + file("${sample}.pdf") optional true into arriba_visualization_output script: def suff_mem = ("${(task.memory.toBytes() - 6000000000) / task.cpus}" > 2000000000) ? 'true' : 'false' @@ -663,11 +655,11 @@ process fusion_inspector { input: set val(sample), file(reads) from read_files_fusion_inspector - file reference from reference.fusion_inspector.collect() - file fi_input_list from fusion_inspector_input_list.collect() + file(reference) from reference.fusion_inspector.collect() + file(fi_input_list) from fusion_inspector_input_list.collect() output: - file '*.{fa,gtf,bed,bam,bai,txt}' into fusion_inspector_output + file("*.{fa,gtf,bed,bam,bai,txt}") into fusion_inspector_output script: def extra_params = params.fusion_inspector_opt ? "${params.fusion_inspector_opt}" : '' @@ -702,8 +694,8 @@ process get_software_versions { !params.debug output: - file 'software_versions_mqc.yaml' into software_versions_yaml - file "software_versions.csv" + file('software_versions_mqc.yaml') into software_versions_yaml + file('software_versions.csv') script: """ @@ -738,7 +730,7 @@ process fastqc { set val(name), file(reads) from read_files_fastqc output: - file "*_fastqc.{zip,html}" into fastqc_results + file("*_fastqc.{zip,html}") into fastqc_results script: """ @@ -756,16 +748,16 @@ process multiqc { !params.debug input: - file multiqc_config from ch_multiqc_config - file ('fastqc/*') from fastqc_results.collect().ifEmpty([]) - file ('software_versions/*') from software_versions_yaml.collect() - file workflow_summary from create_workflow_summary(summary) - file fusions_mq from summary_fusions_mq.collect().ifEmpty([]) + file(multiqc_config) from ch_multiqc_config + file("fastqc/*") from fastqc_results.collect().ifEmpty([]) + file("software_versions/*") from software_versions_yaml.collect() + file(workflow_summary) from create_workflow_summary(summary) + file(fusions_mq) from summary_fusions_mq.collect().ifEmpty([]) output: - file "*multiqc_report.html" into multiqc_report - file "*_data" - file "multiqc_plots" + file("*multiqc_report.html") into multiqc_report + file("*_data") + file("multiqc_plots") script: rtitle = custom_runName ? "--title \"$custom_runName\"" : '' @@ -785,10 +777,10 @@ process output_documentation { !params.debug input: - file output_docs from ch_output_docs + file(output_docs) from ch_output_docs output: - file "results_description.html" + file("results_description.html") script: """ From 38bab216039c20afb61714eafd4febd1fd13334f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 22 Jan 2020 14:13:59 +0100 Subject: [PATCH 0022/1520] refactor reference channels --- main.nf | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/main.nf b/main.nf index 79a43892..c9338729 100644 --- a/main.nf +++ b/main.nf @@ -34,16 +34,16 @@ def helpMessage() { Tool flags: --arriba Run Arriba - --arriba_opt Extra parameter for Arriba + --arriba_opt Specify extra parameters for Arriba --star_fusion Run STAR-Fusion - --star_fusion_opt Extra parameter for STAR-Fusion + --star_fusion_opt Specify extra parameters for STAR-Fusion --fusioncatcher Run FusionCatcher - --fusioncatcher_opt Extra parameters for FusionCatcher + --fusioncatcher_opt Specify extra parameters for FusionCatcher --ericscript Run Ericscript --pizzly Run Pizzly --squid Run Squid --databases Database path for fusion-report - --fusion_report_opt fusion-report extra parameters + --fusion_report_opt Specify extra parameters for fusion-report Visualization flags: --arriba_vis Generate a PDF visualization per detected fusion @@ -57,7 +57,7 @@ def helpMessage() { --star_fusion_ref Path to STAR-Fusion reference --fusioncatcher_ref Path to Fusioncatcher reference --ericscript_ref Path to Ericscript reference - --arriba_ref Path to Arriba references + --arriba_ref Path to Arriba reference Options: --read_length Length of the reads. Default: 100 @@ -106,40 +106,34 @@ if (!params.databases) exit 1, "Database path for fusion-report has to be specif if (params.arriba) { running_tools.add("Arriba") - reference.arriba = Channel.fromPath(params.arriba_ref, checkIfExists: true) - .ifEmpty{exit 1, "Arriba reference directory not found!"} + reference.arriba = Channel.value(file(params.arriba_ref)).ifEmpty{exit 1, "Arriba reference directory not found!"} } if (params.arriba_vis) { visualization_tools.add("Arriba") - reference.arriba_vis = Channel.fromPath(params.arriba_ref, checkIfExists: true) - .ifEmpty{exit 1, "Arriba visualization reference directory not found!"} + reference.arriba_vis = Channel.value(file(params.arriba_ref)).ifEmpty{exit 1, "Arriba visualization reference directory not found!"} } if (params.ericscript) { running_tools.add("EricScript") - reference.ericscript = Channel.fromPath(params.ericscript_ref, checkIfExists: true) - .ifEmpty{exit 1, "EricsSript reference not found!"} + reference.ericscript = Channel.value(file(params.ericscript_ref)).ifEmpty{exit 1, "EricsSript reference not found!"} } if (params.fusioncatcher) { running_tools.add("Fusioncatcher") - reference.fusioncatcher = Channel.fromPath(params.fusioncatcher_ref, checkIfExists: true) - .ifEmpty{exit 1, "Fusioncatcher data directory not found!"} + reference.fusioncatcher = Channel.value(file(params.fusioncatcher_ref)).ifEmpty{exit 1, "Fusioncatcher data directory not found!"} } if (params.fusion_inspector) { visualization_tools.add("Fusion-Inspector") - reference.fusion_inspector = Channel.fromPath(params.star_fusion_ref, checkIfExists: true) - .ifEmpty{exit 1, "Fusion-Inspector reference not found" } + reference.fusion_inspector = Channel.value(file(params.star_fusion_ref)).ifEmpty{exit 1, "Fusion-Inspector reference not found" } } if (params.pizzly) running_tools.add("Pizzly") if (params.star_fusion) { running_tools.add("STAR-Fusion") - reference.star_fusion = Channel.fromPath(params.star_fusion_ref, checkIfExists: true) - .ifEmpty{exit 1, "Star-Fusion reference directory not found!"} + reference.star_fusion = Channel.value(file(params.star_fusion_ref)).ifEmpty{exit 1, "Star-Fusion reference directory not found!"} } if (params.squid) running_tools.add("Squid") @@ -309,7 +303,7 @@ process arriba { input: set val(sample), file(reads) from read_files_arriba - file(reference) from reference.arriba.collect() + file(reference) from reference.arriba file(star_index) from ch_star_index file(fasta) from ch_fasta file(gtf) from ch_gtf @@ -371,7 +365,7 @@ process star_fusion { input: set val(sample), file(reads) from read_files_star_fusion - file(reference) from reference.star_fusion.collect() + file(reference) from reference.star_fusion file(star_index) from ch_star_index output: @@ -432,7 +426,7 @@ process fusioncatcher { input: set val(sample), file(reads) from read_files_fusioncatcher - file(data_dir) from reference.fusioncatcher.collect() + file(data_dir) from reference.fusioncatcher output: set val(sample), file("${sample}_fusioncatcher.txt") optional true into fusioncatcher_fusions @@ -464,7 +458,7 @@ process ericscript { input: set val(sample), file(reads) from read_files_ericscript - file(reference) from reference.ericscript.collect() + file(reference) from reference.ericscript output: set val(sample), file("./tmp/${sample}_ericscript.tsv") optional true into ericscript_fusions @@ -619,7 +613,7 @@ process arriba_visualization { params.arriba_vis && (!params.singleEnd || params.debug) input: - file(reference) from reference.arriba_vis.collect() + file(reference) from reference.arriba_vis file(fusions) from arriba_fusions_visualization.collect() file(bam) from arriba_bam.collect() file(gtf) from ch_gtf @@ -655,7 +649,7 @@ process fusion_inspector { input: set val(sample), file(reads) from read_files_fusion_inspector - file(reference) from reference.fusion_inspector.collect() + file(reference) from reference.fusion_inspector file(fi_input_list) from fusion_inspector_input_list.collect() output: From 64b00acb61d0463ea124454ac025f5146b239c70 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 22 Jan 2020 14:23:56 +0100 Subject: [PATCH 0023/1520] add dump --- main.nf | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index c9338729..e1c7558d 100644 --- a/main.nf +++ b/main.nf @@ -352,6 +352,8 @@ process arriba { """ } +arriba_fusions_summary = arriba_fusions_summary.dump(tag:'arriba_fusions_summary') + /* * STAR-Fusion */ @@ -413,6 +415,8 @@ process star_fusion { """ } +star_fusion_fusions = star_fusion_fusions.dump(tag:'star_fusion_fusions') + /* * Fusioncatcher */ @@ -445,6 +449,8 @@ process fusioncatcher { """ } +fusioncatcher_fusions = fusioncatcher_fusions.dump(tag:'fusioncatcher_fusions') + /* * Ericscript */ @@ -475,6 +481,8 @@ process ericscript { """ } +ericscript_fusions = ericscript_fusions.dump(tag:'ericscript_fusions') + /* * Pizzly */ @@ -510,6 +518,8 @@ process pizzly { """ } +pizzly_fusions = pizzly_fusions.dump(tag:'pizzly_fusions') + /* * Squid */ @@ -549,14 +559,16 @@ process squid { """ } +squid_fusions = squid_fusions.dump(tag:'squid_fusions') + read_files_summary = read_files_summary.dump(tag:'read_files_summary') arriba_fusions_summary = arriba_fusions_summary.dump(tag:'arriba_fusions_summary') files_and_reports_summary = read_files_summary - .join(arriba_fusions_summary) + .join(pizzly_fusions) +// .join(arriba_fusions_summary) // .join(ericscript_fusions) // .join(fusioncatcher_fusions) -// .join(pizzly_fusions) // .join(squid_fusions) // .join(star_fusion_fusions) From 16442932c7822deed522a273119565d4c96bccf7 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 22 Jan 2020 15:23:58 +0100 Subject: [PATCH 0024/1520] change output file names --- main.nf | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/main.nf b/main.nf index e1c7558d..77ad17f8 100644 --- a/main.nf +++ b/main.nf @@ -291,12 +291,7 @@ ch_star_index = ch_star_index.dump(tag:'ch_star_index') */ process arriba { tag "$sample" - publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy', - saveAs: {filename -> - if (filename == "fusions.tsv") "${sample}_arriba.tsv" - else if (filename == "Aligned.out.bam") "${sample}_arriba.bam" - else filename - } + publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy' when: params.arriba && (!params.singleEnd || params.debug) @@ -339,14 +334,16 @@ process arriba { --readFilesCommand zcat \\ --sjdbOverhang ${params.read_length - 1} | - tee Aligned.out.bam | + mv Aligned.out.bam ${sample}_arriba.bam + + tee ${sample}_arriba.bam | arriba \\ -x /dev/stdin \\ -a ${fasta} \\ -g ${gtf} \\ -b ${reference}/blacklist_hg38_GRCh38_2018-11-04.tsv \\ - -o fusions.tsv -O fusions.discarded.tsv \\ + -o ${sample}_arriba.tsv -O ${sample}_discarded_arriba.tsv \\ -T -P \\ ${extra_params} """ @@ -359,8 +356,7 @@ arriba_fusions_summary = arriba_fusions_summary.dump(tag:'arriba_fusions_summary */ process star_fusion { tag "$sample" - publishDir "${params.outdir}/tools/Star-Fusion/${sample}", mode: 'copy', - saveAs: {filename -> filename == "star-fusion.fusion_predictions.tsv" ? "${sample}_star-fusion.tsv" : filename} + publishDir "${params.outdir}/tools/Star-Fusion/${sample}", mode: 'copy' when: params.star_fusion || (params.star_fusion && params.debug) @@ -412,6 +408,8 @@ process star_fusion { --CPU ${task.cpus} \\ --examine_coding_effect \\ --output_dir . ${extra_params} + + mv star-fusion.fusion_predictions.tsv ${sample}_star-fusion.tsv """ } @@ -422,8 +420,7 @@ star_fusion_fusions = star_fusion_fusions.dump(tag:'star_fusion_fusions') */ process fusioncatcher { tag "$sample" - publishDir "${params.outdir}/tools/Fusioncatcher/${sample}", mode: 'copy', - saveAs: {filename -> filename == "final-list_candidate-fusion-genes.txt" ? "${sample}_fusioncatcher.txt" : filename} + publishDir "${params.outdir}/tools/Fusioncatcher/${sample}", mode: 'copy' when: params.fusioncatcher || (params.fusioncatcher && params.debug) @@ -446,6 +443,8 @@ process fusioncatcher { --threads ${task.cpus} \\ -o . \\ --skip-blat ${extra_params} + + mv final-list_candidate-fusion-genes.txt ${sample}_fusioncatcher.txt """ } @@ -456,8 +455,7 @@ fusioncatcher_fusions = fusioncatcher_fusions.dump(tag:'fusioncatcher_fusions') */ process ericscript { tag "$sample" - publishDir "${params.outdir}/tools/EricScript/${sample}", mode: 'copy', - saveAs: {filename -> filename == "fusions.results.filtered.tsv" ? "${sample}_ericscript.tsv" : filename} + publishDir "${params.outdir}/tools/EricScript/${sample}", mode: 'copy' when: params.ericscript && (!params.singleEnd || params.debug) @@ -478,6 +476,8 @@ process ericscript { -p ${task.cpus} \\ -o ./tmp \\ ${reads} + + mv fusions.results.filtered.tsv ${sample}_ericscript.tsv """ } @@ -488,8 +488,7 @@ ericscript_fusions = ericscript_fusions.dump(tag:'ericscript_fusions') */ process pizzly { tag "$sample" - publishDir "${params.outdir}/tools/Pizzly/${sample}", mode: 'copy', - saveAs: {filename -> filename == "pizzly_fusions.txt" ? "${sample}_pizzly.txt" : filename} + publishDir "${params.outdir}/tools/Pizzly/${sample}", mode: 'copy' when: params.pizzly && (!params.singleEnd || params.debug) @@ -515,6 +514,8 @@ process pizzly { --fasta ${transcript} \\ --output pizzly_fusions output/fusion.txt pizzly_flatten_json.py pizzly_fusions.json pizzly_fusions.txt + + mv pizzly_fusions.txt ${sample}_pizzly.txt """ } @@ -525,8 +526,7 @@ pizzly_fusions = pizzly_fusions.dump(tag:'pizzly_fusions') */ process squid { tag "$sample" - publishDir "${params.outdir}/tools/Squid/${sample}", mode: 'copy', - saveAs: {filename -> filename == "fusions_annotated.txt" ? "${sample}_fusions_annotated.txt" : filename} + publishDir "${params.outdir}/tools/Squid/${sample}", mode: 'copy' when: params.squid && (!params.singleEnd || params.debug) @@ -556,6 +556,8 @@ process squid { samtools view -bS Chimeric.out.sam > ${sample}Chimeric.out.bam squid -b ${sample}Aligned.sortedByCoord.out.bam -c ${sample}Chimeric.out.bam -o fusions AnnotateSQUIDOutput.py ${gtf} fusions_sv.txt fusions_annotated.txt + + fusions_annotated.txt ${sample}_fusions_annotated.txt """ } From 702feae8a72717016c6c60a0d3790f1d12bbd546 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 22 Jan 2020 15:34:54 +0100 Subject: [PATCH 0025/1520] reorganizing summary input --- main.nf | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/main.nf b/main.nf index 77ad17f8..33f6f650 100644 --- a/main.nf +++ b/main.nf @@ -567,12 +567,12 @@ read_files_summary = read_files_summary.dump(tag:'read_files_summary') arriba_fusions_summary = arriba_fusions_summary.dump(tag:'arriba_fusions_summary') files_and_reports_summary = read_files_summary - .join(pizzly_fusions) -// .join(arriba_fusions_summary) -// .join(ericscript_fusions) -// .join(fusioncatcher_fusions) -// .join(squid_fusions) -// .join(star_fusion_fusions) + .join(arriba_fusions_summary, remainder: true) + .join(ericscript_fusions, remainder: true) + .join(fusioncatcher_fusions, remainder: true) + .join(pizzly_fusions, remainder: true) + .join(squid_fusions, remainder: true) + .join(star_fusion_fusions, remainder: true) /* ================================================================================ @@ -588,7 +588,7 @@ process summary { !params.debug && (params.arriba || params.fusioncatcher || params.star_fusion || params.ericscript || params.pizzly || params.squid) input: - set val(sample), file(reads), file(reports) from files_and_reports_summary + set val(sample), file(reads), file(arriba), file(ericscript), file(fusioncatcher), file(pizzly), file(squid), file(starfusion) from files_and_reports_summary output: file("${sample}_fusion_list.tsv") into fusion_inspector_input_list @@ -598,11 +598,11 @@ process summary { script: def extra_params = params.fusion_report_opt ? "${params.fusion_report_opt}" : '' def tools = !arriba.empty() ? "--arriba ${arriba} " : '' - tools += !fusioncatcher.empty() ? "--fusioncatcher ${fusioncatcher} " : '' - tools += !starfusion.empty() ? "--starfusion ${starfusion} " : '' tools += !ericscript.empty() ? "--ericscript ${ericscript} " : '' + tools += !fusioncatcher.empty() ? "--fusioncatcher ${fusioncatcher} " : '' tools += !pizzly.empty() ? "--pizzly ${pizzly} " : '' tools += !squid.empty() ? "--squid ${squid} " : '' + tools += !starfusion.empty() ? "--starfusion ${starfusion} " : '' """ fusion_report run ${sample} . ${params.databases} \\ ${tools} ${extra_params} From 35e19e317566710b3e396436b3e6453657a5416b Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 22 Jan 2020 16:14:07 +0100 Subject: [PATCH 0026/1520] improving output --- main.nf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 33f6f650..51e3d884 100644 --- a/main.nf +++ b/main.nf @@ -515,7 +515,10 @@ process pizzly { --output pizzly_fusions output/fusion.txt pizzly_flatten_json.py pizzly_fusions.json pizzly_fusions.txt + mv index.cache.txt ${sample}_pizzly_cache.txt + mv pizzly_fusions.json ${sample}_pizzly.txt mv pizzly_fusions.txt ${sample}_pizzly.txt + mv pizzly_fusions.unfiltered.json ${sample}_unfiltered_pizzly.json """ } @@ -564,7 +567,6 @@ process squid { squid_fusions = squid_fusions.dump(tag:'squid_fusions') read_files_summary = read_files_summary.dump(tag:'read_files_summary') -arriba_fusions_summary = arriba_fusions_summary.dump(tag:'arriba_fusions_summary') files_and_reports_summary = read_files_summary .join(arriba_fusions_summary, remainder: true) @@ -574,6 +576,8 @@ files_and_reports_summary = read_files_summary .join(squid_fusions, remainder: true) .join(star_fusion_fusions, remainder: true) +files_and_reports_summary = files_and_reports_summary.dump(tag:'files_and_reports_summary') + /* ================================================================================ SUMMARIZING RESULTS From 8e56e9056e8ef80bac6398243b1faf2782a70da6 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 22 Jan 2020 16:24:33 +0100 Subject: [PATCH 0027/1520] fix arriba output --- main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index 51e3d884..e80d92a1 100644 --- a/main.nf +++ b/main.nf @@ -334,9 +334,7 @@ process arriba { --readFilesCommand zcat \\ --sjdbOverhang ${params.read_length - 1} | - mv Aligned.out.bam ${sample}_arriba.bam - - tee ${sample}_arriba.bam | + tee Aligned.out.bam | arriba \\ -x /dev/stdin \\ @@ -346,6 +344,8 @@ process arriba { -o ${sample}_arriba.tsv -O ${sample}_discarded_arriba.tsv \\ -T -P \\ ${extra_params} + + mv Aligned.out.bam ${sample}_arriba.bam """ } From 27b0e56c5e2072aa8bdf04b796c56ebe7fd4106c Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 22 Jan 2020 17:40:39 +0100 Subject: [PATCH 0028/1520] fix output for squid --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index e80d92a1..8d76569a 100644 --- a/main.nf +++ b/main.nf @@ -560,7 +560,7 @@ process squid { squid -b ${sample}Aligned.sortedByCoord.out.bam -c ${sample}Chimeric.out.bam -o fusions AnnotateSQUIDOutput.py ${gtf} fusions_sv.txt fusions_annotated.txt - fusions_annotated.txt ${sample}_fusions_annotated.txt + mv fusions_annotated.txt ${sample}_fusions_annotated.txt """ } From b94167acddde7718df7458108e65c6aefbe37176 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 23 Jan 2020 09:34:02 +0100 Subject: [PATCH 0029/1520] fix arriba_visualization input --- main.nf | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/main.nf b/main.nf index 8d76569a..8c89db71 100644 --- a/main.nf +++ b/main.nf @@ -290,7 +290,8 @@ ch_star_index = ch_star_index.dump(tag:'ch_star_index') * Arriba */ process arriba { - tag "$sample" + tag {sample} + publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy' when: @@ -305,8 +306,7 @@ process arriba { output: set val(sample), file("${sample}_arriba.tsv") optional true into arriba_fusions_summary - file("${sample}_arriba.tsv") optional true into arriba_fusions_visualization - file("${sample}_arriba.bam") optional true into arriba_bam + set val(sample), file("${sample}_arriba.bam"), file("${sample}_arriba.tsv") optional true into arriba_visualization file("*.{tsv,txt}") into arriba_output script: @@ -355,7 +355,8 @@ arriba_fusions_summary = arriba_fusions_summary.dump(tag:'arriba_fusions_summary * STAR-Fusion */ process star_fusion { - tag "$sample" + tag {sample} + publishDir "${params.outdir}/tools/Star-Fusion/${sample}", mode: 'copy' when: @@ -419,7 +420,8 @@ star_fusion_fusions = star_fusion_fusions.dump(tag:'star_fusion_fusions') * Fusioncatcher */ process fusioncatcher { - tag "$sample" + tag {sample} + publishDir "${params.outdir}/tools/Fusioncatcher/${sample}", mode: 'copy' when: @@ -454,7 +456,8 @@ fusioncatcher_fusions = fusioncatcher_fusions.dump(tag:'fusioncatcher_fusions') * Ericscript */ process ericscript { - tag "$sample" + tag {sample} + publishDir "${params.outdir}/tools/EricScript/${sample}", mode: 'copy' when: @@ -487,7 +490,8 @@ ericscript_fusions = ericscript_fusions.dump(tag:'ericscript_fusions') * Pizzly */ process pizzly { - tag "$sample" + tag {sample} + publishDir "${params.outdir}/tools/Pizzly/${sample}", mode: 'copy' when: @@ -528,7 +532,8 @@ pizzly_fusions = pizzly_fusions.dump(tag:'pizzly_fusions') * Squid */ process squid { - tag "$sample" + tag {sample} + publishDir "${params.outdir}/tools/Squid/${sample}", mode: 'copy' when: @@ -585,7 +590,8 @@ files_and_reports_summary = files_and_reports_summary.dump(tag:'files_and_report */ process summary { - tag "$sample" + tag {sample} + publishDir "${params.outdir}/Reports/${sample}", mode: 'copy' when: @@ -623,7 +629,8 @@ process summary { * Arriba Visualization */ process arriba_visualization { - tag "$sample" + tag {sample} + publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy', saveAs: {filename -> filename == "visualization.pdf" ? "${sample}.pdf" : filename} @@ -632,8 +639,7 @@ process arriba_visualization { input: file(reference) from reference.arriba_vis - file(fusions) from arriba_fusions_visualization.collect() - file(bam) from arriba_bam.collect() + set sample, file(bam), file(fusions) from arriba_visualization file(gtf) from ch_gtf output: @@ -659,7 +665,8 @@ process arriba_visualization { * Fusion Inspector */ process fusion_inspector { - tag "$sample" + tag {sample} + publishDir "${params.outdir}/tools/FusionInspector/${sample}", mode: 'copy' when: From 387f85015f9da740ca03f7c7ef77bafe5a4c48dc Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 23 Jan 2020 09:40:14 +0100 Subject: [PATCH 0030/1520] fix arriba_visualization output --- main.nf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index 8c89db71..846bd29c 100644 --- a/main.nf +++ b/main.nf @@ -631,8 +631,7 @@ process summary { process arriba_visualization { tag {sample} - publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy', - saveAs: {filename -> filename == "visualization.pdf" ? "${sample}.pdf" : filename} + publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy' when: params.arriba_vis && (!params.singleEnd || params.debug) @@ -654,7 +653,7 @@ process arriba_visualization { draw_fusions.R \\ --fusions=${fusions} \\ --alignments=Aligned.sortedByCoord.out.bam \\ - --output=visualization.pdf \\ + --output=${sample}.pdf \\ --annotation=${gtf} \\ --cytobands=${reference}/cytobands_hg38_GRCh38_2018-02-23.tsv \\ --proteinDomains=${reference}/protein_domains_hg38_GRCh38_2018-03-06.gff3 From 6fbc8ac00878a179452dd8f365d2e3c53d607a8f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 23 Jan 2020 09:48:41 +0100 Subject: [PATCH 0031/1520] reorder statements in process --- main.nf | 224 +++++++++++++++++++++++++++----------------------------- 1 file changed, 106 insertions(+), 118 deletions(-) diff --git a/main.nf b/main.nf index 846bd29c..260f795b 100644 --- a/main.nf +++ b/main.nf @@ -155,7 +155,7 @@ if (workflow.profile == 'awsbatch') { // Stage config files ch_multiqc_config = Channel.fromPath(params.multiqc_config) -ch_output_docs = Channel.fromPath("$baseDir/docs/output.md") +ch_output_docs = Channel.fromPath("${baseDir}/docs/output.md") /* * Create a channel for input read files @@ -249,15 +249,16 @@ ${summary.collect { k,v -> "
$k
${v ?: ' 2000000000) ? 'true' : 'false' @@ -668,16 +661,15 @@ process fusion_inspector { publishDir "${params.outdir}/tools/FusionInspector/${sample}", mode: 'copy' - when: - params.fusion_inspector && (!params.singleEnd || params.debug) - input: - set val(sample), file(reads) from read_files_fusion_inspector - file(reference) from reference.fusion_inspector - file(fi_input_list) from fusion_inspector_input_list.collect() + set val(sample), file(reads) from read_files_fusion_inspector + file(reference) from reference.fusion_inspector + file(fi_input_list) from fusion_inspector_input_list.collect() output: - file("*.{fa,gtf,bed,bam,bai,txt}") into fusion_inspector_output + file("*.{fa,gtf,bed,bam,bai,txt}") into fusion_inspector_output + + when: params.fusion_inspector && (!params.singleEnd || params.debug) script: def extra_params = params.fusion_inspector_opt ? "${params.fusion_inspector_opt}" : '' @@ -708,27 +700,26 @@ process get_software_versions { else null } - when: - !params.debug - output: - file('software_versions_mqc.yaml') into software_versions_yaml - file('software_versions.csv') + file('software_versions_mqc.yaml') into software_versions_yaml + file('software_versions.csv') + + when: !params.debug script: """ - echo $workflow.manifest.version > v_pipeline.txt - echo $workflow.nextflow.version > v_nextflow.txt + echo ${workflow.manifest.version} > v_pipeline.txt + echo ${workflow.nextflow.version} > v_nextflow.txt fastqc --version > v_fastqc.txt multiqc --version > v_multiqc.txt - cat $baseDir/tools/arriba/environment.yml > v_arriba.txt - cat $baseDir/tools/fusioncatcher/environment.yml > v_fusioncatcher.txt - cat $baseDir/tools/fusion-inspector/environment.yml > v_fusion_inspector.txt - cat $baseDir/tools/star-fusion/environment.yml > v_star_fusion.txt - cat $baseDir/tools/ericscript/environment.yml > v_ericscript.txt - cat $baseDir/tools/pizzly/environment.yml > v_pizzly.txt - cat $baseDir/tools/squid/environment.yml > v_squid.txt - cat $baseDir/environment.yml > v_fusion_report.txt + cat ${baseDir}/tools/arriba/environment.yml > v_arriba.txt + cat ${baseDir}/tools/fusioncatcher/environment.yml > v_fusioncatcher.txt + cat ${baseDir}/tools/fusion-inspector/environment.yml > v_fusion_inspector.txt + cat ${baseDir}/tools/star-fusion/environment.yml > v_star_fusion.txt + cat ${baseDir}/tools/ericscript/environment.yml > v_ericscript.txt + cat ${baseDir}/tools/pizzly/environment.yml > v_pizzly.txt + cat ${baseDir}/tools/squid/environment.yml > v_squid.txt + cat ${baseDir}/environment.yml > v_fusion_report.txt scrape_software_versions.py &> software_versions_mqc.yaml """ } @@ -737,18 +728,17 @@ process get_software_versions { * FastQC */ process fastqc { - tag "$name" + tag {name} publishDir "${params.outdir}/fastqc", mode: 'copy', saveAs: {filename -> filename.indexOf(".zip") > 0 ? "zips/$filename" : "$filename"} - when: - !params.debug - input: - set val(name), file(reads) from read_files_fastqc + set val(name), file(reads) from read_files_fastqc output: - file("*_fastqc.{zip,html}") into fastqc_results + file("*_fastqc.{zip,html}") into fastqc_results + + when: !params.debug script: """ @@ -762,20 +752,19 @@ process fastqc { process multiqc { publishDir "${params.outdir}/MultiQC", mode: 'copy' - when: - !params.debug - input: - file(multiqc_config) from ch_multiqc_config - file("fastqc/*") from fastqc_results.collect().ifEmpty([]) - file("software_versions/*") from software_versions_yaml.collect() - file(workflow_summary) from create_workflow_summary(summary) - file(fusions_mq) from summary_fusions_mq.collect().ifEmpty([]) + file(multiqc_config) from ch_multiqc_config + file("fastqc/*") from fastqc_results.collect().ifEmpty([]) + file("software_versions/*") from software_versions_yaml.collect() + file(workflow_summary) from create_workflow_summary(summary) + file(fusions_mq) from summary_fusions_mq.collect().ifEmpty([]) output: - file("*multiqc_report.html") into multiqc_report - file("*_data") - file("multiqc_plots") + file("*multiqc_report.html") into multiqc_report + file("*_data") + file("multiqc_plots") + + when: !params.debug script: rtitle = custom_runName ? "--title \"$custom_runName\"" : '' @@ -791,14 +780,13 @@ process multiqc { process output_documentation { publishDir "${params.outdir}/pipeline_info", mode: 'copy' - when: - !params.debug - input: - file(output_docs) from ch_output_docs + file(output_docs) from ch_output_docs output: - file("results_description.html") + file("results_description.html") + + when: !params.debug script: """ @@ -856,18 +844,18 @@ workflow.onComplete { // Render the TXT template def engine = new groovy.text.GStringTemplateEngine() - def tf = new File("$baseDir/assets/email_template.txt") + def tf = new File("${baseDir}/assets/email_template.txt") def txt_template = engine.createTemplate(tf).make(email_fields) def email_txt = txt_template.toString() // Render the HTML template - def hf = new File("$baseDir/assets/email_template.html") + def hf = new File("${baseDir}/assets/email_template.html") def html_template = engine.createTemplate(hf).make(email_fields) def email_html = html_template.toString() // Render the sendmail template - def smail_fields = [ email: params.email, subject: subject, email_txt: email_txt, email_html: email_html, baseDir: "$baseDir", mqcFile: mqc_report, mqcMaxSize: params.maxMultiqcEmailFileSize.toBytes() ] - def sf = new File("$baseDir/assets/sendmail_template.txt") + def smail_fields = [ email: params.email, subject: subject, email_txt: email_txt, email_html: email_html, baseDir: "${baseDir}", mqcFile: mqc_report, mqcMaxSize: params.maxMultiqcEmailFileSize.toBytes() ] + def sf = new File("${baseDir}/assets/sendmail_template.txt") def sendmail_template = engine.createTemplate(sf).make(smail_fields) def sendmail_html = sendmail_template.toString() @@ -896,9 +884,9 @@ workflow.onComplete { output_tf.withWriter { w -> w << email_txt } c_reset = params.monochrome_logs ? '' : "\033[0m"; - c_purple = params.monochrome_logs ? '' : "\033[0;35m"; - c_green = params.monochrome_logs ? '' : "\033[0;32m"; c_red = params.monochrome_logs ? '' : "\033[0;31m"; + c_green = params.monochrome_logs ? '' : "\033[0;32m"; + c_purple = params.monochrome_logs ? '' : "\033[0;35m"; if (workflow.stats.ignoredCountFmt > 0 && workflow.success) { log.info "${c_purple}Warning, pipeline completed, but with errored process(es) ${c_reset}" From 05f31517c9c06c17ad1f0921ea8e9615fd75f9fc Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 23 Jan 2020 10:43:25 +0100 Subject: [PATCH 0032/1520] update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd40248c..c05c7406 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### 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 From e0a0d4b5be72d8138dc81c01050d18b32268e714 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 23 Jan 2020 23:20:47 +0100 Subject: [PATCH 0033/1520] fix: rename isssue in batch mode for ericscript --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 260f795b..0d522a5b 100644 --- a/main.nf +++ b/main.nf @@ -477,7 +477,7 @@ process ericscript { -o ./tmp \\ ${reads} - mv fusions.results.filtered.tsv ${sample}_ericscript.tsv + mv ./tmp/fusions.results.filtered.tsv ./tmp/${sample}_ericscript.tsv """ } From e7024fcb7e61e2dacb495ee8ae537cbe5c87f516 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 23 Jan 2020 23:21:26 +0100 Subject: [PATCH 0034/1520] feat: implemented (#18) --- main.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.nf b/main.nf index 0d522a5b..d04f179b 100644 --- a/main.nf +++ b/main.nf @@ -410,6 +410,8 @@ process star_fusion { --output_dir . ${extra_params} mv star-fusion.fusion_predictions.tsv ${sample}_star-fusion.tsv + mv star-fusion.fusion_predictions.abridged.tsv ${sample}_abridged.tsv + mv star-fusion.fusion_predictions.abridged.coding_effect.tsv ${sample}_abridged.coding_effect.tsv """ } From 5fea38c304210d85c81e0335663697417d85690d Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 23 Jan 2020 23:54:27 +0100 Subject: [PATCH 0035/1520] fix: updated fusioncatcher to 1.20 (#95) --- CHANGELOG.md | 2 ++ download-references.nf | 12 ++++++------ main.nf | 2 +- tools/fusioncatcher/Dockerfile | 2 +- tools/fusioncatcher/environment.yml | 4 ++-- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c05c7406..2454c4bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,10 +14,12 @@ * Updated `STAR` in `Squid`, `Fusion-Inspector` version to `2.7.0f` * Upgraded `STAR-Fusion v1.5.0` to `STAR-Fusion v1.7.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) ### 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) ## nfcore/rnafusion version 1.0.2 - 2019/05/13 diff --git a/download-references.nf b/download-references.nf index 9e5656b5..6a890fb9 100644 --- a/download-references.nf +++ b/download-references.nf @@ -172,12 +172,12 @@ process download_fusioncatcher { script: """ - wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v90.tar.gz.aa - wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v90.tar.gz.ab - wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v90.tar.gz.ac - wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v90.tar.gz.ad - cat human_v90.tar.gz.* | tar xz - rm human_v90.tar* + 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* """ } diff --git a/main.nf b/main.nf index d04f179b..d518c8fc 100644 --- a/main.nf +++ b/main.nf @@ -439,7 +439,7 @@ process fusioncatcher { option = params.singleEnd ? reads[0] : "${reads[0]},${reads[1]}" def extra_params = params.fusioncatcher_opt ? "${params.fusioncatcher_opt}" : '' """ - fusioncatcher \\ + fusioncatcher.py \\ -d ${data_dir} \\ -i ${option} \\ --threads ${task.cpus} \\ diff --git a/tools/fusioncatcher/Dockerfile b/tools/fusioncatcher/Dockerfile index 37672a55..fe3228bd 100644 --- a/tools/fusioncatcher/Dockerfile +++ b/tools/fusioncatcher/Dockerfile @@ -5,4 +5,4 @@ LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin. COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/fusioncatcher_v1.00/bin:$PATH +ENV PATH /opt/conda/envs/fusioncatcher_v1.20/bin:$PATH diff --git a/tools/fusioncatcher/environment.yml b/tools/fusioncatcher/environment.yml index 5e4f7098..b54b8484 100644 --- a/tools/fusioncatcher/environment.yml +++ b/tools/fusioncatcher/environment.yml @@ -1,6 +1,6 @@ -name: fusioncatcher_v1.00 +name: fusioncatcher_v1.20 channels: - bioconda - conda-forge dependencies: - - bioconda::fusioncatcher=1.00 + - bioconda::fusioncatcher=1.20 From 07891e947b97e289350735dd293f72574a09168a Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 24 Jan 2020 15:01:32 +0100 Subject: [PATCH 0036/1520] resize logo --- docs/images/rnafusion_logo.svg | 129 +++++++++++++++++---------------- 1 file changed, 66 insertions(+), 63 deletions(-) diff --git a/docs/images/rnafusion_logo.svg b/docs/images/rnafusion_logo.svg index ec35448f..fcd196c8 100644 --- a/docs/images/rnafusion_logo.svg +++ b/docs/images/rnafusion_logo.svg @@ -9,13 +9,13 @@ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" enable-background="new 0 0 1150.9 517" version="1.1" - viewBox="0 0 1456.7841 522.44342" + viewBox="0 0 1139.218 514.66212" xml:space="preserve" id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="EmptyName_logo.svg" - width="1456.7842" - height="522.44342">nf-nf- + core/ + x="357.14139" + y="241.24541" + font-size="209.87px" + font-weight="bold" + id="text69" + style="font-weight:bold;font-size:209.86999512px;line-height:0%;font-family:'Maven Pro'">core/ + rnafusion + x="-260.05042" + y="457.04541" + font-weight="bold" + id="text59" + style="font-weight:bold;line-height:0%;font-family:'Maven Pro'">rnafusion + \ No newline at end of file + d="m 300.43725,166.1155 -21.53224,21.61638 h 61.0915 V 166.1155 Z" + id="path67" + inkscape:connector-curvature="0" + style="fill:url(#f)" /> \ No newline at end of file From 94a74f58556ae44930472e3bc701c06d42584744 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 24 Jan 2020 15:01:58 +0100 Subject: [PATCH 0037/1520] update logos --- README.md | 6 +- docs/images/BTB_logo.png | Bin 0 -> 13624 bytes docs/images/BTB_logo.svg | 184 ++++++++++++++++++ docs/images/NGI_logo.png | Bin 0 -> 20547 bytes docs/images/NGI_logo.svg | 333 ++++++++++++++++++++++++++++++++ docs/images/SDU_logo.png | Bin 0 -> 11894 bytes docs/images/SciLifeLab_logo.png | Bin 0 -> 8387 bytes docs/images/SciLifeLab_logo.svg | 99 ++++++++++ docs/images/ki-logo.png | Bin 56313 -> 0 bytes docs/images/ngi-logo.png | Bin 30519 -> 0 bytes docs/images/sdu-logo.png | Bin 33098 -> 0 bytes 11 files changed, 619 insertions(+), 3 deletions(-) create mode 100644 docs/images/BTB_logo.png create mode 100644 docs/images/BTB_logo.svg create mode 100644 docs/images/NGI_logo.png create mode 100644 docs/images/NGI_logo.svg create mode 100644 docs/images/SDU_logo.png create mode 100644 docs/images/SciLifeLab_logo.png create mode 100644 docs/images/SciLifeLab_logo.svg delete mode 100644 docs/images/ki-logo.png delete mode 100644 docs/images/ngi-logo.png delete mode 100644 docs/images/sdu-logo.png diff --git a/README.md b/README.md index 1284e351..850a089b 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,6 @@ Páll Melsted, Shannon Hateley, Isaac Charles Joseph, Harold Pimentel, Nicolas L * **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](docs/images/ngi-logo.png) | ![nf-core/rnafusion](docs/images/ki-logo.png) | ![nf-core/rnafusion](docs/images/sdu-logo.png) +[![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/docs/images/BTB_logo.png b/docs/images/BTB_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6a197b807508b6722abbe70c49210ca0d693bcdc GIT binary patch literal 13624 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 Kc$KI@!2bhJTgn{( literal 0 HcmV?d00001 diff --git a/docs/images/BTB_logo.svg b/docs/images/BTB_logo.svg new file mode 100644 index 00000000..099f1101 --- /dev/null +++ b/docs/images/BTB_logo.svg @@ -0,0 +1,184 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/docs/images/NGI_logo.png b/docs/images/NGI_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4b769e551050a878e22bd1120033b097b22670 GIT binary patch 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 new file mode 100644 index 0000000000000000000000000000000000000000..38e60b4b6a1de2255f2086e8c36a84ecfbe6e14e GIT binary patch literal 11894 zcma*N2UL^66E6zVL8%Ig^bXP?QbP@dB8Z5TKoF#Nfk+EYI!JF(N~i%52sJ2O5u`~8 zVi2TA4c*EnMXKF-35+X!G z5*b56@`qRzi6Ax%QEX-7h${F;P>?Ri1lBUNGp~5HL0%96S34>k9KTWF*&QymN6$Sa{!k z_4j;xb#-++P5o~W+~2>cYF&Mik(t=e%+pd7@%QYceYdL}sHD{DaeAkm>f&%rT|haC zhx!?ioUf62;%UU?i}S6z?)hNPmp_(HJ~OC?^0wB#1c4dJeN8UT){EYEUmOfu*yiKH z|7=tmbqgn^@=z~nP$PdbxAq}tb9=J?aZ89^dcP3f&M!gN>gM71KllU6RV9Ob*x1;J zE$3cLpGp>0GFMtQr!(->Q9J>0>VHr9-4 zQ1wF)lzuBjpe;4ao*~QWB(PYEPj~R9Q!TfKE|OeWI~RVpJqsg5S_@I*)?{?jU=_F@ zWUW^%AJf{OzADDWnIm_e8#biIvl%JvWEsDORSP|>|LJR!gHP{D>M5x=8BeFDtG>3q zzuf;cTunu#{hlPdT0H5(BR{JY*d$1uYQdeTM&{%!Pu*WBuA z@3I-rL{l;BBrue>-LGjl0^Aj1x}Nq+M%yab2|DtdH|S&$H+8=wi#_2WxHyb5k$3(O z$`8ilJC}PM7*}~TA8EPavJ3ZxfFgUC38(iOFhg37U6Qhr$)$YYb=^{a>V~agM@~jk@D`{tIHF#bP_Jg-q*6+yc@j^&vhX@w%dbQ z!tXLqIPgFgXySX-Wf0%LzWl8jsage*eleaug{poxSZ*$2tbTUF32hbMy>sx*YM3Lr z8f<<22tb*cQ-*smHaIjmIQXp^I(NuwYRP>H8B(L-HCINLRXX{aWO0P+T$so-6+akz z7A$|$&}sXbTaEaB(-c=agyG@&Y`%hz9&D6c+T*1qGiTyXg24OiNWZs$wn<;bGPx*S zgd)NdIy~niFLqk{P1zKs9!#JOF#Z^^b~O7)JJ&gl9=+pv_Y;tU6#g;fB?#d? z6I0Aj?deSX(4cp=%fBuuy1Pp!?1P&9BY9`4 zH?X{yFCNbS#J>h4dIx*@AvuXNde8Rjv=p%Rqd$#%`pgidFqCg-#kctD$;h0~Ts$Jl zs)_uEjr{|nkh~cz9qxT%N?mZ{Qx-XYSfqBt2uLORadWVBnp&=hj;=D}{j3itZyT9_ zo}#?MoXlk4^;LOJf#)r>BDnIrZM*9sj<@dE~u|5{vNKtnFl8-mB zZa%sB`}s3@Ard6r4O;JtYb5hIZvP~~AL1|28a0ku|D`ufW`Jw=YYF&KEv|CE?RAwf zcJT~2b#wJ)D~}eVsPT*2t9@=?#zgpIK;Y858zUJjLIQ2J`XUlZ5BNc63KxIR4%b&^ zmRw_3wy`NQdo=vyEY2wgij|d>fev~^S$Q#;3deSBd&wKjg~XHv<|U&0_fcbWME-QtxIkfdIt{f-PZP>W=&;DL$uD*gYhG% zvz-lbJ9>nwTtSIVA1k8(pIUBUy(ecr65oO**Mr?(+_KuK0S8MDDJFVXsNGn}ReAk^ zDm`W1l%tpV@^kykBLjbc>Yz8Col_g}lYsYI#(8u@4dVXkhgAcJi?B1-epsCT979R^ z3)wk*4&SRo3kdpq|DM5E@XJ#IF?_SxOs@uSB%iqx{of>2l0sli*ua|gdP})Q)(*LbX;ulAn zdM+J3Yv}jd;7G8bvZH~{RY=ZtDO2qB6{Y?ePeRaW8%MSp)klx5h&pV6SjrEAxQj7Q-`VGV; zi?%*n>@6+VWuC`>exwfz6Y`HFOvl;g_y3dm{2__*O@CHnvYvSSx=Mpv4no}<~vN9kbphaoohuE1WV$y5|l09T~{|>UKC<2AI zmi5(j^2)^jW!Tk*09oJuo0h4@CoS%^Kf@jp>{Ha>Un?_@v=F{Uxb!*wZII+@+?Z}e) z(T*YlJ5R)*B3ZAI4gsRzig}pKpB{vCq}6L4{osvsi=9tU7%4qizo0T+`jzU*sCFblajC|5#Bgpnm&}7VQLHKk&>8zfN@%b0VbSfj z0+Jt3K}033rO8fvb!=`t?Qz9sOu;}SkOz+IURJ|Ba8SH~)REQAS;`lTxpM`~rkeco ztGtC@W`KXWTY@#gqEnt33hWTJ-V(hn(B{C%d31BletYI_0#l>;a&RnMO6Ozq3!yRU zNu05it6PrE~)RSAQ=zB_7x!ShzL%X|z4%coZ?i6!z9_eo+k}5@QVRWB11Rs6YRmizZZEw~@7!dZzdt@B$J*pcXsB#U* z6$CrVL@4mxqqcvt`}H34T=(9|lJytbp$cK_NGNR5JOPc8rnrvB#sj93gWoL(YNn-E z<{cX|K-`tqQDUxAhkw`&$#99wRvRW`Xe>4a2wYf zS6dG`qyw3@2d=>?)840V+bN-D8-tRzKI_4}Q_H}czaF5LJ5kIi;DTPh?oA|@i=*y* zXw%ivF)M)W48Lr1^U@Cw=nZedQ2SKJrZ-R;mj0v(31SdvBO+;Pj{R%a*!Ar}PXK5I z=yUQLs2a3q*A$=gWw{ZPtj`RM;j)EpY3)2BI!7}F{aDp~5FuQ5(qJyCQi93FMl1Ne zx5Vk`ep$6vp^hkFT*`*{B%geO4{P3Q;2<6V(|>vGhd8HGtZr~Z<{--Nbx-8Xbd(HY zh!Ao^AErY4IUPT=*m<&Qbz;cBQY-MRM#kKH;??``-vIFz-MKm2`1DNt{nY7%RaX#I zT7|`%7OweB!l`GiRubYMb?lOz$s0O+I5*Q~v-{2JpB?|qR5*1%&GJo<4>Mw*@Sr2G zy0yQ3tbVGNYQ8J1{Z+Ice5A~XsqnkspNq4@%~&&u-X;664E*o(%A0UVx9EW@=A=`> zu#8vECx8J3{t+GN?+4_mWOYFGEAB$NIB2zEI27fxLy8Z)Xb531AzXHl%)>m6F?5 zJZmdWgAI=Hv)je2UX-Matt9hl08)%Ih;iw{;wV<$tplS47bCy~!Dnc&?g zJ0mI7URii^KIQGucew#Xd)Pk6sr87(0#^P5i$yba!-bowaSy(OuNA5vJhj_TtkNU99*|geoh)cSADu0Yd@w< z+j&d4L)@kb1q?n|K{HI**iAXo4c#ee!3h6KSnAwA|NJ4+#-Ux;h*~-ZA%pHLQVQR} zq+~88$v#4+Vk8xGVP$jv4{kp26L}hBQlB@j5oHpzNciP;)NJZday)ywX$12ymajWU zq4_)U7-}iYT@Ml2+fkoh(;RSjoSp_=M7%YT|E!6G6Bzfr;R7ABhZW&0Sg#SlE-I!Y zt$_O$?ax0SMskr|0n~{2pwayF#??!hwTcur2Oq*!+t{Kdb%}i6b3EEMTh@@Vb;x8J z6~GX)(xLrYF4bW~Zjd~?tmfGBGG@P)lXuk^=J8}LH|wkHhJldthQLmPNqgnHb@-es z#}`QInMhv?D=BWC;CeUJq4meoVzqriky==YXX)LHm_`bZ%6`gKe&)g_;XM9waI&Bl zX{l62;UKN!h=$daWiWSpRuEJ838S;r>K3N(7aoMzTtD4yauuM$*Pp3v!WJu@Wf@88@=8 z7@?L43*R)OCBCm($1V?mgwNq4r3(Ou8cxLrnfxJ~Ta*4(zuv~zIwwk!+%i33AIfI= zfWT;{?OfT;+A`lhF{2$S6$dP@;E|s^ZRaNZG)GO8CM=OFwye1yk*RO>tg48f%GR}} z5MK#AG~AogDUkpt>~QK!l(D(wkSgUKt+A>qyAAF*`K5hTQx?Ml;U}I`t0hsSANoz! z*uh?2OmAiVRxYBU%uvhrpMD_{Cm%yk_v~HQxf1bq)O~&J?~^9G+9pqT2HRiV;_qx- zHCgz23${|VE6_&k(IT%4eAhUb2QDLmuboCm=-Gh@Mfhsy>qm<@Upa#+ulweZ$wq{P zC_@(`>to|Zc-pd^rn2^$$G%fv6WYs5WV9A)vx$hFwNrgAdr3Di{a|Z47ntHPmIk!@ z!kpB3Lc#r|?3*4#jDj^aRgz*&U&{4Q1Muy^GHns^U2VVN<;~3@Pm&hPeM7+`zo{>W z8NV*pLV4Qr_9u zxB%kQ>^QBS9&w7>24hhx?9gE9cE=i2cyFM!yIYhiYQIOO<_K>fq$Eyfnc7KL5=Rpn z76yc_kLtl*+qt;7Jf(kngQ~Gd@1=s)(W9tzEY>6V_S2Nvw&Bb-o z!a)EoC&4%$&!bkeWoKgWxxf!fI`#5dE|OAs?{rW6yjyaT;#w51Wjk6pM;INwwb)iw zFVOE&VBd7JEAHjrwUPW4K(Um=XFYzy0DMyLWcRC_|ggSpd(c& zhKL(`n;!PrRM3q8x(wBbcHtb0W|OiFJv%!%IPf0rtxRL_Pjgev9e;tEx47+bTZTtN zQuu)e%!4ymUv}%;```WB$HM)|JVFQmLcr8f|ANe#jQ@!iNAX~p{$FMCf05=W9z7Vb zo?Nq({~rl6=f86Lf5`uz<^K;>|3&`4VfA0+|Ld&&i`9S4i~67B|5;$~ z-^3kaP~PgIaaGQ+NUAfAK!A6a9m6||A|`>SU(c_d7ZrooRqaz%t4{WIFuUUiJ03?r zlO1lUvxMi4y}e8!%A-)YtKhZ3{bwg?%deSw=@WN0H#bj+(fgs$VE{~^v9v&Y4&@Oab z*l;)ArQc=<*p0fX4NJV@r)Gvy?)U1PZ@*ut;87+SQb(?!lE{X1yYh8YF(3r|b1cZc)wHRiz=cdA{emJEOh-N@XA#3GsFa0CMJ2Yr5)alNJBUKYXeRf7Sn9 zl!4Q1ghkh)aEONe$nYem+TNhS;|P8J1fvibW6;Ai$y=M>#J{8Ju_9^oV>~%YIidFY z);TExf-%=5wgjq0;xRH3_VP;J(&S6N(fw4xAA^?i_ODRad0t(t z;_xd$C|rT*f#8Cn+WTwyD;@d(y4qvEq&`l?RY6C ztIu8Xy8M~OB@ZKhX9-@OUZZwMKeXLhO2dc+kdufh~pBp zN2s|NJAbH5=fNs5a)#$3b?PhpvuY~Am7R|zvu=#txySYjRm6v4?K3ri5w+jwr1gYD zwrp}UZ0t97knq6iu|cpauh|X1>S(8t$;~P$r_6~memxjxqNK4}x&cg-rAYxR5zFU~ z%!nny9pN>4AQ1>Lhh}0_aly-ZUJNVI>0rs96><3EdG}2w5ng=3B1T?VA4Z<&9SKG> zR%l9!j=fdDlHyjFTO|*Ok&I`ikQrt>eX+N5jV7hPBqb#$cgyPBn;53}+HP8jZ%@BE zAG+7f=2#nWwU$Zn0igSSdP@@Mv#g!3RrE;mCm2HxAVRhsoTN#g@|5!UP?N|C zNNLmWj7INF`Xq@bw*)&PhT~Q-z&4T~5M&|8krKg!WMSP6q4DdK5mpCY=ZjL5$7))+ zmkcYy1ezA)qwZ+JK2A_RuQI7I;5tu-REGow!33W?dPc{k`*EUTt=3aYq{`-7*;k9v z)9T=Olb?X_o!PGUneHMF%z5u?!m6%+;Tf+oU{!iK$}~3-=er#~^JPVYXE6koKkJcG zVm@IA`MZB*t!-?|6dN@Ff$uNHR@pt@$(sm@WLwW*Py0KN^RAKcDw(TrtrdrJk`PoL z@emihsT5zs1vRF}et1;y0|T}&gkf;iN7;^kLn3L$La1JQwc57CTV+{~OyAVnYN(^M z@(gXqYltpZ6S(iMbX|GF_$FXb$xW~=n`6SCKfn-%Yg#FfI;8zJu=NG?Mwh9uA|@(O zu&55ilq#g0TogJVbToj2$|~7%X30C0eCE=90OYgU>u9G?H^Y=ehzbdE6*l0M~gkC{uvvdC5vkW zKhovRb!;-H-&keJ=W8=9%}mIFNZvD|`z9_bWaMVB^bMG)CW1oH#-*P z!KFl%T3f6db>+#hi)~aN;1gG^-0WLyE#>xTQ(Eu6z^NWxEVAdHcEHSh9>QA2E4EWI>kE zYcLj~#&KVFio?n@%b-^9ak79iM_N`}gwbm^ax5{LT5a0rHf?D2+WxxuZa!pcRu+3~ zQ$}Vd-nY2NJWWe!|2oZH&01Cm#Zi%L6DO8v#KOtLR)C}`IK9y8i+f^XTIYRL11ksrD5`2Yv|P_ zp~8{BuEvm=R|bf6^RTziwCA=^gfX%38Z*)))j1lKIQiGKxK#IVP?*;>ww$6LaC~~P zXOo*7;@n!%3_=QSy^!tToH;u?gLeO#x2yzh4^OzW8=fmlIQ%@gv{G#ojHdTz3ZwZ< zI~Mi#iwh>$T9(@|HGnU{hy`jADhqq&hBK)YsLo>-M#^2qBY?@Z+wF&ANgyys zDt<{HN%!j4mAkN7j~(xI3u|*4S_K=jTgNCZ9FF2KL7Z1K-E*sHc&m8vXlG{JX){l- zFQ-BGZbYD4n3UwDVACT*I+gxi?8`Y6nP!^%Bz1d-~2qyh>$xvx`|JOp{ev<&uX0xoOh=%h&opavGlrgDSl^ z=9Zl&rtiY z`(9_urobfzZ4x<_W_+(^iCG+PdIUR}FSl#s+rm3mezKjh1*-HbDeJ0#T34UX9)|QR0*%ed= zmwNE4jQkKeCUF*MgS6IlT8vt!U-CaJB=EGM2$r&M{UeQEtrtGwb{*mX@t;2vz%Bv} z2D}sTJu12BvunV%u_E=Wb*Fv!^L$?EQ>DMjPe?GDeZ^tKt^c$K@PP`AP#Kw3-T*T~ zC1H2e)x(Vod5|GRm_%bWe=odjmr&2Is`^5qz}$L_F3fNtht^Xbi|Tn@!XRI^F_N$F zgwTjIFUq%=nFRuY+r}__ykdx1Q!=T}4Tq8^+%X;)T^_&7JodY17lMT5AQ-oL_^iZW z6^QsEN)@7SK_kd8SI0!;lVP&3H2U)I<+%=p0M##S8MuOUoc!(-;W{+L`1f=ITCn4> zzfrQNqgGsvM}nltvn>#(5zKIrzaua)gKZcSP=}Ld`2*%(U>@TOmt+i0ae?q>HA=0T z#>G>uz342E%tn?23hr(}Q}8Fh2L%)9wV3Fdr}*lB>s`;o@ULq8Iuoar?f}=?y%$q| z;LHr22G}`SkZ?Zfz4tDj8imZ z8mCMHoP+=P_3|6;fb!5{p-dB6ZHejBk*JAxiLC9aUOZvXicay%{wRK5yN$bsL( zTCx6e5p1i^=E?avaUL{aM1z&6-NnR6KGs(@=eJ^~m1vakXIt_Wg(_rSvQvMURPmyL z65n}Pz=Xb<3x=5%GYxqA zKdP-?;mdn4HHGhq)%g%TLGUQoAybIBkjfG12^l;XrnJ<;?2v?SeleVR5kJCG*bLb_ z!09|RdO5iD-4fWqoJz^A^ z+|Ji#wrC@f@8z~l)(|uX1n$mv%GI51E8XdHe<^XSDcNCWtv5qV@(7zW#kGTAd3?FZ zkI2N)q=E-lf54kmps;71zjR=bFFao?hF;c`o62$f&qHRP8rnW}>xS?%q5PuH-2}hV zx9TFa6|ou+LX~EEA*2nXVXW3FQqZL9?*7v&7T=NMfZxIry*>G3(>o1}h0fdk=MB!n z$|9wfNdLtK9NaC&WrN$xNZ!`)fKOSqNY|bH3^UsAGKRd27wPeR=9{$@^>%*pokMfp zXF!~txWdaw2E+?1Q|5bY?{&X*D7)!$F zQ(r~F4@(W_==@Yvu!HNvwMJ<_zzDe*jF{d$sPc}!VWVxxl^N7p=tC@;dKNSZBSs7yavf`NG;wh-8kEkdCE1fRGcVQF=(gm-}7Ex#+*Hh{2n#;+=_* z^TvP3+o<$gPnhNgoC%74>Ua4#Btl|#yHm(}W6E4x`j)BA)u%(%Ytw*{Ya8EDH?QMD zjgW`H|G_FOW!vTtg&YT9r}hgR@i?aKWk z^`Jc-cp3zu?9#d%?047G+UB&Dh*M2C+h*1106ib?PIN5ZRCbr9)vK)H<;7kNt4>k% zTL&ZLp7Kl1Dbkli?t)0JLPDrGuNd8 zuG+06o4nV8l_IY7jwV(FO0*^{sO3$fv83Po6YaqeC><7s6T$H)d!ZLwYpC*DQtcBD zq+*k6vRPlCbFSExlATD&q02f3oQTZ9yzuX0mzH!cmZkO(N1rYDZ(~1i&mH->bVgG+ zJ1OO`EH5t%e>x-gyIiYjmZhjl^wl>=?|s50e-P~8vUcl5EvOP&7KooPZDu2%YP+vW zhmG|hmz_#L$6r{lNLwtH<9>V})jPsZ?bXc4n2B;)J#NrZ;d2{y41C5LZ*refDlKlo zI_+oTTqrdg`VN}GLuB@|$3w9A*AK$kdWvmi+e=GJJ3bBd&8*5g3syLF@dd=t&p)0x z!0SmM5J${(@fyogFHEiQhDs9NO#D63{m^0~MQ0USyZl=wuC?LQ>6fC~!n+cU_-U!C z^I?J~R=w5NXs&McPisQF6LM|Mtd>5X;)={;4e7u4YBiep3bi0i#}ejf4|7s>@N*(w zNMxmD?n_Aj`i+`5ZU069 literal 0 HcmV?d00001 diff --git a/docs/images/SciLifeLab_logo.png b/docs/images/SciLifeLab_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bc4dbda623f8f70d82f883c5019638d86016a298 GIT binary patch literal 8387 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 Z^1n)knbg1LpQ-==002ovPDHLkV1kk8bd>-A literal 0 HcmV?d00001 diff --git a/docs/images/SciLifeLab_logo.svg b/docs/images/SciLifeLab_logo.svg new file mode 100644 index 00000000..b8a44b79 --- /dev/null +++ b/docs/images/SciLifeLab_logo.svg @@ -0,0 +1,99 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/docs/images/ki-logo.png b/docs/images/ki-logo.png deleted file mode 100644 index 73a8079e882df1890c7346a5835bf13137d9c226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56313 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 z 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 JLR3HC{{Z*kV&VV* diff --git a/docs/images/sdu-logo.png b/docs/images/sdu-logo.png deleted file mode 100644 index 9a5f658fcf627db41ec5b1674712d0f5a5074df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33098 zcmeFZbzGIt_AgEeTXL(EJROIlm$*@sSQ1BGwr5~c8pw0p1 zc@QS>ciCQHDe$=NAg||)g2GCR{6%%o5_^Jz!q04_sq3Pv{6G)}w_}Bx!XKNly4yJb z)F>#zV(t!5n2nhWOo+_F!PaBwk z=^ZgqY+-jnK!BZ@3l!pRXKU{)=q_^SQm!CSMpm=kfn1Wf*ofSbKsE@`RaS#Y!JW(? zJgmGdFb*z$2%i8e2af zP+In{=74{R+_7|VaS&um`%J6W)C2nYzUv2(IL$CduQ5T zLjEB~+RPc|WaZ#u1-FMF$p z{U;_<*xx)3u1>a>T{DHTnc14znc2HI1AH9+kaIByEKJg8WIM^Dk$Y-26cfuX~N;QqQ9(6?H>?Aq@<8m#Rp+fhQh4u zk+?Dnv;8~MKQ;bOd1lg37c)_SSAd0`lZBI0lY>`~gI$n=lL={>>{o>RqWm`*%5YOF zbC3TdgXiC5T%r7T8NduOg}OlhkEC3sy&}gHCTI?KvV*#aTG>G@%-9_4Eri+rS$T!> zZ@Utdg4@EKfNq(IatX8jr|K(Qm$oLTVDIb#wTGE0NQ(j$tX5X0f@Wqs0%ihGQx;C> zV-6N>E>jrGV-9{8i>WD8fSaG+Q~<`!dkLbl@>TZ#AzB&^b4AXVzeJnC}9_^-A9cwuXG>6ILyPR?e? zIVW=GACvBHH}CZ%A$SGlFD$MpTwg2qa-<*H3S^a-i;4k@C*#CPQ zZkA^D|GNqGOVlORe;48mH+OM^I+;mW05EGY{M^3$ea&mI=UFE#;<}c1)>bkP5UuyGLEf6#S@e14D0n5KC z`tRxR|G4naA^krVd{x|^My{gq+wvc{ehbl6fSKXCmPqN@ad;JS*&Z_9t+ z`Yl9P3I4!!6^-AP|G@QIh^`X+f$J(7zb*fP>$ebHCHMo^RWyEE{sY%iDuHQm*mEaFtSJC)w`43#bh3G25AGoff@!RqrxPA-KRf0coT}9)!Wbrp@@mjA%@TZpa_{DJE#8ow?7f$O&rT_yMf*HturTmA#r zZy~x$@CUA|X#BSP2d>{jbd}%_TvyTfZTSyezlG>3!5_G;qVe1EAGm%C(N%&!a9u^? zx8*-@{T8CD1b^VVipFotf8hEpL{|y^z;zXk-9yF0)J!jK^6r?K2AYeLeqVG zE!o4HczC$8@2&rx8pwUf#+{mS+7nKw8@lv0P0h&p3`L21x4St_*-!3i}`4stGVdrH2;OS?s?&Nr(1Fyc?#T2FC z;b9C3FouNM84dwz00b0(0tEpNGz86+2RI0L0RjDbh?648Aio~JsQ))i;-vpS#3tN8 z1okH)UhF)paO~!_7P%K`DKE&FkICaRm7S}9fx*y;D>K~NapM1thU}H%;#5r>cDe+1 zuyk@|ygxex7bI0VtnngW*?yMOMNPBlp?al+J2e=n=Q9A2kYF%c>}sdeEK5HdR8VN` zoW#v6=b2O+ZGNC$DaMqqU6iX&JdK3`LT~LMZk>De_DcXbkD&1G%B_~pN#P20^~yXv zm-W&Y`97aeinTS@jT#6*U`#|J3&PnoSrJ=OQyZMl3tPOkr$A$-c~8_@yoS{!_*#=T zUc1m!6sUNOo}?})*~KX5#X3~K(vc~dUog^AjSQgUpZ1(YZ5bAp4Ld+XZS{B9MZ5zG z+I9D2Ef(xpzF+B)ZbX-s;$j!Y1$8Rn7@`;!<&K+dsQ~H#+mC>WC3Do&a*XJ1kR2=y zN}r);hPDUefkyRrMNn+5*{5+XheOs{Tc>h#LxOGXV}|`;*>lgkFmFYOb@c7*(DhT)VdOU zBDD#}eTL@#?iktZsI78&$?4X9CD;55h_p`R)hmhJ#gLsqZ%t~aB^|PIvqIo&$}R^| zdbrfwkLVDs`SLCt^|AP2$o|mHmh9u%Gx1B45t3FRk$vX!_KxDbxrmGloj5MY%e?J{ z*1`N=1YS>TI2B<4r|xiF=Z%)(7x{MYPmn4FMu+-s@qR{-4H?9~7wk(1{NnvJPJUu= zA6iHvBf_HnHj>3BD|ejHUG7)^nk16s=BYfpKqF-MV7^-*>YUth3s;mmYnfrpSxSk^ zZgqmbm6n5fra~dY)!~5Bxj*Z7{^Aas;Sr%Cc69c4V3HX=*9r!wJafYU42KEjO7D4@X z4|A^ECZ2jcVt?+hK8zB#N2@1nfy5`MwJ=r#K4l~Vs0L?wo!FT!XrLRfi-D=_ND zZA)e{F~pvy|CaMVC>&8s-%4qzD|$N6sc)i?z3d>EGeK|tYY?FJtU#La6q3v;*djTE zD*Cx>hNI-6E-<38k5dEmO!*@k>O5NNm8$})qb@ST9gO+Bk{lz_vK_1d?!dGo4q0p@#R_Wc$-H~Xi*)Nz#{4Qx^~zDeJid1BiK%O@+sO=f z5o#&TTezaG;9c5EnD&H|^YRg;M^vpfmwE|ddfGCI`0 zs*%+7(*$!@P-fU(L$e5d<;E{|#k997LND4}&epV~b+X=Y-o%rmeYSP&MgEx@0oYi* z`-B`&F7;|n=!LeXU3I!O0aJ%lc&^T+j_Ioae{lNlZJU<*il;NLdY>sU3RY0++uZTk zJ(M{w8%H?fo|>r8`a{iiQJG=Ebl*!gC-p;EnQ#XZlns{MwP?wb!Z9-)W#lf>sQh`~ z1(|i*LQo9$!qTlJWQOm(O&JzL)ITtmKDq(G7Btxzyk~g)p;x%>{JEC2h(^epM|ga9 zKqMm^?dN&9`rR0xEsSoR$*NZZURM8Y?{L~1?mJqvb?&ULDN!K?7cCb>*jiG<~&bY z4pMO+E3yp74T!UD=h-|zz7_(`9M*++n^Q{JxZrhZM!iKjk4?8;SDRTuYl)YZ`ttl3 zBX`#oXZh(**NSpxNdV~z7CsU{4viRgFb2|-d>D)c@8PwO*$WpiXpP*cI5&J&W*F0= zy~Qw8$#0{1Z{Qs+E%ljJp378*s)meu9KNPBBgM_Af>EFPYk;p%zAtYBc#4NHcHbG5 zKC(>7Lnf=k-)cp27AdNsl!%MGELqi4=gBA+WeDq-u1^}V_m0_*k+bwNe&y15KF$Il zVz2KUEERD7W$U{jauS4sdgU8_sZ|HOu6{}NO1E3!mXh@F4+1+!`I_mXsDi5r*D4N| zdtBTtsI-WJ6-M_wuL1KG#3y2-yHrt+D4ILZ)3wUm7C!_u&=hv7qUoV#krE(_78UiB zF6Tg6NDk3o8*!NT zXJ^cRB9+v_Qx-JZ%!EoKjK9Z(uihs$_}nu~t(#_i0Ans26WKrwQ?8(WOt5EV(xJu!rhzbO<&1r}a;*LYp3~O>I&|(nDl#BCCVkh=Un@7Py9-yB@E&o_tBQ z`q;>{gmByqD~0*l?Q z4p`kHpB3LMExLrNaT4k)t!CyJcfb0=uy6BYMpDm2uJRjMZg#vd-NzDfgjy#f9UUT1NejWx;+-C$0H0^+7+V0F1njohM z>6hloWYy}-V!D;rp(w@e0b6Q}8bg}KA#>^c#`E`6{7!rWbX%G=G}m2*a>z2{*KWNn zjwBwK$8pX@YNIRTI>DtJgvzx6$bt+;C8gNRM}e>o7Ig?kRm<`Qf64);%rKRX<~j*J z%iA;V53{$5f*>Ng7@3>yGiqO!W}EoUtvw@ z)}4CcnM&zz8#P$9rDnTfN9{1YTK)&K?A&TXz#_33bmkaIK=YT+0=r zirL)4O`m3ze)c7IwVgR3Fc>2k+H@v6z20h{jmu_sHYMc%u7$6$C%INA12 zx)^{0jpzXb;NP`0?Rc>?wE&AsNw>ZT8`wL^R6W?tkZ&Il-=cgCeZWKZN;bnnM8;+m zp7t#OOqm<{F!MErA<{V$!ZLrROBnH;!hcwUe@F6KV)^s&tFNNM0P7~Lf) z-CE&Aei$_GMZQrFtcrT*##YlJPXPVM?DR&Mv);6trX9vgD7v@YP8|F~)0*#L#ss>} zvX0kIUK#(SWqLBOY?J0k^H5|)cCbOnKsNlCMXD`H-4}o@`KMb)e1M`N<^X(d1#_}| zi%w9pNSd7x3ap!Y7xII7T0HI5+nse9?BJgW_Ls@jMkk)sbO>{zd-! zkGEwixzzSscxt2Mp?AsY0%d~=a6?sBYVHv^fHgP`$;s`Q(IJ ztLC-7FU)3sdNypbCJF9p_nL?RUKdq(lytB4dXrAp%{`?o9D7~qa==t;Aktm}ZCcI& zY)Dg88F4UvwL=@ALK>;yGA3NuqkKAh-B4Bi<0!@tQ+IqwaI(tlhY_bH}4v>d9p?mBN*oMES8$0 zDqWhZ&gpv+np3EHy3+PXnYky2L(+K{uXh)JyKsp5NezS}mFdRF$=q~2clGzwmm837)YN-s_-@HIq>FpyE~i!jUOEb-1RFJ#6Z zoZewrXL(7HRgG_-6HNRayr)QGc9+ZmUs(TxdOJFiRz0FqWx|;=?D&3gE%rmVhDgj_ z2cCztE0K~c!P$d*1jU(Q236`>3UN=Or5VU>5aO=%j2~YE;=)|wu9qOdr>W;C=mAdt zT~L@u>vQ%4o@AO+6!EWW^G)%v~D(!=ruhI6hMS-)N0Sm&IkG z%zI2!hlH--!KaGoDGJ895UJHi>(af~eOTnwWU`GQPHcB-0k42*u;WK=c8@8<~nxEuv_~i%5&S+u2bJ3a*~_p$4=@pHuCE zjeDZ2Ub*g#k5YMWWAVmq>Bfhaho8+Vlt-6qUogl>qM;!76S?6z3oow5H`Ra zrs?U|=F1MT4Wn$#y41OQ@*16e9OT|PkG}lCO`It!Ev`WjSOQ&~5#Y0=1l zU@WcuUC=JzuXQ+?=f(>x&{)C_3(UDXt5yATb+CQo*jH_dhvGx!rVvQeyRwFEK^6nxuGNq67-Ua=&C_eRG#Q zoWnqDMJi*r(sG7iW~m>L6RRukW9BpC4>rAE=x{?iVe8Y~pl1@vRg2gBvflvfK;h>M zMrUmv8F1&VR+;Odxk}|O>?Uujy;{5Ll!aXxJ`4WH0RZ_0jD8QO1XjULLb?nE8>m`M zbKUJa2-^6m&;eLwdsE_M-UI1}R`AF!axRM3#6RV~v-Aj96Ten4e{+{O)KuD7l>QQP z4~l9Mt+=S%mEK_a>IorjGjcfwq>tSx4*e45tbJ?mfju@PoCMMLKpchdI%p7B7N6!- zFk9e==-jyGj~oFwNaplbh!>CNOMYYUM!QD9O}y3#GFRV4AbOAO&G2<&$pCT-HzmBE zU2a&=+ihE*6E$P`TS z;~H}R-kUUJsq^^7B4O4u0M6wwf)+*>)ecWV-P>7~x@rt}8A3MkfEG}pAF0|;x;^N! zry0Wr$inFnqx2BO32!#YvJH(Fg#!P2P3o`F3Xjs^U%$_WtG@W@W$40u0vjUd9;tsb zkSkKo&^@TOz)t4jc&YtESV>C;iXH5Ng6uyay@aQsL|9SP6n=Mw1hPU70dh}KLu(Lk zV2^pB3;}H_xv#qEVyZ`&);)SiEJG{dS$yYMBe}I2xxoNpf@eUIO26KNd@8mnTreyV zes_#IA!TX4ecMUUc9=`NEwJyHA^WK_(oV-^n#g^J76zM>kQsJ{+``OMOXg_g76C z-tQ&&Qd|Zqn%rVe=7gdGdvV5$glov1ir8Hg{~7rQ2hM`(eT0I3U3Y+9GOgc#PCDQ0 zAcpKZ1oy)Xr>N#_I-{i_-!*ScM{{TYEd+-D*0bw-Npfan#;>V9xmfIw<=@92+;{`( z@cRYx%J}_h4YIV!w<g%(@o(1BTt7r8ig_Ff3&JM7Js*FP6;!*O zweBI&H9Y5wL>mZh_`vXC*A;#!>OjkoG@7H4#9;#_!ogFr#VylZy6XV1Ki5m=6&2yn zZ@t1_pl8TX0fIX$7Lr=hl_6upNACRm7QJ;{F>+flHGzV14y+6?GKv;p#X81ZI$bTd zd@_P5s0+BFYcv=pzcMF0Q2~-UlpmmV9vjx_qKwkC3BpK#l=pDw2JoK|GW&Nc1HH(+IOv6!M^<7;c1CQz(HtNiR+h1RJY- z_F2!gJT&zPgZ6MPZ7C|GYuMRJ)hcSEOIMCk&VnpHGKl9ZsiO~azv5LEj?z#GMNN{- z3GK~fnQ)r(`~|2r;e4A!vLcR@rWOU@$^p-yXvF{?rAH1C2%ed?{8wxm4g*NMFMu>v zVNjL7>g{9&11I4Bp3%d2`YTr<71qkq17QutTz+I0mEC911}SzMb@7q zNF*MV!f~?PPsjV&A3)*BU`JUr)e!b18s#suS4L^~kYoOKjP3~YcW5iz?taOfBxZI) zBq3Vr!;!?e300N|phY9HG?4}M`(2%_IKPysjMM&U5BstBSNx_kjpb9umw1Q72ul+W zL^|}TKNB*WmX?kGO)A>MMd|D*DOeP{3AN6l>v2MI5)$@*pB=k~Q*Hqhx-%YvV@~A}rw^QRz^LT7Nd=mP~CI-SIB-l7m*tjlyBE zXdsv7?~sgPnDs?QgLv?k9(isByR_HXI_{w)vYR|^;9!i#2BFlT>FR)7i)5CkU%er= zDm*I|g|AVdi=aB8Wv#$!&6-jc@`GhuoJa;bu0xe2ulvZ(1UYP)kH%O`>D)h`5=l3% zw3CHXwknXRZxXHuGrlZNZG0gs`tFPNJhktO-Wt(vls$jVJC!L=+tzBhf36$05vSP= zI<|4~Xh5b3w3TEJ2bp*TIh6(h3A~CYgW9n8hJuIBgEBjv2ZFysk}_}XJ;-JqWywr$ zfFOstA0uPyn#-v;_ezB;a3+1ObWrK6j}eO@G!V{)-o*HlPfd%XjSu4& zND>@NK-d@Ny~QY4W#S)B-c~$&_&s5tU`{<=x={lcg#=-lBbS|PI3?fh@fIojt-b!~Wn!g~}CVMY|Rm00>S*}wN zNUVBjtlMw*w5Er4A8YO|x;=eFqUwihG~;?}Vp(7;^2aKa5;assfI z6u$zH@lzS1jeiqsm%dn#&Z9V-i!)D^|DsJS%U2liq$E$i52SnnWwDIO-=a1|Mn?22 zuWfaYGdLTIcF*(V^qQg_grty`B;hLJv+STnHKpwZuKy)i7Vu#N%pcR9MGw?iM05?i zVqbF|*CI=66WXz~v1gqUwy3=Ed06NJRl7n*9Os^VHmeR>WfZP=MHM`Hi!#H^?)Se@rPpXF5~j}I_0iAb+)VnZ!2gIVlr<_ zSo@&6d{TbNNO<$-X|FJL@GIk+za%bx)(^g)QR%2WA;r%)2#Q&WmLy>Pn6_B3Lfpa` z>bz%&j0ajzAyeF5M3uKAttMx{;o!~q2VCejR;nHdU~1}qy3BTiti@l}aQ1;lRwzS= z+Qov|`_M%f>jI-HJ-OCd!$?tz7riE85|t))16BDoN z^`C}jQQ8Z_N~^r^jAzjvVpBpZD9Cva9-4*pzQjOoP>h6quB)f|o7fzJ5RsuWc)h6= zAv+lokV z#{Sn~01tLxKtTSBR+mpKN+HLGT|9Q;aZ~*oz#K~J5;l!N9_WFC-X`d_)hp3P)p_4i zzwoEFanDG%*053|tE7hOzL)W!5mo|_OJqhwNGt@djF633$vMWcrlhP}*t%!D$yCk~ zMNLR(2udjkxifGLXjd7twG)(P!h}enMV!}xk7p45V#JbudLW-v@Ubk-PcKA&eVU|{ zV`Y$1YgEHmTUXxr>3hd_!?5D>`GqD)xkzDH5 zQw60}J27_WNiG3@#w3@R0{h{mNsITUo1{T!Pa61;erg_X?vvzFGl^tL)sl(i(v0Fn zeqg_=rX|Dl$X4+ikZZHqb#=IojXUig!Gp#}*1TFofs714sU(-m1N%p>r(JYr7i;6B zT|5N&1cHwnC6`!?x(19vXA(3&KS(aIjU_FrN-p65y_!o#9@0>#f^y{XMhIzs_DU|j z0DB72{PdMv3XJg~ek&=pT@`c?CCe~1K{lNm`Y~?Y$wBa13_Np+?#61;Y&oL8`Av&J z4)H<)OrUROI|ZqWVjNIJIXCwa6`Lc^CW&}p&`K-Ww9(Bp`)XzmVo7g>ZJ5M{O z%NWcGC#8o*IUbJ3rE_yWTgul&ZlTth!*%<1(=q0pt<|%8h3{&xAewM4Plx8*rD{sD zO7CwU-EqT7+mr_6SWhEy+)Jnp%{6K9NpYA#F%lL@RK$@a#6EWkU!((>sJ+}tqC=eD zPPJg0CitsQrb@8Als*!VVDNF6bc2=y^a(S)kgFP zQU8d>@aim_G_j6}2YAGisy8K@H9%*gG(YPF^j&Mf$6At0l!5&QhYTk?6f#~B;A2Sl z5!Uszh{g4Ttt0v!xDTRV_4%OOyV%YNn1Fc#_?U~QW`u>JM<{s{4i=lwl3cn)5w0$9 z-@OEU%p|#_PIZBlZ#%unP4lz%G^GPOji6Mx%?dC%L_b?>uU9(wn0eao75EtB+vFVB zPfa2Tx2X(5hMHbqMu9-eu`kY5>wdD38HZg2W)avoErrILOKecLx4;3h_t@9`$4Pv9 zAKV{&3|OWWg$wW3ouuHcDmngs+o#}TyO?8P#2&k!Dt&!a2BlwtGjnJ7x8_u^q@O0} zOncdY;yyz3OZtt|Db-oG$pNSHVv5p~))W0rD6XFc*U`l4`*q2}%_UQspC^I+e1PQw zvkVpgi_#C9xRWVHM9PPWAl>nTWs2?TX9x8W2lXR6%snSm_e8LcHfc_&vbTI(zwbLy z&1AUF%$+vI_c@ZrTHNy^H?Ot8PGc*pkSmSqJY_8*k@S-X`7lG0+`&x}*6(6E)sEO^ zIllRgOTUg$qRuFcnf&_k_1A9xRMP7tU-u zuXj4=K@jISiN`h1B)rAY7iklHd^Jcn1+EbzTGocNb20>ZZ7T{gFV8omNu0cHoOQPDSquJ1nWfwK-I;U7#|FfO$MY zZ+(t6XV1&F@`;o@QiT_9KUp-QlK11HV)G|d-rcW0zSj*taE+lIh4qM>YOg4d@1; zP$P~(o63!CRi!?&G9`hO(zS!A;p58tzyUYhD(V@QcddoIvzMfD_p=yp>3%zHe^rHQOE zzxEW~YEHI__Oj47zU1Z{_@463GMP3;c1P>n)B7YFA^(&rS)GGdHhT|CO*#; zQB`2sihHqn5p2va8n-lOZFA6Xl^-X9kG1z7>UC#KxbzY$F66yCZ6XG%d|p}#<9($^ z4U=*r^Gnjst=t`ZdDcr4Q29_Wb)q(CTvy*5wrTp@z^mazxYsWkd|YDJ>(|`3I2gV; zC~U8Q+oyf*P93p5mGp_)iKkw4Vdlbe`8$8|JSA4_A#R?nf@t>foGYrpLLfr#ngAY4xhRPS@D0y+9J*H*1BZfDs0 z`Ww5?`jb3EAKU%fo}ClY>N3ngm6NV?m*vo`4tIx#<}k!N8@aYLbekvr9Rh2+3Eu-t zCvu4Dor@M~K6dV@RvTVi5B9;=?LCU=b}4otQF2e_c5z8U_b*(a{_arBBKk~$U_$p3 zLA@a?pj!wMF19U%C8D+CZZyC9^?A%OR}jo3shGo1a501Rh403_ufl zo!g3cG;V=t1?yga4>#WEe|z_&kdQ?2y`T_fN6BX&)*^IJB-k@W^L%t31g+n;<~#6F z?dGrKIkbxCv*{@pMn7ttB&0>atDh6|_3bf65OnTPn1T+XCZGOz()Xz9E&C6U$%g$k zdQOB`sfXCSPp{0ms0z5L|K5`Pwq7h>-I|68Sk&PDMH~KNSvXDbV`e!i33ucM;>1YC zDu}S+JMqwbC+92jM_h3&OmlK}5Zg-DHPNbZ$wTYqNt0UXw1ndFRXfjPU*c9>^JS2T z{jTvF;c&6{P9-o~!!@{)1Ru;A70LxN*JMT+2~??9Y^~T@?lIPOxFdC_f}i`GsGV}& z@_Hm8>36f&1Ut)h#X!O_wrhj%H16)Y&RvABcYu^Tuo(b#mPO4G+14K2Hi;e%Ko>4l z*zB2MEfwFZ5k#<$J#f}1l>=3SB`?Zd&TS~N{o}M%Y(zIYNzp5amF8Wapju}5Na|J| zojvY8^e%jF!ik88E{s?A?Y)IdR=m`0!R)G}6Q2v_eJ?a+emX=D5<%3VXl5=~R0WRd zq{1=U=MicrqFStwJPZ>=IJhyw->}=xY1iL8`W^ZPi6(rL^yS!I!rxyqp%?2U1P$OuP0%H!b>xts-)fg^rQa!aP z71w>8jqAGzHkwH3d|DuYiZB6PJZ(;`Dr7bE+jv|e4k#<^Ra0;0iHD|V$IMBHiYg(< zVvEbNdvno{=4W?}C>}EZl5bET<|l7Sd^%O#B5-5O;Gf2+pHRfr!~O~jy-(I zH*Ms>=aLCb8$XOitQRuh1VEHitAlb){4M1@?WP8rqq_PViNRH@v$KRK74d#1batDq zQXC^?-ffJG$&g7}6|kr>+IJh?lhY9kdbOaf#mPBcCWP^4jZyp~dF?Wl7b2v6eYqlT zqKb#rW<2hy785RnUv5&gvN;OfcQ;qO?sl(<=zQ=yT5Aue)h8?VjE~x0^IPtmHTA8t zRkYSvh0*C-7N8lLNey4oRZiu*LYQiC;9fWR_HB~H@NnD-zSGZx(Km5)%eje8{I_x@ z85$NiMAj@M^nklQz)sXf=eW)t!(4;}Hk**xTU}$z=Oun5ZjrVg@V8r>CJ5038;Mh{PhkdP)SVv( zS_)QgwCX61`ttUIn=}M3(7zltmxiXTe=9URIlSIwi*L&5898sBS9?8MaEZJel2;^u{8;4 z82^xUMo-R{$)hn??}`HTFkT@`#MRsNPU%*4`I$^rO0}AK_|!$kvQ+WDMN_WPyN7BN z$uH}a10=sPa&(=NzPSr*^-x+#>T1ZQoJda+JX^zF?8W``L~QY}iuAdQ^UuD?{YKUO zb!mq5<4jr8oSm3FvA;&eq5ia7P1J%RBVNw(4p&iXwarq35maF2DQPytr}^oNN2Ij@ z?y6P@v~CZUxz{`@BcB>IfoA&#>I$ZDYa;g zl5Uow8fAkj(D=vN~1 z%$`z3pc}pQ1J&ZnWAtxgIBBUgp{D1bEcU$TZ*uLSc^3Oj^Z>QFOif+3ad^sZI-Dv@aT@|Zu^cYv-y#g4|if#1`r%!|Ua zJI50vQa5$cnQEg_O0>%i>zj!|K=k+TkVqe0sRdT`L@uKaN(E9S#x65Q!>>}KVTF2D zOuRSt6t*k;B+?Ggj|x0Gjd>R_VX>UEiNOj|w7;1GYB= zi%#5o9;ox`MI}~A$k(ZXT^rDxYM`61IsIr~HSeIUDTw+-=}zD4Y?Co%y}XcZDrKb) z*IRvcJ_s0)DoF_z!L5}KFNCNEY06lN_sT^A2G=I@oK$v3C&ekSvB!aPhT_4PcRWeU zxO1;>4>`$WBDcA~MX@I%d3glhBRV;s;e3Z6|E`xb-;PBR-F8h#RNve1Al_++51s3` zKRfM!&FteV@Qx@Lza9}atn#b)gmC4fFWkPr>xExRSow5Ixe{f$N3;{sqgn17gdOyp zbPxv!{;xr~EY|5onbdPJ$BaEk&|2#=#WV0lBZSn;FyT++A3?7TcXLD)M9?`MVmbaq z+qYvGEGs^6EH*F-u=rjmi}g6EY+Hu_R6Xmq8O=}ENmq7ePtACfDCOn-XEjBUz=0F9 z;xbZ0rIh5NXmfYNa^d%p`D@^wR_3bQ(+#=hgbA3tFHEGPbzSfw5l7Mte)~)vcSFf= zdYiif?r!wi1NGCQ;A-2KQr>OWR!;&o5f!wuYEkux8cV`FjO+Z2K&^a-pbne+ zN}dU${wdEL^nr`d%DgXs!=e)Vv0jemMxF>|Tj`0+nnw(l{Jecc zo&PZ`@hy>9;}|syEOX~)qF#*SN0@gVj##9jLk_?A;V6$h_x96H&0P4`aR!-twU)R*2s+z8GO_u1y;2D$W>F9N&y4t6?#TD(u#cxDe0Jurus<>$eK?KJ%k; zhB9Rx5LcY?e!yzyWKmyQ4?MZU;{$WYkCg5qt|}GUza8u2w+v+zT6ouoi5x0hsY2Hl zq@J*T>u{Qx@#sApDFsiFdp(SQUuyYltVcj|WvmY~-y1$>bQ`C{Z*H<*wXZTKd80 zY!Inq%-_0Mx@$Y0lvAsb=7hD++r8DHM!gs{N>+k~L}~(b!h=}yz%y zKo1JfSI-g;MYnfdpRafHHIzi}|xI=6)~t6ju&0t?vZ-Dq+&0ovg`;n9Hv!Oc|3 zrI+5)Db)^Mi{w>{tl5BlXV4E^R>i9Hg?*9ChHW3ljo3#j4-TX^!Lu?#R}edh!B?EDVHY z%Koo5Us3g|P#==oFSinxCmEdK`HD%w+{GwAyq=uSQS$c<5Ndj|2YcRUtCL;mTze+l zA;ubR>^m4i6}fVtX~objsJzS=>%|{Ko9Oo{yKYP*qB`?!F<*P%E>!iK;63V-YoiMS ztO}f%JECG=DN?)bVALe=*)GylXr&zP1HWEo^HIzd!<2J>hk1pOf!Oy^ObFjs{y2<(+~3siCFLTX#+T?wI(2V$Co+Z%%$-UE=noijbdCz?pWt zZIJXspu;&ak|n&iU_;XlKD*kp0H3{Ag~rDfHS>7Y`3~7Eht- zx^RUoO^GQw6yri9s=Fyf=(7sthWaEl;ls=^ShTYz=Gc#(AUSJW=%CA%57Bo79_1D`*0(g)oX}P@jy9mB;_5HYsr$ArFIp)9K z!j0ZU%ah)O3iJFDn)OrdSWwZp?)45WS|2{}nGMj2b%BGt8sH-4U-I=&<=HH!=Zy^= z9S2JLpds(yE>zem8dbgS!jW^< zDJ;sMCxO3x(+UO-J=FLa?Vy^(llgQI?4B&I2%fsit z3c$xh$o(sDfPpL|Ie)Tut1uq6Ryp zVgpNV(uaOuLH{sdb8!<+-EknGPby&53A#|&$iboA_6lNmGVNv(4x6Lv=8CXt?Nj8-7!kYHwFK<>>jhC8Elt6cayR zd=e*e$A(UhqC=0L^NZZFq#mj8S@^Le_1@e~==T`W$cbcM!yL@5W|quVqqX@Yk)soV z*yi0x+l{?+(iK~hxhBGlyurW|MZ->~Gm4fyd$i^@8mbuydgyn!Sl^CqVRP!IKA8o0 zB@rYk4x9oBMVtZ01|*;pB56S!m{w8=qO@c2=;4R+UCG<7I{{LB?5e$ ziYVP!yaz2@8&V{F`JtIMRLcXKl1#N6m-;%4E-KI4mH=9a{}T?q`@@7Ol|LYA1h)c7kZ%pX9XazFxkLletMO7ZWtu z*0;|BEqv@EPpb4r3j~Ai^wpvYw|B0&F=!~!{H*@)I@)&p(DH8ax7`>J4D~54l==Ji z{aCN?HrIRGCr8pC5mnOXyL>w{o3$vD`Nf78*nzJ<`mx3ORJ5Jr9Nv~eltNnW_-<_C zz&J2#si@lUE)q|DyD3)G>3xGQ<}9WIC3IL2=Q^x9wd~qU$GW6AqMGlF7tV?oos&CV zm&6Q9)`=Od=z+NYg1BQRkU%LpUjtDZ*HV2tCCn5WsF^ZvgIBfYb>GeSyshs{56W!4 zg+=qzK`N`o)h6zd`DYSF6#Chr;K1Cuc zn$y~|4n2#tugmQdnbt_i_+l|D?7L^F;Nr4I>8qf0|(lns3Me9# zTM0BQ5sR5^e0b{pT-15ySxmE+gHi62(k;>Ir*+92KN)h8KQ9Q>D@?GNK1%4`$f|KS z&p(>dYcyxF6?8Y*ZMr4W#hq{<^d8lE*wC$Uqo)u{%6sj^1j_8URGB)4?^dRJXkK44 zlo7sGwfyKTSV+)84*00XWMe122ix;yMI&|dnzg;!cwG{0qSuq}U*yO4BxmMll9=ai zxB7++y>2*@C1+~y&9ZIntD7>ct|+KDyG!1Z*l1PX`?0&Bndre2y!Vf%Hy@D4`U)vU zAdgZKd$zM|?GCN(vMua>-ut@gINi7LYU$^-e!^a&DSWxeIlmDhEIr>4sbcd%sdmPe0=wP2HzW$g;l4rJthDPL`3v#f8D$j z-0@Y#$75zjeu8>oz0t>od(&~uf^aj#BWm6|HvEkt+xf!INxkHf-?rn79Wxb<5Wkp( z^JfL&@1;=(N0Vk0M=JZ0?PzmHtTPp^q%8MIB2 z^t;MF)9Y?-GZ@_PVm*h>^F&sD?jV<&JaXMJulPQ5pAH2s`AB>4nS;f&MF8H?dDn&N zqK~nIqd>DZIw;k?v|`JDxZ2jM z+w4?+#LW8?JM|=SUP)D`CPTFd6``#3P9JpU8|%aC=`Lw{Hl58X@&ooUixtTCz?$2r zDAU|X+j#;Vm`L1y0Edw!TZiRGMW>O~6CR08Ksx1?RF}QHY1GSTW-naP$MSo#uqNjv zwHk>-b()_ff&Bzq0!e87#^!yk)l@U8SoY=m&bH4Zc~-B@IZGXiod$O5%zCfF4Un4m8MEyhj*L6?(4Bv zJWETJaK{l230s@OBqNpi?wT*%wQqDBODYBEphU`$QHqp3Y5}sQ&(NgCYt<4Owu14S z3N7p1i$ZPL6i1UPV86kciJ@8(12iGA*TU*$#;?)zW)@Xq4L*koJef?Hc#C4t`WuDJmPoL0D=}pOr{O|B&!VO|2z<{T!}lGx_`JYqb>}iqCvp6RluL!`68Wa@3LxWTkjujhcCfnC%rb`w(enUSIJ%dB(=@GF|z7w zXpzVq?8TR5;bhZ?XxGfop0Y617FW8&B~%3q0 z{{tJMUcg0HRzTOS$o9^lnDf@7!dGa6Dli7OCn4@BY#w7x)rOlSZ|Ln)yZIUs6XEq^ z_x<`GV&RB%ApTcnXBw3R+J<4%TuKH_r`%A?t;yXqZBVha#_eR8GmVD0mD{MHx$l+> zrXZ%K<`R{qnF~W|khzsxra+qI0x5{%0)oPbn%men-}m=BXMWv3-upc7|La`u`{3xj zgi=i2ug)jGC0p$6XsOeP>PZ;%9DP*EJ6O!OCRpl3gyt0zw_b%f)B4)aP!Oa=!dJ=1 z)pKmYvO;;)u-2+X2kYrS%4gMX%GSPmuzpQm%6maj7T_}}RJlJEn@GA zGHeVkDq#~*y0{=ea!TR&*u&9b^r*8zj^6GxP0jV}bFFGk_vG5AjY_@AG~A1Y*& z^hhyWPG=Z<=sybuZ|yD^_xhFF6&$r`rTL;(VGr;4ix161ai&wg_0)r*9fSA*EA!=J zBE>!P11mpgam5+G!&!&G-O)P)!~EhJjR9F`CT|f|9++$en2MPz=;&_a%nq zrQp1wAxR-u89El_Jlz(1U53O#UQtS^K}@-iH?F;(k8{uFC73y>B%xB>4G=ZK zjxmN~?9e_}dnYQl$(<8J#}y|G?8{oyto-&q?)A<46qH?VGE_3;3ZRZ^e5_^mtUM0S zs05sQv)ToM?lvoXroJZqwZGK*j{>{uDhf#1BBW@!$xw-0@hBX$S3Kv+ItLZ=fjGI@ z(^v;m8T_p=VDZXDbGNH6ROMPw_#VsVq7L@nxA&)7C~|R%gIn-L*Ak3^{fO@*dR-=J z<6&d-;*DhOWbEvW-`@KGhZl9}_K4PJ?ThsMFc-C%pJrVMaHYuzq!3=>E@6oq2{BZ9 z%Xu&Lj4GRWPqx zH*vaOaaqSXYAz~9?<)n|B~^PM&zki#b^ z&2cG%Jnsm{t9}6+1@Lxj{mzo2DSuAqg(C#QP1to$PoSRa!NHGHrbg)U-k+Q-tknM!hDjG3=- z4g$^VSb0TCyb)1Z7uqubb)|n*7ujn+akz|e`2m@w|4Z(K6L)#_z+d4D4Zwg60~Y2n zcEzPCE*GQkEWK%$lEtejuqh=Kz?QFY4GdXRK?N7n$8&Hh3<;q!l%fYf>-u5~Tg5S% zHofy$=FBZ{U%1B*x_!)(D)g)lh2E^TyK=-v*$7pH#NA4l_f;r?$)Oomml93vo*+XYzCagF0xGNd)OCNNxk%bs0lLS%obD+&J$4xie^;v;XkMWw|<*xO6 z26?kZ(9hK%iwOEhKW-HKr{vsNK_Y2pzPS)P>{}~8QOur|>zGmnuKAovmClWaP~qEq z`sAds$*M+@(4@j|O|f*{yKfG|&;Q*dQA#JlioFT)sOXM^6ZipSEOt`rKLaI zR<8qN`t)&nlp)W~ys~Z>$eb(@Y}6vK!vNxvSTYoYHGI1$^aC@?xH-GpH4KA#E~4^yaO8(cfvF{u!!zNb1WilG>8y@ z7=5r!0{9#CYH_t*71LU+^`l>6ovjz%t@U{BHp$1@8VT+Jo+SegxwZ05A%(nUiB|!L z`5=z7b)F5HSF1Vw>0rtwx2M;sr%;e4`z0rE^uqa*#!G-f0b9P?tloUv>P;k^c!%0e zrVVrHGszI-V1hW|NFe?KZ_S{EaZ1Qwd-aW3VhBIanJth-xH=grhxaAxe`wkFNHhKp z(Eb|-{zK39`P%pMgHm?iLmh<_`Tvdo760AXf7Slyip$KAJsFV%vsR?z$nh`x{~3um MUT`_zXzO$5Z~Mp?5&!@I From 24be56195cec8b35b2c2bb9c8d1e2333b3f4f20d Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 25 Jan 2020 18:10:51 +0100 Subject: [PATCH 0038/1520] chore: refactoring --- Dockerfile | 2 +- download-references.nf | 29 +++++++---------------------- download-singularity-img.nf | 33 +++++++++------------------------ 3 files changed, 17 insertions(+), 47 deletions(-) diff --git a/Dockerfile b/Dockerfile index d8b5f84a..95ab60dc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,4 +4,4 @@ LABEL authors="Martin Proks " \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/nf-core-rnafusion-1.1.0/bin:$PATH +ENV PATH /opt/conda/envs/$(cat environment.yml | grep "name:" | cut -d":" -f2 | cut -d " " -f2)/bin:$PATH diff --git a/download-references.nf b/download-references.nf index 6a890fb9..43031361 100644 --- a/download-references.nf +++ b/download-references.nf @@ -46,31 +46,17 @@ if (params.help){ exit 0 } -if (!params.reference_release) { - exit 1, "You did not specify the release number of reference!" -} +if (!params.reference_release) exit 1, "You did not specify the release number of reference!" +if (!params.outdir) exit 1, "Output directory not specified!" params.running_tools = [] -if (!params.outdir) { - exit 1, "Output directory not specified!" -} -if (params.arriba || params.download_all) { - params.running_tools.add("Arriba") -} -if (params.star_fusion || params.download_all) { - params.running_tools.add("STAR-Fusion") -} -if (params.fusioncatcher || params.download_all) { - params.running_tools.add("Fusioncatcher") -} -if (params.ericscript || params.download_all) { - params.running_tools.add("Ericscript") -} +if (params.arriba || params.download_all) params.running_tools.add("Arriba") +if (params.star_fusion || params.download_all) params.running_tools.add("STAR-Fusion") +if (params.fusioncatcher || params.download_all) params.running_tools.add("Fusioncatcher") +if (params.ericscript || params.download_all) params.running_tools.add("Ericscript") if (params.download_all) { params.running_tools.add('fusion-report') - if (!params.cosmic_usr || !params.cosmic_passwd) { - exit 1, "Database credentials are required parameter!" - } + if (!params.cosmic_usr || !params.cosmic_passwd) exit 1, "Database credentials are required parameter!" } // Header log info @@ -94,7 +80,6 @@ process download_base { file "Homo_sapiens.GRCh38_r${params.reference_release}.gtf" into gtf file "Homo_sapiens.GRCh38_${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 diff --git a/download-singularity-img.nf b/download-singularity-img.nf index 7aeb69c6..48673a51 100644 --- a/download-singularity-img.nf +++ b/download-singularity-img.nf @@ -50,30 +50,15 @@ if (params.help){ } params.running_tools = ["nf-core/rnafusion/${workflow.manifest.version}"] -if (!params.outdir) { - exit 1, "Output directory not specified!" -} -if (params.arriba || download_all) { - params.running_tools.add("Arriba") -} -if (params.star_fusion || download_all) { - params.running_tools.add("STAR-Fusion") -} -if (params.fusioncatcher || download_all) { - params.running_tools.add("Fusioncatcher") -} -if (params.ericscript || download_all) { - params.running_tools.add("Ericscript") -} -if (params.pizzly || download_all) { - params.running_tools.add("Pizzly") -} -if (params.squid || download_all) { - params.running_tools.add("Squid") -} -if (params.fusion_inspector || download_all) { - params.running_tools.add("Fusion-Inspector") -} +if (!params.outdir) exit 1, "Output directory not specified!" + +if (params.arriba || download_all) params.running_tools.add("Arriba") +if (params.star_fusion || download_all) params.running_tools.add("STAR-Fusion") +if (params.fusioncatcher || download_all) params.running_tools.add("Fusioncatcher") +if (params.ericscript || download_all) params.running_tools.add("Ericscript") +if (params.pizzly || download_all) params.running_tools.add("Pizzly") +if (params.squid || download_all) params.running_tools.add("Squid") +if (params.fusion_inspector || download_all) params.running_tools.add("Fusion-Inspector") // Header log info log.info nfcoreHeader() From 04ccc60c900a1f877a2e262e2eb8b3dca223746d Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 25 Jan 2020 18:11:32 +0100 Subject: [PATCH 0039/1520] docs: updated example configuration --- example/custom-docker.config | 33 ++++++++++++---------- example/custom-singularity.config | 46 +++++++++++++++---------------- 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/example/custom-docker.config b/example/custom-docker.config index 5eedfdc4..2da2832b 100644 --- a/example/custom-docker.config +++ b/example/custom-docker.config @@ -8,30 +8,33 @@ params { max_cpus = 24 max_memory = 256.GB max_time = 72.h - container_version = '1.0.1' + container_version = '1.1.0' - // Default tool versions + // Tool versions arriba_version = '1.1.0' - star_fusion_version = '1.5.0' - fusioncatcher_version = '1.00' ericscript_version = '0.5.5' + fusioncatcher_version = '1.20' + fusion_inspector_version = '1.3.1-star2.7.0f' pizzly_version = '0.37.3' - squid_version = '1.5' - fusion_inspector_version = '1.3.1' + squid_version = '1.5-star2.7.0f' + star_fusion_version = '1.6.0' // Extra parameters for fusion tools arriba_opt = '' - star_fusion_opt = '' fusioncatcher_opt = '' fusion_report_opt = '' - + star_fusion_opt = '' + + // References reference_base = '/path/to/references' - databases = "${params.reference_base}/databases/" + fasta = "${params.reference_base}/Homo_sapiens.GRCh38_r97.all.fa + gtf = "${params.reference_base}/Homo_sapiens.GRCh38_r97.gtf + transcript = "${params.reference_base}/Homo_sapiens.GRCh38_r97.cdna.all.fa.gz" + databases = "${params.reference_base}/1.1.0/databases" - arriba_ref = "${params.reference_base}/arriba_ref" - fusioncatcher_ref = "${params.reference_base}/fusioncatcher_ref/human_v90" - star_fusion_ref = "${params.reference_base}/star_fusion_ensembl_ref/ctat_genome_lib_build_dir" - ericscript_ref = "${params.reference_base}/ericscript_ref/ericscript_db_homosapiens_ensembl84" - pizzly_fasta = "${params.reference_base}/pizzly_ref/Homo_sapiens.GRCh38.cdna.all.fa.gz" - pizzly_gtf = "${params.reference_base}/pizzly_ref/Homo_sapiens.GRCh38.94.gtf" + // Fusion tools + arriba_ref = "${params.reference_base}/arriba" + ericscript_ref = "${params.reference_base}/ericscript/ericscript_db_homosapiens_ensembl84" + fusioncatcher_ref = "${params.reference_base}/fusioncatcher/human_v98" + star_fusion_ref = "${params.reference_base}/star-fusion/ctat_genome_lib_build_dir" } \ No newline at end of file diff --git a/example/custom-singularity.config b/example/custom-singularity.config index 55691122..b910afb0 100644 --- a/example/custom-singularity.config +++ b/example/custom-singularity.config @@ -8,42 +8,44 @@ params { max_cpus = 24 max_memory = 256.GB max_time = 72.h - container_version = '1.0.1' + container_version = '1.1.0' - // Default tool versions + // Tool versions arriba_version = '1.1.0' - star_fusion_version = '1.5.0' - fusioncatcher_version = '1.00' ericscript_version = '0.5.5' + fusioncatcher_version = '1.20' + fusion_inspector_version = '1.3.1-star2.7.0f' pizzly_version = '0.37.3' - squid_version = '1.5' - fusion_inspector_version = '1.3.1' + squid_version = '1.5-star2.7.0f' + star_fusion_version = '1.6.0' // Extra parameters for fusion tools arriba_opt = '' - star_fusion_opt = '' fusioncatcher_opt = '' fusion_report_opt = '' + star_fusion_opt = '' + // References reference_base = '/path/to/references' - containerPath = "file:///path/to/containers/" - databases = "${params.reference_base}/databases/" + fasta = "${params.reference_base}/Homo_sapiens.GRCh38_r97.all.fa + gtf = "${params.reference_base}/Homo_sapiens.GRCh38_r97.gtf + transcript = "${params.reference_base}/Homo_sapiens.GRCh38_r97.cdna.all.fa.gz" + databases = "${params.reference_base}/1.1.0/databases" - arriba_ref = "${params.reference_base}/arriba_ref" - fusioncatcher_ref = "${params.reference_base}/fusioncatcher_ref/human_v90" - star_fusion_ref = "${params.reference_base}/star_fusion_ensembl_ref/ctat_genome_lib_build_dir" - ericscript_ref = "${params.reference_base}/ericscript_ref/ericscript_db_homosapiens_ensembl84" - pizzly_fasta = "${params.reference_base}/pizzly_ref/Homo_sapiens.GRCh38.cdna.all.fa.gz" - pizzly_gtf = "${params.reference_base}/pizzly_ref/Homo_sapiens.GRCh38.94.gtf" + // Fusion tools + arriba_ref = "${params.reference_base}/arriba" + ericscript_ref = "${params.reference_base}/ericscript/ericscript_db_homosapiens_ensembl84" + fusioncatcher_ref = "${params.reference_base}/fusioncatcher/human_v98" + star_fusion_ref = "${params.reference_base}/star-fusion/ctat_genome_lib_build_dir" } process { - container = "${params.containerPath}/rnafusion_v${params.container_version}.img" + container = "${params.containerPath}/rnafusion_1.1.0.img" - withName:arriba { + withName: "arriba|arriba_visualization" { container = "${params.containerPath}/rnafusion_arriba_v${params.arriba_version}.img" } - withName:star_fusion { + withName: "star_fusion|download_star_fusion" { container = "${params.containerPath}/rnafusion_star-fusion_v${params.star_fusion_version}.img" } withName:fusioncatcher { @@ -53,16 +55,12 @@ process { container = "${params.containerPath}/rnafusion_fusion-inspector_v${params.fusion_inspector_version}.img" } withName:ericscript { - container = "${params.containerPath}/rnafusion_ericscript_v${params.ericscript_version}.img" + container = "${params.containerPathCommon}/rnafusion_ericscript_v${params.ericscript_version}.img" } withName:pizzly { - container = "${params.containerPath}/rnafusion_pizzly_v${params.pizzly_version}.img" + container = "${params.containerPathCommon}/rnafusion_pizzly_v${params.pizzly_version}.img" } withName:squid { container = "${params.containerPath}/rnafusion_squid_v${params.squid_version}.img" } - // Download references - withName:download_star_fusion_ensembl { - container = "${params.containerPath}/rnafusion_star-fusion_v${params.star_fusion_version}.img" - } } From c7d34987213ebdcc7d2f665bfc6456fb51c21e06 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 25 Jan 2020 18:12:16 +0100 Subject: [PATCH 0040/1520] chore: refactoring --- bin/scrape_software_versions.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index 45eb3c4b..13a493ba 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -10,13 +10,13 @@ 'FastQC': ['v_fastqc.txt', r"FastQC v(\S+)"], 'MultiQC': ['v_multiqc.txt', r"multiqc, version (\S+)"], 'Arriba': ['v_arriba.txt', r"arriba=(\S+)"], - 'STAR-Fusion': ['v_star_fusion.txt', r"star-fusion=(\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+)"], - 'EricScript': ['v_ericscript.txt', r"ericscript=(\S+)"], + 'fusion-report': ['v_fusion_report.txt', r"fusion-report=(\S+)"], 'Pizzly': ['v_pizzly.txt', r"pizzly=(\S+)"], - 'Squid': ['v_squid.txt', r"squid=(\S+)"], - 'fusion-report': ['v_fusion_report.txt', r"fusion-report=(\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' @@ -24,12 +24,13 @@ results['FastQC'] = 'N/A' results['MultiQC'] = 'N/A' results['Arriba'] = 'N/A' -results['STAR-Fusion'] = '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' -results['fusion-report'] = 'N/A' # Search each file using its regex for k, v in regexes.items(): From 4aeb705c642493c4ef1cc375b8aa453f4d999263 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 25 Jan 2020 18:13:33 +0100 Subject: [PATCH 0041/1520] chore: removed unnecessary files --- .github/pylintrc | 562 ------------------------------------------- Jenkinsfile | 47 ---- conf/igenomes.config | 152 ------------ conf/jenkins.config | 23 -- conf/test.config | 29 --- 5 files changed, 813 deletions(-) delete mode 100644 .github/pylintrc delete mode 100644 Jenkinsfile delete mode 100644 conf/igenomes.config delete mode 100644 conf/jenkins.config delete mode 100644 conf/test.config diff --git a/.github/pylintrc b/.github/pylintrc deleted file mode 100644 index f58b60bb..00000000 --- a/.github/pylintrc +++ /dev/null @@ -1,562 +0,0 @@ -[MASTER] - -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code. -extension-pkg-whitelist= - -# Add files or directories to the blacklist. They should be base names, not -# paths. -ignore=CVS - -# Add files or directories matching the regex patterns to the blacklist. The -# regex matches against base names, not paths. -ignore-patterns= - -# Python code to execute, usually for sys.path manipulation such as -# pygtk.require(). -#init-hook= - -# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the -# number of processors available to use. -jobs=1 - -# Control the amount of potential inferred values when inferring a single -# object. This can help the performance when dealing with large functions or -# complex, nested conditions. -limit-inference-results=100 - -# List of plugins (as comma separated values of python modules names) to load, -# usually to register additional checkers. -load-plugins= - -# Pickle collected data for later comparisons. -persistent=yes - -# Specify a configuration file. -#rcfile= - -# When enabled, pylint would attempt to guess common misconfiguration and emit -# user-friendly hints instead of false-positive error messages. -suggestion-mode=yes - -# Allow loading of arbitrary C extensions. Extensions are imported into the -# active Python interpreter and may run arbitrary code. -unsafe-load-any-extension=no - - -[MESSAGES CONTROL] - -# Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. -confidence= - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once). You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use "--disable=all --enable=classes -# --disable=W". -disable=print-statement, - parameter-unpacking, - unpacking-in-except, - old-raise-syntax, - backtick, - long-suffix, - old-ne-operator, - old-octal-literal, - import-star-module-level, - non-ascii-bytes-literal, - raw-checker-failed, - bad-inline-option, - locally-disabled, - file-ignored, - suppressed-message, - useless-suppression, - deprecated-pragma, - use-symbolic-message-instead, - apply-builtin, - basestring-builtin, - buffer-builtin, - cmp-builtin, - coerce-builtin, - execfile-builtin, - file-builtin, - long-builtin, - raw_input-builtin, - reduce-builtin, - standarderror-builtin, - unicode-builtin, - xrange-builtin, - coerce-method, - delslice-method, - getslice-method, - setslice-method, - no-absolute-import, - old-division, - dict-iter-method, - dict-view-method, - next-method-called, - metaclass-assignment, - indexing-exception, - raising-string, - reload-builtin, - oct-method, - hex-method, - nonzero-method, - cmp-method, - input-builtin, - round-builtin, - intern-builtin, - unichr-builtin, - map-builtin-not-iterating, - zip-builtin-not-iterating, - range-builtin-not-iterating, - filter-builtin-not-iterating, - using-cmp-argument, - eq-without-hash, - div-method, - idiv-method, - rdiv-method, - exception-message-attribute, - invalid-str-codec, - sys-max-int, - bad-python3-import, - deprecated-string-function, - deprecated-str-translate-call, - deprecated-itertools-function, - deprecated-types-field, - next-method-defined, - dict-items-not-iterating, - dict-keys-not-iterating, - dict-values-not-iterating, - deprecated-operator-function, - deprecated-urllib-function, - xreadlines-attribute, - deprecated-sys-function, - exception-escape, - comprehension-escape, - too-few-public-methods - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time (only on the command line, not in the configuration file where -# it should appear only once). See also the "--disable" option for examples. -enable=c-extension-no-member - - -[REPORTS] - -# Python expression which should return a note less than 10 (10 is the highest -# note). You have access to the variables errors warning, statement which -# respectively contain the number of errors / warnings messages and the total -# number of statements analyzed. This is used by the global evaluation report -# (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details. -#msg-template= - -# Set the output format. Available formats are text, parseable, colorized, json -# and msvs (visual studio). You can also give a reporter class, e.g. -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Tells whether to display a full report or only the messages. -reports=no - -# Activate the evaluation score. -score=yes - - -[REFACTORING] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - -# Complete name of functions that never returns. When checking for -# inconsistent-return-statements if a never returning function is called then -# it will be considered as an explicit return statement and no message will be -# printed. -never-returning-functions=sys.exit - - -[BASIC] - -# Naming style matching correct argument names. -argument-naming-style=snake_case - -# Regular expression matching correct argument names. Overrides argument- -# naming-style. -#argument-rgx= - -# Naming style matching correct attribute names. -attr-naming-style=snake_case - -# Regular expression matching correct attribute names. Overrides attr-naming- -# style. -#attr-rgx= - -# Bad variable names which should always be refused, separated by a comma. -bad-names=foo, - bar, - baz, - toto, - tutu, - tata - -# Naming style matching correct class attribute names. -class-attribute-naming-style=any - -# Regular expression matching correct class attribute names. Overrides class- -# attribute-naming-style. -#class-attribute-rgx= - -# Naming style matching correct class names. -class-naming-style=PascalCase - -# Regular expression matching correct class names. Overrides class-naming- -# style. -#class-rgx= - -# Naming style matching correct constant names. -const-naming-style=UPPER_CASE - -# Regular expression matching correct constant names. Overrides const-naming- -# style. -#const-rgx= - -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=-1 - -# Naming style matching correct function names. -function-naming-style=snake_case - -# Regular expression matching correct function names. Overrides function- -# naming-style. -#function-rgx= - -# Good variable names which should always be accepted, separated by a comma. -good-names=i, - j, - k, - ex, - Run, - _ - -# Include a hint for the correct naming format with invalid-name. -include-naming-hint=no - -# Naming style matching correct inline iteration names. -inlinevar-naming-style=any - -# Regular expression matching correct inline iteration names. Overrides -# inlinevar-naming-style. -#inlinevar-rgx= - -# Naming style matching correct method names. -method-naming-style=snake_case - -# Regular expression matching correct method names. Overrides method-naming- -# style. -#method-rgx= - -# Naming style matching correct module names. -module-naming-style=snake_case - -# Regular expression matching correct module names. Overrides module-naming- -# style. -#module-rgx= - -# Colon-delimited sets of names that determine each other's naming style when -# the name regexes allow several styles. -name-group= - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=^_ - -# List of decorators that produce properties, such as abc.abstractproperty. Add -# to this list to register other decorators that produce valid properties. -# These decorators are taken in consideration only for invalid-name. -property-classes=abc.abstractproperty - -# Naming style matching correct variable names. -variable-naming-style=snake_case - -# Regular expression matching correct variable names. Overrides variable- -# naming-style. -#variable-rgx= - - -[FORMAT] - -# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. -expected-line-ending-format= - -# Regexp for a line that is allowed to be longer than the limit. -ignore-long-lines=^\s*(# )??$ - -# Number of spaces of indent required inside a hanging or continued line. -indent-after-paren=4 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=' ' - -# Maximum number of characters on a single line. -max-line-length=100 - -# Maximum number of lines in a module. -max-module-lines=1000 - -# List of optional constructs for which whitespace checking is disabled. `dict- -# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. -# `trailing-comma` allows a space between comma and closing bracket: (a, ). -# `empty-line` allows space-only lines. -no-space-check=trailing-comma, - dict-separator - -# Allow the body of a class to be on the same line as the declaration if body -# contains single statement. -single-line-class-stmt=no - -# Allow the body of an if to be on the same line as the test if there is no -# else. -single-line-if-stmt=no - - -[LOGGING] - -# Format style used to check logging format string. `old` means using % -# formatting, while `new` is for `{}` formatting. -logging-format-style=old - -# Logging modules to check that the string format arguments are in logging -# function parameter format. -logging-modules=logging - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -notes=FIXME, - XXX, - TODO - - -[SIMILARITIES] - -# Ignore comments when computing similarities. -ignore-comments=yes - -# Ignore docstrings when computing similarities. -ignore-docstrings=yes - -# Ignore imports when computing similarities. -ignore-imports=no - -# Minimum lines number of a similarity. -min-similarity-lines=4 - - -[SPELLING] - -# Limits count of emitted suggestions for spelling mistakes. -max-spelling-suggestions=4 - -# Spelling dictionary name. Available dictionaries: none. To make it working -# install python-enchant package.. -spelling-dict= - -# List of comma separated words that should not be checked. -spelling-ignore-words= - -# A path to a file that contains private dictionary; one word per line. -spelling-private-dict-file= - -# Tells whether to store unknown words to indicated private dictionary in -# --spelling-private-dict-file option instead of raising a message. -spelling-store-unknown-words=no - - -[TYPECHECK] - -# List of decorators that produce context managers, such as -# contextlib.contextmanager. Add to this list to register other decorators that -# produce valid context managers. -contextmanager-decorators=contextlib.contextmanager - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E1101 when accessed. Python regular -# expressions are accepted. -generated-members= - -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - -# Tells whether to warn about missing members when the owner of the attribute -# is inferred to be None. -ignore-none=yes - -# This flag controls whether pylint should warn about no-member and similar -# checks whenever an opaque object is returned when inferring. The inference -# can return multiple potential results while evaluating a Python object, but -# some branches might not be evaluated, which results in partial inference. In -# that case, it might be useful to still emit no-member and other checks for -# the rest of the inferred objects. -ignore-on-opaque-inference=yes - -# List of class names for which member attributes should not be checked (useful -# for classes with dynamically set attributes). This supports the use of -# qualified names. -ignored-classes=optparse.Values,thread._local,_thread._local - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis. It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules= - -# Show a hint with possible names when a member name was not found. The aspect -# of finding the hint is based on edit distance. -missing-member-hint=yes - -# The minimum edit distance a name should have in order to be considered a -# similar match for a missing member name. -missing-member-hint-distance=1 - -# The total number of similar names that should be taken in consideration when -# showing a hint for a missing member. -missing-member-max-choices=1 - - -[VARIABLES] - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid defining new builtins when possible. -additional-builtins= - -# Tells whether unused global variables should be treated as a violation. -allow-global-unused-variables=yes - -# List of strings which can identify a callback function by name. A callback -# name must start or end with one of those strings. -callbacks=cb_, - _cb - -# A regular expression matching the name of dummy variables (i.e. expected to -# not be used). -dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ - -# Argument names that match this expression will be ignored. Default to name -# with leading underscore. -ignored-argument-names=_.*|^ignored_|^unused_ - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# List of qualified module names which can have objects that can redefine -# builtins. -redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io - - -[CLASSES] - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__, - __new__, - setUp - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict, - _fields, - _replace, - _source, - _make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=cls - - -[DESIGN] - -# Maximum number of arguments for function / method. -max-args=5 - -# Maximum number of attributes for a class (see R0902). -max-attributes=7 - -# Maximum number of boolean expressions in an if statement. -max-bool-expr=5 - -# Maximum number of branch for function / method body. -max-branches=12 - -# Maximum number of locals for function / method body. -max-locals=15 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=20 - -# Maximum number of return / yield for function / method body. -max-returns=6 - -# Maximum number of statements in function / method body. -max-statements=50 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=2 - - -[IMPORTS] - -# Allow wildcard imports from modules that define __all__. -allow-wildcard-with-all=no - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - -# Deprecated modules which should not be used, separated by a comma. -deprecated-modules=optparse,tkinter.tix - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled). -ext-import-graph= - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled). -import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled). -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "Exception". -overgeneral-exceptions=Exception diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index eeaa816d..00000000 --- a/Jenkinsfile +++ /dev/null @@ -1,47 +0,0 @@ -pipeline { - agent any - - environment { - JENKINS_API = credentials('api') - NXF_VER = 0.32.0 - } - - stages { - stage('Setup environment') { - steps { - sh "pip install nf-core" - sh "docker pull nfcore/rnafusion:1.0.2" - } - } - stage('Lint markdown') { - steps { - sh "markdownlint $WORKSPACE -c $WORKSPACE/.github/markdownlint.yml" - } - } - stage('Nextflow legacy build') { - steps { - // sh "nextflow run kraken,jenkins nf-core/rnafusion" - sh "nextflow run nf-core/rnafusion -r 1.0.2 --help" - sh "nextflow run nf-core/rnafusion/download-references.nf -r 1.0.2 --help" - sh "nextflow run nf-core/rnafusion/download-singularity-img.nf -r 1.0.2 --help" - } - } - stage('Nextflow latest build') { - steps { - // sh "nextflow run kraken,jenkins nf-core/rnafusion" - sh "NXF_VER='' nextflow run nf-core/rnafusion -r 1.0.2 --help" - sh "NXF_VER='' nextflow run nf-core/rnafusion/download-references.nf -r 1.0.2 --help" - sh "NXF_VER='' nextflow run nf-core/rnafusion/download-singularity-img.nf -r 1.0.2 --help" - } - } - } - - post { - failure { - script { - def response = sh(script: "curl -u ${JENKINS_API_USR}:${JENKINS_API_PSW} ${BUILD_URL}/consoleText", returnStdout: true).trim().replace('\n', '
') - def comment = pullRequest.comment("## :rotating_light: Build log output:
${response}
") - } - } - } -} \ No newline at end of file diff --git a/conf/igenomes.config b/conf/igenomes.config deleted file mode 100644 index 1840a7a6..00000000 --- a/conf/igenomes.config +++ /dev/null @@ -1,152 +0,0 @@ -/* - * ------------------------------------------------- - * 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' { - bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" - } - 'GRCh38' { - bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" - } - 'GRCm38' { - bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" - } - 'TAIR10' { - bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" - } - 'EB2' { - bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" - } - 'UMD3.1' { - bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" - } - 'WBcel235' { - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" - } - 'CanFam3.1' { - bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" - } - 'GRCz10' { - bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" - } - 'BDGP6' { - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" - } - 'EquCab2' { - bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" - } - 'EB1' { - bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" - } - 'Galgal4' { - bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" - } - 'Gm01' { - bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" - } - 'Mmul_1' { - bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" - } - 'IRGSP-1.0' { - bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" - } - 'CHIMP2.1.4' { - bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" - } - 'Rnor_6.0' { - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" - } - 'R64-1-1' { - bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" - } - 'EF2' { - bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" - } - 'Sbi1' { - bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" - } - 'Sscrofa10.2' { - bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" - } - 'AGPv3' { - bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" - } - } -} diff --git a/conf/jenkins.config b/conf/jenkins.config deleted file mode 100644 index da8a8f1c..00000000 --- a/conf/jenkins.config +++ /dev/null @@ -1,23 +0,0 @@ -/* - * ------------------------------------------------- - * Nextflow config file for running tests - * ------------------------------------------------- - * Testing profile for checking just the syntax - * of the pipeline. To run use: - * nextflow run nf-core/rnafusion -profile jenkins - */ - -executor { - name = 'local' -} - -params { - reads = '/share-data/testing/rnafusion/reads_{1,2}.fq.gz' - genome = 'GRCh38' - star_fusion = true - fusioncatcher = true - ericscript = true - pizzly = true - squid = true - fusion_inspector = true -} \ No newline at end of file diff --git a/conf/test.config b/conf/test.config deleted file mode 100644 index 6f076005..00000000 --- a/conf/test.config +++ /dev/null @@ -1,29 +0,0 @@ -/* - * ------------------------------------------------- - * Nextflow config file for running tests - * ------------------------------------------------- - * Defines bundled input files and everything required - * to run a fast and simple test. Use as follows: - * nextflow run nf-core/rnafusion -profile test - */ - -executor { - name = 'local' -} - -params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function' - // Limit resources so that this can run on Travis - max_cpus = 2 - max_memory = 6.GB - max_time = 48.h - // Input data - test = true - reads = 'tests/reads_{1,2}.fq.gz' - // Genome references - fasta = 'tests/genome.fa' - gtf = 'tests/genes.gtf' - star_index = 'tests/star_index' - databases = '/tests/databases' -} From 98814a7220b605b94558edaaf27a7bdda6839d9c Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 25 Jan 2020 18:15:38 +0100 Subject: [PATCH 0042/1520] chore: reorder structure of configuration files --- conf/base.config | 20 +++++++------------- nextflow.config | 2 +- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/conf/base.config b/conf/base.config index 79b34450..af76325f 100644 --- a/conf/base.config +++ b/conf/base.config @@ -35,11 +35,11 @@ process{ time = { check_max( 4.h * task.attempt, 'time' ) } container = "nfcore/rnafusion:arriba_v${params.arriba_version}" } - withName:star_fusion { + withName:ericscript { cpus = { check_max (24, 'cpus')} memory = { check_max( 60.GB * task.attempt, 'memory' ) } - time = { check_max( 4.h * task.attempt, 'time' ) } - container = "nfcore/rnafusion:star-fusion_v${params.star_fusion_version}" + time = { check_max( 12.h * task.attempt, 'time' ) } + container = "nfcore/rnafusion:ericscript_v${params.ericscript_version}" } withName:fusioncatcher { cpus = { check_max (24, 'cpus')} @@ -53,12 +53,6 @@ process{ time = { check_max( 12.h * task.attempt, 'time' ) } container = "nfcore/rnafusion:fusion-inspector_v${params.fusion_inspector_version}" } - withName:ericscript { - cpus = { check_max (24, 'cpus')} - memory = { check_max( 60.GB * task.attempt, 'memory' ) } - time = { check_max( 12.h * task.attempt, 'time' ) } - container = "nfcore/rnafusion:ericscript_v${params.ericscript_version}" - } withName:pizzly { cpus = { check_max (24, 'cpus')} memory = { check_max( 60.GB * task.attempt, 'memory' ) } @@ -71,10 +65,10 @@ process{ time = { check_max( 4.h * task.attempt, 'time' ) } container = "nfcore/rnafusion:squid_v${params.squid_version}" } - withName:download_star_fusion { - cpus = { check_max (8, 'cpus')} - memory = { check_max( 20.GB * task.attempt, 'memory' ) } - time = { check_max( 24.h * task.attempt, 'time' ) } + withName:"star_fusion|download_star_fusion" { + cpus = { check_max (24, 'cpus')} + memory = { check_max( 60.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } container = "nfcore/rnafusion:star-fusion_v${params.star_fusion_version}" } } diff --git a/nextflow.config b/nextflow.config index 0dcb1539..751ad414 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,7 +11,7 @@ params { // Options: Tool versions arriba_version = '1.1.0' ericscript_version = '0.5.5' - fusioncatcher_version = '1.00' + fusioncatcher_version = '1.20' fusion_inspector_version = '1.3.1-star2.7.0f' pizzly_version = '0.37.3' squid_version = '1.5-star2.7.0f' From 6ba3cf83bded3db58f36a79080f1807c64e274bc Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 25 Jan 2020 18:16:04 +0100 Subject: [PATCH 0043/1520] fix: Removed --vis param from Fusion-Inspector --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index d518c8fc..f677ac7f 100644 --- a/main.nf +++ b/main.nf @@ -684,7 +684,7 @@ process fusion_inspector { --CPU ${task.cpus} \\ --out_dir . \\ --out_prefix finspector \\ - --vis ${extra_params} + ${extra_params} """ } From d635fd30e983a16db79153a7eb334bcd4caf36cd Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 25 Jan 2020 18:16:29 +0100 Subject: [PATCH 0044/1520] docs: updated changelog and README --- CHANGELOG.md | 9 ++++++++- README.md | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2454c4bf..4d1ca211 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ ### Changed -* Upgraded `fusion-report v1.0.0` to `fusion-report v2.0` +* 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.7.0` [#83](https://github.com/nf-core/rnafusion/issues/83) @@ -21,6 +22,12 @@ * 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 +* Removed `igenomes.config` because the pipeline only supports Ensembl version + ## nfcore/rnafusion version 1.0.2 - 2019/05/13 ### Changed diff --git a/README.md b/README.md index 1284e351..383c2353 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ bioRxiv 120295; doi: [https://doi.org/10.1101/120295](https://doi.org/10.1101/12 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) +* **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/) From 717b59e3874ae0a58c377470ac259c9528ef5260 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Jan 2020 10:50:00 +0100 Subject: [PATCH 0045/1520] fix ANSI logs --- main.nf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index 260f795b..141fe1b4 100644 --- a/main.nf +++ b/main.nf @@ -889,16 +889,16 @@ workflow.onComplete { c_purple = params.monochrome_logs ? '' : "\033[0;35m"; if (workflow.stats.ignoredCountFmt > 0 && workflow.success) { - log.info "${c_purple}Warning, pipeline completed, but with errored process(es) ${c_reset}" - log.info "${c_red}Number of ignored errored process(es) : ${workflow.stats.ignoredCountFmt} ${c_reset}" - log.info "${c_green}Number of successfully ran process(es) : ${workflow.stats.succeedCountFmt} ${c_reset}" + log.info "-${c_purple}Warning, pipeline completed, but with errored process(es) ${c_reset}-" + log.info "-${c_red}Number of ignored errored process(es) : ${workflow.stats.ignoredCountFmt} ${c_reset}-" + log.info "-${c_green}Number of successfully ran process(es) : ${workflow.stats.succeedCountFmt} ${c_reset}-" } if(workflow.success) { - log.info "${c_purple}[nf-core/rnafusion]${c_green} Pipeline completed successfully${c_reset}" + log.info "-${c_purple}[nf-core/rnafusion]${c_green} Pipeline completed successfully${c_reset}-" } else { checkHostname() - log.info "${c_purple}[nf-core/rnafusion]${c_red} Pipeline completed with errors${c_reset}" + log.info "-${c_purple}[nf-core/rnafusion]${c_red} Pipeline completed with errors${c_reset}-" } } @@ -915,14 +915,14 @@ def nfcoreHeader() { c_cyan = params.monochrome_logs ? '' : "\033[0;36m"; c_white = params.monochrome_logs ? '' : "\033[0;37m"; - return """ ${c_dim}----------------------------------------------------${c_reset} + 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} + -${c_dim}--------------------------------------------------${c_reset}- """.stripIndent() } From e353fc36eeb4346ec82462ad62a829132a93d03e Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Jan 2020 10:58:06 +0100 Subject: [PATCH 0046/1520] update CHANGELOG --- CHANGELOG.md | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c05c7406..c54514d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ -# nfcore/rnafusion +# nfcore/rnafusion: Changelog -## nfcore/rnafusion version 1.1.0 - +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.1.0] nfcore/rnafusion - ### Added @@ -14,12 +18,13 @@ * Updated `STAR` in `Squid`, `Fusion-Inspector` version to `2.7.0f` * Upgraded `STAR-Fusion v1.5.0` to `STAR-Fusion v1.7.0` [#83](https://github.com/nf-core/rnafusion/issues/83) * Parameter `igenomesIgnore` renamed to `igenome` [#81](https://github.com/nf-core/rnafusion/issues/81) +* Update logos ### Fixed * iGenomes optional, but not really [#91](https://github.com/nf-core/rnafusion/issues/91) -## nfcore/rnafusion version 1.0.2 - 2019/05/13 +## [1.0.2] nfcore/rnafusion - 2019/05/13 ### Changed @@ -31,7 +36,7 @@ * 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) -## nfcore/rnafusion version 1.0.1 - 2019/04/06 +## [1.0.1] nfcore/rnafusion - 2019/04/06 ### Added @@ -57,10 +62,10 @@ * Removed `Singularity` -## nfcore/rnafusion version 1.0 - 2018/02/14 +## [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. +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. * Fusion gene detection tools: * `STAR-Fusion v1.5.0` @@ -76,10 +81,11 @@ additional help scripts to download references for fusion tools and Singularity * `MultiQC v1.7` * `FusionGDB updated 2019/01/23` -## SciLifeLab/NGI-RNAfusion version 0.1 (ARCHIVED) - 2018/10/05 +## [0.1] SciLifeLab/NGI-RNAfusion (ARCHIVED) - 2018/10/05 -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. +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. * Tools: * STAR-Fusion From 9002fa07e7643a196b39ee822a4f90c86bcaa739 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 29 Jan 2020 11:36:21 +0100 Subject: [PATCH 0047/1520] Template update for nf-core/tools version 1.8 --- .github/CONTRIBUTING.md | 52 ++- .github/ISSUE_TEMPLATE/bug_report.md | 43 ++- .github/ISSUE_TEMPLATE/feature_request.md | 18 +- .github/PULL_REQUEST_TEMPLATE.md | 28 +- .github/markdownlint.yml | 4 - .github/workflows/branch.yml | 16 + .github/workflows/ci.yml | 29 ++ .github/workflows/linting.yml | 41 ++ .gitignore | 2 +- .travis.yml | 13 +- CHANGELOG.md | 14 +- CODE_OF_CONDUCT.md | 2 +- Dockerfile | 14 +- LICENSE | 2 +- README.md | 49 ++- assets/email_template.html | 2 + assets/email_template.txt | 12 +- assets/nf-core-rnafusion_logo.png | Bin 0 -> 12597 bytes assets/sendmail_template.txt | 17 + bin/scrape_software_versions.py | 15 +- conf/awsbatch.config | 18 - conf/base.config | 37 +- conf/igenomes.config | 451 +++++++++++++++++----- conf/test.config | 5 +- docs/images/nf-core-rnafusion_logo.png | Bin 0 -> 21334 bytes docs/output.md | 4 +- docs/usage.md | 86 ++++- environment.yml | 9 +- main.nf | 252 ++++++------ nextflow.config | 56 ++- 30 files changed, 920 insertions(+), 371 deletions(-) create mode 100644 .github/workflows/branch.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/linting.yml create mode 100644 assets/nf-core-rnafusion_logo.png delete mode 100644 conf/awsbatch.config create mode 100644 docs/images/nf-core-rnafusion_logo.png diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 6a5ef862..260f8fd6 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,47 +1,57 @@ # nf-core/rnafusion: Contributing Guidelines -Hi there! Many thanks for taking an interest in improving nf-core/rnafusion. +Hi there! +Many thanks for taking an interest in improving nf-core/rnafusion. -We try to manage the required tasks for nf-core/rnafusion using GitHub issues, you probably came to this page when creating one. Please use the pre-filled template to save time. - -However, don't be put off by this template - other more general issues and suggestions are welcome! Contributions to the code are even more welcome ;) - -> If you need help using or modifying nf-core/rnafusion then the best place to ask is on the pipeline channel on [Slack](https://nf-core-invite.herokuapp.com/). +We try to manage the required tasks for nf-core/rnafusion using GitHub issues, you probably came to this page when creating one. +Please use the pre-filled template to save time. +However, don't be put off by this template - other more general issues and suggestions are welcome! +Contributions to the code are even more welcome ;) +> If you need help using or modifying nf-core/rnafusion then the best place to ask is on the nf-core Slack [#rnafusion](https://nfcore.slack.com/channels/rnafusion) channel ([join our Slack here](https://nf-co.re/join/slack)). ## Contribution workflow -If you'd like to write some code for nf-core/rnafusion, the standard workflow -is as follows: -1. Check that there isn't already an issue about your idea in the - [nf-core/rnafusion issues](https://github.com/nf-core/rnafusion/issues) to avoid - duplicating work. +If you'd like to write some code for nf-core/rnafusion, the standard workflow is as follows: + +1. Check that there isn't already an issue about your idea in the [nf-core/rnafusion issues](https://github.com/nf-core/rnafusion/issues) to avoid duplicating work * If there isn't one already, please create one so that others know you're working on this -2. Fork the [nf-core/rnafusion repository](https://github.com/nf-core/rnafusion) to your GitHub account +2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/rnafusion repository](https://github.com/nf-core/rnafusion) to your GitHub account 3. Make the necessary changes / additions within your forked repository -4. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged. - -If you're not used to this workflow with git, you can start with some [basic docs from GitHub](https://help.github.com/articles/fork-a-repo/) or even their [excellent interactive tutorial](https://try.github.io/). +4. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged +If you're not used to this workflow with git, you can start with some [docs from GitHub](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or even their [excellent `git` resources](https://try.github.io/). ## Tests -When you create a pull request with changes, [Travis CI](https://travis-ci.org/) will run automatic tests. + +When you create a pull request with changes, [GitHub Actions](https://github.com/features/actions) will run automatic tests. Typically, pull-requests are only fully reviewed when these tests are passing, though of course we can help out before then. There are typically two types of tests that run: ### Lint Tests -The nf-core has a [set of guidelines](http://nf-co.re/guidelines) which all pipelines must adhere to. + +`nf-core` has a [set of guidelines](https://nf-co.re/developers/guidelines) which all pipelines must adhere to. To enforce these and ensure that all pipelines stay in sync, we have developed a helper tool which runs checks on the pipeline code. This is in the [nf-core/tools repository](https://github.com/nf-core/tools) and once installed can be run locally with the `nf-core lint ` command. If any failures or warnings are encountered, please follow the listed URL for more documentation. ### Pipeline Tests -Each nf-core pipeline should be set up with a minimal set of test-data. -Travis CI then runs the pipeline on this data to ensure that it exists successfully. + +Each `nf-core` pipeline should be set up with a minimal set of test-data. +`GitHub Actions` then runs the pipeline on this data to ensure that it exits successfully. If there are any failures then the automated tests fail. -These tests are run both with the latest available version of Nextflow and also the minimum required version that is stated in the pipeline code. +These tests are run both with the latest available version of `Nextflow` and also the minimum required version that is stated in the pipeline code. + +## Patch + +: 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). +* A PR should be made on `master` from patch to directly this particular bug. ## Getting help -For further information/help, please consult the [nf-core/rnafusion documentation](https://github.com/nf-core/rnafusion#documentation) and don't hesitate to get in touch on the pipeline channel on [Slack](https://nf-core-invite.herokuapp.com/). + +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)). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 405f88fe..45a4d208 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,31 +1,42 @@ +# nf-core/rnafusion bug report + Hi there! -Thanks for telling us about a problem with the pipeline. Please delete this text and anything that's not relevant from the template below: +Thanks for telling us about a problem with the pipeline. +Please delete this text and anything that's not relevant from the template below: + +## Describe the bug -#### Describe the bug A clear and concise description of what the bug is. -#### Steps to reproduce +## Steps to reproduce + Steps to reproduce the behaviour: + 1. Command line: `nextflow run ...` 2. See error: _Please provide your error message_ -#### Expected behaviour +## Expected behaviour + A clear and concise description of what you expected to happen. -#### System: - - Hardware: [e.g. HPC, Desktop, Cloud...] - - Executor: [e.g. slurm, local, awsbatch...] - - OS: [e.g. CentOS Linux, macOS, Linux Mint...] - - Version [e.g. 7, 10.13.6, 18.3...] +## System + +- Hardware: +- Executor: +- OS: +- Version + +## Nextflow Installation + +- Version: + +## Container engine -#### Nextflow Installation: - - Version: [e.g. 0.31.0] +- Engine: +- version: +- Image tag: -#### Container engine: - - Engine: [e.g. Conda, Docker or Singularity] - - version: [e.g. 1.0.0] - - Image tag: [e.g. nfcore/rnafusion:1.0.0] +## Additional context -#### 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 1f025b77..167d7f93 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,16 +1,24 @@ +# nf-core/rnafusion feature request + Hi there! -Thanks for suggesting a new feature for the pipeline! Please delete this text and anything that's not relevant from the template below: +Thanks for suggesting a new feature for the pipeline! +Please delete this text and anything that's not relevant from the template below: + +## Is your feature request related to a problem? Please describe -#### 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 +## Describe the solution you'd like + A clear and concise description of what you want to happen. -#### Describe alternatives you've considered +## Describe alternatives you've considered + A clear and concise description of any alternative solutions or features you've considered. -#### Additional context +## 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 2eb3f51f..e504e427 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,15 +1,19 @@ -Many thanks to contributing to nf-core/rnafusion! +# nf-core/rnafusion pull request -Please fill in the appropriate checklist below (delete whatever is not relevant). These are the most common things requested on pull requests (PRs). +Many thanks for contributing to nf-core/rnafusion! + +Please fill in the appropriate checklist below (delete whatever is not relevant). +These are the most common things requested on pull requests (PRs). ## PR checklist - - [ ] This comment contains a description of changes (with reason) - - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If 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:** https://github.com/nf-core/rnafusion/tree/master/.github/CONTRIBUTING.md + +- [ ] This comment contains a description of changes (with reason) +- [ ] If you've fixed a bug or added code that should be tested, add tests! +- [ ] If 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 diff --git a/.github/markdownlint.yml b/.github/markdownlint.yml index e052a635..96b12a70 100644 --- a/.github/markdownlint.yml +++ b/.github/markdownlint.yml @@ -1,9 +1,5 @@ # Markdownlint configuration file default: true, line-length: false -no-multiple-blanks: 0 -blanks-around-headers: false -blanks-around-lists: false -header-increment: false no-duplicate-header: siblings_only: true diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml new file mode 100644 index 00000000..ed654eae --- /dev/null +++ b/.github/workflows/branch.yml @@ -0,0 +1,16 @@ +name: nf-core branch protection +# This workflow is triggered on PRs to master branch on the repository +# It fails when someone tries to make a PR against the nf-core `master` branch instead of `dev` +on: + pull_request: + branches: + - master + +jobs: + test: + runs-on: ubuntu-18.04 + steps: + # PRs are only ok if coming from an nf-core `dev` branch or a fork `patch` branch + - name: Check PRs + run: | + { [[ $(git remote get-url origin) == *nf-core/rnafusion ]] && [[ ${GITHUB_HEAD_REF} = "dev" ]]; } || [[ ${GITHUB_HEAD_REF} == "patch" ]] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..d2086b11 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +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] + +jobs: + test: + 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: Pull docker image + run: | + docker pull nfcore/rnafusion:dev && docker tag nfcore/rnafusion:dev nfcore/rnafusion:dev + - name: Run pipeline with test data + 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 new file mode 100644 index 00000000..7354dc74 --- /dev/null +++ b/.github/workflows/linting.yml @@ -0,0 +1,41 @@ +name: nf-core linting +# This workflow is triggered on pushes and PRs to the repository. +# It runs the `nf-core lint` and markdown lint tests to ensure that the code meets the nf-core guidelines +on: [push, pull_request] + +jobs: + Markdown: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: '10' + - name: Install markdownlint + run: | + npm install -g markdownlint-cli + - name: Run Markdownlint + run: | + markdownlint ${GITHUB_WORKSPACE} -c ${GITHUB_WORKSPACE}/.github/markdownlint.yml + nf-core: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - 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 pip + run: | + sudo apt install python3-pip + pip install --upgrade pip + - name: Install nf-core tools + run: | + pip install nf-core + - name: Run nf-core lint + run: | + nf-core lint ${GITHUB_WORKSPACE} diff --git a/.gitignore b/.gitignore index 5b54e3e6..0189a444 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,5 @@ work/ data/ results/ .DS_Store -tests/test_data +test* *.pyc diff --git a/.travis.yml b/.travis.yml index 0962986a..a0a5d791 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ matrix: before_install: # PRs to master are only ok if coming from dev branch - - '[ $TRAVIS_PULL_REQUEST = "false" ] || [ $TRAVIS_BRANCH != "master" ] || ([ $TRAVIS_PULL_REQUEST_SLUG = $TRAVIS_REPO_SLUG ] && [ $TRAVIS_PULL_REQUEST_BRANCH = "dev" ])' + - '[ $TRAVIS_PULL_REQUEST = "false" ] || [ $TRAVIS_BRANCH != "master" ] || ([ $TRAVIS_PULL_REQUEST_SLUG = $TRAVIS_REPO_SLUG ] && [ $TRAVIS_PULL_REQUEST_BRANCH = "dev" ]) || [ $TRAVIS_PULL_REQUEST_BRANCH = "patch" ]' # Pull the docker image first so the test doesn't wait for this - docker pull nfcore/rnafusion:dev # Fake the tag locally so that the pipeline runs properly @@ -30,8 +30,13 @@ install: - sudo apt-get install npm && npm install -g markdownlint-cli env: - - NXF_VER='0.32.0' # Specify a minimum NF version that should be tested and work - - NXF_VER='' # Plus: get the latest NF version and check that it works + # Tower token is to inspect runs on https://tower.nf + # Use public mailbox nf-core@mailinator.com to log in: https://www.mailinator.com/v3/index.jsp?zone=public&query=nf-core + # Specify a minimum NF version that should be tested and work + - NXF_VER='19.10.0' TOWER_ACCESS_TOKEN="1c1f493bc2703472d6f1b9f6fb9e9d117abab7b1" + # Plus: get the latest NF version and check that it works + - NXF_VER='' TOWER_ACCESS_TOKEN="1c1f493bc2703472d6f1b9f6fb9e9d117abab7b1" + script: # Lint the pipeline code @@ -39,4 +44,4 @@ script: # Lint the documentation - markdownlint ${TRAVIS_BUILD_DIR} -c ${TRAVIS_BUILD_DIR}/.github/markdownlint.yml # Run the pipeline with the test profile - - nextflow run ${TRAVIS_BUILD_DIR} -profile test,docker + - nextflow run ${TRAVIS_BUILD_DIR} -profile test,docker -ansi-log false -name rnafusion-${TRAVIS_EVENT_TYPE}-${TRAVIS_PULL_REQUEST}-${TRAVIS_COMMIT:0:6}-test-description diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f3175b2..b40ab2de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,16 @@ # nf-core/rnafusion: Changelog -## v1.0.1 - [date] +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). + +## v1.1.0 - [date] + Initial release of nf-core/rnafusion, created with the [nf-core](http://nf-co.re/) template. + +### `Added` + +### `Fixed` + +### `Dependencies` + +### `Deprecated` diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 09226d0d..cf930c8a 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -34,7 +34,7 @@ This Code of Conduct applies both within project spaces and in public spaces whe ## Enforcement -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team on [Slack](https://nf-core-invite.herokuapp.com/). The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team on [Slack](https://nf-co.re/join/slack). The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. diff --git a/Dockerfile b/Dockerfile index 01fafa54..f5be9c2d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,13 @@ -FROM nfcore/base -LABEL authors="No author provided" \ - description="Docker image containing all requirements for nf-core/rnafusion pipeline" +FROM nfcore/base:1.8 +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 -ENV PATH /opt/conda/envs/nf-core-rnafusion-1.0.1/bin:$PATH + +# Add conda installation dir to PATH (instead of doing 'conda activate') +ENV PATH /opt/conda/envs/nf-core-rnafusion-1.1.0/bin:$PATH + +# Dump the details of the installed packages to a file for posterity +RUN conda env export --name nf-core-rnafusion-1.1.0 > nf-core-rnafusion-1.1.0.yml diff --git a/LICENSE b/LICENSE index fafd3dbf..ac8adf18 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) No author provided +Copyright (c) Martin Proks Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 90babb0a..1bd0c411 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,45 @@ -# nf-core/rnafusion +# ![nf-core/rnafusion](docs/images/nf-core-rnafusion_logo.png) **Nextflow rnafusion analysis pipeline, part of the nf-core community.**. [![Build Status](https://travis-ci.com/nf-core/rnafusion.svg?branch=master)](https://travis-ci.com/nf-core/rnafusion) -[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A50.32.0-brightgreen.svg)](https://www.nextflow.io/) +[![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)](http://bioconda.github.io/) [![Docker](https://img.shields.io/docker/automated/nfcore/rnafusion.svg)](https://hub.docker.com/r/nfcore/rnafusion) ## Introduction + 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. +## Quick Start + +i. Install [`nextflow`](https://nf-co.re/usage/installation) + +ii. Install one of [`docker`](https://docs.docker.com/engine/installation/), [`singularity`](https://www.sylabs.io/guides/3.0/user-guide/) or [`conda`](https://conda.io/miniconda.html) + +iii. Download the pipeline and test it on a minimal dataset with a single command + +```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 institute` 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! + + + +```bash +nextflow run nf-core/rnafusion -profile --reads '*_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) @@ -27,4 +54,20 @@ The nf-core/rnafusion pipeline comes with documentation about the pipeline, foun ## Credits -nf-core/rnafusion was originally written by No author provided. + +nf-core/rnafusion was originally written by Martin Proks. + +## Contributions and Support + +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)). + +## Citation + + + + +You can cite the `nf-core` pre-print as follows: + +> Ewels PA, Peltzer A, Fillinger S, Alneberg JA, Patel H, Wilm A, Garcia MU, Di Tommaso P, Nahnsen S. **nf-core: Community curated bioinformatics pipelines**. *bioRxiv*. 2019. p. 610741. [doi: 10.1101/610741](https://www.biorxiv.org/content/10.1101/610741v1). diff --git a/assets/email_template.html b/assets/email_template.html index af566215..2e85801c 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -11,6 +11,8 @@
+ +

nf-core/rnafusion v${version}

Run Name: $runName

diff --git a/assets/email_template.txt b/assets/email_template.txt index 7efad5be..f717ee9f 100644 --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -1,6 +1,12 @@ -======================================== - nf-core/rnafusion v${version} -======================================== +---------------------------------------------------- + ,--./,-. + ___ __ __ __ ___ /,-._.--~\\ + |\\ | |__ __ / ` / \\ |__) |__ } { + | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, + `._,._,' + nf-core/rnafusion v${version} +---------------------------------------------------- + Run Name: $runName <% if (success){ diff --git a/assets/nf-core-rnafusion_logo.png b/assets/nf-core-rnafusion_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ea7ca150bb5310db9aefcda00a23cdd304e6aee9 GIT binary patch literal 12597 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 DY1D5F literal 0 HcmV?d00001 diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index 2d671220..3b09baa6 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -8,6 +8,23 @@ Content-Type: text/html; charset=utf-8 $email_html +--nfcoremimeboundary +Content-Type: image/png;name="nf-core-rnafusion_logo.png" +Content-Transfer-Encoding: base64 +Content-ID: +Content-Disposition: inline; filename="nf-core-rnafusion_logo.png" + +<% out << new File("$baseDir/assets/nf-core-rnafusion_logo.png"). + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' ) %> + <% if (mqcFile){ def mqcFileObj = new File("$mqcFile") diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index e1a24f40..283f73fa 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -18,14 +18,17 @@ # Search each file using its regex for k, v in regexes.items(): - with open(v[0]) as x: - versions = x.read() - match = re.search(v[1], versions) - if match: - results[k] = "v{}".format(match.group(1)) + try: + with open(v[0]) as x: + versions = x.read() + match = re.search(v[1], versions) + if match: + results[k] = "v{}".format(match.group(1)) + except IOError: + results[k] = False # Remove software set to false in results -for k in results: +for k in list(results): if not results[k]: del(results[k]) diff --git a/conf/awsbatch.config b/conf/awsbatch.config deleted file mode 100644 index 14af5866..00000000 --- a/conf/awsbatch.config +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ------------------------------------------------- - * Nextflow config file for running on AWS batch - * ------------------------------------------------- - * Base config needed for running with -profile awsbatch - */ -params { - config_profile_name = 'AWSBATCH' - config_profile_description = 'AWSBATCH Cloud Profile' - config_profile_contact = 'Alexander Peltzer (@apeltzer)' - config_profile_url = 'https://aws.amazon.com/de/batch/' -} - -aws.region = params.awsregion -process.executor = 'awsbatch' -process.queue = params.awsqueue -executor.awscli = '/home/ec2-user/miniconda/bin/aws' -params.tracedir = './' diff --git a/conf/base.config b/conf/base.config index 7a2c4ee5..e2a4c1ac 100644 --- a/conf/base.config +++ b/conf/base.config @@ -13,22 +13,39 @@ process { // TODO nf-core: Check the defaults for all processes cpus = { check_max( 1 * task.attempt, 'cpus' ) } - memory = { check_max( 8.GB * task.attempt, 'memory' ) } - time = { check_max( 2.h * task.attempt, 'time' ) } + memory = { check_max( 7.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' // 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 -} - -params { - // Defaults only, expecting to be overwritten - max_memory = 128.GB - max_cpus = 16 - max_time = 240.h - igenomes_base = 's3://ngi-igenomes/igenomes/' + withLabel:process_low { + cpus = { check_max( 2 * task.attempt, 'cpus' ) } + memory = { check_max( 14.GB * task.attempt, 'memory' ) } + time = { check_max( 6.h * task.attempt, 'time' ) } + } + withLabel:process_medium { + cpus = { check_max( 6 * task.attempt, 'cpus' ) } + memory = { check_max( 42.GB * task.attempt, 'memory' ) } + time = { check_max( 8.h * task.attempt, 'time' ) } + } + withLabel:process_high { + cpus = { check_max( 12 * task.attempt, 'cpus' ) } + memory = { check_max( 84.GB * task.attempt, 'memory' ) } + time = { check_max( 10.h * task.attempt, 'time' ) } + } + withLabel:process_long { + time = { check_max( 20.h * task.attempt, 'time' ) } + } + withName:get_software_versions { + cache = false + } + } diff --git a/conf/igenomes.config b/conf/igenomes.config index d19e61f4..2de92422 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -9,139 +9,412 @@ params { // illumina iGenomes reference file paths - // TODO nf-core: Add new reference types and strip out those that are not needed genomes { 'GRCh37' { - bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" + 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" + } + '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 5c1cbe72..0f23d861 100644 --- a/conf/test.config +++ b/conf/test.config @@ -4,7 +4,7 @@ * ------------------------------------------------- * Defines bundled input files and everything required * to run a fast and simple test. Use as follows: - * nextflow run nf-core/rnafusion -profile test + * nextflow run nf-core/rnafusion -profile test, */ params { @@ -14,10 +14,11 @@ params { max_cpus = 2 max_memory = 6.GB max_time = 48.h + // 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 - singleEnd = false + 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/images/nf-core-rnafusion_logo.png b/docs/images/nf-core-rnafusion_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..eab61c0e4e7d7b705197615aef65188745919009 GIT binary patch literal 21334 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%0AkKYWcl89g2KH;zY=P#I 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 e|Mx}y&KmI?uZdft^ literal 0 HcmV?d00001 diff --git a/docs/output.md b/docs/output.md index 130ba906..86dae502 100644 --- a/docs/output.md +++ b/docs/output.md @@ -5,6 +5,7 @@ This document describes the output produced by the pipeline. Most of the plots a ## Pipeline overview + The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: @@ -12,6 +13,7 @@ and processes data using the following steps: * [MultiQC](#multiqc) - aggregate report, describing results of the whole pipeline ## 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. For further reading and documentation see the [FastQC help](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). @@ -25,8 +27,8 @@ For further reading and documentation see the [FastQC help](http://www.bioinform * `zips/sample_fastqc.zip` * zip file containing the FastQC report, tab-delimited data file and plot images - ## 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. The pipeline has special steps which allow the software versions used to be reported in the MultiQC output for future traceability. diff --git a/docs/usage.md b/docs/usage.md index 4da47584..87b78513 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -2,8 +2,6 @@ ## Table of contents - - * [Table of contents](#table-of-contents) * [Introduction](#introduction) * [Running the pipeline](#running-the-pipeline) @@ -12,20 +10,23 @@ * [Main arguments](#main-arguments) * [`-profile`](#-profile) * [`--reads`](#--reads) - * [`--singleEnd`](#--singleend) + * [`--single_end`](#--single_end) * [Reference genomes](#reference-genomes) * [`--genome` (using iGenomes)](#--genome-using-igenomes) * [`--fasta`](#--fasta) - * [`--igenomesIgnore`](#--igenomesignore) + * [`--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) @@ -37,10 +38,9 @@ * [`--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`): @@ -52,6 +52,7 @@ NXF_OPTS='-Xms1g -Xmx4g' ## Running the pipeline + The typical command for running the pipeline is as follows: ```bash @@ -70,6 +71,7 @@ results # Finished results (configurable, see below) ``` ### Updating the pipeline + When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: ```bash @@ -77,22 +79,28 @@ nextflow pull nf-core/rnafusion ``` ### Reproducibility + It's a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. First, go to the [nf-core/rnafusion releases page](https://github.com/nf-core/rnafusion/releases) and find the latest version number - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. 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 ### `-profile` -Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. Note that multiple profiles can be loaded, for example: `-profile docker` - the order of arguments is important! -If `-profile` is not specified at all the pipeline will be run locally and expects all software to be installed and available on the `PATH`. +Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. + +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Conda) - see below. + +The pipeline also dynamically loads configurations from [https://github.com/nf-core/configs](https://github.com/nf-core/configs) when it runs, making multiple config profiles for various institutional clusters available at run time. For more information and to see if your system is available in these configs please see the [nf-core/configs documentation](https://github.com/nf-core/configs#documentation). + +Note that multiple profiles can be loaded, for example: `-profile test,docker` - the order of arguments is important! +They are loaded in sequence, so later profiles can overwrite earlier profiles. + +If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. -* `awsbatch` - * A generic configuration profile to be used with AWS Batch. * `conda` * A generic configuration profile to be used with [conda](https://conda.io/docs/) * Pulls most software from [Bioconda](https://bioconda.github.io/) @@ -109,6 +117,7 @@ If `-profile` is not specified at all the pipeline will be run locally and expec ### `--reads` + Use this to specify the location of your input FastQ files. For example: ```bash @@ -123,21 +132,22 @@ Please note the following requirements: If left unspecified, a default pattern is used: `data/*{1,2}.fastq.gz` -### `--singleEnd` -By default, the pipeline expects paired-end data. If you have single-end data, you need to specify `--singleEnd` 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: +### `--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 ---singleEnd --reads '*.fastq' +--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) + There are 31 different species supported in the iGenomes references. To run the pipeline, you must specify which to use with the `--genome` flag. You can find the keys to specify the genomes in the [iGenomes config file](../conf/igenomes.config). Common genomes that are supported are: @@ -171,33 +181,48 @@ params { ``` + ### `--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]' ``` -### `--igenomesIgnore` +### `--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. 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-core-invite.herokuapp.com/). +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 the `-awsbatch` profile and then specify all of the following 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. + ### `--awsregion` -The AWS region to run your job in. Default is set to `eu-west-1` but can be adjusted to your needs. + +The AWS region in which to run your job. Default is set to `eu-west-1` but can be adjusted to your needs. + +### `--awscli` + +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`. 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. @@ -206,12 +231,23 @@ Please make sure to also set the `-w/--work-dir` and `--outdir` parameters to a ### `--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). @@ -219,6 +255,7 @@ This is used in the MultiQC report (if not default) and in the summary HTML / e- **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. @@ -226,6 +263,7 @@ You can also supply a run name to resume a specific run: `-resume [run-name]`. U **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) @@ -233,7 +271,8 @@ Specify the path to a specific config file (this is a core NextFlow command). 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 is set to `master`. + +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 @@ -241,6 +280,7 @@ Provide git commit id for custom Institutional configs hosted at `nf-core/config ``` ### `--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 @@ -261,22 +301,28 @@ nextflow run /path/to/pipeline/ --custom_config_base /path/to/my/configs/configs > 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 e5ecedae..fbb39389 100644 --- a/environment.yml +++ b/environment.yml @@ -1,11 +1,14 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: nf-core-rnafusion-1.0.1 +name: nf-core-rnafusion-1.1.0 channels: - conda-forge - bioconda - defaults dependencies: + - conda-forge::python=3.7.3 # TODO nf-core: Add required software dependencies here - - fastqc=0.11.8 - - multiqc=1.7 + - bioconda::fastqc=0.11.8 + - bioconda::multiqc=1.7 + - conda-forge::r-markdown=1.1 + - conda-forge::r-base=3.6.1 diff --git a/main.nf b/main.nf index c011c986..b112e8c7 100644 --- a/main.nf +++ b/main.nf @@ -9,7 +9,6 @@ ---------------------------------------------------------------------------------------- */ - def helpMessage() { // TODO nf-core: Add to this help message with new command line parameters log.info nfcoreHeader() @@ -22,39 +21,41 @@ def helpMessage() { nextflow run nf-core/rnafusion --reads '*_R{1,2}.fastq.gz' -profile docker Mandatory arguments: - --reads Path to input data (must be surrounded with quotes) - -profile Configuration profile to use. Can use multiple (comma separated) - Available: conda, docker, singularity, awsbatch, test and more. + --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 Options: - --genome Name of iGenomes reference - --singleEnd Specifies that the input is single end reads + --genome [str] Name of iGenomes reference + --single_end [bool] Specifies that the input is single-end reads - References If not specified in the configuration file or you wish to overwrite any of the references. - --fasta Path to Fasta reference + References If not specified in the configuration file or you wish to overwrite any of the references + --fasta [file] Path to fasta reference Other options: - --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 - --maxMultiqcEmailFileSize 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) - -name Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic. + --outdir [file] The output directory where the results will be saved + --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) + -name [str] Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic AWSBatch options: - --awsqueue The AWSBatch JobQueue that needs to be set when running on AWSBatch - --awsregion The AWS Region for your AWS Batch job to run on + --awsqueue [str] The AWSBatch JobQueue that needs to be set when running on AWSBatch + --awsregion [str] The AWS Region for your AWS Batch job to run on + --awscli [str] Path to the AWS CLI tool """.stripIndent() } -/* - * SET UP CONFIGURATION VARIABLES - */ - -// Show help emssage -if (params.help){ +// Show help message +if (params.help) { helpMessage() exit 0 } +/* + * SET UP CONFIGURATION VARIABLES + */ + // Check if genome exists in the config file if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { exit 1, "The provided genome '${params.genome}' is not available in the iGenomes file. Currently the available genomes are ${params.genomes.keySet().join(", ")}" @@ -62,96 +63,92 @@ if (params.genomes && params.genome && !params.genomes.containsKey(params.genome // TODO nf-core: Add any reference files that are needed // Configurable reference genomes -fasta = params.genome ? params.genomes[ params.genome ].fasta ?: false : false -if ( params.fasta ){ - fasta = file(params.fasta) - if( !fasta.exists() ) exit 1, "Fasta file not found: ${params.fasta}" -} // // NOTE - THIS IS NOT USED IN THIS PIPELINE, EXAMPLE ONLY -// If you want to use the above in a process, define the following: +// If you want to use the channel below in a process, define the following: // input: -// file fasta from fasta +// file fasta from ch_fasta // - +params.fasta = params.genome ? params.genomes[ params.genome ].fasta ?: false : 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 custom_runName = params.name -if( !(workflow.runName ==~ /[a-z]+_[a-z]+/) ){ - custom_runName = workflow.runName +if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { + custom_runName = workflow.runName } - -if( workflow.profile == 'awsbatch') { - // AWSBatch sanity checking - if (!params.awsqueue || !params.awsregion) exit 1, "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" - // Check outdir paths to be S3 buckets if running on AWSBatch - // related: https://github.com/nextflow-io/nextflow/issues/813 - if (!params.outdir.startsWith('s3:')) exit 1, "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" - // Prevent trace files to be stored on S3 since S3 does not support rolling files. - if (workflow.tracedir.startsWith('s3:')) exit 1, "Specify a local tracedir or run without trace! S3 cannot be used for tracefiles." +if (workflow.profile.contains('awsbatch')) { + // AWSBatch sanity checking + if (!params.awsqueue || !params.awsregion) exit 1, "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" + // Check outdir paths to be S3 buckets if running on AWSBatch + // related: https://github.com/nextflow-io/nextflow/issues/813 + if (!params.outdir.startsWith('s3:')) exit 1, "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" + // Prevent trace files to be stored on S3 since S3 does not support rolling files. + if (params.tracedir.startsWith('s3:')) exit 1, "Specify a local tracedir or run without trace! S3 cannot be used for tracefiles." } // Stage config files -ch_multiqc_config = Channel.fromPath(params.multiqc_config) -ch_output_docs = Channel.fromPath("$baseDir/docs/output.md") +ch_multiqc_config = file(params.multiqc_config, checkIfExists: true) +ch_output_docs = file("$baseDir/docs/output.md", checkIfExists: true) /* * Create a channel for input read files */ -if(params.readPaths){ - if(params.singleEnd){ +if (params.readPaths) { + if (params.single_end) { Channel .from(params.readPaths) - .map { row -> [ row[0], [file(row[1][0])]] } + .map { row -> [ row[0], [ file(row[1][0], checkIfExists: true) ] ] } .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } - .into { read_files_fastqc; read_files_trimming } + .into { ch_read_files_fastqc; ch_read_files_trimming } } else { Channel .from(params.readPaths) - .map { row -> [ row[0], [file(row[1][0]), file(row[1][1])]] } + .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" } - .into { read_files_fastqc; read_files_trimming } + .into { ch_read_files_fastqc; ch_read_files_trimming } } } else { Channel - .fromFilePairs( params.reads, size: params.singleEnd ? 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 --singleEnd on the command line." } - .into { read_files_fastqc; read_files_trimming } + .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." } + .into { ch_read_files_fastqc; ch_read_files_trimming } } - // Header log info log.info nfcoreHeader() def summary = [:] -if(workflow.revision) summary['Pipeline Release'] = workflow.revision +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['Fasta Ref'] = params.fasta -summary['Data Type'] = params.singleEnd ? 'Single-End' : 'Paired-End' +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" -if(workflow.containerEngine) summary['Container'] = "$workflow.containerEngine - $workflow.container" +if (workflow.containerEngine) summary['Container'] = "$workflow.containerEngine - $workflow.container" summary['Output dir'] = params.outdir summary['Launch dir'] = workflow.launchDir summary['Working dir'] = workflow.workDir summary['Script dir'] = workflow.projectDir summary['User'] = workflow.userName -if(workflow.profile == 'awsbatch'){ - summary['AWS Region'] = params.awsregion - summary['AWS Queue'] = params.awsqueue +if (workflow.profile.contains('awsbatch')) { + summary['AWS Region'] = params.awsregion + summary['AWS Queue'] = params.awsqueue + 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.email) { - summary['E-mail Address'] = params.email - summary['MultiQC maxsize'] = params.maxMultiqcEmailFileSize +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.email || params.email_on_fail) { + summary['E-mail Address'] = params.email + summary['E-mail on failure'] = params.email_on_fail + summary['MultiQC maxsize'] = params.max_multiqc_email_size } log.info summary.collect { k,v -> "${k.padRight(18)}: $v" }.join("\n") -log.info "\033[2m----------------------------------------------------\033[0m" +log.info "-\033[2m--------------------------------------------------\033[0m-" // Check the hostnames against configured profiles checkHostname() @@ -173,19 +170,18 @@ ${summary.collect { k,v -> "
$k
${v ?: ' - if (filename.indexOf(".csv") > 0) filename - else null - } + saveAs: { filename -> + if (filename.indexOf(".csv") > 0) filename + else null + } output: - file 'software_versions_mqc.yaml' into software_versions_yaml + file 'software_versions_mqc.yaml' into ch_software_versions_yaml file "software_versions.csv" script: @@ -199,30 +195,29 @@ process get_software_versions { """ } - - /* * STEP 1 - FastQC */ process fastqc { tag "$name" + label 'process_medium' publishDir "${params.outdir}/fastqc", mode: 'copy', - saveAs: {filename -> filename.indexOf(".zip") > 0 ? "zips/$filename" : "$filename"} + saveAs: { filename -> + filename.indexOf(".zip") > 0 ? "zips/$filename" : "$filename" + } input: - set val(name), file(reads) from read_files_fastqc + set val(name), file(reads) from ch_read_files_fastqc output: - file "*_fastqc.{zip,html}" into fastqc_results + file "*_fastqc.{zip,html}" into ch_fastqc_results script: """ - fastqc -q $reads + fastqc --quiet --threads $task.cpus $reads """ } - - /* * STEP 2 - MultiQC */ @@ -232,12 +227,12 @@ process multiqc { input: file multiqc_config from ch_multiqc_config // TODO nf-core: Add in log files from your new processes for MultiQC to find! - file ('fastqc/*') from fastqc_results.collect().ifEmpty([]) - file ('software_versions/*') from software_versions_yaml.collect() + file ('fastqc/*') from ch_fastqc_results.collect().ifEmpty([]) + file ('software_versions/*') from ch_software_versions_yaml.collect() file workflow_summary from create_workflow_summary(summary) output: - file "*multiqc_report.html" into multiqc_report + file "*multiqc_report.html" into ch_multiqc_report file "*_data" file "multiqc_plots" @@ -250,8 +245,6 @@ process multiqc { """ } - - /* * STEP 3 - Output Description HTML */ @@ -270,8 +263,6 @@ process output_documentation { """ } - - /* * Completion e-mail notification */ @@ -279,8 +270,8 @@ workflow.onComplete { // Set up the e-mail variables def subject = "[nf-core/rnafusion] Successful: $workflow.runName" - if(!workflow.success){ - subject = "[nf-core/rnafusion] FAILED: $workflow.runName" + if (!workflow.success) { + subject = "[nf-core/rnafusion] FAILED: $workflow.runName" } def email_fields = [:] email_fields['version'] = workflow.manifest.version @@ -298,21 +289,20 @@ workflow.onComplete { email_fields['summary']['Date Completed'] = workflow.complete email_fields['summary']['Pipeline script file path'] = workflow.scriptFile email_fields['summary']['Pipeline script hash ID'] = workflow.scriptId - if(workflow.repository) email_fields['summary']['Pipeline repository Git URL'] = workflow.repository - if(workflow.commitId) email_fields['summary']['Pipeline repository Git Commit'] = workflow.commitId - if(workflow.revision) email_fields['summary']['Pipeline Git branch/tag'] = workflow.revision - if(workflow.container) email_fields['summary']['Docker image'] = workflow.container + if (workflow.repository) email_fields['summary']['Pipeline repository Git URL'] = workflow.repository + if (workflow.commitId) email_fields['summary']['Pipeline repository Git Commit'] = workflow.commitId + if (workflow.revision) email_fields['summary']['Pipeline Git branch/tag'] = workflow.revision email_fields['summary']['Nextflow Version'] = workflow.nextflow.version email_fields['summary']['Nextflow Build'] = workflow.nextflow.build email_fields['summary']['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp - // TODO nf-core: If not using MultiQC, strip out this code (including params.maxMultiqcEmailFileSize) + // TODO nf-core: If not using MultiQC, strip out this code (including params.max_multiqc_email_size) // On success try attach the multiqc report def mqc_report = null try { if (workflow.success) { - mqc_report = multiqc_report.getVal() - if (mqc_report.getClass() == ArrayList){ + mqc_report = ch_multiqc_report.getVal() + if (mqc_report.getClass() == ArrayList) { log.warn "[nf-core/rnafusion] Found multiple reports from process 'multiqc', will use only one" mqc_report = mqc_report[0] } @@ -321,6 +311,12 @@ workflow.onComplete { log.warn "[nf-core/rnafusion] Could not attach MultiQC report to summary email" } + // Check if we are only sending emails on failure + email_address = params.email + if (!params.email && params.email_on_fail && !workflow.success) { + email_address = params.email_on_fail + } + // Render the TXT template def engine = new groovy.text.GStringTemplateEngine() def tf = new File("$baseDir/assets/email_template.txt") @@ -333,89 +329,89 @@ workflow.onComplete { def email_html = html_template.toString() // Render the sendmail template - def smail_fields = [ email: params.email, subject: subject, email_txt: email_txt, email_html: email_html, baseDir: "$baseDir", mqcFile: mqc_report, mqcMaxSize: params.maxMultiqcEmailFileSize.toBytes() ] + def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, baseDir: "$baseDir", mqcFile: mqc_report, mqcMaxSize: params.max_multiqc_email_size.toBytes() ] def sf = new File("$baseDir/assets/sendmail_template.txt") def sendmail_template = engine.createTemplate(sf).make(smail_fields) def sendmail_html = sendmail_template.toString() // Send the HTML e-mail - if (params.email) { + if (email_address) { try { - if( params.plaintext_email ){ throw GroovyException('Send plaintext e-mail, not HTML') } - // Try to send HTML e-mail using sendmail - [ 'sendmail', '-t' ].execute() << sendmail_html - log.info "[nf-core/rnafusion] Sent summary e-mail to $params.email (sendmail)" + if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } + // Try to send HTML e-mail using sendmail + [ 'sendmail', '-t' ].execute() << sendmail_html + log.info "[nf-core/rnafusion] Sent summary e-mail to $email_address (sendmail)" } catch (all) { - // Catch failures and try with plaintext - [ 'mail', '-s', subject, params.email ].execute() << email_txt - log.info "[nf-core/rnafusion] Sent summary e-mail to $params.email (mail)" + // Catch failures and try with plaintext + [ 'mail', '-s', subject, email_address ].execute() << email_txt + log.info "[nf-core/rnafusion] Sent summary e-mail to $email_address (mail)" } } // Write summary e-mail HTML to a file - def output_d = new File( "${params.outdir}/pipeline_info/" ) - if( !output_d.exists() ) { - output_d.mkdirs() + def output_d = new File("${params.outdir}/pipeline_info/") + if (!output_d.exists()) { + output_d.mkdirs() } - def output_hf = new File( output_d, "pipeline_report.html" ) + def output_hf = new File(output_d, "pipeline_report.html") output_hf.withWriter { w -> w << email_html } - def output_tf = new File( output_d, "pipeline_report.txt" ) + def output_tf = new File(output_d, "pipeline_report.txt") output_tf.withWriter { w -> w << email_txt } - c_reset = params.monochrome_logs ? '' : "\033[0m"; - c_purple = params.monochrome_logs ? '' : "\033[0;35m"; c_green = params.monochrome_logs ? '' : "\033[0;32m"; + c_purple = params.monochrome_logs ? '' : "\033[0;35m"; c_red = params.monochrome_logs ? '' : "\033[0;31m"; + c_reset = params.monochrome_logs ? '' : "\033[0m"; - if (workflow.stats.ignoredCountFmt > 0 && workflow.success) { - log.info "${c_purple}Warning, pipeline completed, but with errored process(es) ${c_reset}" - log.info "${c_red}Number of ignored errored process(es) : ${workflow.stats.ignoredCountFmt} ${c_reset}" - log.info "${c_green}Number of successfully ran process(es) : ${workflow.stats.succeedCountFmt} ${c_reset}" + if (workflow.stats.ignoredCount > 0 && workflow.success) { + log.info "-${c_purple}Warning, pipeline completed, but with errored process(es) ${c_reset}-" + log.info "-${c_red}Number of ignored errored process(es) : ${workflow.stats.ignoredCount} ${c_reset}-" + log.info "-${c_green}Number of successfully ran process(es) : ${workflow.stats.succeedCount} ${c_reset}-" } - if(workflow.success){ - log.info "${c_purple}[nf-core/rnafusion]${c_green} Pipeline completed successfully${c_reset}" + if (workflow.success) { + log.info "-${c_purple}[nf-core/rnafusion]${c_green} Pipeline completed successfully${c_reset}-" } else { checkHostname() - log.info "${c_purple}[nf-core/rnafusion]${c_red} Pipeline completed with errors${c_reset}" + log.info "-${c_purple}[nf-core/rnafusion]${c_red} Pipeline completed with errors${c_reset}-" } } -def nfcoreHeader(){ +def nfcoreHeader() { // Log colors ANSI codes - c_reset = params.monochrome_logs ? '' : "\033[0m"; - c_dim = params.monochrome_logs ? '' : "\033[2m"; c_black = params.monochrome_logs ? '' : "\033[0;30m"; - c_green = params.monochrome_logs ? '' : "\033[0;32m"; - c_yellow = params.monochrome_logs ? '' : "\033[0;33m"; c_blue = params.monochrome_logs ? '' : "\033[0;34m"; - c_purple = params.monochrome_logs ? '' : "\033[0;35m"; 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} + 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} + -${c_dim}--------------------------------------------------${c_reset}- """.stripIndent() } -def checkHostname(){ +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){ + 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)){ + 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" + diff --git a/nextflow.config b/nextflow.config index e66ac9c3..6bd24de1 100644 --- a/nextflow.config +++ b/nextflow.config @@ -10,29 +10,35 @@ params { // Workflow flags // TODO nf-core: Specify your pipeline's command line flags + genome = false reads = "data/*{1,2}.fastq.gz" - singleEnd = false + single_end = false outdir = './results' // Boilerplate options name = false multiqc_config = "$baseDir/assets/multiqc_config.yaml" email = false - maxMultiqcEmailFileSize = 25.MB + email_on_fail = false + max_multiqc_email_size = 25.MB plaintext_email = false monochrome_logs = false help = false - igenomes_base = "./iGenomes" + igenomes_base = 's3://ngi-igenomes/igenomes/' tracedir = "${params.outdir}/pipeline_info" - awsqueue = false - awsregion = 'eu-west-1' - igenomesIgnore = false + igenomes_ignore = false custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" hostnames = false config_profile_description = false config_profile_contact = false config_profile_url = false + + // Defaults only, expecting to be overwritten + max_memory = 128.GB + max_cpus = 16 + max_time = 240.h + } // Container slug. Stable releases should specify release tag! @@ -50,19 +56,33 @@ try { } profiles { - awsbatch { includeConfig 'conf/awsbatch.config' } conda { process.conda = "$baseDir/environment.yml" } debug { process.beforeScript = 'echo $HOSTNAME' } - docker { docker.enabled = true } - singularity { singularity.enabled = true } + docker { + docker.enabled = true + // Avoid this error: + // WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap. + // Testing this in nf-core after discussion here https://github.com/nf-core/tools/pull/351 + // once this is established and works well, nextflow might implement this behavior as new default. + docker.runOptions = '-u \$(id -u):\$(id -g)' + } + singularity { + singularity.enabled = true + singularity.autoMounts = true + } test { includeConfig 'conf/test.config' } } // Load igenomes.config if required -if(!params.igenomesIgnore){ +if (!params.igenomes_ignore) { includeConfig 'conf/igenomes.config' } +// Export this variable to prevent local Python libraries from conflicting with those in the container +env { + PYTHONNOUSERSITE = 1 +} + // Capture exit codes from upstream processes when piping process.shell = ['/bin/bash', '-euo', 'pipefail'] @@ -85,20 +105,20 @@ dag { manifest { name = 'nf-core/rnafusion' - author = 'No author provided' + author = 'Martin Proks' homePage = 'https://github.com/nf-core/rnafusion' description = 'Nextflow rnafusion analysis pipeline, part of the nf-core community.' mainScript = 'main.nf' - nextflowVersion = '>=0.32.0' - version = '1.0.1' + nextflowVersion = '>=19.10.0' + version = '1.1.0' } // Function to ensure that resource requirements don't go beyond // a maximum limit def check_max(obj, type) { - if(type == 'memory'){ + if (type == 'memory') { try { - if(obj.compareTo(params.max_memory as nextflow.util.MemoryUnit) == 1) + if (obj.compareTo(params.max_memory as nextflow.util.MemoryUnit) == 1) return params.max_memory as nextflow.util.MemoryUnit else return obj @@ -106,9 +126,9 @@ def check_max(obj, type) { println " ### ERROR ### Max memory '${params.max_memory}' is not valid! Using default value: $obj" return obj } - } else if(type == 'time'){ + } else if (type == 'time') { try { - if(obj.compareTo(params.max_time as nextflow.util.Duration) == 1) + if (obj.compareTo(params.max_time as nextflow.util.Duration) == 1) return params.max_time as nextflow.util.Duration else return obj @@ -116,7 +136,7 @@ def check_max(obj, type) { println " ### ERROR ### Max time '${params.max_time}' is not valid! Using default value: $obj" return obj } - } else if(type == 'cpus'){ + } else if (type == 'cpus') { try { return Math.min( obj, params.max_cpus as int ) } catch (all) { From ab1bc130ed2195c0aca8237faaac09aa1f18a7d1 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 30 Jan 2020 10:55:30 +0100 Subject: [PATCH 0048/1520] chore: allow test.sh --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 46cc4dd7..b8c9a300 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,6 @@ work/ results/ .DS_Store -test* +test/* *.pyc .vscode/ \ No newline at end of file From 86aaf0fb9fa70cd475f533666bbcf51a640d3215 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 30 Jan 2020 10:55:46 +0100 Subject: [PATCH 0049/1520] fix: updated package versions --- environment.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/environment.yml b/environment.yml index 3ead67f6..3b3bcefe 100644 --- a/environment.yml +++ b/environment.yml @@ -7,13 +7,13 @@ channels: - defaults dependencies: - conda-forge::python=3.7.3 - # TODO nf-core: Add required software dependencies here - bioconda::fastqc=0.11.8 - bioconda::multiqc=1.7 - conda-forge::r-markdown=1.1 - conda-forge::r-base=3.6.1 + # Custom packages - bioconda::star=2.7.0f # update STAR-Fusion and Fusion-Inspector, Arriba - - conda-forge::r-data.table=1.12.0 - - conda-forge::r-gplots=3.0.1.1 - - bioconda::bioconductor-edger=3.24.1 + - conda-forge::r-data.table=1.12.8 + - conda-forge::r-gplots=3.0.1.2 + - bioconda::bioconductor-edger=3.28.0 - bioconda::fusion-report=2.0.1 From fb3f05282e845daae4aeb8cb4ae458eb1b6b43a7 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 30 Jan 2020 10:56:16 +0100 Subject: [PATCH 0050/1520] docs: updated README --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 1dd95b4d..247f8fbf 100644 --- a/README.md +++ b/README.md @@ -49,8 +49,6 @@ nextflow run nf-core/rnafusion -profile test, - ```bash nextflow run nf-core/rnafusion -profile docker --reads '*_R{1,2}.fastq.gz' ``` @@ -101,8 +99,7 @@ For further information or help, don't hesitate to get in touch on [Slack](https ## 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` pre-print as follows: From 4da409ab839a749c3fabe0db38610609dde0e11b Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 30 Jan 2020 10:56:44 +0100 Subject: [PATCH 0051/1520] fix: removed TODO --- conf/base.config | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/base.config b/conf/base.config index 66da8a65..cab22295 100644 --- a/conf/base.config +++ b/conf/base.config @@ -23,7 +23,6 @@ process{ // 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' ) } From b21b59b21d32379a911d2822b5a61172f5303697 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 30 Jan 2020 10:57:04 +0100 Subject: [PATCH 0052/1520] feat: added internal testing script --- test.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 test.sh diff --git a/test.sh b/test.sh new file mode 100644 index 00000000..9c61bfb9 --- /dev/null +++ b/test.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Test tools only +nextflow run NGI-RNAfusion/ -profile munin -c munin-singularity-1.1.0.config --reads '/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --debug + +# Test batch mode +nextflow run NGI-RNAfusion/ -profile munin -c munin-singularity-1.1.0.config --reads '/data1/references/rnafusion/1.1.0/batch_data/00*/*_R{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid + +# Test the whole pipeline +nextflow run NGI-RNAfusion/ -profile munin -c munin-singularity-1.1.0.config --reads '/data1/matq007/data/reads_{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector From 3981e965c984a3951beedf8385b067a78028e384 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 30 Jan 2020 10:57:41 +0100 Subject: [PATCH 0053/1520] fix: resolved 1.8 TEMPLATE issues --- main.nf | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/main.nf b/main.nf index 5467d33c..0ffc3ef2 100644 --- a/main.nf +++ b/main.nf @@ -168,17 +168,17 @@ if(params.readPaths) { Channel.from(params.readPaths) .map { row -> [ row[0], [file(row[1][0])]] } .ifEmpty{exit 1, "params.readPaths was empty - no input files supplied" } - .into{read_files_arriba; read_files_ericscript; read_files_fastqc; read_files_fusion_inspector; read_files_fusioncatcher; read_files_multiqc; read_files_pizzly; read_files_squid; read_files_star_fusion; read_files_summary} + .into{read_files_arriba; read_files_ericscript; ch_read_files_fastqc; read_files_fusion_inspector; read_files_fusioncatcher; read_files_multiqc; read_files_pizzly; read_files_squid; read_files_star_fusion; read_files_summary} } else { Channel.from(params.readPaths) .map { row -> [ row[0], [file(row[1][0]), file(row[1][1])]] } .ifEmpty{exit 1, "params.readPaths was empty - no input files supplied" } - .into{read_files_arriba; read_files_ericscript; read_files_fastqc; read_files_fusion_inspector; read_files_fusioncatcher; read_files_multiqc; read_files_pizzly; read_files_squid; read_files_star_fusion; read_files_summary} + .into{read_files_arriba; read_files_ericscript; ch_read_files_fastqc; read_files_fusion_inspector; read_files_fusioncatcher; read_files_multiqc; read_files_pizzly; read_files_squid; read_files_star_fusion; read_files_summary} } } 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." } - .into{read_files_arriba; read_files_ericscript; read_files_fastqc; read_files_fusion_inspector; read_files_fusioncatcher; read_files_multiqc; read_files_pizzly; read_files_squid; read_files_star_fusion; read_files_summary} + .into{read_files_arriba; read_files_ericscript; ch_read_files_fastqc; read_files_fusion_inspector; read_files_fusioncatcher; read_files_multiqc; read_files_pizzly; read_files_squid; read_files_star_fusion; read_files_summary} } /* @@ -610,7 +610,8 @@ process summary { file("${sample}_fusion_genes_mqc.json") into summary_fusions_mq file("*") into report - when: !params.debug && (params.arriba || params.fusioncatcher || params.star_fusion || params.ericscript || params.pizzly || params.squid) + when: !params.debug && (running_tools.size() > 0) + script: def extra_params = params.fusion_report_opt ? "${params.fusion_report_opt}" : '' @@ -770,7 +771,6 @@ process multiqc { input: file multiqc_config from ch_multiqc_config - // TODO nf-core: Add in log files from your new processes for MultiQC to find! file ('fastqc/*') from ch_fastqc_results.collect().ifEmpty([]) file ('software_versions/*') from ch_software_versions_yaml.collect() file workflow_summary from create_workflow_summary(summary) @@ -844,7 +844,6 @@ workflow.onComplete { email_fields['summary']['Nextflow Build'] = workflow.nextflow.build email_fields['summary']['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp - // TODO nf-core: If not using MultiQC, strip out this code (including params.max_multiqc_email_size) // On success try attach the multiqc report def mqc_report = null try { From 2c154020160e035eeb0ba3a930308427483b8d5e Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 30 Jan 2020 10:58:32 +0100 Subject: [PATCH 0054/1520] docs: updated CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2982082b..0b2898c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a * 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 From 3067f519bad8ddce25787fed186f425372e53fd5 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 30 Jan 2020 11:05:43 +0100 Subject: [PATCH 0055/1520] docs: fixed linting --- README.md | 2 +- docs/usage.md | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/README.md b/README.md index 247f8fbf..9a7a66af 100644 --- a/README.md +++ b/README.md @@ -107,4 +107,4 @@ You can cite the `nf-core` pre-print as follows: [![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) \ No newline at end of file +[![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/docs/usage.md b/docs/usage.md index c4d163a3..4b5bbee8 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -342,16 +342,6 @@ Required reference in order to run `Ericscript`. --ericscript_ref '[path to Ericscript reference]' ``` - - -### `--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]' -``` - ## Job resources ### Automatic resubmission From b75b88a75db3c532e4ae13727407e9fba5121e3b Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 30 Jan 2020 11:06:17 +0100 Subject: [PATCH 0056/1520] feat: added ci testing for all nextflow scripts --- .github/workflows/ci.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d2086b11..2156132d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,8 +22,12 @@ jobs: - name: Pull docker image run: | docker pull nfcore/rnafusion:dev && docker tag nfcore/rnafusion:dev nfcore/rnafusion:dev - - name: Run pipeline with test data + - name: Run pipeline 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 + nextflow run ${GITHUB_WORKSPACE} --help + - name: Run pipeline for downloading references + run: | + nextflow run ${GITHUB_WORKSPACE}/download-references.nf --help + - name: Run pipeline for downloading singularity images + run: | + nextflow run ${GITHUB_WORKSPACE}/download-singularity-img.nf --help From 63fda22959f5535d62cd2580c71b6fcdc9cf2572 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 30 Jan 2020 11:56:19 +0100 Subject: [PATCH 0057/1520] fix: updated paths for internal testing --- test.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test.sh b/test.sh index 9c61bfb9..90a010d9 100644 --- a/test.sh +++ b/test.sh @@ -1,10 +1,10 @@ #!/bin/bash # Test tools only -nextflow run NGI-RNAfusion/ -profile munin -c munin-singularity-1.1.0.config --reads '/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --debug +nextflow run NGI-RNAfusion/ -profile munin -c '/data1/references/rnafusion/1.1.0/munin-singularity.config' --reads '/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --debug # Test batch mode -nextflow run NGI-RNAfusion/ -profile munin -c munin-singularity-1.1.0.config --reads '/data1/references/rnafusion/1.1.0/batch_data/00*/*_R{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid +nextflow run NGI-RNAfusion/ -profile munin -c '/data1/references/rnafusion/1.1.0/munin-singularity.config' --reads '/data1/references/rnafusion/1.1.0/batch_data/00*/*_R{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid # Test the whole pipeline -nextflow run NGI-RNAfusion/ -profile munin -c munin-singularity-1.1.0.config --reads '/data1/matq007/data/reads_{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector +nextflow run NGI-RNAfusion/ -profile munin -c '/data1/references/rnafusion/1.1.0/munin-singularity.config' --reads '/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector From f0fe26be504b7081a7b95ce9eea9fa4dbc154fbe Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 6 Feb 2020 20:57:50 +0100 Subject: [PATCH 0058/1520] fix: updated command line parameters --- main.nf | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/main.nf b/main.nf index 0ffc3ef2..517243d6 100644 --- a/main.nf +++ b/main.nf @@ -33,30 +33,32 @@ def helpMessage() { Available: conda, docker, singularity, test, awsbatch and more Tool flags: --arriba [bool] Run Arriba - --arriba_opt [bool] Specify extra parameters for Arriba - --star_fusion [bool] Run STAR-Fusion - --star_fusion_opt [str] Specify extra parameters for STAR-Fusion + --arriba_opt [str] Specify extra parameters for Arriba + --ericscript [bool] Run Ericscript --fusioncatcher [bool] Run FusionCatcher --fusioncatcher_opt [srt] Specify extra parameters for FusionCatcher - --ericscript [bool] Run Ericscript + --fusion_report_opt [str] Specify extra parameters for fusion-report --pizzly [bool] Run Pizzly + --pizzly_k [int] Number of k-mers. Deafult 31 --squid [bool] Run Squid - --databases [path] Database path for fusion-report - --fusion_report_opt [str] Specify extra parameters for fusion-report - + --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 + --fusion_inspector_opt [str] Specify extra parameters for Fusion-Inspector References If not specified in the configuration file or you wish to overwrite any of the references. + --arriba_ref [file] Path to Arriba reference + --databases [path] Database path for fusion-report + --ericscript_ref [file] Path to Ericscript reference --fasta [file] Path to fasta reference + --fusioncatcher_ref [file] Path to Fusioncatcher reference --gtf [file] Path to GTF annotation - --transcript [file] Path to transcript --star_index [file] Path to STAR-Index reference --star_fusion_ref [file] Path to STAR-Fusion reference - --fusioncatcher_ref [file] Path to Fusioncatcher reference - --ericscript_ref [file] Path to Ericscript reference - --arriba_ref [file] Path to Arriba reference + --transcript [file] Path to transcript Options: --read_length [int] Length of the reads. Default: 100 From a472dd888adc901e9c7cb73ff00abf08df38822f Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 6 Feb 2020 20:58:19 +0100 Subject: [PATCH 0059/1520] fix: updated example comfigurations title --- example/custom-docker.config | 2 +- example/custom-singularity.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/example/custom-docker.config b/example/custom-docker.config index 2da2832b..472d95dc 100644 --- a/example/custom-docker.config +++ b/example/custom-docker.config @@ -1,6 +1,6 @@ /* * ------------------------------------------------- - * Nextflow config file for Munin Singularity + * Nextflow example configuration for Docker * ------------------------------------------------- */ diff --git a/example/custom-singularity.config b/example/custom-singularity.config index b910afb0..2342e20a 100644 --- a/example/custom-singularity.config +++ b/example/custom-singularity.config @@ -1,6 +1,6 @@ /* * ------------------------------------------------- - * Nextflow config file for Munin Singularity + * Nextflow example configuration for Singularity * ------------------------------------------------- */ From c394fb0e00d3c0e8f04dff2e550a826ea0733adb Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 6 Feb 2020 20:58:33 +0100 Subject: [PATCH 0060/1520] docs: updated documentation --- README.md | 7 +- docs/README.md | 14 -- docs/configuration/adding_your_own.md | 88 ---------- docs/configuration/local.md | 49 ------ docs/configuration/reference_genomes.md | 52 ------ docs/configuration/uppmax.md | 62 ------- docs/installation.md | 118 ------------- docs/output.md | 216 +++++++++++++----------- docs/references.md | 167 +++++------------- docs/troubleshooting.md | 33 ---- docs/usage.md | 212 ++++++++++++----------- 11 files changed, 273 insertions(+), 745 deletions(-) delete mode 100644 docs/README.md delete mode 100644 docs/configuration/adding_your_own.md delete mode 100644 docs/configuration/local.md delete mode 100644 docs/configuration/reference_genomes.md delete mode 100644 docs/configuration/uppmax.md delete mode 100644 docs/installation.md delete mode 100644 docs/troubleshooting.md diff --git a/README.md b/README.md index 9a7a66af..6e8f46ab 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ ii. Install one of [`docker`](https://docs.docker.com/engine/installation/), [`s iii. Download the pipeline and test it on a minimal dataset with a single command ```bash -nextflow run nf-core/rnafusion -profile test, +nextflow run nf-core/rnafusion --help ``` > Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile institute` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. @@ -50,7 +50,7 @@ nextflow run nf-core/rnafusion -profile test, -c './example/custom-docker.config' --reads '*_R{1,2}.fastq.gz' --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. @@ -61,10 +61,9 @@ The nf-core/rnafusion pipeline comes with documentation about the pipeline, foun 1. [Installation](https://nf-co.re/usage/installation) 2. Pipeline configuration - * [Download references for tools](docs/references.md) + * [Download references](docs/references.md) * [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) diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 1a6b6ba9..00000000 --- a/docs/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# 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 - * [Download references for tools](references.md) - * [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) - * [UPPMAX configuration](configuration/uppmax.md) -3. [Running the pipeline](usage.md) -4. [Output and how to interpret the results](output.md) -5. [Troubleshooting](https://nf-co.re/usage/troubleshooting) diff --git a/docs/configuration/adding_your_own.md b/docs/configuration/adding_your_own.md deleted file mode 100644 index a3a2b7d2..00000000 --- a/docs/configuration/adding_your_own.md +++ /dev/null @@ -1,88 +0,0 @@ -# nf-core/rnafusion: Configuration for other clusters - -It is entirely possible to run this pipeline on other clusters, though you will need to set up your own config file so that the pipeline knows how to work with your cluster. - -> If you think that there are other people using the pipeline who would benefit from your configuration (eg. other common cluster setups), please let us know. We can add a new configuration and profile to our existing configuration repository [nf-core/configs](https://github.com/nf-core/configs). This would allow everyone to run the pipeline with just specifying `-profile `. - -If you are the only person to be running this pipeline, you can create your config file as `~/.nextflow/config` and it will be applied every time you run Nextflow. Alternatively, save the file anywhere and reference it when running the pipeline with `-c path/to/config` (see the [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more). - -A basic configuration comes with the pipeline, which runs by default (the `standard` config profile - see [`conf/base.config`](../conf/base.config)). This means that you only need to configure the specifics for your system and overwrite any defaults that you want to change. - -## Cluster Environment - -By default, pipeline uses the `local` Nextflow executor - in other words, all jobs are run in the login session. If you're using a simple server, this may be fine. If you're using a compute cluster, this is bad as all jobs will run on the head node. - -To specify your cluster environment, add the following line to your config file: - -```nextflow -process.executor = 'YOUR_SYSTEM_TYPE' -``` - -Many different cluster types are supported by Nextflow. For more information, please see the [Nextflow documentation](https://www.nextflow.io/docs/latest/executor.html). - -Note that you may need to specify cluster options, such as a project or queue. To do so, use the `clusterOptions` config option: - -```nextflow -process { - executor = 'SLURM' - clusterOptions = '-A myproject' -} -``` - -## Software Requirements - -To run the pipeline, several software packages are required. How you satisfy these requirements is essentially up to you and depends on your system. If possible, we _highly_ recommend using either Docker or Singularity. - -Please see the [`installation documentation`](../installation.md) for how to run using the below as a one-off. These instructions are about configuring a config file for repeated use. - -### Docker - -Docker is a great way to run nf-core/rnafusion, as it manages all software installations and allows the pipeline to be run in an identical software environment across a range of systems. - -Nextflow has [excellent integration](https://www.nextflow.io/docs/latest/docker.html) with Docker, and beyond installing the two tools, not much else is required - nextflow will automatically fetch the [nfcore/rnafusion](https://hub.docker.com/r/nfcore/rnafusion/) image that we have created and is hosted at dockerhub at run time. - -To add docker support to your own config file, add the following: - -```nextflow -docker.enabled = true -process.container = "nfcore/rnafusion" -``` - -Note that the dockerhub organisation name annoyingly can't have a hyphen, so is `nfcore` and not `nf-core`. - -### Singularity image - -Many HPC environments are not able to run Docker due to security issues. -[Singularity](http://singularity.lbl.gov/) is a tool designed to run on such HPC systems which is very similar to Docker. - -To specify singularity usage in your pipeline config file, add the following: - -```nextflow -singularity.enabled = true -process.container = "docker://nf-core/rnafusion" -``` - -If you intend to run the pipeline offline, nextflow will not be able to automatically download the singularity image for you. -Instead, you'll have to do this yourself manually first, transfer the image file and then point to that. - -First, pull the image file where you have an internet connection: - -```bash -singularity pull --name nf-core-rnafusion.simg docker://nf-core/rnafusion -``` - -Then transfer this file and point the config file to the image: - -```nextflow -singularity.enabled = true -process.container = "/path/to/nf-core-rnafusion.simg" -``` - -### Conda - -If you're not able to use Docker or Singularity, you can instead use conda to manage the software requirements. -To use conda in your own config file, add the following: - -```nextflow -process.conda = "$baseDir/environment.yml" -``` diff --git a/docs/configuration/local.md b/docs/configuration/local.md deleted file mode 100644 index fad35bc0..00000000 --- a/docs/configuration/local.md +++ /dev/null @@ -1,49 +0,0 @@ -# nfcore/rnafusion: Local Configuration - -Local installation is not advised as some tools require at least **60GB** of RAM. For more details about tool memory consumption see section [tools](../tools.md). If you satisfy this requirement, we highly recommend using either Docker or Singularity. - -## Docker - -Docker is a great way to run nfcore/rnafusion, as it manages all software installations and allows the pipeline to be run in an identical software environment across a range of systems. - -Nextflow has [excellent integration](https://www.nextflow.io/docs/latest/docker.html) with Docker, and beyond installing the two tools, not much else is required. The nfcore/rnafusion profile comes with a configuration profile for docker, making it very easy to use. This also comes with the required presets to use the AWS iGenomes resource, meaning that if using common reference genomes you just specify the reference ID and it will be autaomtically downloaded from AWS S3. - -First, install docker on your system: [Docker Installation Instructions](https://docs.docker.com/engine/installation/) - -Then, simply run the analysis pipeline: - -```bash -nextflow run nf-core/rnafusion -profile docker --genome '' --reads '' -``` - -Nextflow will recognise `nf-core/rnafusion` and download the pipeline from GitHub. The `-profile docker` configuration lists the [nfcore/rnafusion](https://hub.docker.com/r/nfcore/rnafusion/) image that we have created and is hosted at dockerhub, and this is downloaded. - -For more information about how to work with reference genomes, see [`docs/configuration/reference_genomes.md`](docs/configuration/reference_genomes.md). - -### Pipeline versions - -The public docker images are tagged with the same version numbers as the code, which you can use to ensure reproducibility. When running the pipeline, specify the pipeline version with `-r`, for example `-r 1.0.1`. This uses pipeline code and docker image from this tagged version. - -## Singularity image - -Many HPC environments are not able to run Docker due to security issues. [Singularity](http://singularity.lbl.gov/) is a tool designed to run on such HPC systems which is very similar to Docker. Even better, it can use create images directly from dockerhub. - -To use the singularity image for a single run, use `-with-singularity`. This will download the docker container from dockerhub and create a singularity image for you dynamically. - -If you intend to run the pipeline offline, nextflow will not be able to automatically download the singularity image for you. Instead, you'll have to do this yourself manually first, transfer the image file and then point to that. - -First, pull the image file where you have an internet connection: - -> NB: The "tag" at the end of this command corresponds to the pipeline version. -> Here, we're pulling the docker image for version 1.0.1 of the nfcore/rnafusion pipeline -> Make sure that this tag corresponds to the version of the pipeline that you're using - -```bash -singularity pull --name nfcore-rnafusion-1.0.1.img docker://nfcore/rnafusion:1.0.1 -``` - -Then transfer this file and run the pipeline with this path: - -```bash -nextflow run /path/to/nfcore-rnafusion -with-singularity /path/to/nfcore-rnafusion-1.0.1.img -``` diff --git a/docs/configuration/reference_genomes.md b/docs/configuration/reference_genomes.md deleted file mode 100644 index afb0c989..00000000 --- a/docs/configuration/reference_genomes.md +++ /dev/null @@ -1,52 +0,0 @@ -# nf-core/rnafusion: Reference Genomes Configuration - -The nf-core/rnafusion pipeline needs a reference genome for alignment and annotation. - -These paths can be supplied on the command line at run time (see the [usage docs](../usage.md)), -but for convenience it's often better to save these paths in a nextflow config file. -See below for instructions on how to do this. -Read [Adding your own system](adding_your_own.md) to find out how to set up custom config files. - -## Adding paths to a config file - -Specifying long paths every time you run the pipeline is a pain. -To make this easier, the pipeline comes configured to understand reference genome keywords which correspond to preconfigured paths, meaning that you can just specify `--genome ID` when running the pipeline. - -Note that this genome key can also be specified in a config file if you always use the same genome. - -To use this system, add paths to your config file using the following template: - -```nextflow -params { - genomes { - 'YOUR-ID' { - fasta = '/genome.fa' - } - 'OTHER-GENOME' { - // [..] - } - } - // Optional - default genome. Ignored if --genome 'OTHER-GENOME' specified on command line - genome = 'YOUR-ID' -} -``` - -You can add as many genomes as you like as long as they have unique IDs. - -## illumina iGenomes - -To make the use of reference genomes easier, illumina has developed a centralised resource called [iGenomes](https://support.illumina.com/sequencing/sequencing_software/igenome.html). -Multiple reference index types are held together with consistent structure for multiple genomes. - -We have put a copy of iGenomes up onto AWS S3 hosting and this pipeline is configured to use this by default. -The hosting fees for AWS iGenomes are currently kindly funded by a grant from Amazon. -The pipeline will automatically download the required reference files when you run the pipeline. -For more information about the AWS iGenomes, see [https://ewels.github.io/AWS-iGenomes/](https://ewels.github.io/AWS-iGenomes/). - -Downloading the files takes time and bandwidth, so we recommend making a local copy of the iGenomes resource. -Once downloaded, you can customise the variable `params.igenomes_base` in your custom configuration file to point to the reference location. -For example: - -```nextflow -params.igenomes_base = '/path/to/data/igenomes/' -``` diff --git a/docs/configuration/uppmax.md b/docs/configuration/uppmax.md deleted file mode 100644 index 1feeefc1..00000000 --- a/docs/configuration/uppmax.md +++ /dev/null @@ -1,62 +0,0 @@ -# nfcore/rnafusion: UPPMAX Configuration - -The pipeline comes bundled with configurations to use the [Swedish UPPMAX](https://www.uppmax.uu.se/) clusters (tested on `milou`, `rackham`, `bianca` and `irma`). As such, you shouldn't need to add any custom configuration - everything _should_ work out of the box. - -To use the pipeline on UPPMAX, you **must** specificy `-profile uppmax` when running the pipeline (as of Nov 2017). - -Note that you will need to specify your UPPMAX project ID when running a pipeline. To do this, use the command line flag `--project `. The pipeline will exit with an error message if you try to run it pipeline with the UPPMAX config profile without a project. - -**Optional Extra:** To avoid having to specify your project every time you run Nextflow, you can add it to your personal Nextflow config file instead. Add this line to `~/.nextflow/config`: - -```groovy -params.project = 'project_ID' // eg. b2017123 -``` - -## Running offline - -If you are running the pipeline on Bianca or Irma, you will not have an active internet connection and some automated features will not be able to function. Specifically, you'll need to transfer the pipeline files and the singularity image manually. - -First, to generate the singularity image, run the following command. Note that you need singularity installed - this is available on the other UPPMAX clusters (Milou and Rackham): - -First, pull the image file where you have an internet connection: - -> NB: The "tag" at the end of this command corresponds to the pipeline version. -> Here, we're pulling the docker image for version 1.0.1 of the nfcore/rnafusion pipeline -> Make sure that this tag corresponds to the version of the pipeline that you're using - -```bash -singularity pull --name nfcore-rnafusion-1.0.1.img docker://nfcore/rnafusion:1.0.1 -pwd # Prints path to your singularity container -``` - -The nfcore/rnafusion pipeline files can be downloaded from [https://github.com/nf-core/rnafusion/releases](https://github.com/nf-core/rnafusion/releases). - -Download the pipeline files and transfer the compressed archive (the `.zip` -or `.tar.gz` file). Once transferred, extract the pipeline files. -For example, with a `.zip` file: - -```bash -unzip 1.0.1.zip -mv nfcore-rnafusion-1.0.1 nfcore-rnafusion # rename the folder -cd nfcore-rnafusion-1.0.1 -pwd # Prints full path to your pipeline -``` - -Finally, move to the directory where you want to run the pipeline -and execute Nextflow with the path to the pipeline, as so: - -```bash -cd /path/to/my/data/analysis -nextflow run /path/to/nfcore-rnafusion-1.0.1 -with-singularity /path/to/singularity/nfcore-rnafusion-1.0.1.img -``` - -(Note that you'll need the other common flags such as `--reads` and `--genome` in addition to this command). - -> NB: Note that you should _not_ use the `-r 1.0.1` flag recommended elsewhere. This tells Nextflow to download -> that version of the code when it runs. Here, you have already downloaded the code, so it generates an error. - -## Environment modules and development - -If you would prefer to use environment modules instead of singularity, you can use the old version of the configuration by specifying `-profile uppmax_modules` (we don't recommend this). - -For pipeline development work on `milou`, use `-profile uppmax_devel` - this uses the milou [devel partition](http://www.uppmax.uu.se/support/user-guides/slurm-user-guide/#tocjump_030509106905141747_8) for testing the pipeline quickly. Please note that this is _not_ suitable for proper analysis runs - only tiny test datasets. diff --git a/docs/installation.md b/docs/installation.md deleted file mode 100644 index 43aa2d4b..00000000 --- a/docs/installation.md +++ /dev/null @@ -1,118 +0,0 @@ -# nf-core/rnafusion: Installation - -To start using the nf-core/rnafusion pipeline, follow the steps below: - -1. [Install Nextflow](#1-install-nextflow) -2. [Install the pipeline](#2-install-the-pipeline) - * [Automatic](#21-automatic) - * [Offline](#22-offline) - * [Development](#23-development) -3. [Pipeline configuration](#3-pipeline-configuration) - * [Software deps: Docker and Singularity](#31-software-deps-docker-and-singularity) - * [Software deps: Bioconda](#32-software-deps-bioconda) - * [Configuration profiles](#33-configuration-profiles) -4. [Reference genomes](#4-reference-genomes) -5. [Appendices](#appendices) - * [Running on UPPMAX](#running-on-uppmax) - -## 1) Install NextFlow - -Nextflow runs on most POSIX systems (Linux, Mac OSX etc). It can be installed by running the following commands: - -```bash -# Make sure that Java v8+ is installed: -java -version - -# Install Nextflow -curl -fsSL get.nextflow.io | bash - -# Add Nextflow binary to your PATH: -mv nextflow ~/bin/ -# OR system-wide installation: -# sudo mv nextflow /usr/local/bin -``` - -See [nextflow.io](https://www.nextflow.io/) for further instructions on how to install and configure Nextflow. - -## 2) Install the pipeline - -### 2.1) Automatic - -This pipeline itself needs no installation - NextFlow will automatically fetch it from GitHub if `nf-core/rnafusion` is specified as the pipeline name. - -### 2.2) Offline - -The above method requires an internet connection so that Nextflow can download the pipeline files. If you're running on a system that has no internet connection, you'll need to download and transfer the pipeline files manually: - -```bash -wget https://github.com/nf-core/rnafusion/archive/master.zip -mkdir -p ~/my-pipelines/nf-core/ -unzip master.zip -d ~/my-pipelines/nf-core/ -cd ~/my_data/ -nextflow run ~/my-pipelines/nf-core/rnafusion-master -``` - -To stop nextflow from looking for updates online, you can tell it to run in offline mode by specifying the following environment variable in your ~/.bashrc file: - -```bash -export NXF_OFFLINE='TRUE' -``` - -### 2.3) Development - -If you would like to make changes to the pipeline, it's best to make a fork on GitHub and then clone the files. Once cloned you can run the pipeline directly as above. - -## 3) Pipeline configuration - -By default, the pipeline runs with the `standard` configuration profile. This uses a number of sensible defaults for process requirements and is suitable for running on a simple (if powerful!) basic server. You can see this configuration in [`conf/base.config`](../conf/base.config). - -Be warned of two important points about this default configuration: - -1. The default profile uses the `local` executor - * All jobs are run in the login session. If you're using a simple server, this may be fine. If you're using a compute cluster, this is bad as all jobs will run on the head node. - * See the [nextflow docs](https://www.nextflow.io/docs/latest/executor.html) for information about running with other hardware backends. Most job scheduler systems are natively supported. -2. Nextflow will expect all software to be installed and available on the `PATH` - -### 3.1) Software deps: Docker - -First, install docker on your system: [Docker Installation Instructions](https://docs.docker.com/engine/installation/) - -Then, running the pipeline with the option `-profile docker` tells Nextflow to enable Docker for this run. A set of images containing the software requirements will be automatically fetched and used from DockerHub ([https://hub.docker.com/r/nfcore/rnafusion](https://hub.docker.com/r/nfcore/rnafusion)). - -### 3.1) Software deps: Singularity - -If you're not able to use Docker then [Singularity](http://singularity.lbl.gov/) is a great alternative. -The process is very similar: running the pipeline with the option `-profile singularity` tells Nextflow to enable singularity for this run. A set of images containing all of the software requirements will be automatically fetched and used from DockerHub. - -If running offline with Singularity, you'll need to download and transfer the Singularity images first. You can use included nextflow `download-singularity-img.nf` script: - -```bash -nextflow run nf-core/rnafusion/download-singularity-img.nf --all --outdir -``` - -For additional optional parameters run: - -```bash -nextflow run nf-core/rnafusion/download-singularity-img.nf --help -``` - -### 3.2) Software deps: conda - -If you're not able to use Docker _or_ Singularity, you can instead use conda to manage the software requirements. -This is slower and less reproducible than the above, but is still better than having to install all requirements yourself! -The pipeline ships with a conda environment file and nextflow has built-in support for this. -To use it first ensure that you have conda installed (we recommend [miniconda](https://conda.io/miniconda.html)), then follow the same pattern as above and use the flag `-profile conda` - -## Appendices - -### Running on UPPMAX - -To run the pipeline on the [Swedish UPPMAX](https://www.uppmax.uu.se/) clusters (`rackham`, `irma`, `bianca` etc), use the command line flag `-profile uppmax`. This tells Nextflow to submit jobs using the SLURM job executor with Singularity for software dependencies. - -Note that you will need to specify your UPPMAX project ID when running a pipeline. To do this, use the command line flag `--project `. The pipeline will exit with an error message if you try to run it pipeline with the default UPPMAX config profile without a project. - -**Optional Extra:** To avoid having to specify your project every time you run Nextflow, you can add it to your personal Nextflow config file instead. Add this line to `~/.nextflow/config`: - -```nextflow -params.project = 'project_ID' // eg. b2017123 -``` diff --git a/docs/output.md b/docs/output.md index 40b2bde5..7c02cfdf 100644 --- a/docs/output.md +++ b/docs/output.md @@ -7,86 +7,27 @@ This document describes the output produced by the pipeline. The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: +* [Arriba](#arriba) +* [EricScript](#ericscript) * [FastQC](#fastqc) - read quality control -* [Star-Fusion](#star-fusion) * [FusionCatcher](#fusioncatcher) -* [EricScript](#ericscript) -* [Pizzly](#pizzly) -* [Squid](#squid) * [FusionInspector](#fusion-inspector) * [fusion-report](#fusion-report) * [MultiQC](#multiqc) - aggregate report, describing results of the whole pipeline +* [Pizzly](#pizzly) +* [Squid](#squid) +* [Star-Fusion](#star-fusion) -## 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. - -For further reading and documentation see the [FastQC help](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 directory: `results/fastqc`** - -* `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 - -## Star-Fusion - -**Output directory: `results/tools/StarFusion`** - -* `star-fusion.fusion_predictions.tsv` - * contains all the predicted gene fusions - -|  Column | Description | -| ------- | ----------- | -| JunctionReadCount | Indicates the number of RNA-Seq fragments containing a read that aligns as a split read at the site of the putative fusion junction. | -| SpanningFragCount | Indicates the number of RNA-Seq fragments that encompass the fusion junction such that one read of the pair aligns to a different gene than the other paired-end read of that fragment. | -| SpliceType | Indicates whether the proposed breakpoint occurs at reference exon junctions as provided by the reference transcript structure annotations (ex. gencode). -| LeftGene -| LeftBreakpoint -| RightGene -| RightBreakpoint -| LargeAnchorSupport | column indicates whether there are split reads that provide 'long' (set to length of 25 bases) alignments on both sides of the putative breakpoint. | -| FFPM | fusion fragments per million total reads; **Default:** *0.1 (meaning at least 1 fusion-supporting rna-seq fragment per 10M total reads)*; **TL;DR:** can be adjusted by changing `--min_FFPM` -| LeftBreakDinuc | | -| LeftBreakEntropy | Represents Shannon entropy | -| RightBreakDinuc | -| RightBreakEntropy | Represents Shannon entropy | -| annots | Annotation generated by [FusionAnnotar](https://github.com/FusionAnnotator/FusionAnnotator/wiki) | - -For more info check the [documentation](https://github.com/STAR-Fusion/STAR-Fusion/wiki#Outputs). - -## Fusioncatcher - -**Output directory: `results/tools/Fusioncatcher`** - -* `final-list_candidate-fusion-genes.txt` - * contains all the predicted gene fusions +## Arriba -|  Column | Description | -| ------- | ----------- | -| **Gene\_1\_symbol(5end\_fusion\_partner)** | Gene symbol of the 5' end fusion partner | -| **Gene\_2\_symbol\_2(3end\_fusion\_partner)** | Gene symbol of the 3' end fusion partner | -| **Gene\_1\_id(5end\_fusion\_partner)** | Ensembl gene id of the 5' end fusion partner | -| **Gene\_2\_id(3end\_fusion\_partner)** | Ensembl gene id of the 3' end fusion partner | -| **Exon\_1\_id(5end\_fusion\_partner)** | Ensembl exon id of the 5' end fusion exon-exon junction | -| **Exon\_2\_id(3end\_fusion\_partner)** | Ensembl exon id of the 3' end fusion exon-exon junction | -| **Fusion\_point\_for\_gene\_1(5end\_fusion\_partner)** | Chromosomal position of the 5' end of fusion junction (chromosome:position:strand); 1-based coordinate | -| **Fusion\_point\_for\_gene\_2(3end\_fusion\_partner)** | Chromosomal position of the 3' end of fusion junction (chromosome:position:strand); 1-based coordinate | -| **Spanning\_pairs** | Count of pairs of reads supporting the fusion (**including** also the multimapping reads) | -| **Spanning\_unique\_reads** | Count of unique reads (i.e. unique mapping positions) mapping on the fusion junction. Shortly, here are counted all the reads which map on fusion junction minus the PCR duplicated reads. | -| **Longest\_anchor\_found** | Longest anchor (hangover) found among the unique reads mapping on the fusion junction | -| **Fusion\_finding\_method** | Aligning method used for mapping the reads and finding the fusion genes. Here are two methods used which are: (i) **BOWTIE** = only Bowtie aligner is used for mapping the reads on the genome and exon-exon fusion junctions, (ii) **BOWTIE+BLAT** = Bowtie aligner is used for mapping reads on the genome and BLAT is used for mapping reads for finding the fusion junction, (iii) **BOWTIE+STAR** = Bowtie aligner is used for mapping reads on the genome and STAR is used for mapping reads for finding the fusion junction, (iv) **BOWTIE+BOWTIE2** = Bowtie aligner is used for mapping reads on the genome and Bowtie2 is used for mapping reads for finding the fusion junction. | -| **Fusion\_sequence** | The inferred fusion junction (the asterisk sign marks the junction point) | -| **Fusion\_description** | Type of the fusion gene (see the Table 2) | -| **Counts\_of\_common\_mapping\_reads** | Count of reads mapping simultaneously on both genes which form the fusion gene. This is an indication how similar are the DNA/RNA sequences of the genes forming the fusion gene (i.e. what is their homology because highly homologous genes tend to appear show as candidate fusion genes). In case of completely different sequences of the genes involved in forming a fusion gene then here it is expected to have the value zero. | -| **Predicted\_effect** | Predicted effect of the candidate fusion gene using the annotation from Ensembl database. This is shown in format **effect\_gene\_1**/**effect\_gene\_2**, where the possible values for effect\_gene\_1 or effect\_gene\_2 are: **intergenic**, **intronic**, **exonic(no-known-CDS)**, **UTR**, **CDS(not-reliable-start-or-end)**, **CDS(truncated)**, or **CDS(complete)**. In case that the fusion junction for both genes is within their CDS (coding sequence) then only the values **in-frame** or **out-of-frame** will be shown. | -| **Predicted\_fused\_transcripts** | All possible known fused transcripts in format ENSEMBL-TRANSCRIPT-1:POSITION-1/ENSEMBLE-TRANSCRIPT-B:POSITION-2, where are fused the sequence 1:POSITION-1 of transcript ENSEMBL-TRANSCRIPT-1 with sequence POSITION-2:END of transcript ENSEMBL-TRANSCRIPT-2 | -| **Predicted\_fused\_proteins** | Predicted amino acid sequences of all possible fused proteins (separated by ";"). | +**Output directory: `results/tools/Arriba`** -For more info check the [documentation](https://github.com/ndaniel/fusioncatcher/blob/master/doc/manual.md#62---output-data-output-data). +* `fusions.tsv` + * contains fusions which pass all of Arriba's filters. It should be highly enriched for true predictions. The predictions are listed from highest to lowest confidence. +* `fusions.discarded.tsv` + * contains all events that Arriba classified as an artifact or that are also observed in healthy tissue. This file may be useful, if one suspects that an event should be present, but was erroneously discarded by Arriba. +* `.pdf` + * contains fusion visualization when opted for `--arriba_vis` ## EricScript @@ -125,47 +66,50 @@ For more info check the [documentation](https://github.com/ndaniel/fusioncatcher For more info check the [documentation](https://sites.google.com/site/bioericscript/getting-started). -## Pizzly +## FastQC -**Output directory: `results/tools/Pizzly`** +[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. -* `pizzly_fusions.json` - * contains all the predicted gene fusions +For further reading and documentation see the [FastQC help](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). -|  Column | Description | -| ------- | ----------- | -| geneA | `id`: reference id and `name`: gene name | -| geneB | Describes reference id and gene name | -| paircount | Number of paired count | -| splitcount | Number of split count | -| transcripts | List of all transcripts `fasta_record`, `transcriptA`, `transcriptB`, `support`, `reads` | -| readpairs | List of read pairs containing (`type`, `read1`, `read2`) | +> **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. -For more info check the [documentation](https://github.com/pmelsted/pizzly#output). +**Output directory: `results/fastqc`** -## Squid +* `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 -**Output directory: `results/tools/Squid`** +## Fusioncatcher -* `fusions_annotated.txt` +**Output directory: `results/tools/Fusioncatcher`** + +* `final-list_candidate-fusion-genes.txt` * contains all the predicted gene fusions |  Column | Description | | ------- | ----------- | -| chr1 | chromosome name of the first breakpoint. -| start1 | starting position of the segment of the first breakpoint, or the predicted breakpoint position if strand1 is "-" | -| end1 | ending position of the segment of the first breakpoint, or the predicted breakpoint position if strand1 is "+" | -| chr2 | chromosome name of the second breakpoint | -| start2 | starting position of the segment of the second breakpoint, or the predicted breakpoint position if strand2 is "-" | -| end2 | ending position of the segment of the second breakpoint, or the predicted breakpoint position if strand2 is "+" | -| name | TSV is not named yet, this column shows with dot. -| score | number of reads supporting this TSV (without weighted by Discordant edge ratio multiplier) | -| strand1 | strand of the first segment in TSV. -| strand2 | strand of the second segment in TSV. -| num_concordantfrag_bp1 | number of concordant paired-end reads covering the first breakpoint. For a concordant paired-end read, it includes two ends and a inserted region in between, if any of the 3 regions covers the breakpoint, the read is counted in this number | -| num_concordantfrag_bp2 | number of concordant paired-end reads covering the second breakpoint. The count is defined in the same way as num_concordantfrag_bp1 | +| **Gene\_1\_symbol(5end\_fusion\_partner)** | Gene symbol of the 5' end fusion partner | +| **Gene\_2\_symbol\_2(3end\_fusion\_partner)** | Gene symbol of the 3' end fusion partner | +| **Gene\_1\_id(5end\_fusion\_partner)** | Ensembl gene id of the 5' end fusion partner | +| **Gene\_2\_id(3end\_fusion\_partner)** | Ensembl gene id of the 3' end fusion partner | +| **Exon\_1\_id(5end\_fusion\_partner)** | Ensembl exon id of the 5' end fusion exon-exon junction | +| **Exon\_2\_id(3end\_fusion\_partner)** | Ensembl exon id of the 3' end fusion exon-exon junction | +| **Fusion\_point\_for\_gene\_1(5end\_fusion\_partner)** | Chromosomal position of the 5' end of fusion junction (chromosome:position:strand); 1-based coordinate | +| **Fusion\_point\_for\_gene\_2(3end\_fusion\_partner)** | Chromosomal position of the 3' end of fusion junction (chromosome:position:strand); 1-based coordinate | +| **Spanning\_pairs** | Count of pairs of reads supporting the fusion (**including** also the multimapping reads) | +| **Spanning\_unique\_reads** | Count of unique reads (i.e. unique mapping positions) mapping on the fusion junction. Shortly, here are counted all the reads which map on fusion junction minus the PCR duplicated reads. | +| **Longest\_anchor\_found** | Longest anchor (hangover) found among the unique reads mapping on the fusion junction | +| **Fusion\_finding\_method** | Aligning method used for mapping the reads and finding the fusion genes. Here are two methods used which are: (i) **BOWTIE** = only Bowtie aligner is used for mapping the reads on the genome and exon-exon fusion junctions, (ii) **BOWTIE+BLAT** = Bowtie aligner is used for mapping reads on the genome and BLAT is used for mapping reads for finding the fusion junction, (iii) **BOWTIE+STAR** = Bowtie aligner is used for mapping reads on the genome and STAR is used for mapping reads for finding the fusion junction, (iv) **BOWTIE+BOWTIE2** = Bowtie aligner is used for mapping reads on the genome and Bowtie2 is used for mapping reads for finding the fusion junction. | +| **Fusion\_sequence** | The inferred fusion junction (the asterisk sign marks the junction point) | +| **Fusion\_description** | Type of the fusion gene (see the Table 2) | +| **Counts\_of\_common\_mapping\_reads** | Count of reads mapping simultaneously on both genes which form the fusion gene. This is an indication how similar are the DNA/RNA sequences of the genes forming the fusion gene (i.e. what is their homology because highly homologous genes tend to appear show as candidate fusion genes). In case of completely different sequences of the genes involved in forming a fusion gene then here it is expected to have the value zero. | +| **Predicted\_effect** | Predicted effect of the candidate fusion gene using the annotation from Ensembl database. This is shown in format **effect\_gene\_1**/**effect\_gene\_2**, where the possible values for effect\_gene\_1 or effect\_gene\_2 are: **intergenic**, **intronic**, **exonic(no-known-CDS)**, **UTR**, **CDS(not-reliable-start-or-end)**, **CDS(truncated)**, or **CDS(complete)**. In case that the fusion junction for both genes is within their CDS (coding sequence) then only the values **in-frame** or **out-of-frame** will be shown. | +| **Predicted\_fused\_transcripts** | All possible known fused transcripts in format ENSEMBL-TRANSCRIPT-1:POSITION-1/ENSEMBLE-TRANSCRIPT-B:POSITION-2, where are fused the sequence 1:POSITION-1 of transcript ENSEMBL-TRANSCRIPT-1 with sequence POSITION-2:END of transcript ENSEMBL-TRANSCRIPT-2 | +| **Predicted\_fused\_proteins** | Predicted amino acid sequences of all possible fused proteins (separated by ";"). | -For more info check the [documentation](https://github.com/Kingsford-Group/squid#output-specification). +For more info check the [documentation](https://github.com/ndaniel/fusioncatcher/blob/master/doc/manual.md#62---output-data-output-data). ## Fusion Inspector @@ -192,7 +136,7 @@ To visualize fusion genes in [IGV tool](https://software.broadinstitute.org/soft Add the bam files by choosing `File->Load from File` and make sure to select your generated mini genome in the upper-left corner. For more info and help check [wiki page](https://github.com/FusionInspector/FusionInspector/wiki). -## Summary report +## fusion-report **Output directory: `results/Report-`** @@ -239,3 +183,71 @@ The pipeline has special steps which allow the software versions used to be repo * Directory containing parsed statistics from the different tools used in the pipeline For more information about how to use MultiQC reports, see [http://multiqc.info](http://multiqc.info) + +## Pizzly + +**Output directory: `results/tools/Pizzly`** + +* `pizzly_fusions.json` + * contains all the predicted gene fusions + +|  Column | Description | +| ------- | ----------- | +| geneA | `id`: reference id and `name`: gene name | +| geneB | Describes reference id and gene name | +| paircount | Number of paired count | +| splitcount | Number of split count | +| transcripts | List of all transcripts `fasta_record`, `transcriptA`, `transcriptB`, `support`, `reads` | +| readpairs | List of read pairs containing (`type`, `read1`, `read2`) | + +For more info check the [documentation](https://github.com/pmelsted/pizzly#output). + +## Squid + +**Output directory: `results/tools/Squid`** + +* `fusions_annotated.txt` + * contains all the predicted gene fusions + +|  Column | Description | +| ------- | ----------- | +| chr1 | chromosome name of the first breakpoint. +| start1 | starting position of the segment of the first breakpoint, or the predicted breakpoint position if strand1 is "-" | +| end1 | ending position of the segment of the first breakpoint, or the predicted breakpoint position if strand1 is "+" | +| chr2 | chromosome name of the second breakpoint | +| start2 | starting position of the segment of the second breakpoint, or the predicted breakpoint position if strand2 is "-" | +| end2 | ending position of the segment of the second breakpoint, or the predicted breakpoint position if strand2 is "+" | +| name | TSV is not named yet, this column shows with dot. +| score | number of reads supporting this TSV (without weighted by Discordant edge ratio multiplier) | +| strand1 | strand of the first segment in TSV. +| strand2 | strand of the second segment in TSV. +| num_concordantfrag_bp1 | number of concordant paired-end reads covering the first breakpoint. For a concordant paired-end read, it includes two ends and a inserted region in between, if any of the 3 regions covers the breakpoint, the read is counted in this number | +| num_concordantfrag_bp2 | number of concordant paired-end reads covering the second breakpoint. The count is defined in the same way as num_concordantfrag_bp1 | + +For more info check the [documentation](https://github.com/Kingsford-Group/squid#output-specification). + +## Star-Fusion + +**Output directory: `results/tools/StarFusion`** + +* `star-fusion.fusion_predictions.tsv` + * contains all the predicted gene fusions + +|  Column | Description | +| ------- | ----------- | +| JunctionReadCount | Indicates the number of RNA-Seq fragments containing a read that aligns as a split read at the site of the putative fusion junction. | +| SpanningFragCount | Indicates the number of RNA-Seq fragments that encompass the fusion junction such that one read of the pair aligns to a different gene than the other paired-end read of that fragment. | +| SpliceType | Indicates whether the proposed breakpoint occurs at reference exon junctions as provided by the reference transcript structure annotations (ex. gencode). +| LeftGene +| LeftBreakpoint +| RightGene +| RightBreakpoint +| LargeAnchorSupport | column indicates whether there are split reads that provide 'long' (set to length of 25 bases) alignments on both sides of the putative breakpoint. | +| FFPM | fusion fragments per million total reads; **Default:** *0.1 (meaning at least 1 fusion-supporting rna-seq fragment per 10M total reads)*; **TL;DR:** can be adjusted by changing `--min_FFPM` +| LeftBreakDinuc | | +| LeftBreakEntropy | Represents Shannon entropy | +| RightBreakDinuc | +| RightBreakEntropy | Represents Shannon entropy | +| annots | Annotation generated by [FusionAnnotar](https://github.com/FusionAnnotator/FusionAnnotator/wiki) | + +For more info check the [documentation](https://github.com/STAR-Fusion/STAR-Fusion/wiki#Outputs). \ No newline at end of file diff --git a/docs/references.md b/docs/references.md index a6e0bffc..fce86b0f 100644 --- a/docs/references.md +++ b/docs/references.md @@ -1,154 +1,75 @@ # nfcore/rnafusion: Download references for tools -## 1. Using nextflow helper script +## Use nextflow helper script Downloading references manually is a tedious long process. To make the pipeline easier to work with, we provide a script to download all necessary references for fusion detection tools. > **TL;DR:** Make sure to download the correct references for your need! -```bash -# Example how to download references -# Note: STAR-Fusion has two versions of reference: -# * NCBI -# * Ensembl (generated by the script) -nextflow run nf-core/rnafusion/download-references.nf - -profile - --star_fusion - --fusioncatcher - --ericscript - --pizzly - --fusion_report --cosmic_usr --cosmic_passwd - --outdir -``` - -For additional optional parameters run: - ```bash nextflow run nf-core/rnafusion/download-references.nf --help ``` -## 2. Manual download - -### STAR-Fusion (NCBI) - -```bash -wget -N https://data.broadinstitute.org/Trinity/CTAT_RESOURCE_LIB/GRCh38_v27_CTAT_lib_Feb092018.plug-n-play.tar.gz -O GRCh38_v27_CTAT_lib_Feb092018.plug-n-play.tar.gz -tar -xvzf GRCh38_v27_CTAT_lib_Feb092018.plug-n-play.tar.gz -``` - -> Update your custom configuration file to include the directory - -```groovy -params { - star_fusion_ref = "/path/to/GRCh38_v27_CTAT_lib_Feb092018/ctat_genome_lib_build_dir" -} -``` - -### STAR-Fusion (Custom Ensembl example) - -```bash -# download all chromosomes from ensembl -wget ftp://ftp.ensembl.org/pub/release-77/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.{1..22}.fa.gz -wget ftp://ftp.ensembl.org/pub/release-77/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.{MT,X,Y}.fa.gz -gunzip -c Homo_sapiens.GRCh38.dna.chromosome.* > Homo_sapiens.GRCh38_r77.all.fa - -# download fasta file -wget ftp://ftp.ensembl.org/pub/release-77/gtf/homo_sapiens/Homo_sapiens.GRCh38.77.chr.gtf.gz - -# download -wget ftp://ftp.ebi.ac.uk/pub/databases/Pfam/current_release/Pfam-A.hmm.gz -gunzip Pfam-A.hmm.gz -hmmpress Pfam-A.hmm - -prep_genome_lib.pl - --genome_fa Homo_sapiens.GRCh38_r77.all.fa - --gtf Homo_sapiens.GRCh38.77.chr.gtf - --pfam_db Pfam-A.hmm - --CPU 10 -``` - -> Update your custom configuration file to include the directory - -```groovy -params { - star_fusion_ref = "/path/to/ctat_genome_lib_build_dir" -} -``` - -## Fusioncatcher - ```bash -wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v90.tar.gz.aa -wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v90.tar.gz.ab -wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v90.tar.gz.ac -wget -N http://sourceforge.net/projects/fusioncatcher/files/data/human_v90.tar.gz.ad -cat human_v90.tar.gz.* | tar xz -``` - -> Update your custom configuration file to include the directory - -```groovy -params { - fusioncatcher_ref = '/path/to/human_v90' -} +# Example to download all tools +nextflow run nf-core/rnafusion/download-references.nf \ + -profile \ + --arriba \ + --ericscript \ + --fusioncatcher \ + --fusion_report --cosmic_usr --cosmic_passwd \ + --pizzly \ + --star_fusion \ + --outdir ``` -## Ericscript - ```bash -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 \ -&& rm gdown.pl +# Example of downloading specific tools +nextflow run nf-core/rnafusion/download-references.nf \ + -profile \ + --arriba \ + --fusion_report --cosmic_usr --cosmic_passwd \ + --outdir ``` -> Update your custom configuration file to include the directory +## 2. Tool reference requirements -```groovy -params { - ericscript_ref = '/path/to/ericscript_db_homosapiens_ensembl84' -} -``` +### STAR-Fusion -## Pizzly +- STAR-index +- FASTA +- GTF +- ctat_genome_lib_build_dir (built using `prep_genome_lib.pl`) -```bash -# transcriptome -wget -N ftp://ftp.ensembl.org/pub/release-94/fasta/homo_sapiens/cdna/Homo_sapiens.GRCh38.cdna.all.fa.gz \ +### Fusioncatcher -# annotation -wget -N ftp://ftp.ensembl.org/pub/release-94/gtf/homo_sapiens/Homo_sapiens.GRCh38.94.gtf.gz && gunzip Homo_sapiens.GRCh38.94.gtf.gz -``` +- Custom reference (human) +- FASTA +- GTF -> Update your custom configuration file to include the directory +### Ericscript -```groovy -params { - pizzly_fasta = "/path/to/pizzly_ref/Homo_sapiens.GRCh38.cdna.all.fa.gz" - pizzly_gtf = "/path/to/pizzly_ref/Homo_sapiens.GRCh38.94.gtf" -} -``` +- Custom reference +- FASTA +- GTF -## Squid +### Pizzly -Requires: +- Transcript +- FASTA +- GTF -* STAR-Index (is either provided by the user or built by the pipeline) -* GTF file +### Squid -## AWS iGenomes +- STAR-index +- GTF file -```bash -mkdir -p igenomes/Homo_sapiens/NCBI/GRCh38/ -aws s3 --no-sign-request --region eu-west-1 sync s3://ngi-igenomes/igenomes/Homo_sapiens/NCBI/GRCh38/ . -``` - -## FusionInspector +### Fusion-Inspector -> Uses reference genome from STAR-Fusion (ctat_genome_lib_build_dir) +- ctat_genome_lib_build_dir +- FASTA +- GTF -## fusion-report +### fusion-report -```bash -fusion_report download --cosmic_usr --cosmic_passwd /output/databases -``` +- internal databases diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md deleted file mode 100644 index 185bcf7a..00000000 --- a/docs/troubleshooting.md +++ /dev/null @@ -1,33 +0,0 @@ -# nf-core/rnafusion: Troubleshooting - -## Input files not found - -If only no file, only one input file , or only read one and not read two is picked up then something is wrong with your input file declaration - -1. The path must be enclosed in quotes (`'` or `"`) -2. The path must have at least one `*` wildcard character. This is even if you are only running one paired end sample. -3. When using the pipeline with paired end data, the path must use `{1,2}` or `{R1,R2}` notation to specify read pairs. -4. If you are running Single end data make sure to specify `--single_end` - -If the pipeline can't find your files then you will get the following error - -```bash -ERROR ~ Cannot find any reads matching: *{1,2}.fastq.gz -``` - -Note that if your sample name is "messy" then you have to be very particular with your glob specification. A file name like `L1-1-D-2h_S1_L002_R1_001.fastq.gz` can be difficult enough for a human to read. Specifying `*{1,2}*.gz` wont work give you what you want Whilst `*{R1,R2}*.gz` will. - -## Data organization - -The pipeline can't take a list of multiple input files - it takes a glob expression. If your input files are scattered in different paths then we recommend that you generate a directory with symlinked files. If running in paired end mode please make sure that your files are sensibly named so that they can be properly paired. See the previous point. - -## Strange errors from tools - -Make sure you are using the **recommended** amount of RAM. Some tools will fail because of this and will break the pipeline throwing strange error messages and codes. Some of the tools are not maintained any more and require small hacking as can be seen in some `Dockerfiles` defined in `tools/` folder. - -## Extra resources and getting help - -If you still have an issue with running the pipeline then feel free to contact us. -Have a look at the [pipeline website](https://github.com/nf-core/rnafusion) to find out how. - -If you have problems that are related to Nextflow and not our pipeline then check out the [Nextflow gitter channel](https://gitter.im/nextflow-io/nextflow) or the [google group](https://groups.google.com/forum/#!forum/nextflow). diff --git a/docs/usage.md b/docs/usage.md index 4b5bbee8..2ef7d78b 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -7,6 +7,7 @@ * [Running the pipeline](#running-the-pipeline) * [Using Docker](#running-the-pipeline-using-docker) * [Using Singularity](#running-the-pipeline-using-singularity) + * [Running specific tools](#running-specific-tools) * [Updating the pipeline](#updating-the-pipeline) * [Reproducibility](#reproducibility) * [Main arguments](#main-arguments) @@ -19,25 +20,31 @@ * [`--reads`](#--reads) * [`--single_end`](#--single_end) * [Tool flags](#tool-flags) - * [`--star_fusion`](#--star_fusion) - * [`--star_fusion_opt`](#--star_fusion_opt) + * [`--arriba`](#--arriba) + * [`--arriba_opt`](#--arriba_opt) + * [`--ericscript`](#--ericscript) + * [`--ericscript_opt`](#--ericscript_opt) * [`--fusioncatcher`](#--fusioncatcher) * [`--fusioncatcher_opt`](#--fusioncatcher_opt) - * [`--ericscript`](#--ericscript) - * [`--pizzly`](#--pizzly) - * [`--squid`](#--squid) * [`--fusion_report_opt`](#--fusion_report_opt) - * [`--debug`](#--debug) + * [`--pizzly`](#--pizzly) + * [`--pizzly_k`](#--pizzly_k) + * [`--squid`](#--squid) + * [`--star_fusion`](#--star_fusion) + * [`--star_fusion_opt`](#--star_fusion_opt) * [Visualization flags](#visualization-flags) + * [`--arriba_vis`](#--arriba_vis) * [`--fusion_inspector`](#--fusion_inspector) * [Reference genomes](#reference-genomes) + * [`--arriba_ref`](#--arriba_ref) + * [`--databases`](#--databases) + * [`--ericscript_ref`](#--ericscript_ref) * [`--fasta`](#--fasta) + * [`--fusioncatcher_ref`](#--fusioncatcher_ref) * [`--gtf`](#--gtf) * [`--star_index`](#--star_index) * [`--star_fusion_ref`](#--star_fusion_ref) - * [`--fusioncatcher_ref`](#--fusioncatcher_ref) - * [`--ericscript_ref`](#--ericscript_ref) - * [`--igenomes_ignore`](#--igenomes_ignore) + * [`--transcript`](#--transcript) * [Job resources](#job-resources) * [Automatic resubmission](#automatic-resubmission) * [Custom resource requests](#custom-resource-requests) @@ -46,6 +53,7 @@ * [`--awsregion`](#--awsregion) * [`--awscli`](#--awscli) * [Other command line parameters](#other-command-line-parameters) + * [`--debug`](#--debug) * [`--read_length`](#--read_length) * [`--outdir`](#--outdir) * [`--email`](#--email) @@ -83,85 +91,57 @@ The typical command for running the pipeline is as follows. This will launch the pipeline using `docker` with configuration profile [example-docker.config](https://github.com/nf-core/rnafusion/blob/master/example/custom-docker.config). See below for more information about profiles. ```bash -# With custom fasta and gtf (Ensembl example) -nextflow run nf-core/rnafusion - --reads '*_R{1,2}.fastq.gz' - -profile docker -c 'example/custom-docker.config' - --fasta 'Homo_sapiens.GRCh38.95.all.fa' - --gtf 'Homo_sapiens.GRCh38.95.chr.gtf' - --star_fusion - --fusioncatcher - --ericscript - --pizzly - --squid - --fusion_inspector - -# With NCBI GRCh38 genome reference -nextflow run nf-core/rnafusion - --reads '*_R{1,2}.fastq.gz' - -profile docker -c 'example/custom-docker.config' - --genome GRCh38 - --igenomes_base '/path/to/igenomes' - --star_fusion - --fusioncatcher - --ericscript - --pizzly - --squid +nextflow run nf-core/rnafusion \ + -profile docker -c 'example/custom-docker.config' \ + --reads '*_R{1,2}.fastq.gz' \ + --arriba \ + --star_fusion \ + --fusioncatcher \ + --ericscript \ + --pizzly \ + --squid \ + --arriba_vis \ --fusion_inspector ``` ### Running the pipeline using Singularity -First start by downloading singularity images. Sometimes the pipeline can crash if you are not using downloaded images (might be some network issues). +First start by downloading singularity images. ```bash nextflow run nf-core/rnafusion/download-singularity-img.nf --download_all --outdir /path +``` -# or +If the nextflow download script crashes (network issue), please use the bash script instead. +```bash cd utils && sh download-singularity-img.sh /path/to/images ``` -This will launch the pipeline using `singularity` with configuration profile [example-singularity.config](https://github.com/nf-core/rnafusion/blob/master/example/custom-singularity.config). See below for more information about profiles. +The command bellow will launch the pipeline using `singularity` with configuration profile [example-singularity.config](https://github.com/nf-core/rnafusion/blob/master/example/custom-singularity.config). See below for more information about profiles. ```bash -# With custom fasta and gtf (Ensembl example) -nextflow run nf-core/rnafusion - --reads '*_R{1,2}.fastq.gz' - -profile singularity -c 'example/custom-singularity.config' - --fasta 'Homo_sapiens.GRCh38.95.all.fa' - --gtf 'Homo_sapiens.GRCh38.95.chr.gtf' - --star_fusion - --fusioncatcher - --ericscript - --pizzly - --squid - --fusion_inspector - -# With NCBI GRCh38 genome reference -nextflow run nf-core/rnafusion - --reads '*_R{1,2}.fastq.gz' - -profile singularity -c 'example/custom-singularity.config' - --genome GRCh38 - --igenomes_base '/path/to/igenomes' - --star_fusion - --fusioncatcher - --ericscript - --pizzly - --squid +nextflow run nf-core/rnafusion \ + -profile singularity -c 'example/custom-singularity.config' \ + --reads '*_R{1,2}.fastq.gz' \ + --arriba \ + --star_fusion \ + --fusioncatcher \ + --ericscript \ + --pizzly \ + --squid \ + --arriba_vis \ --fusion_inspector ``` ---- - -It is also possible to execute **only** specific tools: +### Running specific tools ```bash -nextflow run nf-core/rnafusion - --reads '*_R{1,2}.fastq.gz' - --genome GRCh38 -profile docker -c 'example/custom-docker.config' - --fusioncatcher - --ericscript +nextflow run nf-core/rnafusion \ + -profile singularity -c 'example/custom-singularity.config' \ + --reads '*_R{1,2}.fastq.gz' \ + --arriba \ + --squid ``` Note that the pipeline will create the following files in your working directory: @@ -243,48 +223,54 @@ By default, the pipeline expects paired-end data. If you have single-end data, y ## Tool flags -### `--star_fusion` +### `--arriba` -If enabled, executes `STAR-Fusion` tool. +If enabled, executes `Arriba` tool. -* `--star_fusion_opt` - * Parameter for specifying additional parameters. For more info, please refer to the [documentation](https://github.com/STAR-Fusion/STAR-Fusion/wiki) of the tool. - * **Has to be specified in custom configuration file. Will not work from a command line.** +* `--arriba_opt` + * Specify additional parameters. For more info, please refer to the [documentation](http://arriba.readthedocs.io/en/latest/quickstart/) of the tool. + +### `--ericscript` + +If enabled, executes `Ericscript` tool. + +* `--ericscript_opt` + * Specify additional parameters. For more info, please refer to the [documentation](https://sites.google.com/site/bioericscript/home) of the tool. ### `--fusioncatcher` If enabled, executes `Fusioncatcher` tool. * `--fusioncatcher_opt` - * Parameter for specifying additional parameters. For more info, please refer to the [documentation](https://github.com/ndaniel/fusioncatcher/blob/master/doc/manual.md) of the tool. - * **Has to be specified in custom configuration file. Will not work from a command line.** + * Specify additional parameters. For more info, please refer to the [documentation](https://github.com/ndaniel/fusioncatcher/blob/master/doc/manual.md) of the tool. -### `--ericscript` +### `--fusion_report_opt` -If enabled, executes `Ericscript` tool. +Specify additional parameters. For more info, please refer to the [documentation](https://matq007.github.io/fusion-report/#/) of the tool. ### `--pizzly` If enabled, executes `Pizzly` tool. +* `--pizzly_k` + * Number of k-mers. Deafult 31. + ### `--squid` If enabled, executes `Squid` tool. -### `--fusion_report_opt` +### `--star_fusion` -* Parameter for specifying additional parameters. For more info, please refer to the fusion-report [documentation](https://matq007.github.io/fusion-report/usage.html). -* **Has to be specified in custom configuration file. Will not work from a command line.** +If enabled, executes `STAR-Fusion` tool. -### `--debug` +* `--star_fusion_opt` + * Parameter for specifying additional parameters. For more info, please refer to the [documentation](https://github.com/STAR-Fusion/STAR-Fusion/wiki) of the tool. -To run only a specific tool (testing freshly implemented tool) just add `--debug` parameter. This parameter only works on **fusion tools only**! +## Visualization flags -```bash -nextflow run nf-core/rnafusion --reads '*_R{1,2}.fastq.gz' --genome GRCh38 -profile docker --star_fusion --test -``` +### `--arriba_vis` -## Visualization flags +If enabled, executes build in `Arriba` visualization tool. ### `--fusion_inspector` @@ -292,19 +278,49 @@ If enabled, executes `Fusion-Inspector` tool. ## 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. +### `--arriba_ref` + +Required reference in order to run `Arriba`. + +```bash +--arriba_ref '[path to Arriba reference]' +``` + +### `--databases` + +Required databases in order to run `fusion-report`. + +```bash +--databases '[path to fusion-report databases]' +``` + +### `--ericscript_ref` + +Required reference in order to run `EricScript`. + +```bash +--ericscript_ref '[path to EricScript reference]' +``` ### `--fasta` -If you prefer, you can specify the full path to your reference genome when you run the pipeline: +Required reference genome. ```bash --fasta '[path to Fasta reference]' ``` +### `--fusioncatcher_ref` + +Required reference in order to run `Fusioncatcher`. + +```bash +--fusioncatcher_ref '[path to Fusioncatcher reference]' +``` + ### `--gtf` -If you prefer, you can specify the full path to your annotation when you run the pipeline: +Required annotation file. ```bash --gtf '[path to GTF annotation]' @@ -326,20 +342,12 @@ Required reference in order to run `STAR-Fusion`. --star_fusion_ref '[path to STAR-Fusion reference]' ``` -### `--fusioncatcher_ref` +### `--transcript` -Required reference in order to run `Fusioncatcher`. +Required transcript file. ```bash ---fusioncatcher_ref '[path to Fusioncatcher reference]' -``` - -### `--ericscript_ref` - -Required reference in order to run `Ericscript`. - -```bash ---ericscript_ref '[path to Ericscript reference]' +--transcript '[path to transcript reference]' ``` ## Job resources @@ -377,6 +385,10 @@ Please make sure to also set the `-w/--work-dir` and `--outdir` parameters to a ## Other command line parameters +### `--debug` + +To run only a specific tool (testing freshly implemented tool) just add `--debug` parameter. This parameter only works on **fusion tools only**! + ### `--read_length` Length is used to build a STAR index. Default is 100bp (Illumina). From 308314308239980720a617bf02de936c110333aa Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 6 Feb 2020 21:03:32 +0100 Subject: [PATCH 0061/1520] fix: fixed linting --- docs/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..0780ee4f --- /dev/null +++ b/docs/README.md @@ -0,0 +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 + * [Download references](references.md) + * [Local installation](https://nf-co.re/usage/local_installation) + * [Adding your own system config](https://nf-co.re/usage/adding_own_config) +3. [Running the pipeline](usage.md) +4. [Output and how to interpret the results](output.md) +5. [Troubleshooting](https://nf-co.re/usage/troubleshooting) \ No newline at end of file From 8c0681766e18e2463dd5fd5d4e195af0fa1431f1 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 6 Feb 2020 21:06:22 +0100 Subject: [PATCH 0062/1520] fix: removed comment --- conf/base.config | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/base.config b/conf/base.config index cab22295..e8d67f4a 100644 --- a/conf/base.config +++ b/conf/base.config @@ -23,7 +23,6 @@ process{ // 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. - // 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' ) } From 51cd2b509da81d890996162312475339d94df6c7 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 6 Feb 2020 21:09:42 +0100 Subject: [PATCH 0063/1520] fix: fix markdown linting --- docs/README.md | 2 +- docs/output.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0780ee4f..4c584b9a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -9,4 +9,4 @@ The nf-core/rnafusion documentation is split into the following files: * [Adding your own system config](https://nf-co.re/usage/adding_own_config) 3. [Running the pipeline](usage.md) 4. [Output and how to interpret the results](output.md) -5. [Troubleshooting](https://nf-co.re/usage/troubleshooting) \ No newline at end of file +5. [Troubleshooting](https://nf-co.re/usage/troubleshooting) diff --git a/docs/output.md b/docs/output.md index 7c02cfdf..6c68d00e 100644 --- a/docs/output.md +++ b/docs/output.md @@ -250,4 +250,4 @@ For more info check the [documentation](https://github.com/Kingsford-Group/squid | RightBreakEntropy | Represents Shannon entropy | | annots | Annotation generated by [FusionAnnotar](https://github.com/FusionAnnotator/FusionAnnotator/wiki) | -For more info check the [documentation](https://github.com/STAR-Fusion/STAR-Fusion/wiki#Outputs). \ No newline at end of file +For more info check the [documentation](https://github.com/STAR-Fusion/STAR-Fusion/wiki#Outputs). From c423b068be588ec1990c33af67b2d833be2843e4 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 7 Feb 2020 10:10:14 +0100 Subject: [PATCH 0064/1520] docs: updated title description --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e8f46ab..2d8e15c0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # ![nf-core/rnafusion](docs/images/nf-core-rnafusion_logo.png) -**Nextflow rnafusion analysis pipeline, part of the nf-core community.**. +**RNA sequencing analysis pipeline with curated list of tools for detecting and visualizing fusion genes.**. [![Build Status](https://travis-ci.com/nf-core/rnafusion.svg?branch=master)](https://travis-ci.com/nf-core/rnafusion) [![GitHub Actions CI Status](https://github.com/nf-core/rnafusion/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/rnafusion/actions) From ae9125aca68e3ca59c57f4b7cae383f3ea31c2b0 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 7 Feb 2020 10:17:59 +0100 Subject: [PATCH 0065/1520] test: updated internal testing script --- test.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test.sh b/test.sh index 90a010d9..da28bd55 100644 --- a/test.sh +++ b/test.sh @@ -1,10 +1,10 @@ #!/bin/bash # Test tools only -nextflow run NGI-RNAfusion/ -profile munin -c '/data1/references/rnafusion/1.1.0/munin-singularity.config' --reads '/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --debug +nextflow run nf-core/rnafusion -profile munin -c '/data1/references/rnafusion/1.1.0/munin-singularity.config' --reads '/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --debug # Test batch mode -nextflow run NGI-RNAfusion/ -profile munin -c '/data1/references/rnafusion/1.1.0/munin-singularity.config' --reads '/data1/references/rnafusion/1.1.0/batch_data/00*/*_R{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid +nextflow run nf-core/rnafusion -profile munin -c '/data1/references/rnafusion/1.1.0/munin-singularity.config' --reads '/data1/references/rnafusion/1.1.0/batch_data/00*/*_R{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid # Test the whole pipeline -nextflow run NGI-RNAfusion/ -profile munin -c '/data1/references/rnafusion/1.1.0/munin-singularity.config' --reads '/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector +nextflow run nf-core/rnafusion -profile munin -c '/data1/references/rnafusion/1.1.0/munin-singularity.config' --reads '/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector From efbe09ec296d2b57f9a6eb8c059a8847cb2f4fca Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 7 Feb 2020 10:19:15 +0100 Subject: [PATCH 0066/1520] docs: fixed old name of the pipeline in example Co-Authored-By: Maxime Garcia --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2d8e15c0..4016897c 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ nextflow run nf-core/rnafusion --help iv. Start running your own analysis! ```bash -nextflow run NGI-RNAfusion/ -profile -c './example/custom-docker.config' --reads '*_R{1,2}.fastq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector +nextflow run nf-core/rnafusion -profile -c './example/custom-docker.config' --reads '*_R{1,2}.fastq.gz' --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. From 26fda1c973dedbb20053592b01526f3bcbbfdfd6 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 7 Feb 2020 10:22:36 +0100 Subject: [PATCH 0067/1520] docs: update README.md Co-Authored-By: Maxime Garcia --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4016897c..48332787 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # ![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.**. +**RNA sequencing analysis pipeline with curated list of tools for detecting and visualizing fusion genes.** [![Build Status](https://travis-ci.com/nf-core/rnafusion.svg?branch=master)](https://travis-ci.com/nf-core/rnafusion) [![GitHub Actions CI Status](https://github.com/nf-core/rnafusion/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/rnafusion/actions) From b9d3bebcc547b3e6774f6f9c5e228fdf212f7715 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 7 Feb 2020 10:26:26 +0100 Subject: [PATCH 0068/1520] docs: updated fusioncatcher link Co-Authored-By: Maxime Garcia --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 48332787..d73829e1 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool | --------------- |:----------------:|:-----------------:|:-----------------:| | [Arriba](https://github.com/suhrig/arriba) | **No** | >=16 cores | ~30GB | | [EricScript](https://sites.google.com/site/bioericscript/getting-started) | **No** | >=16 cores | ~30GB | -| [FusionCatcher](https://github.com/ndaniel/fusioncatcher/blob/master/doc/manual.md) | Yes | >=16 cores | ~64GB | +| [FusionCatcher](https://github.com/ndaniel/fusioncatcher) | Yes | >=16 cores | ~64GB | | [fusion-report](https://github.com/matq007/fusion-report) | - | - | - | | [Pizzly](https://github.com/pmelsted/pizzly) | **No** | >=16 cores | ~30GB | | [Squid](https://github.com/Kingsford-Group/squid) | **No** | >=16 cores | ~30GB | From a6834484e1e637c65f59e76859205ee0ee844df1 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 7 Feb 2020 10:27:04 +0100 Subject: [PATCH 0069/1520] docs: updated FusionInspector link Co-Authored-By: Maxime Garcia --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d73829e1..fdefa594 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool | [Pizzly](https://github.com/pmelsted/pizzly) | **No** | >=16 cores | ~30GB | | [Squid](https://github.com/Kingsford-Group/squid) | **No** | >=16 cores | ~30GB | | [Star-Fusion](https://github.com/STAR-Fusion/STAR-Fusion/wiki) | Yes | >=16 cores | ~30GB | -| [FusionInspector](https://github.com/FusionInspector/FusionInspector/wiki) | **No** | >=16 cores | ~30GB | +| [FusionInspector](https://github.com/FusionInspector/FusionInspector) | **No** | >=16 cores | ~30GB | For available parameters or help run: From fe655b535326624c553bd07c15e2180b43b57645 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 7 Feb 2020 10:27:25 +0100 Subject: [PATCH 0070/1520] docs: update Star-Fusion link Co-Authored-By: Maxime Garcia --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fdefa594..46921780 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool | [fusion-report](https://github.com/matq007/fusion-report) | - | - | - | | [Pizzly](https://github.com/pmelsted/pizzly) | **No** | >=16 cores | ~30GB | | [Squid](https://github.com/Kingsford-Group/squid) | **No** | >=16 cores | ~30GB | -| [Star-Fusion](https://github.com/STAR-Fusion/STAR-Fusion/wiki) | Yes | >=16 cores | ~30GB | +| [Star-Fusion](https://github.com/STAR-Fusion/STAR-Fusion) | Yes | >=16 cores | ~30GB | | [FusionInspector](https://github.com/FusionInspector/FusionInspector) | **No** | >=16 cores | ~30GB | For available parameters or help run: From 23137d8ed6c99f826de9586b285dade1c6817fe0 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 7 Feb 2020 10:36:55 +0100 Subject: [PATCH 0071/1520] fix: removed comments --- conf/base.config | 4 ---- 1 file changed, 4 deletions(-) diff --git a/conf/base.config b/conf/base.config index e8d67f4a..a3c8da5e 100644 --- a/conf/base.config +++ b/conf/base.config @@ -19,10 +19,6 @@ process{ 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. withLabel:process_low { cpus = { check_max( 2 * task.attempt, 'cpus' ) } memory = { check_max( 14.GB * task.attempt, 'memory' ) } From e5bbf9b6fc1332d76b6a3c9cff8df8977f9a7c53 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 7 Feb 2020 10:41:05 +0100 Subject: [PATCH 0072/1520] docs: update docs/references.md Co-Authored-By: Maxime Garcia --- docs/references.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references.md b/docs/references.md index fce86b0f..ea2dc474 100644 --- a/docs/references.md +++ b/docs/references.md @@ -32,7 +32,7 @@ nextflow run nf-core/rnafusion/download-references.nf \ --outdir ``` -## 2. Tool reference requirements +## Tool reference requirements ### STAR-Fusion From 3a2497a5bcb6118a3651bd315c35ab7d03e46859 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 7 Feb 2020 10:41:15 +0100 Subject: [PATCH 0073/1520] docs: update docs/usage.md Co-Authored-By: Maxime Garcia --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 2ef7d78b..ba38dc0d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -189,7 +189,7 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof * Pulls most software from [Bioconda](https://bioconda.github.io/) * `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/) + * Pulls software from DockerHub: [`nfcore/rnafusion`](http://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/) From 5b7e2b1c7690c936c8fac4628fe7630f02b3cb19 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Sun, 9 Feb 2020 14:46:51 +0100 Subject: [PATCH 0074/1520] fix input for Fusion Inspector --- main.nf | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index 517243d6..f156cad7 100644 --- a/main.nf +++ b/main.nf @@ -490,7 +490,9 @@ process ericscript { -o ./tmp \\ ${reads} - mv ./tmp/fusions.results.filtered.tsv ./tmp/${sample}_ericscript.tsv + if [-f ./tmp/fusions.results.filtered.tsv]; then + mv ./tmp/fusions.results.filtered.tsv ./tmp/${sample}_ericscript.tsv + fi """ } @@ -608,7 +610,7 @@ process summary { set val(sample), file(reads), file(arriba), file(ericscript), file(fusioncatcher), file(pizzly), file(squid), file(starfusion) from files_and_reports_summary output: - file("${sample}_fusion_list.tsv") into fusion_inspector_input_list + 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 @@ -670,6 +672,10 @@ process arriba_visualization { """ } + +fusion_inspector_input = fusion_inspector_input_list + .join(read_files_fusion_inspector) + /* * Fusion Inspector */ @@ -680,9 +686,8 @@ process fusion_inspector { publishDir "${params.outdir}/tools/FusionInspector/${sample}", mode: 'copy' input: - set val(sample), file(reads) from read_files_fusion_inspector + set val(sample), file(fi_input_list), files(reads) from fusion_inspector_input file(reference) from reference.fusion_inspector - file(fi_input_list) from fusion_inspector_input_list.collect() output: file("*.{fa,gtf,bed,bam,bai,txt}") into fusion_inspector_output From 1dc0a41cd2cbc26ca964d01fe264c2cd1370826f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Sun, 9 Feb 2020 15:00:14 +0100 Subject: [PATCH 0075/1520] add dump tags --- main.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index f156cad7..7eca4512 100644 --- a/main.nf +++ b/main.nf @@ -674,7 +674,9 @@ process arriba_visualization { fusion_inspector_input = fusion_inspector_input_list - .join(read_files_fusion_inspector) + .join(read_files_fusion_inspector, by:[0]) + +fusion_inspector_input = fusion_inspector_input.dump(tag:'fusion_inspector_input') /* * Fusion Inspector From 06bf80753a6ab0f34b84fa13bab817718e3cc98b Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Sun, 9 Feb 2020 15:01:36 +0100 Subject: [PATCH 0076/1520] fix syntax --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 7eca4512..d2d02e77 100644 --- a/main.nf +++ b/main.nf @@ -688,7 +688,7 @@ process fusion_inspector { publishDir "${params.outdir}/tools/FusionInspector/${sample}", mode: 'copy' input: - set val(sample), file(fi_input_list), files(reads) from fusion_inspector_input + set val(sample), file(fi_input_list), file(reads) from fusion_inspector_input file(reference) from reference.fusion_inspector output: From 0db6c87338152b5017651fc95719b858e392792d Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Sun, 9 Feb 2020 15:26:44 +0100 Subject: [PATCH 0077/1520] better syntax --- main.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/main.nf b/main.nf index d2d02e77..802e108a 100644 --- a/main.nf +++ b/main.nf @@ -673,8 +673,7 @@ process arriba_visualization { } -fusion_inspector_input = fusion_inspector_input_list - .join(read_files_fusion_inspector, by:[0]) +fusion_inspector_input = fusion_inspector_input_list.join(read_files_fusion_inspector) fusion_inspector_input = fusion_inspector_input.dump(tag:'fusion_inspector_input') From ef05838de95f46d4c9c2e34fe6a1a11cebc3a59d Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Sun, 9 Feb 2020 16:21:54 +0100 Subject: [PATCH 0078/1520] update tests --- test.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test.sh b/test.sh index da28bd55..c69bc16c 100644 --- a/test.sh +++ b/test.sh @@ -1,10 +1,13 @@ #!/bin/bash # Test tools only -nextflow run nf-core/rnafusion -profile munin -c '/data1/references/rnafusion/1.1.0/munin-singularity.config' --reads '/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --debug +nextflow run nf-core/rnafusion -profile munin -c /data1/references/rnafusion/1.1.0/munin-singularity.config --reads "/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --debug # Test batch mode -nextflow run nf-core/rnafusion -profile munin -c '/data1/references/rnafusion/1.1.0/munin-singularity.config' --reads '/data1/references/rnafusion/1.1.0/batch_data/00*/*_R{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid +nextflow run nf-core/rnafusion -profile munin -c /data1/references/rnafusion/1.1.0/munin-singularity.config --reads "/data1/references/rnafusion/1.1.0/batch_data/new_reads/*_R{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid # Test the whole pipeline -nextflow run nf-core/rnafusion -profile munin -c '/data1/references/rnafusion/1.1.0/munin-singularity.config' --reads '/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector +nextflow run nf-core/rnafusion -profile munin -c /data1/references/rnafusion/1.1.0/munin-singularity.config --reads "/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector + +# Test the whole pipeline in batch mode +nextflow run nf-core/rnafusion -profile munin -c /data1/references/rnafusion/1.1.0/munin-singularity.config --reads "/data1/references/rnafusion/1.1.0/batch_data/new_reads/*_R{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector \ No newline at end of file From 227cf0c62b33d512070bc015cd803e2a145eca09 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 10 Feb 2020 08:46:49 +0100 Subject: [PATCH 0079/1520] docs: updated changelog for version 1.1.0 --- CHANGELOG.md | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b2898c2..b2dc49ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,23 @@ 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.1.0] nfcore/rnafusion - +## [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 @@ -17,7 +33,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a * 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.7.0` [#83](https://github.com/nf-core/rnafusion/issues/83) +* 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 @@ -31,8 +47,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a ### Removed * Variables `pizzly_fasta` and `pizzly_gtf` have been removed and replaced with `transcript` and `gtf` -* Jenkisfile, test configuration, pylintrc -* Removed `igenomes.config` because the pipeline only supports Ensembl version +* `Jenkisfile`, test configuration, pylintrc configuration +* Removed `igenomes.config` because the pipeline only supports `Ensembl` version + +--- ## [1.0.2] nfcore/rnafusion - 2019/05/13 @@ -46,6 +64,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a * 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 @@ -72,6 +92,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a * 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. @@ -91,6 +113,8 @@ The pipeline includes additional help scripts to download references for fusion * `MultiQC v1.7` * `FusionGDB updated 2019/01/23` +--- + ## [0.1] SciLifeLab/NGI-RNAfusion (ARCHIVED) - 2018/10/05 Initial release of NGI-RNAfusion, created with the [nf-core](http://nf-co.re/) template. From decc69db5e943b0e9c5bfd9fa764bc18b3ca1e0e Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 10 Feb 2020 10:43:30 +0100 Subject: [PATCH 0080/1520] fix issue with downloading arriba references --- download-references.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download-references.nf b/download-references.nf index 355d7bb4..52c9fc63 100644 --- a/download-references.nf +++ b/download-references.nf @@ -117,7 +117,7 @@ process download_arriba { script: """ wget -N https://github.com/suhrig/arriba/releases/download/v1.1.0/arriba_v1.1.0.tar.gz -O arriba_v1.1.0.tar.gz - tar -xvzf arriba_v1.1.0.tar.gz && mv arriba_v1.1.0/database/* . && gunzip * && rm -rf arriba_* + tar -xvzf arriba_v1.1.0.tar.gz && mv arriba_v1.1.0/database/* . && gunzip *.gz && rm -rf arriba_* """ } From e8320fa7fb64d229da75f3cbe2a6dba19de6f99d Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 10 Feb 2020 10:48:04 +0100 Subject: [PATCH 0081/1520] fix params --- download-singularity-img.nf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/download-singularity-img.nf b/download-singularity-img.nf index 2b1b5303..37de4428 100644 --- a/download-singularity-img.nf +++ b/download-singularity-img.nf @@ -57,13 +57,13 @@ if (params.help) exit 0, helpMessage() params.running_tools = ["nf-core/rnafusion/${workflow.manifest.version}"] if (!params.outdir) exit 1, "Output directory not specified!" -if (params.arriba || download_all) params.running_tools.add("Arriba") -if (params.star_fusion || download_all) params.running_tools.add("STAR-Fusion") -if (params.fusioncatcher || download_all) params.running_tools.add("Fusioncatcher") -if (params.ericscript || download_all) params.running_tools.add("Ericscript") -if (params.pizzly || download_all) params.running_tools.add("Pizzly") -if (params.squid || download_all) params.running_tools.add("Squid") -if (params.fusion_inspector || download_all) params.running_tools.add("Fusion-Inspector") +if (params.arriba || params.download_all) params.running_tools.add("Arriba") +if (params.star_fusion || params.download_all) params.running_tools.add("STAR-Fusion") +if (params.fusioncatcher || params.download_all) params.running_tools.add("Fusioncatcher") +if (params.ericscript || params.download_all) params.running_tools.add("Ericscript") +if (params.pizzly || params.download_all) params.running_tools.add("Pizzly") +if (params.squid || params.download_all) params.running_tools.add("Squid") +if (params.fusion_inspector || params.download_all) params.running_tools.add("Fusion-Inspector") // Header log info log.info nfcoreHeader() From 0aece10a2555bb11b6d739ff27db5a8bd2e18f82 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 10 Feb 2020 11:43:42 +0100 Subject: [PATCH 0082/1520] bump version to dev --- CHANGELOG.md | 2 ++ Dockerfile | 2 +- nextflow.config | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2dc49ee..43f9064c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ 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). +## dev nfcore/rnafusion + ## [1.1.0] nfcore/rnafusion - 2020/02/10 * Fusion gene detection tools: diff --git a/Dockerfile b/Dockerfile index f5be9c2d..f39a0620 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM nfcore/base:1.8 +FROM nfcore/base:dev LABEL authors="Martin Proks" \ description="Docker image containing all software requirements for the nf-core/rnafusion pipeline" diff --git a/nextflow.config b/nextflow.config index 1d6d9f6c..6290f67f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -93,7 +93,7 @@ params { // Container slug. Stable releases should specify release tag! // Developmental code should specify :dev -process.container = 'nfcore/rnafusion:1.1.0' +process.container = 'nfcore/rnafusion:dev' // Load base.config by default for all pipelines includeConfig 'conf/base.config' @@ -150,7 +150,7 @@ manifest { description = 'Nextflow rnafusion analysis pipeline, part of the nf-core community.' mainScript = 'main.nf' nextflowVersion = '>=19.10.0' - version = '1.1.0' + version = 'dev' } // Function to ensure that resource requirements don't go beyond From 21c0e2132920a616479e62b78599b565e612da60 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 10 Feb 2020 14:16:20 +0100 Subject: [PATCH 0083/1520] more bump version + fix paths to files --- .github/workflows/ci.yml | 2 +- example/custom-docker.config | 6 +++--- example/custom-singularity.config | 8 ++++---- tools/build.sh | 0 4 files changed, 8 insertions(+), 8 deletions(-) mode change 100644 => 100755 tools/build.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 745e284c..2156132d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: sudo mv nextflow /usr/local/bin/ - name: Pull docker image run: | - docker pull nfcore/rnafusion:dev && docker tag nfcore/rnafusion:dev nfcore/rnafusion:1.1.0 + docker pull nfcore/rnafusion:dev && docker tag nfcore/rnafusion:dev nfcore/rnafusion:dev - name: Run pipeline run: | nextflow run ${GITHUB_WORKSPACE} --help diff --git a/example/custom-docker.config b/example/custom-docker.config index 472d95dc..a90c17c7 100644 --- a/example/custom-docker.config +++ b/example/custom-docker.config @@ -8,7 +8,7 @@ params { max_cpus = 24 max_memory = 256.GB max_time = 72.h - container_version = '1.1.0' + container_version = 'dev' // Tool versions arriba_version = '1.1.0' @@ -27,8 +27,8 @@ params { // References reference_base = '/path/to/references' - fasta = "${params.reference_base}/Homo_sapiens.GRCh38_r97.all.fa - gtf = "${params.reference_base}/Homo_sapiens.GRCh38_r97.gtf + fasta = "${params.reference_base}/Homo_sapiens.GRCh38_r97.all.fa" + gtf = "${params.reference_base}/Homo_sapiens.GRCh38_r97.gtf" transcript = "${params.reference_base}/Homo_sapiens.GRCh38_r97.cdna.all.fa.gz" databases = "${params.reference_base}/1.1.0/databases" diff --git a/example/custom-singularity.config b/example/custom-singularity.config index 2342e20a..6f11eea6 100644 --- a/example/custom-singularity.config +++ b/example/custom-singularity.config @@ -8,7 +8,7 @@ params { max_cpus = 24 max_memory = 256.GB max_time = 72.h - container_version = '1.1.0' + container_version = 'dev' // Tool versions arriba_version = '1.1.0' @@ -27,8 +27,8 @@ params { // References reference_base = '/path/to/references' - fasta = "${params.reference_base}/Homo_sapiens.GRCh38_r97.all.fa - gtf = "${params.reference_base}/Homo_sapiens.GRCh38_r97.gtf + fasta = "${params.reference_base}/Homo_sapiens.GRCh38_r97.all.fa" + gtf = "${params.reference_base}/Homo_sapiens.GRCh38_r97.gtf" transcript = "${params.reference_base}/Homo_sapiens.GRCh38_r97.cdna.all.fa.gz" databases = "${params.reference_base}/1.1.0/databases" @@ -40,7 +40,7 @@ params { } process { - container = "${params.containerPath}/rnafusion_1.1.0.img" + container = "${params.containerPath}/rnafusion_${container_version}.img" withName: "arriba|arriba_visualization" { container = "${params.containerPath}/rnafusion_arriba_v${params.arriba_version}.img" diff --git a/tools/build.sh b/tools/build.sh old mode 100644 new mode 100755 From e507fd22f244bb71692a08306390e4bfb34b66c1 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 10 Feb 2020 14:21:58 +0100 Subject: [PATCH 0084/1520] bump in environment.yml as well --- environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment.yml b/environment.yml index 3b3bcefe..09e5026a 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.1.0 +name: nf-core-rnafusion-dev channels: - conda-forge - bioconda From cc11d5f9f3e922713c3fd625793b479a076fbfb2 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 10 Feb 2020 14:25:14 +0100 Subject: [PATCH 0085/1520] bump dev in Dockerfile --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index f39a0620..3d79344a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM nfcore/base:dev +FROM nfcore/base:1.8 LABEL authors="Martin Proks" \ description="Docker image containing all software requirements for the nf-core/rnafusion pipeline" @@ -7,7 +7,7 @@ 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-1.1.0/bin:$PATH +ENV PATH /opt/conda/envs/nf-core-rnafusion-dev/bin:$PATH # Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-rnafusion-1.1.0 > nf-core-rnafusion-1.1.0.yml +RUN conda env export --name nf-core-rnafusion-dev > nf-core-rnafusion-dev.yml From 772c89bb21930357de7aca8be5546c3f44dbad3b Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 10 Feb 2020 14:34:27 +0100 Subject: [PATCH 0086/1520] apply changes from suggestion --- conf/base.config | 10 +--------- example/custom-singularity.config | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/conf/base.config b/conf/base.config index 23dd471a..77c12a4c 100644 --- a/conf/base.config +++ b/conf/base.config @@ -40,12 +40,4 @@ process{ withName:get_software_versions { cache = false } -} - -params { - // Defaults only, expecting to be overwritten - max_memory = 128.GB - max_cpus = 16 - max_time = 240.h - igenomes_base = 's3://ngi-igenomes/igenomes/' -} +} \ No newline at end of file diff --git a/example/custom-singularity.config b/example/custom-singularity.config index 6f11eea6..1406352c 100644 --- a/example/custom-singularity.config +++ b/example/custom-singularity.config @@ -40,7 +40,7 @@ params { } process { - container = "${params.containerPath}/rnafusion_${container_version}.img" + container = "${params.containerPath}/rnafusion_v${container_version}.img" withName: "arriba|arriba_visualization" { container = "${params.containerPath}/rnafusion_arriba_v${params.arriba_version}.img" From 25c2a0ec3dbddb24cc7fa67884f56213936f0f26 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 10 Feb 2020 14:41:18 +0100 Subject: [PATCH 0087/1520] removed too much --- conf/base.config | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/conf/base.config b/conf/base.config index 77c12a4c..688cb9c0 100644 --- a/conf/base.config +++ b/conf/base.config @@ -40,4 +40,11 @@ process{ withName:get_software_versions { cache = false } +} + +params { + // Defaults only, expecting to be overwritten + max_memory = 128.GB + max_cpus = 16 + max_time = 240.h } \ No newline at end of file From 8ed8a808856cf969aad1e2d47342ac18dd3fac61 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 11 Feb 2020 15:18:24 +0100 Subject: [PATCH 0088/1520] add social preview image --- assets/nf-core-rnafusion_social_preview.png | Bin 0 -> 47745 bytes assets/nf-core-rnafusion_social_preview.svg | 446 ++++++++++++++++++++ 2 files changed, 446 insertions(+) create mode 100644 assets/nf-core-rnafusion_social_preview.png create mode 100644 assets/nf-core-rnafusion_social_preview.svg diff --git a/assets/nf-core-rnafusion_social_preview.png b/assets/nf-core-rnafusion_social_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..a24ca06654d6ba24a9309ad424928aa5f375b8e6 GIT binary patch literal 47745 zcmeEugr(9EKn7!;fCW??>$K>Np_?^;h(NvPe#9MtG9mSw`Dg-OkL}?SZ2y z;^yYYZE0)mWb(k?l-thHJZ@f$0YT0q@^@}&xW~^D-Q0UM2bz|=%);a^yy*0j^E^X# ztN!V03R5CU26Iqf<0LHxZ{TuE%Rp!QY+!)@PnA;-3jHH5D$u08S-rw_>EPiharGg| zlNgbk@x%AcmUs2>hF+$;6T-?5?^aCE#NlU1=!oD)O1p@%itOKGr0)W9@ZZBP=g7|g zdvvntF!Jy3{{P7$hyOkK{06zyzenc-Pa)+09zF;}PX2pz*yN!9zeiH%*#7sD|2voe zyNQthjUEJfUijKr@NZ(stk&m_7RWcqX`8`Y64Dh#%Khq!cyC4~MRUp*_0MHvQeRH@ z=3sSQrZZKG&87!NAM#sv-4=-B`bIn;Wl`W!V`x_p_xDN~EQVOEoG2fx^1i4XXWh2a z3knJe{M~Fr198vwE-tsh6j{YMozBb1^AqG!=sTq9y{qh>7{>9*d%4Z=sqv&(Y1XW7 zMhCnN5mY;Yd^x4(|2N%5i8`N`Ru0+E>DyU+)>TR2;laVfc~kcc^5r<$dGtEn1UaIj9{LM3a9AyNb?(N^dM_q0aKEc@1 z6%+y@;}Y^pYP=#NV?2~ftJY?-%ncKB?`HHk6OfY_ZL+_Kw&1HdYdelAWLJ?TWTL#8 zXP%(-?A363JF)7!tsB#NZ4xH0o7Ildx2aMfPEqhUW4`M8zILSRfFUu_QE=6_UExf3>C|Demqr|*xy~SwNS-zyx%qro0cYSw6;N$#|%WNUl zz$e`Pan=-Hyy4Xo>Kos!9)gd=a>crMMk^`?2OIOVHibhGW~xK)%~ zKMlCdrU@{M>UMD;8b=TMqxX)O)NXHCE1vV}C@ixPh)ay))g*cvoc@}RBs-cA`OsI? zAI9QyEcZ9@4j~3!qjpF3k@MgF?~SKjH%uc+?t9PLm}^AH1~b!r4MvdDWar^+{{N|I zXrxW!a$3!bH+SknB(|>ooO@M$V#sr)ybN16wXacQ*7l3<03!7AZ&8!_={}QJ7D391 zGw;wGZ3=SPCE@itRmVaTW3!J-?zs<|JbQWUh?*ecZ}hL=ofNpDoH&awFEnXx8L>Y% zpYEu$G3C9x75u$#j*z3;V|HuyFk(;h?`8@Lj6aj-8PyFtF?AQ?JDAbM&=+|sC~KWs>t?5IE{Y7#qM5>dCyA8ko zO2Cpd!aNXLrmVNJ#=ak2zi^*Ppo&2=>!ZM%<2d%LEKi(O4(15SG@J`DIDl|`AXd4} z6n99hSkJz{VRFn(eRHS83g=*__2#WsPZZa)-s8xxI|uy{fBzP4&dzEd$;r`PQ{AK* zIYW;QiOGYuSh=dByd^p3rISA9MO@-yUaX$}dMU=14mo+z(0fUyf@qu6Oj;N=Vis{O zNKS1r-JQlY*Z4sA6cKdtP9U@tFmvb6cfT#>^J$LWGG14UEN^{Eq(;sM($LaQwFwTd zTF;g{jQ$W%m$%XO+L@~(F$f$(r%@fnINI4?4brm+b)6A5Nm)NekGhJ&j#zDCw7VuM zN|c=3UFXibz=oiON%J=q7@NnH(_*cZM?M>ukt2uI zAq(-;?GzcAGzT-c3TPhaR$p%!6WNogo#wYbl*NeDXPpF~bbU#F+EGz^TY%t0hD2>m z=U_`bR?L!`8=ISFJ`rqh4y#;_sPyWP57ErI1z?Nz2n@5nT-ZyE@4=kjvb#^+uLB5T zbm{8VZT@+9z52t4A4Y6BG6Gji!daX|*q(JBL4G-FFHj@@S$*DPg=j#?U}^g+ zgcSEbuH2rl;+o8KZ28_IGIhiEIN~4h0yenueOZT3P5XB@D3QZ~(T1M#EFsMk4tRa1 zAl))s8<+-l+qEomDPKBx{d4s7KiI5?F-khO3J3_ILB6@U>ABJ-xXU2wI;&mWrr}s2 zEPPcQgTXL7S3-~sX&A|W4`s$NK2F9yf8TN1u68rs(aFh&1z%)(&%gzzdDdCOBQh!? zepP$?^Rru%2N8P_eR6W-zu&`gl1E*s5PyX)Go_I?z2`l3nXNqWv#LHiiQm>lNuSM?mnx6bJX(Wk^i zNOIW5@3%Z9rmbiHPQLZef(LL56&1w%aF%om>c6|-KvDk)ohw|17L_emJj zSOjhMpwseu^(^{?%(F`_xa;}(x?l0?IbXM?BYN*EiTbsW`}1t%A3=odSZ576utKwp z$jNixzkl})su~Rzjd=IYxIAuA^EbD;p$FXSTa8%`%_lk9A8n%*22DAx@u=PLEiCF$ z(@g#y-jtp`*T<&5pL>WD$5G~>I2S155w}<&q!E@QeYrx{b<*#NT}eY$K2FaDy*(bh`3kNB_j+I==EEnEDd=ac)%xqc=4OgK$13xf0!YJI9;UFTNj z>RhV~2%l`!SH|18rmyqSR^2PT?3VOt{G+9pVJr+_MYPM5XL{FmaGJh%Qa zotSi=nX+$l5=9ARV~xzEg)QwS9o9odslK^(T3K!DdT||>x>-_Yrrmm2byu|rUu9*j z4?s<%Kv!UvUChFAgN~Ixl^YkEgK^eu6!{RL8HKHZdA?v?CRY8D0*O>|bS&x^NxF2L zN$B08au{KzE4zUZ>1dydd1Q;Lj3+vJC`mLd=$m>5M09Jbjoy(tQK@aSE|+6lp-y>k zO}?&@^3TNFOfPR$q8b6OnV+|_Bl*rK!b^YanoEp?fA+Mdb)8o6hDg)&0jYB1 zzqeLhX8nd`dy09~MenLWZ+V|!rcpwB5#jOG8p#@=dv?3kDs~I{m!g~7psr>fTwYnh zCEq$QHa4~?<~s7_#WWt9L}BpaWstDf>fXHFDsGQ8QZv?W)4TAL5^1#;Gu2KUsI(p} zY-a4U%sy^&TJuUVCs{~9iJZlww|kWtI8uOv5Le6rxYweMk-;!G zLnK5cf^9jsgBVt(?8fCMzp(D{8p80)V48fm^RUnQrdYlW;nP6DgJ+L3+;6cD`ncJL z8xq%IqRh8^Ed$sME?Q+-Sp^H&8gN0ibT#m@mVdf%A)ja9l0fetmi27k$1e9K$oy5% zlq1Abw{7;J&vZcmgLNu3^Te({3s@a-t^3g}25Uvbc*->Q1R~Y=o8*a0S7fvyR^lcK zv9(*-vLP%sx3p-rV8@7;`bO0b)Lr?R$JEn^Q6DHUpe(+r(Km6MdHJl4h*4>#`(?MP zdqnG!B4-xlFvUTC1gZ0=Hgrk!3ke{aHd)nn&G?e?aqZgTh?M)rYL7C%{V%DcX3acZ z&F!^0^+*oQ>yz0Jw=TI;9Q3>sTMuh&_*)(#D@%X-#+|{WtU7H}>0pxkepFfZ4nus0~36WQJoV>(6JsT)J zjY-zDygT7(MmD7(dcRoFTE^?TdqKoFQS!xgDX{tU{TYKi>3Gz zLWW3L^h0o+y{`RhMd(#S$_mi+#o_EZZleRAn&=^zgeV`5F~|1Qqt(A*#_NUAfsTr zy&!E*$(+$-YOm>M+te@HR{IPR$_NJ+IaIV^g~2h|nMM&5JT-gGmEt3!qbF9%*8r{9 z4c9_$EX?@dd70DzV}YdlFftz8B$ z*qPtYj!SAQ5XWK**0?HaYVAVub9n=bNo(ygpKT8yTn+u}HRd3nDjB(X-fe&o{o zWU;$N8Yr_%>hA82NKDLMU3HF(h{(*%z5n9H{{!# zeCg7+Dd%i}ZdN}FQep+|^3B>}v!q{9Tfy7kNru(ON&3}(vLTGGlr!*KO-AY27AB_# zm~I90kev4RjLS|r8V)Z-+FB1uruj~g`>!;*i6M*9P-{e&*JdW3?ha_aOEI9JEa8-t z-VUJ7`DrliW>D3ZUU>tD|FBR?l$L*8(rGF0q4266o>uxYihUW zMf3D4)Zzqe)Rcnv>5c(P%5jm*1v-)nME_Vb+tb7%S?QucoH9+HgWL z9^dS&F*i_(%TQ)DaA>4u5OXic*23B*_XKbW3-@CkQe}hG?%xjt=oFRP?X5`IGlfkp z|LWcf$#l!gU^rQ>K#$DdztE#*sD7}98o7}D(;yu(J6fUy{>*l5#S;e%?4=SBpKa%# zvoK2)TezvTC&xWAmF|a)IdQjW=Uk?rY2T`b_moPQmlb;OWDluv{od89S($JZWWT}N zr_CcI9@3m@SGS8{^;r#-*xN9f8>%66Z$30JaT$3*H@)1-qqV=ciz_zoNIvxR^5x6u z_=db!6ny|`ad1)%>ZqMMb!wVeRrc}(Ykr(vtxjQK$~wQ1wst0fD_JA&r5CkZ)0}96 z?%tg4%}Vu}uaE<9S}G>i_U&6|1iSj`XG&HJn7F9+F=r7Mh`d-@Ja^*`6SZZvM9-Ip?m}Y-;n^#L&$O+{Uak~?ePgpxt)tYgdSSuOpG4!QG6}KkS|JR1*W)H6<0QLV^(OQ%!$oA+eFnAZW`p>)LLyFjN!EZyi;;vwZJkTG}~-%O3f#%W`yz z&9an}B$}-4hN^Y;cP1oB?V<|@$4sggzfh6Bo>8{=RsV!6iJ;&%>{EtzZ!6`WpHW)( zKvklprPbkW-h3Sp&EdqSLL9e&4dx?Uy!J6<*C!h*6mfs@>!mq#kA`wDFrhK zJkEUjlsu_9JuPiA>>hVva!$Y~)P$|p>8a1QY=6XwV*+iN;%enZtBR`~pcM4z?(qx5_7YL=E+dn-x%nWn8#p6f)n zXT;zr9;5t`hF3X|_0Z@Y??^Jb@a0Ai{Q9vkPjBX9v|;vttiyOCzdWS`k*OfTp~J46 z6E<6`Q@$_!3@V+EYy)r{U(h=>d-lthumdyCh~&t@`;B6%jL7vcjI*}WTKZ&aO=}7E z+RdMH@q%Ue)IVHF7Mm$tvEEBH@lPmC)YR4ay*KQ+bc!zh%sVKfsv0_9vp)3hsG6gr zqccze)8WbzT{+m=?6kD{{MU-|@?Fpj=WMP>TayZ~z-_U3{5d7QJzEU*K4N)!na}ah z-8`LQ+3+ihVMG=HRbFB&HOnoWzCkq$wcF4>Fa3$6o7$F+dq$Mi)()qw9=(p7??iXi zQNnUJpUpO1Y}vxA0)4KsB_F*fFdifzY_xf=LzPs$~ z?4NBLd04#{pY&mkupN^7V&}~da2r-@`)w13SBY-JIucq1%wp~;Xml-)wLT-Z=+vxs z-xIO_ou>Ns^C+913Iivh3UqCWx7o=Zm3@q9~ zbWZmdn}2)hCuakJ2weeo@kf z@@L5d$5NW-TxasD=DU5?iFA$+p0Im(cvS9f%|JE(WL);}j;Cj3e);dCHp8_<_qpX| zN0+$){#iR+aSk>%>1YGj7=gz>PtIbz*M|4^wET8wjGhsjgb5{<;b(aaAxnJwb{7yr z%hO{p3QVq@d@QdcV0aw6IG2tO$tb!q*v+)sOc#VtGv!3iOV| z!e{NyyVdnny39N!2B^lw#6SX0re>9RT$0~9)}1IGX@a{iFaPEc;J>yw>GdC_6Nz3* zH_d(=c4eIS(@19&fuGra>-voH1P1U7boLLwUvKLf`XUW+oIA^L9yzEYjNZdJ&xb^> z2Q@@`Gx60<=~w|9T_||j8Ht_>RCL_OTp6Q&ezJ+Pt=%-MyG?s{eaH)o$vwQws0C>_ zr?had-PAFe*#4941%Q;UgiyDmM z05jP_<5Bv?$dzwYNaP8!^T>068}zyb`_0B>PfjkjaAGGnCz4LMGTtin-SreF^{Rii zZBToAma7{Q784Yg_TDUYexI#X7xXhs1scr*xhO5~|&Yxnf>KHuNbDr%cH(}f?<(ri}3oJAINhXoAMLWi2 zz>A>G&I2m|OpqHm%7YjMr#t-ioM2iwphps&FPAno9r5#M2RJc{Z_AF+8jA7bLz7#f*1#t>WD__y5BvX(+ikB(;x7xODk7dW_h^~ zBp+Nes~^)@f@p`#g9j;1A*|T-VL!>AdC#8%v%?`MDEQOn-1;}RkV&AgA{tZ+KiT;% zf4>UFJGx^Ot$J~`mEU1&rmsFMp72PVti8g_cd6@g#mx?n`}}S%C9H;TNtZqD8+y2s zGnJn?Bz3^LPd#q(a3ev1c7#1j>|`88iJ8eYd6xpr~pAC#Ed1`ABLaFgO_F?OpwQbW{^+S9P^m z-6ydv>$TZ_21(y)5!cys1;Wx@A7tM0xy|dhPKz>8lP0^QYrNJm2_h~UHJ&a&2b!9i zvO_eYxDb=8eIdHl)O$Wpugq%vM@%KDPcH~B!TOJ9fjIx;EOOjU-Qgphsg4@{O5EN+ zdfm%j%k0DEHvNyOD_U=AVhS`(WkfG0Y#!^ni+|8&LB!zm^-^!UZF;Ob-HOcKGHJj} zpEkHsC92&0;JeS4@M;#1n#KT?LaV#eXD*X0)f5{~9TvxfYDqeO0ehHjT8uGq}F zRLLUw>=6=JOu#hhz#!SI_%u{bzUNXVP2<#2 zT%D&USZX(HSZa;OsHug)Pq1F8(`4s`kLl@F(8%Z(n+2g5WUMthr+Q~cD=fa9(XRS| z&YXnL*5voANxgtTJo_dvSVIGJxsoJ&_5TmHvS!yt$-4HJ!>HZ znn?pUqKj2$@)PLS(mYAiS+|}Y3J4C4Y8X+uef#Mp_8T`;UAIHoa-CdTIrV|7`0E95 zavED=IzoSxiYhWXIs;a8Y+_=j{>g!XI=?!!>Fn**uo)~@r98nRmSGrmUFQQd6nz`b z?jTQ~@KC~f(M&P;D_$W7>w3Aw?VeLCG@ssU0jn<5(a88NZ z=O-a!q{P}+v5CiOI=3$FTE4ZDvUw-c?>$y_@lC~b|9IP3p&sq1x zZsRgAq9!E!qLLCme#`E!VRvWIVthQ?mRQ-;A>}N@S(II@oEM9hI*>itVu4mu0Irh?p+TM8+g^}d05Csay`to^HI)G&BhX1)LObC)jQ)!v zD0E5uJFU>tMjOS}+}Z_6r4Q|`45Mv@n5Y%w1Qa2A-sr;vPL52n+xv3JNHK=D5xckm zjZc=wNK#t(r$Xw-od!uHuiGeNcwpK^{Oq2*oNse^O{3=4hv8uty_LP9q(yObl(D#V zti%hyus^xoYK8JX?Hf$k4E+v48;)(Az1|W+T85r$cR1;x_tE`_IR@#^E1&rsh3T<* z$ktZj{B+*JgCsA?#y`-isK?*mLPzL=H^_kQ$H3CkGFHSTo4b1PcHK!r==%7Us)br>zVleUviu>)1tx^34msdb`FysV4;V13 zYHM5c3#>SexmNL;w$Riy1^*)qjeIvlSJdJf@m+e+V#$6+eABr+cVtE5V>?I86z3hV zADBYJ(p)teXP(viX^wJ~?o6{)TDb{d?5K_u@AJ9qXWg|~vVc81)!WQmIkh}V{@sh3 za#ud=aX^mv-5c`aK9g(i)NuwUN~`3u>nVBVc7cLHs(WvyBGAALI+#3bD9PBeZcN!x|aO3Bd1(x@f?4HJ?lNbvwc2erjH zpV}LFZ;ZSesPQTTD22<(fC|v%ElsQcCgc8k*=EqV(O$VHZq_b7*lK0i z$KYs~e)I)n@!w{IACR85U8%Zxd+qM4+0avAE8q4B3Do@wr;21m9y!S}dHpy`e}TZW zAR0L=F#YjO!mDlEC>BJ{g=*{gNuVS<(LOqsKTp_v`EjM&LjF9lYMajtrdI@7vMz}$ zO7RwtBJopV(9g!+G!KS;HV~&@Zl7YBVtTCwA`fCP2nP~c3L2y)q+riqPbgPmzcOZ# z`puKR&yX1Ui{}4_X!lyE2?z}28&qt>W0lNFIZj)eF6KQ@`$@U|19y4a%LR%|xg+rE zj$2nf0#-xLCb;0!$M$C~WCicx%A+3J4%bEtkLq%!Tb=MDh<|*kX*Inoal(3Mpv=4W z`tg7AiN<*o?(%kbMEf`QOcl_ca9v;X7PD) z|9*XnjfU2A&vhAPJ1<=LeD_>Dkk8P3pv1@_k(D+m1v`~C!WEZesApV#El_WDWG_pA;` z$ut0QlPLuXepb4JS%)$k!iN>hQR&Y(vi~@gy8j|`UGARK&a&(C$DwkVo&I3)wV8F% zOK-J)WRKAG7f%>?yP z0k_0;6Vn>7kE!dc^Yb$)eR>KpGc!XQ2;U%PQP` zys`H*t?g{q`>!o7gqw&qDwcD+m-QWLp`1y$u~SU&rJYXjC>?gNlRG#*{+Zvpy;`wV z3r#~0A3hB1J9ZFyNvJ{eInfajG@Y97w2XX8yF3s2%h8-YI}L3lh-~J{`*!T&bO|B} z4J|oNV4~nKDQ(9=_p7NtyRA^r%3bwivN?E#j-D_(tGrw}CO#488$w4rY$zZ%xtmM& zuL0wDf5}|GK(C%Xo_!}=vH7Va0sFL0{e^Ec5aola)j3*N0bRSv&J@`hik1}VR}pb> z*13iNbGd4EM(+S$c0;%0(K&_|0o%cAA)ZhSb|tKG!l3Q`7ka;P zeeN1CE%*kRl8hQh18rIyx}|c0-SI4U5g%dh-ncnUPxp5|^DRwZgSn)D&A1KIL_Jf}$cj^Ma#? z^TN%WH&OBj!YU#n;?W<0neJ}2j~_o~LCbQeQlzTFX@Y~FA2;Cu(bIQaa1bmrLae85 z1U)L2X_?^?G!*4c4`otvl|lU35Bei2pM|vJ4N@Y^={UTWrWz#mzUqA15K%7X`pJ^K zs;p*ZmEF?Xw(DRlG|c{qg7Q~)h|x`-ZM$nppIv^{lckc#nGsnTnJf<{C%t)U7BLIw z8SBjK*;|wO236#|9U+o?nXsF{x6sstQub$^51wICEe*n#^k1Z{+Y8?apN&0T)PdRy?4!EmXUifU{_|&jQa?SN`Pzr%4<9b3l5VS-8j-ofmh}Iz z1Q>6de=X5#{svs%QK*g5znz2b9QFtj$qd~gQs>A$GW^|qclY#;aEJE__VE+Z^#wdy zh5BwXOHrWgahIoNw#E(J1^xGXI}mE;^5_EY?=v3Zf1*txf})w)J~TtSOm=>L8f+ZE z#{1n~CN5s{=N=W3j{27u-|oNg%c%RW;p_v+2c$%mP%bC})cdOJtwT?$JwW}wIJ}M?WdK)0-n2PPW;ML1>!MK;FY-ewIt!tgx!!Ygf zsR_EhMv?Y~6P!H+Ll6YeIqcy?jvx)vru$5f%+2+5{o3P&QT4K86nOm)KzX#oxMGQ? zc*-UULUm7drFi`~h-f^5jqk6JXH7b*>)KWqTWGhX|WDRjq;65&KWRwu_#pFSPfSG-mI zA7>%?;-g%Ik2UNSLl2=PM8tXWoy5kk14+&Oj|GSTMId%&&K*Ud*fU3N53~JC@c#dq ziwtf6Jqd%j)RRQj^I)*zKc7RXQ~p9Urx37!DkX~bW2rEx1_@$>UgxRY-=tXK6S(=z zi~SpCXp!9d%dl;q3-^$9GzBrjRnjV5+E}>jtnu8CQksAQhSb|M4H~b;*5W_Zr@kDm4vQMlT+ZdW34kar%kv=1sIIn9Hzij#h(UHnMo!MUH&a#C`eiJz@0?s* zZ4(ZtLgP<%;QHj@KHg%ApJsxrvImf0V;_D5d5{lsne5EipFb7=1ZAxc1x(TUKcPnO zSR=a<7P4Qb(6&l<0R%e%T^^dts3Xl5!l8(;dFFDj`(UjdNrEMj++XFhvKE4T z(Fb-n5Wln7a3TnQ>^U$X>=(Zb9(oNplrhJJ8>%)GN`74)4WMM8po4<^a#bg0!Wsx0 z-CFO8j!|F_`5%5gOeOLZSIu&hEVqHDL7P0 zc`JD}!qSxztah5lRqPjk-D*n|2TLIsbWNH93zONj+f1xTNtdu0KeV}!`XzMVXC6eU zh*AC|_uoe<^tne}^7?9hyi!RZcA1t8O;rOQ&%t?fy}6KRE6DQlWp-xfH8hi1v{hGE zD^wg^1XrA@W!6H@XW;%s4D3Hsz^=~m5N|wW9Yb{n+#IM+CHZvubaqZ4Ucb(_W^c2@ zj{$343iSE8yfT;-;Jg^}JT8_I@}iA=`z_i)Qe&5p7_w+n0sTmFl>e$yd?xrk8L@h* zKts)dH41p|e|armH{M|z>Ip)x(epRE2O1i;6>0b$rlJ$GTIZX^E9o0KC zzYSu93Gk2oQpHiMHh< zhxly=wLtkjFKh41^AjPg+|QfE@+5bZGE_|U+)E? zFyA`ALKYgC(nrC7lc!J;8Hmf(=(-&l;1*Y_`oK|py^1)Cy#-LR@7)FIK$~^vDk4l$ z1lU^4(}u99MyHg~<4#l&1Ua(RiU;IIP}gwKGhcwdsb4G%j9ikII~z+@gXM+j?Ly!y z+m;c!g?9~h-I|%*G8G~@URK>YU(vd=Z|KdzqLtX?iTJbqjgUKgs~M6yy8CGF57?C7 zxE`t5-`j5KkgSVjLJ4hkWpPv(hPyKaZ7l#)+V-jr$a_=ZqmWz>xr)xw*7^b#M1@4H z1n|*Vb|&A7mGG%dX%9v}Tw6`B*JY}^u{$yp2Hg8Clnvkx4;s6Z{r+G;={5-wPZzKm z$OOda2{hEMNJt0kHoy?zqH3fxxtE_B4II>5Y(OF13oE0mz^Nw`!_FD>2p32yk$&?EZeqXj^^@{6EFXYzG5!zV57BxOqe^ z#lk5$DFor5&FIN`bLQ$aIFycj^9JAq>a>EqJUp&F2f{vjBS2!0mO42(@q@)-ca(J> zR_58?nECLQTMewKA%uBt2oIyCznoN!AJK+MS+wwp{O^@W% z(v{Ex_yS(JbOE{H}xL4zLfCBco$aAmX_Y%lH1Kw(rO2dGCZ@RqpHlc<&ieK}AMJW@_XW zYoGY~ph-Uy{1z+hly24@?=f3AIcWizCbPO)AM9XJZ9W{)`i^h%E5>8}+v%+!WuR*K zJ?@IH%f(wt8Y(Kr{q(UIkNw^C$k5P{m2&91rixm*Zw{X%Z;7S#Kj@DbQ?&n0DTV!y zp^q-3p`)Xl#XOx~BiLy{n39W_gG3DWu>&l7fNM}Ol`P?=25GiGJkGMC>mE*rkFiPuANcs9`c8ztwu2L{TWt?sKlV4T1B4d z0HojCC&E*rY$wWnLxxr_AQWhT3t|;qJQP(y@6<}IG!>I145(kR{mj$Q{+Cz9Jxjm_ zbsVY-C(n?nj*VOYg;t<6Oi_!Z)MWtx^adVdksxtThJ}ZtG8u@nZ=fo+y}!|rL3r(O z2ii)~pK#?vRY6DD#l;OkA@lQLnXnh)^IWw+gEW$E?o;k3G#du~D~?Vg39;f{pMXaF zVqA7w!)3a+YX`_STg|XGvmT)Od#l_Q;15M;oxrpteu3H9t$edlR=1l60Q_O?g@X~z zk({vaO-V%4m?+#K|CRu_y1zm`m=ASJEJC5e|3mLRGHO4d7~p@*N$ISKFbA)j>v;e>YM zvft6KUmvbn8?g4=S!#wj&~^ZA1oS3Sr}T*zI1W|6>Ye3Q0O(L0N0d%74Y3I#dOr-B z6k!Z%W4m);K#%`wTW0l3-AinbBrY9O9z`nujFJ8VZlY_}y_RxpKgA%&vs#Yl6{NqBWClOLL_!!Zi9sIG4%0#uA-^sGzNvsLo+i1!*#R`59gQeP&Zf3S&4$@iJWui|xi+ z7$_NUQThk`Jw6n#20Z)f&Ps>nE*Uz@?_rlw+Xcs5c8Re?Z)WIOZv9L^Ov>Q%ISe-s(~$|AAWd=BbdZ;uhQQT`9HQ50%!s0c11N?_N66STjyC^?Zv%5x!dJ$Ax2}dZPvAd3{ zo}h+W77(&ZeD}A9QTLwb=2$ci-08+;PVo?#X!L_?r4wk+UBeo;USQaB!TXZbOmyy1 zyl^V)_pI3b?Fxl%a^C1SwElKG)lv;=hAL*3Lxs%(kM#U}FCZFs{;ps=pGBvXAACru zc?XNn;%CY&;(~7mgoUnz-JLsVSMd>b$e@D(n*fQAaNFg*Y|Id@;s(B1;W?tJaG?JlfXEZA&qtCwUov(zqMt3f}U zO*XLeN6byMdY}lVY{)YQxW4urTL@l5uQ~p@CdbWJF13;+I@@oH$pwro_eA7}{C|u& z(6x-VtXn?@tAL*_zoK$p(&aL|)8Mu%Ogtw z)YMd5p^2P<=hVkaFg&54Mwp4(g!CXGEbKITZHTxY^j+d!Kd>SJZ{Db)F5Vh1HIBpK z^jH;8&e5YsBf`T|LF}fbp#c+gi)|U_l`FD9#A$+v2sgw91eOM!zCEg>U#b%46J!Uk zx;6MHx0ae&(R~5^3QSEFY2CCOpGs%G@veJpeu7Bky*ihZr(HaGcm!*!=ns^9yN7?X8$2Im6nb!1F|Lb z)-X@HsALNVL9o!cWx?$N&~>Qa%hPx6lF_a4EbSOYy>)taHMpn2=jBi2`x>yO`|@On z-wtuDmXVHKEq$E-d)AbrMc1)uLg-@npP;*8886SI@go1@1#r&@6=pMu<4BpWAhOIw zYTfiT%$*QuQ_b4`p@*xRTu+N_rd$`ILJsqhOCj)+K>}dE<R}!K&@3hAqEWu8~XTLN$!2}Lc zGx?$Zq=U$Vm$d%q*p)1S=|rJ4STU7Hs*0bkB%f-QGS?VMXw+K-Fw}<-p9Fp5|94rW#6)bJ!<%yfAuvCnC|-C&p8x z_z(N~eo@%#$wLa6qS^x6p;G;GB=mrzr$g&i1$1L(7M_ZIx>zO&e<0Sh!x~byEr@IH3ou!|#RHk9{8fD_W&S~qH z8&I|w=+4+?cidc`dezXXxx7D1^w7q*?Cme%xz6V>zAjI>cCBI|D*a~qc)qZbrO8{a z@ra-~#ody^81@{y{<3t_A4T!qym6|Nt{R zpB4P}>b1E;mw!cO3o#ufprJQdJ(xARHF znSk#?IpohIxes~Zx<@ZC<8oex>^Lg3OA2nL6NIugaKf+Z`qCavu7p#%a9^$J6;3?H z`oUcH7!QdF$-MjTH1#hIu+np@ZsH-iwbVIg*B3bp%|%dWBovwMn-_P?*imXt*@Zpz zIY1%|DB@~l{iiiu)Pp#pvb8;0oXXj64tGEK;hc9*B#-}%Ttui}y#;j$$IiK9$;%^= zCtz{wH6@@KIc*~dO-zHly|^Z)eW=Stwp+zFPxBF8`ry}cZ5s^9>J0}e&Y`b1MP+Kp zuQXm&AWzM#*X`GwIX$9lrI}~u_WUUOPr=Ul!-&fGHK2zOM1LGyh}XMZN1H>UU%h%Y z!dK3MDT=%=oiyMohxqf#{XH$7tO87_FF=5Yb`w)mS%4r#E}Y8GC^TZOV$%@XOT@vo zG!$t3;d;nXAHZ%c9UVMtuBmb%7!{Rw@Zp}Z8@N)@+b>oKA~qV0BL$*|kO<*dru5ZV zQFx30Q7%ZS;G1n6YHx0qOH52uy8C=a$H^>&g|PgDc!MKiT_mLE-OIs`3{qq24t9(b z@TU55D_nWu9ht5R=kMFXvX&j44OY9LvA(FfP&qdnOon{=MPm%FLo)rX+&40x`DMa| z0z)sONpmAo=>w#FyJ5i6K^2(0{{1Kq&)oR`NOndin)9< zbTxPXUN!~VCG?)NbxOCUX-=BC1v<`^-Li2u>M?X}Mi4z!=uZ&PtJdyXNLH~$=w0x= z1#)4kY(Kx#!Q{Ey85g-KRt3MMPM0&JwvdSca%1v-S#m;j_=aylF zA7UTcP;|X@{v`S;|8Dkz>$?s!uXJHTiK>rP@l{cVmQL6${K6yjYHt5FLcPqRKc+J& ziu*YR@^Y<@lW^kR&i8_h$Ikv?7nzIbb}VjrJRJ6C4x_owUm@*RX`1OxtZ8u`MpRT) z{tnomO1`bFcO#G0+WKLH`no!?LGBD8uzT^BZM1>kV)UPLTtbEN`)~S_e^gT`5%+f$ z7dqdk`;0B#a{d#`0EMn z3cLb0zvV=kt-IfX<&g2*iOF5rT3uA$;x_Yn6CfohM_amXmo4E!uvU4-ZT0Jn$}Byi z(*JKI{i#~pJG$t)IQdq-9lbn}7Hx$QxAXIH*9u5_~`X}b(fkgIyOxLTJNjK4pHD%@;}Pfy7U&wvc1@#$O>ps&GtbM?thVq zME)pTE!Jh-e=Bg6N#$$BBxC-uW2@OIa<>~z9u{q!z{e2b9)-nX4Sh(OHP8SYI)lENmXQ-Ol|L8y z5 zs5w4MX@z2TZKXqUX1;1cK)?=;=4@@vV1wFVxaFtO__VJ~OS=ST8GKMGjHv3b*4oyF zgJUs4ZTFOw1qI*(f9ax&>8}prM2_G79uRE>qUhHisj&auG#O}d0^?>09FVU{h3An- z%)jZxqi2j%_t5wi_&e81g%2B#`hcw(O&&mMiK7|7INnqTZFA-zk3lX$hfse64ytrO zih$pRZ=uT>7zYd-@f19P?9idN{T~NlSpbVgkX|9~_dlR(DT}s!Ko$MF{G!pkD<%9f z-xN4prI?xV@pM?39H3{j4XQp}0&3n6j(!bPy5y*@9f8-ClmES)`-X;za9GL2dmiWm z@H<|5@%*{|N=NF44}9hFln09QAedAPezf@zjx%@vvu!6>rwsG%A!PImV1^Jqbo zX=1O3`FsEKr?yG4=jvn%R7J)(bQUx)e`oeRY(&O59EdO`#qg|uOCXv+&N)r@vYQk? zefBJ<4c$o`H~&oqI9m&KuGkg9Q;3GyzY9Q@VN#5$W{=OpvnnwTbjHXv>57Vq<;6uP zb}ccmx4-rD^vs`=1&x)!Oy++EHsm#!ZS#&qO_*Gu<0IqZ^fo47eDI!kNl8iY!DFMN zCMLQtLzm&B|GNY)2d=0O8r@RAeP591p#@PwF95d$tn^XVnVFd!m?pRpU68O*eiH{B zIP}r?M@B}byFb3IuBovRi)DQK_N_WJqDt{XDbQh{Ul0MLlZe+^E)ac@F)>+ix7WZB zFCih}D8vNkUc>9^>QLes0yzhIn-|T4a269T-80|7dj-tJpuqHnvdO{8nLMDGrv@vW z6z<~>H? z1x^L2J3E)aJHZl}4Lr)&`1sjc0S)Lh7D;UX{im|GwO4W^p(#YKC5yCHpBTU!BEdL;RSqjr>O zKQlReV+qV6dU_SY2nU*l3;60yifgK?dyCDLQO_2f2`$Py28V4_A3aI~>Z}CRTJ%6K zFz^bHP%2sBJhz^0g$&y8qslMYfkSBilwBXWuA`%awu_%0_kV!1Kr*tj(_i15X<8qJ zz=edE3AqP7!v@Ye!*t2Rh7|)7p6Eh>z|FS31K&cy=e@D`7qscj;^crHZ*uhV@@j>j zZ@HY{_XdKxwATrecHYNr$ZzO*8ThUkLsazuIxiwVUO$%}LP`s@)l_>p0m#-w8+S0D zv)@(t1*FE`w%B<}&E{vpNRg3t%vqQwcqeqfx8VG!+Y3qDaM5*isAyIxGb*|2$F!^y6bA@&9kSSoj5^tzxbMsew-gLY&I!ERbKoSb|f zbqb*zVZxSdU2?J%+)oee%~H#rD>8TPToVz|b@h&0TwLr-a2v{!+*=BPIkK%daDUTEo==vQ8tieZue#-&Mwqt;(NvN$uZy&@(rQwhx@NGOjt5ZF1OBI1ucHY@= zVB1atM{J_so(EfTKFz69DgURv_x|g7|NqCIbmCZ+Itrc zg@`nyh4xSyw8!Cywxp7lPD^|5^|{`9z2D!@_Ye5|_;PvuaL((H=kxKn-*5NZ?Yi## z8ks&0k8oxUa?I<&BAg1!lkiPcVIIYo>grgF-=L|7q}JBp^W#5;Mn@0ldOaBHYq$~5 zwSt9(OemfuJh4F7=ud^Z&Sd}?P>-C>jRsNbfI>L(UE7O$-@X#Rl^=b*y^h-w7w~Y6UFG>_ z&4jjH0QmhH1R%U`OIL2bGM%(>R2x9VM~U3WkJo4~Je&1%OI+SMPuuKbb9QzP_8XKv z^=MlXn3yY*Q&WDOHOIiRyf$wsP(z%HS&{i+qwilXRufIj&6c=ZP_U8!$)c(oxgVO} zkdy<*xo_?8d1Y+&YG{+L6I6SFcqVw0>OvEFC1aIiu8~2G)E5osHZfjoYvIpln608Z zNnY2VKd-C;wSqSs3_{(gROgzn8aP>606?ZLy?pu7ur@gY@*rV4CQ*9?AAijT4lE8W z0SOebS&N+Jk(`956NHL9+95fw1_Y32c;(S+YJRjZQ4nKLglU&HJYmRS5qJY7SD;D( zt?)}E0~A@!Lo_i3l9KSURh#!q0Yek0oZaNEa+3Eo{?fQNZ}wBe)7Etu+Xaw@Euej0 z__0ju?q^b$b;$U~p;g<(E<(Rh{pIEHQK*^-3B{O|cDU{>^)`L=8T4le6)`FJjgh_w zCr0`|pp#Z4?iy`$?C%7wXmjcyzR#cMBxh5B^1r|b@4UTQ;tS~7-bX6?9LM`qK%$Sf z2b%iTN;KJbus2u~^G)@nlp6`SJ-7x8tg9l-9X_>VKx}K-m->DOKS>0b^Weu#ZLjvL zy)z1M84hf^4j$+J{rkzH@&OR#2f^E_NpctT&tdB>W$V6rH87{CqAZLTK^VWzcdGeCFt6Ac4PcEt zjj&K&vE|%_-wn=FD~62!C@LhzL1+4%Jx-Z^4h{$4Z3%L+cPJp}&)EUnig>k@Z?P)8 zuzHpCaYgGuS_FFQoWaPi3Zy%viI%Cj%nY7FQ7IT>)l;=-U!D)Pig;8qbX1OAy@a6{ z9+%fg8|^-HPK!8SUufg&h-vZzj|x z`~x8}B&{pw6F@Y^A*)|smgi0FU|d-O_lGPAZ182?iY}3DMlT0Y+MT{VG#3Vt7P0m{ z_lg$USNwICm)I*--V5K^ndd=CA80@cV;x$zq-Kab3?P1NK1DwU!8eL!`-7c{ah`>y zQ=a&q9wT}dHlMi0;m0C_TOB(Se;4AO+;iuqZe(dIU*DseMvA0~foAH2k^-)fR>aeOPj$kI*IN(`pf?wA{gK=CtbUPV3sSkE7PA*0|Y28NpuPSAh@^m z9_ywMhc0fYfJ^!|vwnrm*EVa{|Nf8xxFrZf`8_db3=+Ga*S5RPm_s89RN%ef+r?&B z4U~TMu!P489pWggn937bBR{Ufw83v*s?Ct9pmBpI8-&(>+TFHBwDXgT))e&AXDAi> z3#8GZor#FgcDI|@qB)kk2*uTQhhKkWX{-Cgpazm{w+y)1lLAv(+v;Oj_vq;8 z`~rq~K%xdc7>a&64uTjOQe=I%&L@aKzK-fygLxB1s$^Mb{c&!kNTE^d-9kba;ezug zt{#mV^U|fo`15FCW##3`hWBW@I7NaOv=#XxpenesD3X*K^WFy+jXJ`0!&pXBAaCZ%N0I{d7$My_e7I_uub?~r2E`C%yFhMo z{`6@N{KW}q4Q0GhLlPlAVV87Krv@@v_d#`nM)!#CL+HjM7{9p{ArwtE79YirbJq^a z$g8wyZ*9HkIM$Q&Xq&KNt1)I~)1L2~YIyY306LBE6-yva-ZyrjwY~ik2Befsn_k01 zHNHC_;rLi)vkT=quT#R=$tgaoFSB?GG~H`pyMBhQ5RX@bzSYLZ{1H=LnQcG3QvA5T zsLM=xMGy`%OWCp;_z?&E95HOj7iau$3v|Y}1(oUOlx+i;ab83Kezx@S^V7?LX5s>d zl!UCj@bGZO{-~=T?iM_n2QA8@;)i|sWup79z`#H{{dgrM^OS3GaL40WwoGy^v>z(( zi0ru@f~nynao4YrtFW#OxkO3Of9TjdI*PVUdh5V@@J_iLqsqVkZb3U;hB-MJD~I$L z#%%ODAP$N~7{bul82{KI_VRsv~JM z#D_lbqD>RiJ~cJfwc2&!HagOmkhv6L&^`ZeF}sA*cWz4sd!xqe+F#k&q?@N5#)pS1 zsVxIC+yxv!Kk34TA0K(zmghq@x>a@vE$h+Q>8AN=fHSU@m2XTV@$-LBUd%h=8(adyLopA(O5m@#oHyOj?^%km zmkiO$X(k%lg1ZeGv+YlI_};}hjhX9-T3Wru1DCl;eYk}iKWCp2o}T7pyqF=_#wP9Px3NDJhQcsn^c1-(o3<|$pCkC|?3PVLDwlZKHJ!Sc<4whH)3 zo{8T93{+zN@hsaX030C_$I7Ngu_7NRlePpeWkd@R==JWInElXMQyvBNNK@IJG8pd8 zW2%ij7n*>1;Lfu1s@A{g6SiPfJTH zsy{J)1{>^T2T496BzngkX!u2x$L8S9BHJT~>BvQli&~gqN=izwOW0b5)TA_y-Zv+3 z?uSJlUbZcy;KYpy0!%04GdxCp#KWV`fsp`F*fX zOTkBv`6o%I+peSYM=jDeYJ4jfBvkP$o1RLrYNHs2i~<4XCjkKl2$6enjShnEdiidP zPId(FGd?}s+L5}|e8VXa<*ohwrbe2WCz8~noe-|&Ssny|AR!q}32``4DV{6I9*h0R zk!}a7-T-FU0@F~ZwNr}1&>_a5j-Axk)7Rfhk9YIJ>?F0a%-l^pUitY_ErK28p@|TobOZ7{?C|iI z>N~(o+9@+LGv8hwU#dN95{?>CpogX#62~ops@tJ2`3w$;u_^x?PV~ze7K@&N0>^II zDttHtgX@xYv-eruxL#xWiYj?{?_R|Uf$SIfmxntf30pYi;9fTr8_t`IGud$8aU3p6 z^8LAfz%w=n+rlRwHe9q-bxvX#gG)5XmYMN}xcQz(=dTeKf+GOtkr>!|p=&>mKD`DN zC&6C!5(Z03O~gcbo=y=A;NRZfP(}CN9w})T=oG@mP`HHZ4?WXgmF;+zH&6#)q<&8M zRVcm&m|93C4}>iEUDJIuqk;u`nBGgi#|Or!r9{%eMB5<1c51|6mt|4h{Tb(VjPowk zUK*)X6h#9uo<*x$0n|7OgT}`0Yh4r{hioEjsMKp8@4qj{ajF5l;VU$*hoCFMaw})6 zSfP^Iv90YKra2m3d<%0)i>_U;l5{iFdR0bwQ9=tE5Mkrp*VK4BmrG$o;pBQ)%5xv{ zry^tH+QeE0V?8Y%u3J=D!Od4=BM7wE@}9-tkK^P8xmJP2LjF?$waUoP+p9$)e*Scq z@wos@#kls(Z0Or}qfTeh=8YTmj4mkrX-G?HNe^E0Fm;yR0E~ix$(TCF0s10 zyfRlb@q&u7_hT$V z&4aSeNZ5s55X#MJbc-=TLC8IE1(J#rKM@TSY1a-N@n5`VkJ#9EZJSf+CD=8iaB#=s z49FZV6McKVf+K5}aB!j4>4}Mn&4DT#7NBL;4#k!K3k<7&K%KCrL?%EuHm9EGszJnZ z;D{G~s3*JV1=N#d(E=5WTB*=-lSr9HC!798W83gRo`v`H0?1I3+6jW|rE00J|6C5s zbPYtPKG62tZisrp_-h$(MtVX$kIawbVO8Q`#3E$tb03%d-^=s0sKGb0r2VVTf#^X@ zTIV60YETHeyLe5c*z8Cp0*|5^4ww)F^L+o+TXg>0`gG&(&#$jn*JcwF7spCjjt)~h zr6*k)90%(vg3kTzdXhdt?Wu3OGU^rMFK(ckG}n^k(AFo=q2=Mx5j?FQ>>r|W5^M?d zMWw}y*U{745~xz$wi`c&1_#FcD2`7M+=)a)v(>S`lsnIOpNa#{5Lnz6$eJ4zOg<;? zLmzVi7>v!S3^|!|iy|2_zJ(p&08~%lxw?hpC^i6)jM;Ae1~;?2D62Q{c}O={JbFJK z2r`9b*?ijnUT4rZB*X;Y;@Lh%@zjz%c+b)cbjS;_3CwrJI+A#$iWe_FGyE3)$BrF4 z>>V76lJ|k);pOE$bKt-M5$CB?fCRyQHy5udQ;d*hMa+T>z?#qn{0K(XzSA{_T<4t7 z1Za@ZPV|1bcOqlu%9V%w{($G{FHro3 zpW2pjHPRia3~e2JvxnN~7e~U@#l0IJLt7DF-L} zFWz_$9ip1a@_g@Da_A6la_C4Lm&;_^ChZgyu`9$-B-|&O#_F;nJVqzn3 zAE=-TktFqy(f2nTzK9|~%Y<{`22!P_pn2V}etj5$9T$%*m+B}gE3^60lbow`!+;WX z$dHV=oBaJG@9OJoYZ)&`D@No-!vRiTC*~_CeV)2p#fu026%dv?p!V0||9SVmjflnY zEE`5E2E1xvkD~cMsW&w}y)|Ihti$s?{QAioP{|G->6WEQvE9ddnL0YEvq3@%I8KzI zZ=_w1j0|2ev1~a@bslgM5YVR?&+k$G#_9%J$jJvofGpSonHg?z|L$clq#`zz9B-tNLHfazE8^-CPjqZVw;DHKxz7rEn{r7#YuCBA4=UfjS zDQDwiBU49UAB-xiqEwVfO^v-txIiv+QYK(Yi z+GL_5Z_mR>B%ds`t|Dj{NP&84hx0dsnpOL{MVmCw$*3}xplKFgmA-FzKE^(po4#k` zJz1!sg4}oO_k#ery!9a~)e9rPl=BSDQk{E%R$if=Q$Km(f**lMIu`&{JS;Ka1BL^- zPs0LFHp)C8yLZd_^^Z_vIQF?&j>vH+M14&X4Rf20AR&~ z#q7WSDtUnH#CQw}+QVqaY3$V=2EV6^`i|$RvnU-zj&@4Woy7x&Xsq{(^aJ%fSsaUb ztl^izN8lHHRb%+8o+B5Gu-0EVnC>bz)ElQY=vjqetf;WJp|*Bmqif=vps5{dN6a3b zR5@}p-yo&(WdBd3v-1-Dtn9GI)lL(L3|^gQspS%UQSyJ;J=qWOEy4d0A;6!Sh&o48 z7fM6t=OEM}V%4Sq1;m57*d=KC4@SOU*=}x(uwmKQL%a-j7I$nP-Te^HqNSSa_f4i97m+#mD zH?~5jt^{w0s46%E2Z)0YqtFAIZO`fFLXW<5yPXuwuG9;}DswmV z*MUD+NX#hQqrlKChy7?2#Gpu9!5Z+>fSvsyDc#*!v-Q%%^fYB+TG-mwpzZPv3W`S! zVv{^OB#WlQtZN1&C!M4Ot4!WE3+o@ynJmvXBpMOpnq+U|h+w19 ze5Tc#Lmh`&WzZJO6G(H?bMs5h9ETXJq2;Sq`2s}?*P3_1+z>&K-2aMgfuOXg@q;m| z0vO(%I*GQA18tvFgesCSK!nJHLfU^s5Fym%V#A&k=$iu-awf9y?~6nIL;~b<;-fwl zl^tkc^o;y?mw|5sph_@qRDU-b{G;m2e(ghbP)gLyDbmqGLgEyj41pqCJ9kPE$j**C zUg}J;&SJ$2Sgg$fZ9Cg0;7W0Fp6%UmYogcCx6+dd;0m4}aF_fA_hKb@%$1y(mw-4z zl51YYBZo#JDt;jA2_+)p#exna_2>+OAw04pRPaHEw5!UjE!jcg>of{1Q{ z243tT`yrhM*ZEo9%%)`i`NfMDkHBE)(!6*5(vf8U?qI{VgU+;70@wc87oO?d^H=hm45pTsDq~SkNy&l3iD?UX3oV+Rs_* zK}=;ChU?b|I#H)^iGzt^Q^4!nFl*bQHRsu8g3BA+!ckv3(RU?@o(%W}P_Ikw0iaYCANq)nKv|+X%ImUfMJV;RDfDi$Q`wuM}7Hf=6Jm*V=o#- z5S?@^3_P#ugZhmB#EU`_Xgo?Q>4?r>T^I-M;lwG`O?*=G&iFEgZi4h!gV*^MNV~t# zSt}f}(3|JrvWEr*PuhMU3e<;w*pw;exi}L@hG{%mRQ4Vsun5ImxKhT}$KoZ(G4eSThqk*u zLGyt&<>JeJn{AMSf!0X- zKfgu~^j~gg2)y~Z1+W#6q?PWfoCTz+*!<+VU#C}sRYbQY5ro8U=Yg@nTfj7)1>}_FlDs2uBMNRH3Wm8#QcmU3Q3}R=sGdjBH`9lf-~8y%LVe1qS=_#KmPdR z(wi$cY54%atz+-F8}xSZfFjwh(6v!=lBl!RZVJmLtpJ&iA&NPi)dDq|V$rzhQIJX( zkTXTV0b@{kVFU)iAe=1f zT|6{6xDbL2)fPof;_P_GcLojdC<5FrBl?bOxH9|rpMO$?qWA$Epbiiyv#wclK9Y^U z3cW39>M*ZU8a5ZE-@4=ts%r6!?9a_+zo7f8#*jskptJaXd@0Ua+=mV+Bkm`GW*GB- z|FOtZTn{;0$yMJru+ChkAi&-Q&nsI1KpTOmPz%*0CYF4c;M=WJ!<=bT#GW^`*D4V9xY2xXX({6Iesz z!6W@BI7$KWdc36LF-8U>4OjFt06>XYyMi&Rq*L5oa^@KJqeWNleQ*R?NL{Q3vqQKB zsiEZSh+PAqKsQ{F2njBC^B=hhZDi_$U<~LpQlMVfbk-xn05u>AhYvR{7JyVxzD^a& z7qY&s+99D1%*iFvFB`n*n>s0#^L5yB$Yv4FI#?R&D<=@3{fd^@M zrMQW=hV7;TE%*iuujE@TDDazdzm8D=UDsjwo!~S(Z)WxeeB5h{7DUg@FjVEy_?|{I zdIg@+TeQRMLS|Ax(sn<`oX#OSh@1ZrvTXOHqZ4wf-tS4|O;f}Myr+k@ItE8pSA9kbaHa*% zG)Vfp>zNpCuc(UTF9Wdq0yP|02_y~d!V||VdMAz<#hnMU0=N}CfOCLRV&VNlHD=wm zEgob+;fD_&+IQVtre79R0hYrWeGmk9G=P9n0^#jD;;OYGBqZccgegic`X+5li17<3lZr~mgy{`Xlj{=0}6|1Wk=nxfemg_Y*`~)r$;4#puR-?2GeAYxZ|@=^tGn+ zel(k12a9&%hY3!lJ9Xd?Hg($}XsNBUQ!U*YADn)4JR5^C4Rhu~k}i_-$jgKRn6)b- z8zO6VaR+4-aupzc4d$}@pk5sif^4_<5z}>WrI~0)N09{52_-oX7uOrnb&T(24SfLN z{2(QU9Q6i{4HC4$Yr7LA^bC;qkIz$#Y7de(+qT}^{i(NXlhg1+5>wC5tJm_Zp(fQ9Y+Xzw-r++NQPZ)#!Cai8%90u_aGu`VcDN3T5O zHH0*Z-iH8<0--v1Dw0CP;TLew?bfy9C*e!!oI!SOl<2%s(H?_0lO#(Z1 zgceI6lpzYwo&pEFQ*{d05!nEY;3*zhQu{f;ps?|Je`wzCH>p@7!qI zMn+PFSE(09B4Dl(VyUSK_bOOJk# zsO$X=ZRXae8$$j4RU;cRex7j+vlj%6E7k0phl?_xQ#$(m zT&B}#6BHuxSVQN$5n>oel7yxmjC^~3&8*jGlS#@iyo%vd5>fMVhaY-OuiYfHMj%8S26)9||kLc*Gk=Mh+F(T1fi8d(R#yXcq2{0)2;zk-D$7 z-3N6~eLngufIuJx4B>0JV+mZ(3OYF%x@78M(2uKXet4o0=(IY~LLwI7iNC);@B`~Q z<1|vSo)CFUR%L+uew+XTkCDnrSB->wfOg2R1L^n~fWhBDzEU~{M;k8}7qwmV$)Obi zlu%e#Mp8wtWm za}TP3wDUkKTA$ZZUyKjy9gbFxOGs!UQw>_Uw{XqiR-?;6x*!?9qg9T{s>T$UXdM6g z^XjM(%bESfm*nh>c&J|kpc+t0-=h?Uqoj+6FKjKpM<+`0DtXBKogkY08~id z3N4z9A|5}D1?G5bf6(%2o`96w7qC2M!l2rd-ufUK+fK8{ThEbT* z2KNv5Uy=`%cnug$2B2RbW=pNnXCK^GLw2v?P0~}mcKnxai`rye5&NNV%$TfjEr5=u zB+8FPkAs6>W7`{Gt5dv;t{S*TMT{5pTsLWkCWgZ%4plfuXHCro87yN}9eDV>;vl^O zv+YpIh8J1|N`?FgP{Kx|8^w%PMWXmGU%mwDr8iop!=OZT9bTm(bPOcyL#2odcjqZi zP6c2~IRzqUnCX%+Xikv#@h3>}eS`J*iU#") # 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 0212/1520] 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 0213/1520] 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 0214/1520] 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 0215/1520] 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 0216/1520] 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 0217/1520] 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 0218/1520] 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 0219/1520] 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 0220/1520] 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 0221/1520] 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 0222/1520] 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 0223/1520] 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 0224/1520] 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 zcmb5Wby$?^7d8q5NQtzxgh)zvqjYyjBi-GNAV?$K-6`Fm64Kq>-QDLM)V=rb`_B2} zcwNpl&dgKmS?gZ+iq|i)(jrI*xCjss5J+O8g7Od$P^l0QAT79Oz$bGkGn)_)&oN8{ z1Z2eo1c+p9tqe`f4Im&yzr?7(sw#B9OjVbMgQr1(q|9J@=ZXnO01dgV^O_X$J$wX; z;+}!r_v&DTsUam)m`TttHPjAYxT#$zR7?ZSw^On%QJ{vFi{?`gyTdf5&E)IB?)uYy zh;;Mbf&TvYN)W$Zt|4amx+lPY5tEch=7)HJ0RgXC!I7zv_Ujitgu&XqlZzLknn1lJ z&6o4C(?=!6dTvx$2vW2ajMBg;q+>Yz!v)s@d5(1&l{82X0fygkB zNzY?#DwQVs=DizpavCAp>n_S4$rLW`Rs0c{ugJnHxl^zheQS>eA%|bH7TmR=1nTBx zh#-#Ytr&0*Z-6{C*xSWXYJ(ZG1lC)^5k~KSh?x7WP{14M1uo_wKxOH(#v9fclhXBl z{ux^e;|8g>p4SE4>;4Tom4evZ4=QexkZ9H0#>H2agYCIvoK^H(Ed?93yk)q>ssW5p z_f7}_8m3_QmE*?GXHnyjZpq(Mu_?88JuE%-LqhPveCd~9?;z0wmqj5th@g&UZ+35& z>82%#bfAbup}2KuCPSRtC5)htaF7tbr=c8s8;=dDaP~sM$UZtKQoE^rQrtH88GDV+ z?az)k+1YH3%>A7AgZ0#EY29ofp@NIP(npBlG;GP|q-r52OZ*cbtl=OZ7q{LoC&5-m zS)+!m9r3(crp)+s6mK0hBvgmE(uQt=Q9u6t;p4JQUxE(WmhUiVeLCkZp1=~}1J`m( z9r+q^{pxcKJk`}OdUV1$yp0X$YCcAcaNAq0-n7Z6@&^XOdaZ8xZm|IpgR`__yy_c{ zphaYsl^;%9gRxV#dvFuJDIK)Bg`UUSwyG8KFje@*GH0kIt&t0)|>H; zs>=HnJ!pfT&~52CHv}TI_ZK2iySE@cfigFNzQ6#}ca3s53?H=eXXelbI$TpQ7e1es z=<{L8+df!BYC!HUk<}sJW@0r#LoM-Ozen-&8$#jC^xt|-7Kr&VypBXm6awwDAn_Mb z#;>2@P#74oKKMox?M5)_lgsYJtMY?7^L_tFXy0$#Uj*|Rho~C z8`POTI>gM3Od}YVSv1sd{KgfcL|`yeWhluQ>jsUW9U?c7fgY+4*RJEP9PTZ=M2Fv$ zdoeb32h}&+V$_Gh$#1m9gtva^Hkz!E|B_*`j_f< zruG*fk!>ObNlYS(MN_lk(2}BMs7Ne`35Zh29KO1W5q1aZdsOgnL?jEojKGSL=)UdF z`<1e0v_=er34;#fsgOgETcM(nrBW$W*im%NDNZ-f+{@zDte34s9XkFkwerK(kWrnFt?ScqCUT}Z8TS)?WJQ7SCYq=YEDT1cZbo8u^55)d{Vy5(vA z!UNue?Vh_?B_-c7_f=+UhE}GhY_pUHzkt+Fx!2NqvBLG8VxhFpI_VAk=qs>`Z~|~@ zvD3P?!j5r%;#Gc>?2jK{AY|?`tzdRZ>`1ImWMknoW2gpIF;-8Qj+^m}bym|BOaFEoN~y z7G$tx5oejv8PjLhDYoM7b}qH4KITD(L05^gkCGyzAtRLRmt2*KOPEOFWgBHiWT0j) zVs+DzX1Zh@WGZ8B)qPiGUHz+S%5>QBiyG<=iIWt;+W$$t73H>Lr|=sGaqp=pjY; zPP2)o`+Ax>nilgGKg;1OKbR|6oticsUu7Sgb=8JE8t&>R88psbw4@}?3pRE*hB{j9 z(d=_vtY5I<8^7>*fryWbuf?Utae`mVv0#(QC1tC&F}8L#KHc$QOJj9z^W)yvJ^5wZ zS*3ZF5r>>zAvWKnvRP0qx@Fp2%KYg(a^vH=?tbL0X=g-pq#7t%gpeffNhUMte zy!yiW2mSa1L4$?;WJcshgjo6Tj4=Hit{j!NoVF#l!M2SjbEm8uNN@uFZi0cviTT9Z z1h4GWIyP3c+vj1lVAf#>jXL|e86_NIb(D9_d#9-l`KX`2y|Z}18^DxjQu=*P$gXko zx^I?)Fd>bx)x>AmHwV!b>lw{lZD0k3-SBuvP4Fa*XDz9x*sA<|4r1KJ9om_ML!^9U z`PKzvxWR1PYVURLtTKD?RKNJ$lWk?WvR%-KToyXX-<%OAH$iF23%kIUPC8P2*HmmX1_a*kjqKd@s#wTy?Cy z+qh95f3?r^#;xT5b8mkJtGcYdC#TS~b>Lxq+_<`~;jnECY9ICo<5mwIJjs?WxbwttL%GO`^!OOxW79c9kieyI1eV@o7wt4%@X@j8CLN;7eLr&CTN<}p#;#pp=3vU>IKI8}jdio8!HjkicV>PDkBiJcdFSka+im{w z#vhNEt#s~r>$DB^#YD=if|b+!@`8&e+wQ@x8_ebB13GtpXW2X1b=~dPDIzhCoE__d;HU z4UtN zUCYb04GUYE$(!rao1)0v0l=@*>9d+^6}Bt%a?u{Yx(QI(P<60ov0AY!3qrllw0MIa&~ z;Gvj|p{^y(jj0Eq5Q^wZB01y&b6ub=FbpO|9e}2zR2bR-+_r7n4Bvc77U+$EDhU1k zvx8=DX;I@&X_;G8{F2ebQ;6D?Br#>o#_>!mMLW%#+ zGEWP7w?`fRpLdL{43i^S_mTlZXW!O=y;9me>X(5 zqy%ig>_ndZKQaN&|Al<VgHS%whd>>3mI1NDDTAj*CH;(uid=d9%2K3dd-5%#|) z07UBazZ>HJ|0PnmbJOiVbMkY**q++Oq@-od-EpsDm-Szgb7QShveAifY}na!;cUXd zz)&(%C}w;o?p)onQ?;HNzVuHc^s+iY=5*DFcQ9Xe>9o-$7P<7tUWdlgx3S*`jur5gFBY=j?TT=TiB&Xbf`=mr$f|x$|FCg)eQ+j&FB+y7K5%PoIM5ZLMIkoZ0rqXq?Kxd(8ypJ_A6-6=UQc}j zEfX&nDt!CABRnoYFV0f3=_*$pYP9N*qgIG3m(V`;X#v9@d|gWffI=MB$x{LEbEr~`cxa?2y^D+8{Qrr#e57t~U&FD)i=1uo8F;X@RexEv1K>FIId^pW1)9p``d{B5q1xA~C6+ z_rOH%MAlPvLG=taNs;=Nm8t!c8{?98S8wq^>zMT9yoF|S0yCMmdMx1<*&Cge*E3BY zdoV{%c5Hb80io0Zh~P7OSp`@xK9O}>{FITv59Jb>xlE)lopwK7nmzjf>n9yZi%w6@ zVTwAdT2jP1%Au6_VQ|Ck)b7t#2FUnVTv&-Oz)-=9#%}(Wr{dzsutaJq+dsT= z8@|}raML_oXmL6e)8~^cWuI$`Cd4g@(z0qgD>=T&MH~kpJ=v;HCa@bJ7Uxhv+E=1& zP2{6ZuJs#7!X>PP0j#(ZvF*3{j)m{q+(1fH?S%rNb`GAQtevYG)r_TKiI-6o#9(NE zu7UVsq;ttv0zd~Le7x9tkHBs<rt+{Cq#P4igLHi6<}_&3szfV|1}DM@xZG#Hc81~=84afHjN}Br7m#>F6hf0p zbHs`v_U0#oi{I5gV6PDAeNj4oa>b(NYK^4A1eLLBqW1;5?~T?#!H6P3C~1{m|7pnP zsbc+m$u9%zM1VRF4Z(DV6PB5b=3d7v7Z#O{gt9HD?qG{@OGtIXgN>m8WSCjMwnRk} zrf$Gpwz1Hs@Z}2HXA~j+@)K*YMgBnbOo3g0jWVO@i^<<6%C5B3O`fJGF5XkX<$fh* zZ(ntDzN@l>E8!JdHKt?@0-uc+(rzTp--fzssm+##yZk+1YjcyLYJT3x(0!;N^{-B9 z;loKSwPa+Ban{=(Ni(s=Ov|J@m4?N2<#+@AsGe}9iLwn-#%f2N6$Do&Ow?6JXeV^X z+0R$5czQ`!J2A-YrDF&{#vwwySwO0KiGRZcr#99Eul9antziYp;a3Gt5ZsiicSa5C z0seb1w)9Yyv$05@UeFC&-Nva27?0X9^{8QN5_@|GK$8f(E+($W8sE+?t>((Nk@P^0 zkz@d*<9!bkukq`_L(mT_st+)IMTxzulconPZ#wn9)eug5OxUplQ{Pd`vK7WQOzsyS z2$RfoU?-Z9<(dN{AV3%BI{78{H-3RA{A~fCjpoD+%zo`lTE@@AvBWjMhFDR5tSaj zmnDGBbR+e8LeHp2tII4{oHAgUP++j^-oDZec!$3F;FC@IC}q_b`%@0)8Xl z)8xxd!!j|N{LL*j#=O&r^s3yk5I_bl#CGMtny*8>cxUAYh)76e@YQx+;PH2~ZENpa z)sGMWvpY)iPB5npQZLwU^c)$Pp} z>8{Wy6!mQjW9;|kt5{Og3<{DcineTFf)G9@@KuE)k}7O1V-0Ag((>(Kh`*8m)bQbJ zo)&Q0W`0-8Tu;_gQ|TFA&0geECBQ|1ap@?)+vRc7zj|PjMamVga@A2m-`J1uN4hjL z3Y-ok85Y9QK;AZR4K9#O^%|(H(&)AK=ALOH!j+`?W3i33{}8d?qu$|B_J^w#DEp2mz^(ZmCG4 zIhh@PTqk)>H4cISBjpk^0F-&}mR|$AOY!EQ-UsZ)^lpNX#c1*4`o`u>sjVs4F>q7p z4EVaeD{*Yd*k0e!dpj&oOgi@|M*#y21m=L7G`b`le!ZmX1GRlTA**(}lY5;AKCyKa zzrAyGsil2^rMY7c0AOQMQdu-$olgMke0!%D9Fgox$kUyTIS+}m`3aMWaj8=tuwE`X z`midg?}Yc4F&lR5=LAWLu3a4DdVmR4w|~&)T!yQ$_xWqYIkVJAPoe3 zK5gj6+RfFL7B-=@R?gpk`2GYTd%t`Q-svALi{93dNx>i>DDk|%iD{@Cl27{%Mpu3Y z&_+X&LP&y1zn`7N$-u`jeJtPrfJ3B4E{VH#cDmNNAFe|_BU`01-Vb5{Vfn?r_V(U| zsp}d&*OY`pJqm3rjrO=PJk^()Vbv_)Fli}>Rs*AB9GoAtf40; z4|6A+X4saJ&Tnd2qZ|Pb&r`Xh^aI?<0T%KVdy%ReP7d_V#gM>fp@)Di zLHh({M0UEStEj5H16Yjx`(N#WfPo~F0L~o&o)Ey;ZctK`qj7uZabkmBtnG=N%tF80 z6RRPF^TYjVS!VA1<$&|j5a1bWpKuF6V9QAcLW9k>l<<&~@NWTxS>Ek3d3Z4BoKK!> z-EMf1`wm!F)Q1RW`>U&_{bhaaFO69LC;jsU#-Y1@!A3pG0HcfHUTU81ZkMU%4@1HU zNhRR+AV4{oTdJqr_p5V!+nJmM5^hvoPy7QMwotOg5bJ3BB;Vni{UBmmW{wlqePXcI zVcs0*r3u~_rHfMU-n|=uPZk9%PzO+HsN5nG3Q!&vy-_|vtwCYS480cM7p1*W(w=ad z{e60Z&EY1G#e+Ug2O2)cUSK>t8YDDGz`LD^{w6`0#5xGTj?XRA%+uoR=#^h(rUzl4 zHaUQ4jG;Lw&VS2#kQ0%PvdQZA3zff(1u)*yZE;**{%&Y_yOEM}HWADC^fmKXLCOSN z5ipAxz%WM9RJp_!ur4#PrG(FCYK+K7wGIWOV%G5WGm&f)e`2I{*bKAS>k#5Aqi=0H0(fT+L3CBzo+aUCxtvd1 zWP?AWFLi(D73Eh~v|PzG9DWHnEg#@$NSr<>C=^9tUvaL@A<4I&m<3uz{u5xYW5T^a zU^Hyqw?O({qWMkOC3w{xn63>C2tk9ry`fR`o4T3Grtu}E4>LyFb)23gbRlB zHZ#yS%uENXq*;53U^9%D_&e3E6xe`G(*Q*O;33C>7EKkSR{oF{FI!4%R&$Ih(HAgJ zq9qJSJES3zfmZeAUG25#h%e}X3nk@WG07Sr!hn`0FDG|sUC`zgY~4%nYM6Kb6V}MU za88;Rk#j8+*%dOMn=~r|pAP_Wn7!j8YI86Qqb(DQ@xF2B9R0iLYYtjVN~z!WljzL> zIZT+SWg^Lc#-Lho9xZOwU5kYxGkXP5`7ioxAMY(5ZEN3 zVxE}!7%y{fXC8#SENxQWe-gOEMT`LewHXMo_UHKov2;LqXtg^fIca7>cMT9`9Q{H7 zprKe-@Q+S?c5N8-*pc6LCujRK1=vq8pwU|GImXc9RMw=j}GLYW%>X?2>}{Ow<6CBGD4@IpeTe`7$vF}u9?JI&B` z0m2k`U9w#3W#R($)5>B|9Xjw|o|Q~gzJRTK+qoiBb#v5-&bx{9`(&0VV1_rSbtL0Z zJlu)YpMeB;Gie|Uw*}d90x%`oFE&YD)G`*|uYj$ruErhqw3u}?e}u2S$7t`_*0q<) zIs!vjP>K$4wo2e^spr|u&_S42Hk)NTweArw7}PDkN$&w%0FXzVcY=LlcV2>DVmAe# zs?e!Gw6k>1L38n`?I7C2Rj=D9(Mu3*hLLbWa|61#O)MJp zZYiEWk-a#)iu7@`V#6Rq=|Ln+u>0laEi2{+sxyPcy)NG3I`SiVETD*W2LGBgE$gpXZdbE3h&7PN=A_bNQCk` zJHF2-JgEV}@T>%^@y@`9yxD%Er?r5~0r{BWY8QGrHOT-LCt=MT0Bk)9z@3ya^>$MU zA3~@5!rEB(()MC~^-dAl-=o;Y($xeFcxJEPotq5Ji|L|M1HMtnyZ!Vn|DN!YBq)Fh z{rqM{=BzjM+KAI{@K1^OL0-aV`+O?sDgMQEuCP>DQ)WdUeux`>E`;>kGoVw}d!lm`gj zCldkW5RQ0eG1l8~gM+Tsy=tI91n^p6AhKW^7+V2BGEKXCbd!t!lC*tiW(*Di!Ttp; zAN7M0oz_)g!{qi}aod-dkkD@d`)Gj!4n;Js8h6_NCe5TLOnbnVwDHeb+LA!;5Jsf> z%SKiS4&(p|%vO|X4k%MOpiBYpCQhrFMg{K5PPCvzAVV&;z{34Jfk#2O$NYP3xL8iM*0pe0U{t6 zdZ;~u>R)Ia!hrHK6I*UZ%A^ZC^hXoi{O5 zUFdY`;t2}C{nfiyKCUsQ+o8d!u^iBG0MFTb4d8TI3lSP2;u_YPSzDqUZqo&x9w@_| za8lag&!{CDpP?mLp0NX~8}(g2T*Pu{mm=IAAqXFN!0*L^f(7PZqohUZND`gZ^cAK2 z0YIW9X`cfJ&fRfKnS5J+Y$w(TW#T0w;DTWtUS_xo>wNcFclGq-d!tY0lFKjtbW?yD z%_58ys?KA(-bQnd8SBkr!$0@o2b;W~R&Ho4zt6WnnV>(XK^{sdpZA|h~Sg^NmM_8z_; ztO$nHp|@FqZPlJr>~jd|So|R4;n;K_5Dn)uAOtAq6Fl(iz%z%G7CE`yiS+B?!6^SU zp#gbro)f$DnvL&V=yLU~qL-0gR}zCHer?r|wL^ z)%L(l&CWUMKMH64l|N2x|6KXfNY%DOEJe6D3049WOQ-OG*yj}P<&4T%c+b#Igwo(2r1PLupYHhTebY^|q zh=Grxk-5qN2Yd!(>OL@%hgB5ty9@iK#-A1{6D}B!!oef{kw7xpP_wjA^YA^TP=F8z zjs1#HTMe*M%|0%OE6JO~WoXq-D>A|Tccu-zy;KZiAVYb0>HKbk36NN{ws(8w-RI~f zSRYC*!<}^@LP{>WS>$SkzlH&42ahARwuw z+zplO1ZiX{W_Hq{L}@qFqd)+tM6fB_XF;$dtLMM=;=u4xTa*drbx#fjKw3@H>Papv zzP$J&@x1xL05~FRL%@?W&6anOfi^;_!|!i`UKo+hkdplPJp@Q!gDJiY;rU$}uJ9z1 zB4{S`pCGvf?aE{l|K91lThB){V(mx;7~Cu-p)GaluU%X% zj=K`e_w(9>(%1h0hmIRKvPwODC3JZ9bRjNKT;&(SP_g{LGN+_wzl{|K>-M|87UtV&of^b;?r(W0MY1^O@pD?7HHs5vEVKS_b>4*=UGv&0jzRJTy$9h_aHGUVV(RQX)q^ zPJ5Vl7jPIJX>p$%)GOUC$$P71*q-h|ntl`ff2v_q%0yIe=g-D0QQ=r()fvd~8**)|YMH+{63Nnn$=tDx?FZ;S z2aZK`R@K+6(iFYh$)ElVfn$H)rtxtd0FH^25-VH5Cg?BTY{1r<3nZrV;Ns2fTk4KH z5(LbrQP`9CcN%`q@Htj8){qnORlP3>Ds&LAQ#w%IyfSL~tx|0RAgAP0Se}LBR}(i? zcI2o@lQ8d_wV*JGWGR4xOODr|hi2=(wl6&B4cZisadn01gB+pff(S!GCnaiv8pnfz z$I-EE^{%YKcU0mxQ~{rUYxhx}H%AXO1NAh3@A2tCbL7xluEp9Z%6J{X(7TGBbR-L zf7(O-C)j#{K`-Jl|JZxV=tVsEnLiyq!ugq6_-$SD?Z}G#CIBd@njXTsB3a4wo`BM9BEk*D5%thHIlQaou|1eWl zbaekLuS_7XC0t6fBScxFKr`M{n(&?~^=eZ0W-?W~jxxFAxW0>j}BjX%vA=WQ) z9l75MC-O3W6p2vramfT2?a8m)-3vRqGUJ8htBA3bT4w$dW|**Ec7EM?RwAbS_8sx} ziFVO(T8s4bA)Pk^vw40W8cR+-{qR+)7V%g&+MqHy_F3(=v33rm8v7z2DCgBv=uDj& z5u_VrDmNX}EWcaWHQSB&bQiaX@lS_;yv`{r1Tu%Wu#$do&iqU5X;s{^L_$P523)4#eCAoc-gz*6`g9Ln1g38H%{!x2nM!vVn1sgdUY9sgFZ_4DQa_ZQa=p6e zz8_*m!e{7a-*EL{KOr>zz@jld4a;ozYyL*(W8n*$sS;(n3t8251Z7a2)tW0oVoNW@ ztsKu)tHk&e`@&oWx})*;F`4tu!117@Dy8!W*V2lMyzL>Mi-yY?YJ>6E7AeB#$@-)v zZsU$i>oZ3`@KYvl33u%7zhN60x5ss6i*>qeJa2Xr@!MGtc{EIE><{!B(K%&XY7Q9; zISEnM=zla%Vvvn8B-^?%;v3_8Wls6p^^JLA!7Sl5zld^s(Zb?@QfLt_9xT8l0kdTn z(sAnHy`LB7)mB)IzmbMdVn?N@1hU%E31R4iq~$k9!aU5ot(-sZ5sgSzPSN1vqYz7) z^a>+CdF1*fTo#Eha}@DC7R~U`uWU7PeWqG3YP7cx%FqaHF3YmSshgR(oGyGmzgS}} zp4kV}a2Sc{>d!Eyv@%O++{?ln>kbr}L{{o-UnEylyBPLR8(UYJUp&v=y1dU! z+BuI*kgs(u3LwE1#OiEA2YV-P1?WOy#fiLTtzn?f$N5HoMKE0wNUeV$W0mHNYOA=a zcGcPN66G9(Zr^-`QKwS$j6i}jXZ+_u&DVh;VL4@jX%3-W(x9zE$UM@N4c&~L<0CiM zG3S`7EpJD!Zxf=NR%2AJ<+vHP`;TOC}msF zZRTQkNs1I)$UhB|Y{8q!FFIhk*yu2zw%ga8pDGesPPk<@C{K8gJ1d4x<>2nzMk$u( zqG~+9u){YTq7`(zkRJ@rB=Wb}fHtHTIxG_)P%5C6U$ftpfqbNt$SG zOZGB!!B!9hMEkY!_t%rHMS57w3M$A7jg2A{6eOzsgnQ1NL3ZeD#v@ZEGcg~|BGgR1 z?uRcoj^^WxnhI-#&^r1`qU;4^<|0SJ6l0L$E0B?e80%d8HJ-AyU?}aiEs@_^Mge&3sdAuzrTq=xZ*`6;B5Xa{hF7 zvqQ4W;ct}mW`gOH`-t3k6CV5O?FAvoh&3!9l>*?KYeh?_J^;zy*40ZH2$@6o%)Atx z#_;8r^GSX!5)zredmg9kKdrk1;u$)y+>O{6)W{!-&$`rm$*n*l*&!-J8BP7`BUcIv5`)9N@}zlI9wu0s3|L>U5hn+(rE zF}&>_qka-gxy{f12|3p_)5jpKK=!n(?&a?5K>c`))c239=UOV+|!D9&@Snw=Z{(wY8O4#qz?}p=ukHc^Y1& z8H?8AaLU#R7ISb6;neo&6Es3GR*6O0RFS6*RW#U4ZXT*j&kSql3RV>xzRg0T_J=j; z%>02+@{_7Sg7DNe>sx4iVSg9Xplo&Hnq0L zS!V|po6t_Ig$11Pm9aIB>mi>XOfKN^5Q=r9_cc?@b>;Y8GvfS$;tY_4BTa>zSWY!B zy`HTj-)PF+bN_thG7?h}g!N03JGKR<%b#_0chnG@GPx?}kr8u^KvU#28ZAgaDg#rR z4`Y&(oafw6%vki-fkR{UxocEU}Kd39~ zXIV}TB4_OGScejCMu)oWrFCE6x850ITDHja{Dl5t4C$T*-+XD=G zubP|7xk(nYK@d2yg~?kF>1fBaoTqF z_RPd*-|Ml)HZ-A2(;G(7H28Na*De_DiOXJOJYOg1Q@)fw561smSS?{l;Pu!)x46q@ zl-yizeH}G+-il+g4M#KUQhWz@-m-i1gSxg}?dHB#8E2dmznRyyiC^o94MP_LDUH&H z`&qoidLz#^+#zcxunrXQd5qwm=3aJf&^JwxPbu04@hkQr%v+D=-Q3S)Cb+evYil3m zeCqs4(%p-kYAgMPFTP5{Eo}XBrxpfyKuA;$V;j15TCli4 zdi{K_%*RYkW@S6E^h`>i&!mO${@mbT`wWS#I$61`Zl&%9mFMod0{!B`SvPxuabsti z=V*$Qn|zOUImyR$zY$3&tRyp_Rl5wCuvuX8eqE@4@pj<&gK_^SN2!}RHPD-E<+`0k z`!Li=#S-2(r*nDQh?AT640_*>Z@I&jzSevC6r1>mEH}ldF-2d*BMv^@s|ZZr+NsIw z>$Oyw7F1~PeMdvT;v2FwUe1wrk~xlb#wb8 zb+Y?~eWUc1dHa5?srj%ib@j;4L$91KP+GE+4XulB6YI?q51N*dcIR$tQ;WnmamDnG z-b!gV9QvJ9S$z@4@AVhy8_Fe7QS67B?8mnv&@K?5f$@*oD_e^?l&3M7m3|)L^t4B5 z)bh{sxR>q&3}g=a0ziYtn_J4Rf|A#k;qb*WQy)ucVl4YedOibDmTg72)W+-ig&P

zTP4frB@U9(&l%X%ThrbUbW3vSda3CqfVtq1Ym$S+t}zdrc^F#ooVe?q-<%)~ z_IVHq-ud|3)t~W*yZPd^4G1rg<-A6=u`>RK%QLHohWqrPJFj#-Q zNNJl`OKC9bWD@V8y2)xh+{w#r!&JTeC27!=cGDY{9zmqkSmpCVYEg+Q8K9hn6OBGE zq4i=U6AJWNRD4&{|s?Q&9Rh!}@WIV@FVMewZS@U@vRtBq9@21Jp zlve_!ML#E!=4l-kgNIeCd~8W7mu-i&3@%tSS4d!;=@ zuP~u;tI_%s%cA*2D;>`~_LJpU$?$sCCFqRb2rwyaYsnmsI%1Z>IWQMI;RQN#l`a7suS58=lvL?E!G6mW&zP@2}bQz^P=Xp)O7b-2Hg?A zWD`{6`$fVSm<}GS*eG30k{RTNhoeaFI`RifXdKKxX3UN4WgXK@mE9%(xC&{nv90AS zbn2=XSF6&7CAU;ko;!p$?=Xx}+LWOw$*!lzNPPW6>$QR4+Q2frq1d_G4qy4(a*|XWL0Ajlx=a-@tN_S zL`()6UY5h1x<#rk9O)xNMSTY907B-Mhv?;Q{kqkU@yAs)Z{jQ|^xAxf|7j#`>jL*= znf@}cDiD)|BAk?TfQ!}w3fAIQ8#hdS@P4ln&q>7ccHI)6Jrz{J33nK@%C8QObc0Ns z{oN_p{NJLSpUE1mVtQQ1F1eA&d&0qw8K zsCeWY)<`2(8IA&dBY&cH77);Ww6ndqps4jO)oeykU=GOcZl|`qwUZFGy3zVH>8Y@B z$^q^M`7_`ZsPd9_tSFe5wX*_~7TY4cJP-sK>HO>}ZfR4~?tGvE60(&4^iMt$0`d}0 za_S=C2qN;Mg7}N9 z`Mo(A%ka?l(S06`DPBAAeU+CU*+MqdpzIE2pv?J4kW2AxHEWt+LJ*TQh?~|W>3mTF z0D@KXz4B~2OV;`Q1&(J?TF^g&1QPY-0J&_gK4W@(_HG{%NZaE;Xg>Z7OSo}A{{>-8 zDfKs14HT24b@pNlaO-W}+XR#&LzaO{&Hm%O{R@3wuC! zwz@{?pKTrUf|RubOTD3P_A>i`jSSs2rkYc8u8a98E&n}o45<+Fp+c( zfPAg5R33J36dP>p8Hjxl*~24^{O3O5t~Ao66{S3Ere}G};t-(Jf#kIReVR%{UfxDa z27$;$UAY7EzoJYp2JIKsPSh3gMJ2c=s=xmz{~>sV8(RDgidtb7#}q2aijDx>gTh6k z3~n>}BTb;I~{X&Z1TtX(eotQKITfb>t%?k$nZUby0<K_AQ4#^Rds0X6oZ41C2+ZI7U`ksjl_2$lbq+b7;>YR}NEJQ31rz|1j#e;2?t*z}n z0q=REEO5l-6t#3vbNP~{h1kOOQ7j6$>-Nu<$f0SihBUP`k6SW-W`(3-)2 zQIcQo!LOI{xUt+cilxGRVnkto=k3NVvt+%H^xaI@tnqZVvIlwx zif!#|ZA1J{xk^-NJ&oNNw0yH1Q`4gY%d z$BuyeYobAUg`dmT$d@ItODOd+Dk|K#?MQB>*+@H~@D<;>$as;udVdlt?dWx~AJ7gY zNo!vbD6nuSKAp!E((NZ-F^Z4Ip!)~l0UUJ}NC%2fNQ`8trmx)Wh1Hm*@r_AS#Dq^i zr1mG9Z*7YlsF<5ex&$q20L90HWBVnn@5z!|UpUIX+H;m4!r}a*l-b}W09>zr?^UtQ zpz+&=xGA2Yo-G)Z|BOw_C4UO7L zVeN744NMukTboXE4_(rr>CWbq)S13Fs-04aI|VBgJ<^A*s5* zmjy0$)K#8Kxvt$cV(Q;@vltc;usCMEq*LGSrV5K=F?t|jF&X2>vN!j-W6~m$RRaV) z5_Elhg?ZdL^aWGk9vf2WcWE7b`Bw@=q!fa5P99I~hzPIWut{S9Nr3*{(@G9Ad zD5UWc&EBGO**Z6Hn=7$L5>WY_&ApcZTsar%#~=T(*lh25+Re?lmR!4{n)0A|Cn9O6 z&tZ!1KYk@I;?VoRVx~9>sJ1pLCROq=wj+@>86auysE|4F%z^RxU~S z+{El`H5S3*%WzH>FXmtJ;_OvskDBj(zxs)Lz7MUm?H(pfTBGZ#=EgRUflxOWQNW2&t^Ur{~08$%w}4y0AL&e%810RTm^&^4m6^ zRPx}dy?bA%UKZzl<0K&=_J0N5f>KxA!2H@it#UA-t?zw=@}*yT>%PO`aWHRa6s2b&>jbjT719Ut;6 zEf*$jMI{D@BFco#PAB$jtP7N@gHk=uAccelr$}D;mbXF(SXj)6YL$+}86dPFN?fC~N^Cu9(bT?>WT7$%{`!jt>_9Vsdi^x<{8z4wJ%#CwMqi@Wbvlwpe_8fiEh$V z*1bc6V>1J3il=VX-zNb|t`x1;I3x!=!!+d^z(MET@HWYoA&-wQ6fUY22HXaWa-9Tg8NxdPEXJG{U{m9(HOO7 zU3&Zb$A{$fqGM7lHtE0gKLb1y>y}?8aZ}Tl08pK!yFo4c$F`s~s8F(rcovokU2|qv zJNv4?_w@CRY-)!Lm7Tui%z?UbB+i>zOuvzvp_fPQ*c2&z0{8bxo zZ$4-$Kfm4kS9JO6DPhXz0U@{Su+Iq!pkPy+P(Ln@V499s)N?u+Zz7BD*aMIE6)Kvv~O5w=99))l(ez17MM zhee8uijuC(>eKz9?a4E7ahcO_BC+l*9O*oh9>uH8BfpDYGev~<{x`7#JH?}1{>DNU9zIL%`-v^z5aNMHtT~_BtwY0d$Rk~KSOE*@FxuH!5g$xhC z5ieF@OtEo0i5R{pX?ED*t0q79Zp0Jc{X3fv#7j8D7vo7-JS7XADj3 zT#ow_T!cswNm0_Hm$L6OJEfCXBusZI>VfM@<1}7)Fkp<6`Q3~8bR_FMejxdtXx-0W zoj*5ay7YCu=xlgX0C37X1JBaN3SlH-&DImo$vt{z`N55y0)u%#(GsXC7yh?43Ov)` z6TD+T65o;rZg$uuZ=vM7&!iIxSCFFSg!l3`+$nboR5n!wLM=V>l=IP){ zP=;aQe~`4MZBgw}j_}e|Y@;~^c(M|ga|O>VcalF@4NxB`?eLT}3)>ziZ-~m7o4Tlt z1NGuBvz`|=C5k}D$Y1cY@ByBtYMwi1&>XF+RZ=>M#6ZGl6>q%QJ9iwfp<_jj{I6-ithcGx|_1|*Nq40Aa3fCp4Ur@8ADH?8UaUY55v4-D{h33K^n zQbW!)i?a7EGQMK#15}mACav2u^Pl;B#I=YoX)1N~{nn%)4Xe*HErEU|Ew!@@fEPEZ zA`1P-pTAEx)Mr6zZb}25POBHInjcI1F&t2niV-a{$*TO;!BC0&FAauhlQC8eXMkJ+S=hs`G+lOxp#N& z+Wt#DuF56z=?2u3brlxOJBonLq?*bf0RMYTAGnzhXa?-ndl}k z4uJDtNCzq(;F45)3t^F4inKBmD{f_Z%k42y2O;NP-?M4%9hl%av)&p4FqiECqPY)R z-=hY++_oWdHnLOBD6RhWRLMj`BsJg2u%qBuf=Z42xd77U!MR4AW2Dbc>@L!2ypYQZ zFz)|{skaQOs|%Kf!@&s>Ji(m=cXxMpcemg!!JR;GclY4#?(P=c-Qn9j_uhKHDk?ux zhke#wGHa%%yBQuEb1-^=&}INqxLEf1gCh2449lmpCQ^=s|LvuJtkwyso%w4x(@{w@ z8ZL&hG!B#VHd6m+XT)4fa?O;e->e~RJ$RasaG@0xJOl72a zkq`CL|3;klFE9v*${pdE3*gr0RVAE20^-8^t;h+R^*P7==sQtNTxuyjY603~K;j3P z@`lgWhPOsj*ZN@`oKzm-|IKhEgh4l@`D{FXiL8Hk8AXH5MzQxR^Z}n%Yo$O|MjQl- z)pGZ826=MhE_J9WyGIQlB)~K+EL&2S5taF0Y7-zs{Glg<$8@>OZz11Qt$f-|Ix^?8 zNta)c|I7e?#1Yx~Ff{WgKHe*Z+w-5%2czO{{cn109h;3ZyX2PR|L+LEI+o7JZ|J-h zQ>cdgX3st9#rK{Lq2Gy594ISkKl0x`5|`k~DV{OKaDjQo0rD*MC>hBS@db~O;6J$# zGXKYk1n%AZPTc*~B3bvgGP<4h@v;*ugtse8>CCv;SZDo&=KD|BW^I>{M60JPlf^wv2{C zz|SZCQT%C1O>ZZ`TBF)MecaZgA~KicZ|uiW%2Oc6y}z3V8y=hBK2%))f2Vv=`~wJx z>@eB9%yT#ln|m_rl#7+&bW)(NPC`Z4{dd9WLN64x)Q3L7;5c`)=1}+D#`xR#KeYem zSoec#`|WdAu=@Saf#H4toc|hU%6az*BnQ&k~Gec{-U^RR%Oe zYQcO!e}*=N#ju_^I|jcydzb-+goMnz|D>t;s7A+_EmiRZs0q}E*9V73Oa!tOQht8u zv4JYcf&bnDIbNB#rsPsfIKDeaY3eHlCOVc|w}bFb8+*XnfrIdIlYv>lrMmDj^jPhj z;<*u7=IlwfXoEr5?*@ty?WVm@eGvY-?r4@r!J7 zM*u@*Qsmcb++)F~8gMSPg^B)uvf8umVw#O)oQ)BDR zZI8fCrNcR&(k!?NaVL3pHX^KuyFS#H8!$$ysCIU0-D#DH@Zh1<2~c} zO*6y~ZYD_cqgwpXy#d*h18#_Y<4KLt4$igRlu# zj~Dn}DxaVi;TL2Detc}ne8&>E4CS?qwr6I&MX}^#ff{yAg26`n*9YEr*+}ep7iU2b zn>)&cg5%o(EG+7KHn&gJi9lX7Zl-Q{YHyD(ccWl^){l zT0-kcqeioKYWV=-j$1H*=}vf}cmN8uzo5OzmyhCNtw>}3E#7kecw}nFNQc_cA($^t z1mSj(cWl>gG4130cI#-mnYEq0J#O?z9%>QL5Pk~==)U2Qqg&Pc%9h3TbK~;ZJNjg) zd+|^#6EH~)j%6IJ{H2K2lNLMGgg;B^f1uQIxQiqztbVtv0K8E6z1FMFu31*@uSeOR zyq6uxknQzNH@u$9j~3q!(5*39Cg!AxE~)tMQ-=07yxp}d5p5~Drf@#w6pfOdX$bZ4 zztu7TP1!OgPYJdv#-b;=p3XOI2iM$$zREeco$6^ZkumY#0PMxr+$>Mqwt5O12mwjS z$}0PD*9uFj^6e=2l_*mj2m0`qP0AIN{M5jVb4|z^C^$(fejhzo{YA_U0i-f^?R}z}2?hK;9rN|LEuM<(bq~^;L8X!b2(lqXnKJFY4JZRT7&rvpfPO-WM9BW`I0R~MBQ>W8$3`*7lG|5q4X8d;j#1V83v z?K49+^x|>cCaEKL&yh|Q^$Lxs5eI`SBNjmZ34(~2_-0!%nu4Ol;M3oEZfTNBE=gTP zo##j%_1j(bC<9g?3~W+?ITS3})NvjGO0BsiF_tFY8TD6}db2V8#?KKDj%ROuDGj#8 z07Z~z<;RIAKyHnv>{a`pOS-SsxrYn^`?j2cQQfJNKK;Ot&qHTbnN`=P4q74yMi*$W zVi2dtBJuCII7K=+0+O^x)G^)hokkie0knMnf5i$cL}slCIIL#1>1` zJuuDYGa%>Tn|G<>u8}Vi`D%wFnf^|24kQ|-u$#7%Nj=IxK0dy|g}T3zd_h6UdFOhh zRj%w$1NT1qrJyRgtq#BRLAqU}=0$UWX!%Irp5c-tlO0Rf_!F5AY)I0yqu;YkHbO#2 zF+m;*_s0ODA31=t!!uRhUKGpmI2xU4 z1G8z9u|v>D!{O6%T0vB#CanO4R?Wg_Y zx$L%hjJc!%f9W(BrU=C^7Iqb&&o_6Rp7uXQ@=M49hzIh9*-U~pDQ9x77UdVCm(=@S z!TS<<|JUd$VYzNzGCB?*_?04J>UO`A2t+$#^Gg^@ zJ<`2j-)(FJr`JQ7n7MfhdvI#@c3FUOa z9EvdQKlZ6^eCHRg^(cIeOwwDLnw^vLAW@3W;eUqbLTt;S-Ycy+_WkgsI z9(v=EgI~{dW@RdX1c?U6}PHg-$pWlj2J3pq=A(}6>i%6U}*XQRS zKud^Krb*R9aVKrcK?rEZRiK8z6lYmR;y2sy?n5z06`wcXO%dF~0o|mTqDWNcu0~8I z>flh_)s>lbb9F#qjd1YVJYG6KU7~j!m5#;b`B!0Px>b=dzgZ>1b%0OUl19m|u4^$Db+71ueO;KiM2J zA!y&112H!U(r*XkW91y5(XmN*jCXf(f`jnxUZzs6?c>Qy`{jFdXXJuT@p_^ott@id zF{GcbEEnL<;5e4oK?#UsFkOEDO4u(C+F4HVCe8P)9YvT~r#`r(xI!RL@&af*89E>_kx2%^q>rJ_#==$_)U4 zrMsql)=O38jH`Y8Tp6%|i3mvD6kwR>&bD4mS2~UWB_UdG?Dzbb9l3_jMqe%cq88cs zbt~RwirGiCj_%%AR!n7bOk{|ZSW61#R)N~utT*X$cxVVVU~fi*7e* z#{+JSbHr%!?pSHI)ft+Zc779-?p?vCu_9aqnas0WL4i!BvGn(U;}|m(EiiU-Gc?>k znWB89xfIJw(_N0moJ-o=1I&OJUJcsn(tirChWd~(=K)&#C~Igx;!VpBX-hxtua4<| zrybvc^nYPaF%uK=iRGwRwT0VUIxitE&QfdlMP_eKh6SjGI@>bZBy?bzeD4IXFD1cD8gKKRFP$Kbw#~$FIq8qa5<0Jxi zXZ5}z6+l$`F9N{ock}uet37AIt!-6fF3ABr)jv3Tejax<^SA{ss~{HUe=eZMs>^d% zxsTPPg@Ksm&WNiYBRIV2P7EPJwyWg>EL4t`#*s=?`i^XD$gBlBkwGQ~4uUfybEP_} zZ5;+7@gK6-R3C_6{=WcKR-u!+e|Y()y8+x;-)v$hHo_@hFnLPAM*>Jp%Hm5GiUnI( z`f&PaY~dhA(PgjOW3b6KO1X=l+YZH-fUFh8&jMNbMr!{#`kik#)?^AELW{JD%_d$) zdsVkZ;jXDfTgEJ+N#$~KWL-XdII`Ss!FsVQJGcKkBjX6{7OJ5y98;05sw}ssk8l0@ z`xxS#4@`UL2e(6?+}w8slBQ@*#_-8Ihf{N-m(CU6 z+4=Qg`RT2>Yani1-C^I-w^|EMyby`guVk2{%434Zda<=mYTsVr5fZc=R>%&&UvG{y zl9uHA!7yNp;~N{aaL*p;aQwOUdE5~u6Hr@AL(b!@=V4;DR|2+ER#@4b-A5WN{yayI zIe>A-pTx{cTXLx>+s_y+xj+9B5kQQaPe~!YZlr@vskAUN5LCF*uvMky&Dd;kZS!}U zfEJkAl?*H2{^ZS=yb7?v{88F$wV=MejmJN%EPosPM@TA6x%<M%nITOZG^B2=)J&qy%m2|ysDSC)g-dZ_?_)x@R`OLP!h`>8aWL_)=f{1)tZ8y0Uv z_Y;o?9+Q)f0P(gBXsf?XT-Nc0*K76ISUI}PqTwP08t`Eu_=1a(&r0jQ+^BFLGWsvH z{03AgsAgZaReLI2Rb9T`QzTo004<(x3*_764P0d7wik1x^}$(?d!y57X=Z8Y0)hg< zPNKsjB;?cCb1@dTP3%XjTnn|2a1-CpEj)pOF?`p@v-td|*I`y^3BlmUQnAbm~}FHH8l1Ej`1q%F0L*s0pZv@{-)=mOp4_@mH> zxW&m1jU4~R*AZ7$l1JW0Sz~2cHeef_?Xz!I;kDVfWB@$&Q6?@0xQr4&`d!)clgqqy zjq?eY$bcWsgN)v6f2g}pA0_~I-D>9}77yV-UO5&%-xMY+s3YUci2a@4U-j`7Pr;cE z3{aQ&ufpyt#8d8uAzOK-A7OkFWPSSS_HU3oKWh?q%by4Xg(R%mY!heArV;` zuU@~sI{7P;mlVK7=&s79Jk_>8?Q!nzF`z9$zbNU0`%$krn@#9kLFqaMQliQ_C=db^ zEf}efP8GK~RlEUB_7@YX)b0;_AWgip_5C@J=6$+09bc*Fl4G*I6zg^t#!yKN$ghn} z_ss@Xb8i7$#jl^w19|dfqw(l4ywdL&WdeXa0Vp@0_M`|LFrXll8&YdH&&{AcayBeR z`(T7+<$)UN8$~`CiU6$p6Kgj|j^=lvsgf3NM*XfkQrSrG>R@;$tB zI^Ob6LV`|$B6}eks6vvfV~I-`vLF9r@Khg4YV*b2^CFM*albh`4WQh@L#892gAKUl z8KZ1@^=Qv)nP}^?Uup8FTtDRX%?`qQ#E=hBgaoKLOt$orrLHaSTJf$0dwG__ce<_C zB9DOe4kMVuuNYcdAKftn>?JCOZUB2DhXpLZG<#@$RDpo;FRw}x#}e?>iEMjP1UyR) zXb%#;sk-sJynM!Gk5$-aVEY2r05_W6q4xNw)p}*}-b``%;{EKHeCz_8Qocuf+R3Bg6KH?H-p^l=a|7Thc3BtDb_GANBbNkwHceJSqVZ=A!!BRuAnjO*(& zdlMfylySj?sDc8s*~9nK#l8v2@dNIho4U@YNKHpJLixFp8njf_6K#h+hm!>S)-A#0 z|7ITWk^*$MlGEn3-h?=SkSw|4c-H`IICixB$~et%|_%5@sL;;pY;a&aI2Cw-b(GK2chp8;o~_ zCC`V6$UJ%~vSGjFHWDv=XpFAAzeGCK#R@2B#Xa{OcsLD5l>z`pdGrJ^022WP+E+3! z$xdwBNg}jiAs~hT-X@37aVy5BrTo^dg&ui&zfDI`%`RzrditZ0L#FWW> zVzXo-&G2s>46CJieg0dYEMA3o+4y+e3!0M94&wh0|Dj`n+@d9 zkOGQc%OaxW8AIwnQkqi513jN2vl$>fNhb4EJiNRQE$5pZcuHa|0QkrcC=6)W>&tXIb{Q-vVqN@FM47|GjJgf?1nn|#E z(0d)6&ImZNItci?0@B`b%mbamS|B%G<%>!AM&?0YRrJsS0^tH9_(KwbXW8p%wl zGLv@R*%s_&&kdW&SngWS_0=d#w125UN=R7=NBq@ zs87iC)=eL!_Ms!*p$=2W;@Yq_Bc&@ReVVz-^oX~lCkAIRiQA|8$28kC$ODPL6oK}z z8V?V@m8j7($iZ?g+YG!pvI4n$w1C{#|3ED%j*X+YvJVd*Y?!)_Cb;nzy14N|&W%b> z!{i2AR@ondu%^7b=EO~}4&j#N;5$gT^ZWgi%l?z`F*(M-N#S5h6D_SAix(EW&BIjpf!o_S0VzT z-@icH$~utN$jcNuyLEq5E+4?_ho@#Okn6HTAko%CAmQ_U!HD6&KwzkZfa3UzfXoAL z?fxjm7Qc1X+1YLg z++h}Ho9PBvo=-hwU0q#$4PzvPSZ5!EH`N2|KCPCJQScp2!imqe($aR*?oG#QWx)YG z>;r*c_HS5M%U(&GnL~dk$waZvOjt2gL~%>Y^&dfBm`sk**AX-oHfA8xS$ms*W!kI< zMYFzy^P3uG)lk7Q`F6hfTisfHVkspm`OHP;z{#0MhDq5(~pMNETE{HQ^* z#%$%Jz|4R_!~8Xy7ibtSy!lm5xU!}#a-_lG-&dm$AFr%-{l;-JxH|Jio=OlzGARa9 z-@yCjdf!w28$t=w)rNL)td0{~{g6rqBrTn#>Pq#-^yFfYKAu&;68I$U3%sc{1gLjW z%G|Ap$J&D}eicEGE<`8h6Ko70F2pZp>Pyqh9O>r!xd!p_ zJRhuEPOf#+5}M;;{OilTOqJY=)xf8)D=yd=-&9z!@{Cn1Q9fnA{l}~Dhx&uyez(zS z;CrP-vf9*6Ue=~0CsnZLjacO9VS&fHruZ`PPjcpB=4#{Kx2yOOF4|2w@wnXbS2 zZ)}~;o$pvIG0Ub(dI67Mf${V>sQRkw)zkltj9miw4pWi0g&3#>2f#B;4&P61s{04G zs}o|RQs(8~BnUBI2rTiTW75WKlgoiL@C19#=gzLGtQ^@<@e0lG_F6~tiFt2}9GDuHFKicU z_v`v066JEzo9cGARQ6$y3H+AWo2cgh{N_xar4i}ezr(Ib7q268Yn;$_>~!5m(z*}x4(CR5v2I?2?*g& z^*Lu8m|5bD%tDyRk^Z+4nEhl~ZH1Mc>Qq<6c7P9#LU@0%Jd)U{Zeo|^L)W%$*gtn( zXG{RBc+40;@`Sh-^C5|Z)EVQ_(hwFguYJ6B7h0shdV5pj4?@I|r1$_kP&9Nmwf89* zE%d;=M-ED1+b(^iaUm|%F?q$^nRzmzi)(cxgT9h`Hh*i>%R&tly97RE<@k!0Q|s5A zbn2t~$77GQ3phSq^p^q3lPqN5O>a?S65!MlZZxY^OjDm28G{p%i#ogh8oRP?n5n=& ztx6K`e=N29XCtUUtG92gMB!Pp$1nZ~T3t!*XZI~*=8qbo!Cl{h60&`?pyI#AU zh{3LxPAMuo8@D#Q|OfSdDi605zZ0pAem+G5)AsfX;Y- zGmoB;ss1?6GhdSCJQ&W-7;4P_D3%VuqFL!ixLG=&xnp|&#SuKRB2+fo2Ltx2U+3Rv zGNNV&G&f*4MZUhXYb^U}6>wCyG^lMn7ps>uK5gM&%L&0ys>Jp5g4nC>(3Ng3>@{Et9J^=o_#3FeQt|081p1x{pY8%lU=?*BeD zim#=9%k{u-$ZS5M){j#(s!6=_8UitV$=cG=lDkr^537yi;^k@7d$rL`u+P<;1NMQ( zZ*MGRCpvT@$7`g%{hW#$4Fc}sX|_pjl$6PpP-XnvHUkH`vGMoPBEG-}%M%rOLZf)` znww1KNc029UG1TP&#T$67!XglhmrKesMHE>Vjz-DYlw>QjUq$xtJX29%KCxQLZ3x9 zlS9l!Vge+!Pc4)^vuJv2@6TUN9VLg9w(X5Q zxR}m=_AaB8&*=JTpSMMNVde*#(&RdAK+~HF$oltWY#GY+Bhix4nXjt-OCKL7#{b;9 zD3KxpBC$IN#<@A1^C!R|nLH_2#2G!FvRbgDu-h-3kyqE;m2Xo5KD5c^w?ef2+j+q< zMuWTQ5#+~EmdcDZB1Md|9aHZ>jRG%keCOdn_pI%vX$rr-{PaUanC-~p+j@)7UxTKE zziXL9*+kg1GU<`A*k z=hFRw){)L?%tMn*tQ2~@J=U=%k0b{3A)9Pg{+`hKLe(5A-nIq{NqH?fTV3s!bI#VOj{~LKmc3k+9{+<3Yye z4(V#W*>pV0BkHBcgF@g(MsV@V%r6Y?a1tV=cpAX&^Mcxc(b5^NYXmOm1>$f0^eA@^ zOLM|CGC2F|Hu%RlR6HdpFnpui^0O(SRszlGUY?iljx&_GNe3%tIEy+&$j@Te=`=FA%PMYGxD|v$bSYN(O(NE)2dHDSw*u@_eLQU?CC2ezi30t8F9p( zE9q_Q*ChM)6zV6v@-*dS9X||~Z??O`z#ptY69=`}y!>_ND$FOz!UJvK^AzA2rYQ07n%@pP@v;^W#-%vQgv0K>1?7~IA(oUn0 zDtl@`!?erxjPZp2QGmQy#uI#fL5CHxr^$8;7dD~ZAq|zc>bFn*c{Kgwb>Va+rf7c+ zlHnpn!b1)qM%C{~r!h!=M2@QkL=KGE*HsH<4gS7Gmr0RL9iB(?w4`63v!mbz7qt@3 zFcz)m$1om{7B6l%t`bkKD(dna6=*CJ0Nu-CMMwQcyf;i=rXwQ!TH!qNA?x167$0Q`cF5C@kYf=LiOMrlhJ3 zV}pf-0X>WGIzvj}Xl}lQV6Xi8I_<6bRax^N&lAp^lTJ!fOx!`=mrIhloYZoiq(~p^ zp@ASFvf>av-vj51gNWko-B8I6Cki4yMe)uS*t8BiWMNENw}#(32I;C$8M>Kk=cKM? zP{1ug>bHUTO1cbDS0lAoJ%LOos<_9!W%OL{4Bi|>C?>Gnzkf0c!VdHPF?^Yz!eMb0 zlR<{G@B0VxKKJa75Fyr7RyAyR)i>9;p9H}MJJ;+w;I?s0;bh&&tQ~Evi{2kv5RcfW z>9|ooX-jcb?b#=YPdSkRf%xde#FA=Vj7Nn2MTyyOTppL+d{w*T&aXetmlpNm4W?y< zL!kqhY?H8C&Zgf$nu+fxu6^EJG~UxXL8tK#3bZ#~x5u4L<^YSQSvO$(gyDJNF;mu5 z9{?3DUUsxrMkX?XYIPQThn0OIL%B>Ot4r5VAcF8UABN<*;Y2=ag^K$Z zb&adbQ)NaEntFs*jd|j9MVR3tNoqZ-$z3|4Q>`@UjrN=whcy{k zCi#URBDkz5#nLfoqT3SFZu=@aYH=KJ`~=~VeEGJDH-YFr4LCuU9Kw=p`IjFi6_{Q9 zA$v>?#^kNFnz9V3^GDv0UTT{+|3QlRb1WyuMt~%osZ>y!96kXuZ2Hkbb<~fX2#P>> zJwUw%asxf3kbq)zndW#s_16}+A+k@fmL6F1iaObsf_cV|W9$ zrOPl3s7>usd}sTdg$fB}5)Hxd2?!vA^g|y;L}@kIYn|6g%6M(CzM4C&6T^b}0e>N7 zIX9mnze}`DR4wBA<;s^wrh+Zhx@O6ooD6C55ayKo%at6n;R4}nfN)Og>Hd{XJs`;T zv+zeSxMV?Af$c!gj63nV~%sw7A@4{ zN3{o0-~Ql^{c%dgjgWsOzR|Jp*r9Rz_v1>^Izz!*JuNJB=ygphaN8@r(_c{md39R3 zQq416W#-Z4sFyzPog1Mvp~K|qdB6ES#^=ar=9}=C4YA$7McCC=w;AgzFa9c3$PDOk z#2t5pXVK^GKw*5(;LdCR{Vb;}$tRj8L^R%85~9m*o`2<*;J%A^ZZE`T^yy^1V^=i!(* z!jWjSh%;k~EGA!3l1&0XmU7MNk#hgC6pGZ@+pCd@_rN~`nFG4>WmB)O=0h`VE_d+t z)^C5nBovh+uy1v!DFwTdYi(w;yr*=~UC(}SWqIe^_(FJwbRK915wp7oAh`*tVo7H0 z&$3?3Gd-4Z#`a2aU0uL^73E`533k{mrLNi6JBK}HW~FAxF3`iDMxVLu&(?Jr@s*=0 zwZB&ro~mT=i7Ic&bC!BdaGxL;6t(P!$2aE6e_kcV<6`wTAIE33CNgNk$^C_lge9W4 zm<4fjxR$FQs6KoOF;*)uKd zaLnaRmVzeU=`NIJ>I5~t()h&q=rZt`76#h#JjPKc^=2K;_5E5Ui%Cd)sL96Ep`%$n zEuM*(h1pMSG~8cD+FmXmq4JNN$we7Rl&F)IB|wwzelib@N9@ zQd4>nX3}z2-@>boQi+6PU$RafOkG)|>tPDnlAG-kPMw&0r~oUD&ta({Z~9jd=DcvB z#X)>(Q#lmrsB2cw8ucX-hpS>)`Viec%X-s|Em$f^`C1}b^&%;OV}4`8ZMZh8jbMip zQ_@&2YKqoNoV`=i6%(pE-)R?0om+Zm9(jMN$8&sdIiQpahJu!Tyrb^tQB7~dAy z8}k+L8TZv48|FWiCZH5Et_FGpw_MW^vSnn1%)^Nt%=A7ZEJjqWz4ZEhG%B1{c*)vP zikZErf%wE3y7P7jb=5^IoQ;g2Zxe;dj7N6`TRyS5RMQc``eG;}C3$U>s5Wfze>gz% z`gu^`BB5tZsnd}lsm!fnm)g|wP$(BIVLhX5I!}j-F90|-q)gNKJ2J6k%mxO0}7+u7nF#wv>|TaIlc^I=sB@m|)@2zQtubO*gti#0xSD42h6c5?~b z2JT|?NPb_zw*J=XWQh|tnr?GQruQgn{cKkH;6|=0zV^4sD)IK$KR#GZqDZ-7i_XOd zpgj7*F2d}Pkdva?+H+q&vu`*=&95rkE&k7e=hG2oPoY0Kge0_VMAck1wU=yb?{Xft zA=6zW$@m8HRWrStf0l^)JRlB4dD8w{AfTgzY1?_;N%?y0di3vSSB;7)nOv0>DhACs z^!Ck=mOOM~z?q(7bN**2qz=JFqw_b)dokSS>05^rAv~0)TlwHFym|$~0M5*FLSRD=twRJ_K7;xuJ*q|>XV@k}^d7IqcbOxIAT z_?fcxBR0I+eWTY4ILJt?(9%^JOo`>llGmxBgIy$=EK_HcdRM2=(XAdvV_F*CpD

@rzMuso+`LV9^b2YPRK1hy0Q;xB0 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 z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + RNA-seq analysis pipeline for detection gene-fusions + rnafusion + + + + + + + + + + + + + + + + + + + + + + + + + From a8d9350bdd95f4b9bcfd7157e88808414ef1629a Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 12 Feb 2020 15:49:12 +0100 Subject: [PATCH 0089/1520] update CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43f9064c..4c00af1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a ## dev nfcore/rnafusion +### Added + +* Added social preview image [#107](https://github.com/nf-core/rnafusion/issues/107) + ## [1.1.0] nfcore/rnafusion - 2020/02/10 * Fusion gene detection tools: From e95e5f30294102dbb45398176107346a2f51e877 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 20 Feb 2020 09:50:13 +0100 Subject: [PATCH 0090/1520] fix: updated parameters (#106) --- download-references.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/download-references.nf b/download-references.nf index 52c9fc63..87fbcd4a 100644 --- a/download-references.nf +++ b/download-references.nf @@ -136,7 +136,7 @@ process download_star_fusion { file '*' script: - """ + """ 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 @@ -149,14 +149,14 @@ process download_star_fusion { 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/star-fusion_v1.6.0/ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625/AnnotFilterRuleLib/AnnotFilterRule.pm \\ --fusion_annot_lib CTAT_HumanFusionLib.dat.gz \\ - --annot_filter_rule AnnotFilterRule.pm \\ --pfam_db Pfam-A.hmm \\ --dfam_db homo_sapiens_dfam.hmm \\ - --human_gencode_filter \\ --CPU ${task.cpus} """ } From 24a4fafb188532d53906675bf497618148a8a271 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 20 Feb 2020 09:51:49 +0100 Subject: [PATCH 0091/1520] fix: dropping back from move to copy (#105) --- download-references.nf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/download-references.nf b/download-references.nf index 87fbcd4a..7ae14bf1 100644 --- a/download-references.nf +++ b/download-references.nf @@ -87,7 +87,7 @@ checkHostname() */ process download_base { - publishDir "${params.outdir}/", mode: 'move' + publishDir "${params.outdir}/", mode: 'copy' output: file "Homo_sapiens.GRCh38_r${params.reference_release}.all.fa" into fasta @@ -106,7 +106,7 @@ process download_base { } process download_arriba { - publishDir "${params.outdir}/arriba", mode: 'move' + publishDir "${params.outdir}/arriba", mode: 'copy' when: params.arriba || params.download_all @@ -123,7 +123,7 @@ process download_arriba { process download_star_fusion { label 'process_high' - publishDir "${params.outdir}/star-fusion", mode: 'move' + publishDir "${params.outdir}/star-fusion", mode: 'copy' when: params.star_fusion || params.download_all @@ -162,7 +162,7 @@ process download_star_fusion { } process download_fusioncatcher { - publishDir "${params.outdir}/fusioncatcher", mode: 'move' + publishDir "${params.outdir}/fusioncatcher", mode: 'copy' when: params.fusioncatcher || params.download_all @@ -182,7 +182,7 @@ process download_fusioncatcher { } process download_ericscript { - publishDir "${params.outdir}/ericscript", mode: 'move' + publishDir "${params.outdir}/ericscript", mode: 'copy' when: params.ericscript || params.download_all @@ -201,7 +201,7 @@ process download_ericscript { } process download_databases { - publishDir "${params.outdir}/databases", mode: 'move' + publishDir "${params.outdir}/databases", mode: 'copy' output: file '*' From 76b6e188dfbd28c47d76f68c1757003c8fb0f8ad Mon Sep 17 00:00:00 2001 From: runner Date: Thu, 20 Feb 2020 15:33:15 +0000 Subject: [PATCH 0092/1520] Template update for nf-core/tools version 1.9 --- .github/CONTRIBUTING.md | 52 ++- .github/ISSUE_TEMPLATE/bug_report.md | 43 ++- .github/ISSUE_TEMPLATE/feature_request.md | 18 +- .github/PULL_REQUEST_TEMPLATE.md | 28 +- .github/markdownlint.yml | 4 - .github/workflows/branch.yml | 16 + .github/workflows/ci.yml | 30 ++ .github/workflows/linting.yml | 50 +++ .gitignore | 3 +- .travis.yml | 42 -- CHANGELOG.md | 14 +- CODE_OF_CONDUCT.md | 2 +- Dockerfile | 14 +- LICENSE | 2 +- README.md | 55 ++- assets/email_template.html | 2 + assets/email_template.txt | 12 +- assets/multiqc_config.yaml | 4 +- assets/nf-core-rnafusion_logo.png | Bin 0 -> 12597 bytes assets/sendmail_template.txt | 17 + bin/markdown_to_html.py | 100 +++++ bin/markdown_to_html.r | 51 --- bin/scrape_software_versions.py | 15 +- conf/awsbatch.config | 18 - conf/base.config | 37 +- conf/igenomes.config | 451 +++++++++++++++++----- conf/test.config | 7 +- docs/images/nf-core-rnafusion_logo.png | Bin 0 -> 21334 bytes docs/output.md | 4 +- docs/usage.md | 95 +++-- environment.yml | 10 +- main.nf | 278 +++++++------ nextflow.config | 58 ++- 33 files changed, 1053 insertions(+), 479 deletions(-) create mode 100644 .github/workflows/branch.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/linting.yml delete mode 100644 .travis.yml create mode 100644 assets/nf-core-rnafusion_logo.png create mode 100755 bin/markdown_to_html.py delete mode 100755 bin/markdown_to_html.r delete mode 100644 conf/awsbatch.config create mode 100644 docs/images/nf-core-rnafusion_logo.png diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 6a5ef862..260f8fd6 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,47 +1,57 @@ # nf-core/rnafusion: Contributing Guidelines -Hi there! Many thanks for taking an interest in improving nf-core/rnafusion. +Hi there! +Many thanks for taking an interest in improving nf-core/rnafusion. -We try to manage the required tasks for nf-core/rnafusion using GitHub issues, you probably came to this page when creating one. Please use the pre-filled template to save time. - -However, don't be put off by this template - other more general issues and suggestions are welcome! Contributions to the code are even more welcome ;) - -> If you need help using or modifying nf-core/rnafusion then the best place to ask is on the pipeline channel on [Slack](https://nf-core-invite.herokuapp.com/). +We try to manage the required tasks for nf-core/rnafusion using GitHub issues, you probably came to this page when creating one. +Please use the pre-filled template to save time. +However, don't be put off by this template - other more general issues and suggestions are welcome! +Contributions to the code are even more welcome ;) +> If you need help using or modifying nf-core/rnafusion then the best place to ask is on the nf-core Slack [#rnafusion](https://nfcore.slack.com/channels/rnafusion) channel ([join our Slack here](https://nf-co.re/join/slack)). ## Contribution workflow -If you'd like to write some code for nf-core/rnafusion, the standard workflow -is as follows: -1. Check that there isn't already an issue about your idea in the - [nf-core/rnafusion issues](https://github.com/nf-core/rnafusion/issues) to avoid - duplicating work. +If you'd like to write some code for nf-core/rnafusion, the standard workflow is as follows: + +1. Check that there isn't already an issue about your idea in the [nf-core/rnafusion issues](https://github.com/nf-core/rnafusion/issues) to avoid duplicating work * If there isn't one already, please create one so that others know you're working on this -2. Fork the [nf-core/rnafusion repository](https://github.com/nf-core/rnafusion) to your GitHub account +2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/rnafusion repository](https://github.com/nf-core/rnafusion) to your GitHub account 3. Make the necessary changes / additions within your forked repository -4. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged. - -If you're not used to this workflow with git, you can start with some [basic docs from GitHub](https://help.github.com/articles/fork-a-repo/) or even their [excellent interactive tutorial](https://try.github.io/). +4. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged +If you're not used to this workflow with git, you can start with some [docs from GitHub](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or even their [excellent `git` resources](https://try.github.io/). ## Tests -When you create a pull request with changes, [Travis CI](https://travis-ci.org/) will run automatic tests. + +When you create a pull request with changes, [GitHub Actions](https://github.com/features/actions) will run automatic tests. Typically, pull-requests are only fully reviewed when these tests are passing, though of course we can help out before then. There are typically two types of tests that run: ### Lint Tests -The nf-core has a [set of guidelines](http://nf-co.re/guidelines) which all pipelines must adhere to. + +`nf-core` has a [set of guidelines](https://nf-co.re/developers/guidelines) which all pipelines must adhere to. To enforce these and ensure that all pipelines stay in sync, we have developed a helper tool which runs checks on the pipeline code. This is in the [nf-core/tools repository](https://github.com/nf-core/tools) and once installed can be run locally with the `nf-core lint ` command. If any failures or warnings are encountered, please follow the listed URL for more documentation. ### Pipeline Tests -Each nf-core pipeline should be set up with a minimal set of test-data. -Travis CI then runs the pipeline on this data to ensure that it exists successfully. + +Each `nf-core` pipeline should be set up with a minimal set of test-data. +`GitHub Actions` then runs the pipeline on this data to ensure that it exits successfully. If there are any failures then the automated tests fail. -These tests are run both with the latest available version of Nextflow and also the minimum required version that is stated in the pipeline code. +These tests are run both with the latest available version of `Nextflow` and also the minimum required version that is stated in the pipeline code. + +## Patch + +: 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). +* A PR should be made on `master` from patch to directly this particular bug. ## Getting help -For further information/help, please consult the [nf-core/rnafusion documentation](https://github.com/nf-core/rnafusion#documentation) and don't hesitate to get in touch on the pipeline channel on [Slack](https://nf-core-invite.herokuapp.com/). + +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)). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 405f88fe..45a4d208 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,31 +1,42 @@ +# nf-core/rnafusion bug report + Hi there! -Thanks for telling us about a problem with the pipeline. Please delete this text and anything that's not relevant from the template below: +Thanks for telling us about a problem with the pipeline. +Please delete this text and anything that's not relevant from the template below: + +## Describe the bug -#### Describe the bug A clear and concise description of what the bug is. -#### Steps to reproduce +## Steps to reproduce + Steps to reproduce the behaviour: + 1. Command line: `nextflow run ...` 2. See error: _Please provide your error message_ -#### Expected behaviour +## Expected behaviour + A clear and concise description of what you expected to happen. -#### System: - - Hardware: [e.g. HPC, Desktop, Cloud...] - - Executor: [e.g. slurm, local, awsbatch...] - - OS: [e.g. CentOS Linux, macOS, Linux Mint...] - - Version [e.g. 7, 10.13.6, 18.3...] +## System + +- Hardware: +- Executor: +- OS: +- Version + +## Nextflow Installation + +- Version: + +## Container engine -#### Nextflow Installation: - - Version: [e.g. 0.31.0] +- Engine: +- version: +- Image tag: -#### Container engine: - - Engine: [e.g. Conda, Docker or Singularity] - - version: [e.g. 1.0.0] - - Image tag: [e.g. nfcore/rnafusion:1.0.0] +## Additional context -#### 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 1f025b77..167d7f93 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,16 +1,24 @@ +# nf-core/rnafusion feature request + Hi there! -Thanks for suggesting a new feature for the pipeline! Please delete this text and anything that's not relevant from the template below: +Thanks for suggesting a new feature for the pipeline! +Please delete this text and anything that's not relevant from the template below: + +## Is your feature request related to a problem? Please describe -#### 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 +## Describe the solution you'd like + A clear and concise description of what you want to happen. -#### Describe alternatives you've considered +## Describe alternatives you've considered + A clear and concise description of any alternative solutions or features you've considered. -#### Additional context +## 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 2eb3f51f..e504e427 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,15 +1,19 @@ -Many thanks to contributing to nf-core/rnafusion! +# nf-core/rnafusion pull request -Please fill in the appropriate checklist below (delete whatever is not relevant). These are the most common things requested on pull requests (PRs). +Many thanks for contributing to nf-core/rnafusion! + +Please fill in the appropriate checklist below (delete whatever is not relevant). +These are the most common things requested on pull requests (PRs). ## PR checklist - - [ ] This comment contains a description of changes (with reason) - - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If 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:** https://github.com/nf-core/rnafusion/tree/master/.github/CONTRIBUTING.md + +- [ ] This comment contains a description of changes (with reason) +- [ ] If you've fixed a bug or added code that should be tested, add tests! +- [ ] If 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 diff --git a/.github/markdownlint.yml b/.github/markdownlint.yml index e052a635..96b12a70 100644 --- a/.github/markdownlint.yml +++ b/.github/markdownlint.yml @@ -1,9 +1,5 @@ # Markdownlint configuration file default: true, line-length: false -no-multiple-blanks: 0 -blanks-around-headers: false -blanks-around-lists: false -header-increment: false no-duplicate-header: siblings_only: true diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml new file mode 100644 index 00000000..ed654eae --- /dev/null +++ b/.github/workflows/branch.yml @@ -0,0 +1,16 @@ +name: nf-core branch protection +# This workflow is triggered on PRs to master branch on the repository +# It fails when someone tries to make a PR against the nf-core `master` branch instead of `dev` +on: + pull_request: + branches: + - master + +jobs: + test: + runs-on: ubuntu-18.04 + steps: + # PRs are only ok if coming from an nf-core `dev` branch or a fork `patch` branch + - name: Check PRs + run: | + { [[ $(git remote get-url origin) == *nf-core/rnafusion ]] && [[ ${GITHUB_HEAD_REF} = "dev" ]]; } || [[ ${GITHUB_HEAD_REF} == "patch" ]] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..b08b3a2e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +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] + +jobs: + test: + 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: Pull docker image + run: | + docker pull nfcore/rnafusion:dev + docker tag nfcore/rnafusion:dev nfcore/rnafusion:dev + - name: Run pipeline with test data + 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 new file mode 100644 index 00000000..1e0827a8 --- /dev/null +++ b/.github/workflows/linting.yml @@ -0,0 +1,50 @@ +name: nf-core linting +# This workflow is triggered on pushes and PRs to the repository. +# It runs the `nf-core lint` and markdown lint tests to ensure that the code meets the nf-core guidelines +on: + push: + pull_request: + release: + types: [published] + +jobs: + Markdown: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: '10' + - name: Install markdownlint + run: npm install -g markdownlint-cli + - name: Run Markdownlint + run: markdownlint ${GITHUB_WORKSPACE} -c ${GITHUB_WORKSPACE}/.github/markdownlint.yml + YAML: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: '10' + - name: Install yaml-lint + run: npm install -g yaml-lint + - name: Run yaml-lint + run: yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml") + nf-core: + runs-on: ubuntu-latest + steps: + - 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 + run: nf-core lint ${GITHUB_WORKSPACE} diff --git a/.gitignore b/.gitignore index 5b54e3e6..6354f370 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ work/ data/ results/ .DS_Store -tests/test_data +tests/ +testing/ *.pyc diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0962986a..00000000 --- a/.travis.yml +++ /dev/null @@ -1,42 +0,0 @@ -sudo: required -language: python -jdk: openjdk8 -services: docker -python: '3.6' -cache: pip -matrix: - fast_finish: true - -before_install: - # PRs to master are only ok if coming from dev branch - - '[ $TRAVIS_PULL_REQUEST = "false" ] || [ $TRAVIS_BRANCH != "master" ] || ([ $TRAVIS_PULL_REQUEST_SLUG = $TRAVIS_REPO_SLUG ] && [ $TRAVIS_PULL_REQUEST_BRANCH = "dev" ])' - # Pull the docker image first so the test doesn't wait for this - - docker pull nfcore/rnafusion:dev - # Fake the tag locally so that the pipeline runs properly - # Looks weird when this is :dev to :dev, but makes sense when testing code for a release (:dev to :1.0.1) - - docker tag nfcore/rnafusion:dev nfcore/rnafusion:dev - -install: - # Install Nextflow - - mkdir /tmp/nextflow && cd /tmp/nextflow - - wget -qO- get.nextflow.io | bash - - sudo ln -s /tmp/nextflow/nextflow /usr/local/bin/nextflow - # Install nf-core/tools - - pip install --upgrade pip - - pip install nf-core - # Reset - - mkdir ${TRAVIS_BUILD_DIR}/tests && cd ${TRAVIS_BUILD_DIR}/tests - # Install markdownlint-cli - - sudo apt-get install npm && npm install -g markdownlint-cli - -env: - - NXF_VER='0.32.0' # Specify a minimum NF version that should be tested and work - - NXF_VER='' # Plus: get the latest NF version and check that it works - -script: - # Lint the pipeline code - - nf-core lint ${TRAVIS_BUILD_DIR} - # Lint the documentation - - markdownlint ${TRAVIS_BUILD_DIR} -c ${TRAVIS_BUILD_DIR}/.github/markdownlint.yml - # Run the pipeline with the test profile - - nextflow run ${TRAVIS_BUILD_DIR} -profile test,docker diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f3175b2..89cae718 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,16 @@ # nf-core/rnafusion: Changelog -## v1.0.1 - [date] +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). + +## vdev - [date] + Initial release of nf-core/rnafusion, created with the [nf-core](http://nf-co.re/) template. + +### `Added` + +### `Fixed` + +### `Dependencies` + +### `Deprecated` diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 09226d0d..cf930c8a 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -34,7 +34,7 @@ This Code of Conduct applies both within project spaces and in public spaces whe ## Enforcement -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team on [Slack](https://nf-core-invite.herokuapp.com/). The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team on [Slack](https://nf-co.re/join/slack). The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. diff --git a/Dockerfile b/Dockerfile index 01fafa54..c3748956 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,13 @@ -FROM nfcore/base -LABEL authors="No author provided" \ - description="Docker image containing all requirements for nf-core/rnafusion pipeline" +FROM nfcore/base:1.9 +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 -ENV PATH /opt/conda/envs/nf-core-rnafusion-1.0.1/bin:$PATH + +# Add conda installation dir to PATH (instead of doing 'conda activate') +ENV PATH /opt/conda/envs/nf-core-rnafusion-dev/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 diff --git a/LICENSE b/LICENSE index fafd3dbf..ac8adf18 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) No author provided +Copyright (c) Martin Proks Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 90babb0a..183706e9 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,44 @@ -# nf-core/rnafusion +# ![nf-core/rnafusion](docs/images/nf-core-rnafusion_logo.png) **Nextflow rnafusion analysis pipeline, part of the nf-core community.**. -[![Build Status](https://travis-ci.com/nf-core/rnafusion.svg?branch=master)](https://travis-ci.com/nf-core/rnafusion) -[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A50.32.0-brightgreen.svg)](https://www.nextflow.io/) +[![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)](http://bioconda.github.io/) [![Docker](https://img.shields.io/docker/automated/nfcore/rnafusion.svg)](https://hub.docker.com/r/nfcore/rnafusion) ## Introduction + 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. +## Quick Start + +i. 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)) + +iii. Download the pipeline and test it on a minimal dataset with a single command + +```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. + +iv. Start running your own analysis! + + + +```bash +nextflow run nf-core/rnafusion -profile --reads '*_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) @@ -27,4 +53,25 @@ The nf-core/rnafusion pipeline comes with documentation about the pipeline, foun ## Credits -nf-core/rnafusion was originally written by No author provided. + +nf-core/rnafusion was originally written by Martin Proks. + +## Contributions and Support + +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)). + +## Citation + + + + +You can cite the `nf-core` publication as follows: + +> **The nf-core framework for community-curated bioinformatics pipelines.** +> +> 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). +> ReadCube: [Full Access Link](https://rdcu.be/b1GjZ) diff --git a/assets/email_template.html b/assets/email_template.html index af566215..2e85801c 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -11,6 +11,8 @@
+ +

nf-core/rnafusion v${version}

Run Name: $runName

diff --git a/assets/email_template.txt b/assets/email_template.txt index 7efad5be..f717ee9f 100644 --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -1,6 +1,12 @@ -======================================== - nf-core/rnafusion v${version} -======================================== +---------------------------------------------------- + ,--./,-. + ___ __ __ __ ___ /,-._.--~\\ + |\\ | |__ __ / ` / \\ |__) |__ } { + | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, + `._,._,' + nf-core/rnafusion v${version} +---------------------------------------------------- + Run Name: $runName <% if (success){ diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index bdd59b85..14f8ada3 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -3,7 +3,9 @@ report_comment: > analysis pipeline. For information about how to interpret these results, please see the
documentation. report_section_order: - nf-core/rnafusion-software-versions: + software_versions: order: -1000 + nf-core-rnafusion-summary: + order: -1001 export_plots: true diff --git a/assets/nf-core-rnafusion_logo.png b/assets/nf-core-rnafusion_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ea7ca150bb5310db9aefcda00a23cdd304e6aee9 GIT binary patch literal 12597 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 DY1D5F literal 0 HcmV?d00001 diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index 2d671220..3b09baa6 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -8,6 +8,23 @@ Content-Type: text/html; charset=utf-8 $email_html +--nfcoremimeboundary +Content-Type: image/png;name="nf-core-rnafusion_logo.png" +Content-Transfer-Encoding: base64 +Content-ID: +Content-Disposition: inline; filename="nf-core-rnafusion_logo.png" + +<% out << new File("$baseDir/assets/nf-core-rnafusion_logo.png"). + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' ) %> + <% if (mqcFile){ def mqcFileObj = new File("$mqcFile") diff --git a/bin/markdown_to_html.py b/bin/markdown_to_html.py new file mode 100755 index 00000000..57cc4263 --- /dev/null +++ b/bin/markdown_to_html.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python +from __future__ import print_function +import argparse +import markdown +import os +import sys + +def convert_markdown(in_fn): + input_md = 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' + } + } + ) + return html + +def wrap_html(contents): + header = """ + + + + + +
+ """ + footer = """ +
+ + + """ + return header + contents + footer + + +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.') + 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__': + sys.exit(main()) diff --git a/bin/markdown_to_html.r b/bin/markdown_to_html.r deleted file mode 100755 index abe13350..00000000 --- a/bin/markdown_to_html.r +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env Rscript - -# Command line argument processing -args = commandArgs(trailingOnly=TRUE) -if (length(args) < 2) { - stop("Usage: markdown_to_html.r ", call.=FALSE) -} -markdown_fn <- args[1] -output_fn <- args[2] - -# Load / install packages -if (!require("markdown")) { - install.packages("markdown", dependencies=TRUE, repos='http://cloud.r-project.org/') - library("markdown") -} - -base_css_fn <- getOption("markdown.HTML.stylesheet") -base_css <- readChar(base_css_fn, file.info(base_css_fn)$size) -custom_css <- paste(base_css, " -body { - padding: 3em; - margin-right: 350px; - max-width: 100%; -} -#toc { - position: fixed; - right: 20px; - width: 300px; - padding-top: 20px; - overflow: scroll; - height: calc(100% - 3em - 20px); -} -#toc_header { - font-size: 1.8em; - font-weight: bold; -} -#toc > ul { - padding-left: 0; - list-style-type: none; -} -#toc > ul ul { padding-left: 20px; } -#toc > ul > li > a { display: none; } -img { max-width: 800px; } -") - -markdownToHTML( - file = markdown_fn, - output = output_fn, - stylesheet = custom_css, - options = c('toc', 'base64_images', 'highlight_code') -) diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index e1a24f40..283f73fa 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -18,14 +18,17 @@ # Search each file using its regex for k, v in regexes.items(): - with open(v[0]) as x: - versions = x.read() - match = re.search(v[1], versions) - if match: - results[k] = "v{}".format(match.group(1)) + try: + with open(v[0]) as x: + versions = x.read() + match = re.search(v[1], versions) + if match: + results[k] = "v{}".format(match.group(1)) + except IOError: + results[k] = False # Remove software set to false in results -for k in results: +for k in list(results): if not results[k]: del(results[k]) diff --git a/conf/awsbatch.config b/conf/awsbatch.config deleted file mode 100644 index 14af5866..00000000 --- a/conf/awsbatch.config +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ------------------------------------------------- - * Nextflow config file for running on AWS batch - * ------------------------------------------------- - * Base config needed for running with -profile awsbatch - */ -params { - config_profile_name = 'AWSBATCH' - config_profile_description = 'AWSBATCH Cloud Profile' - config_profile_contact = 'Alexander Peltzer (@apeltzer)' - config_profile_url = 'https://aws.amazon.com/de/batch/' -} - -aws.region = params.awsregion -process.executor = 'awsbatch' -process.queue = params.awsqueue -executor.awscli = '/home/ec2-user/miniconda/bin/aws' -params.tracedir = './' diff --git a/conf/base.config b/conf/base.config index 7a2c4ee5..e2a4c1ac 100644 --- a/conf/base.config +++ b/conf/base.config @@ -13,22 +13,39 @@ process { // TODO nf-core: Check the defaults for all processes cpus = { check_max( 1 * task.attempt, 'cpus' ) } - memory = { check_max( 8.GB * task.attempt, 'memory' ) } - time = { check_max( 2.h * task.attempt, 'time' ) } + memory = { check_max( 7.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' // 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 -} - -params { - // Defaults only, expecting to be overwritten - max_memory = 128.GB - max_cpus = 16 - max_time = 240.h - igenomes_base = 's3://ngi-igenomes/igenomes/' + withLabel:process_low { + cpus = { check_max( 2 * task.attempt, 'cpus' ) } + memory = { check_max( 14.GB * task.attempt, 'memory' ) } + time = { check_max( 6.h * task.attempt, 'time' ) } + } + withLabel:process_medium { + cpus = { check_max( 6 * task.attempt, 'cpus' ) } + memory = { check_max( 42.GB * task.attempt, 'memory' ) } + time = { check_max( 8.h * task.attempt, 'time' ) } + } + withLabel:process_high { + cpus = { check_max( 12 * task.attempt, 'cpus' ) } + memory = { check_max( 84.GB * task.attempt, 'memory' ) } + time = { check_max( 10.h * task.attempt, 'time' ) } + } + withLabel:process_long { + time = { check_max( 20.h * task.attempt, 'time' ) } + } + withName:get_software_versions { + cache = false + } + } diff --git a/conf/igenomes.config b/conf/igenomes.config index d19e61f4..2de92422 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -9,139 +9,412 @@ params { // illumina iGenomes reference file paths - // TODO nf-core: Add new reference types and strip out those that are not needed genomes { 'GRCh37' { - bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" + 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' { - bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" - fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" - star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" + 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" + } + '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 5c1cbe72..3112650d 100644 --- a/conf/test.config +++ b/conf/test.config @@ -4,20 +4,21 @@ * ------------------------------------------------- * Defines bundled input files and everything required * to run a fast and simple test. Use as follows: - * nextflow run nf-core/rnafusion -profile test + * nextflow run nf-core/rnafusion -profile test, */ params { config_profile_name = 'Test profile' config_profile_description = 'Minimal test dataset to check pipeline function' - // Limit resources so that this can run on Travis + // Limit resources so that this can run on GitHub Actions max_cpus = 2 max_memory = 6.GB max_time = 48.h + // 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 - singleEnd = false + 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/images/nf-core-rnafusion_logo.png b/docs/images/nf-core-rnafusion_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..eab61c0e4e7d7b705197615aef65188745919009 GIT binary patch literal 21334 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%0AkKYWcl89g2KH;zY=P#I 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 e|Mx}y&KmI?uZdft^ literal 0 HcmV?d00001 diff --git a/docs/output.md b/docs/output.md index 130ba906..86dae502 100644 --- a/docs/output.md +++ b/docs/output.md @@ -5,6 +5,7 @@ This document describes the output produced by the pipeline. Most of the plots a ## Pipeline overview + The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: @@ -12,6 +13,7 @@ and processes data using the following steps: * [MultiQC](#multiqc) - aggregate report, describing results of the whole pipeline ## 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. For further reading and documentation see the [FastQC help](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). @@ -25,8 +27,8 @@ For further reading and documentation see the [FastQC help](http://www.bioinform * `zips/sample_fastqc.zip` * zip file containing the FastQC report, tab-delimited data file and plot images - ## 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. The pipeline has special steps which allow the software versions used to be reported in the MultiQC output for future traceability. diff --git a/docs/usage.md b/docs/usage.md index 4da47584..94bf53a8 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -2,8 +2,6 @@ ## Table of contents - - * [Table of contents](#table-of-contents) * [Introduction](#introduction) * [Running the pipeline](#running-the-pipeline) @@ -12,20 +10,23 @@ * [Main arguments](#main-arguments) * [`-profile`](#-profile) * [`--reads`](#--reads) - * [`--singleEnd`](#--singleend) + * [`--single_end`](#--single_end) * [Reference genomes](#reference-genomes) * [`--genome` (using iGenomes)](#--genome-using-igenomes) * [`--fasta`](#--fasta) - * [`--igenomesIgnore`](#--igenomesignore) + * [`--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) @@ -37,10 +38,9 @@ * [`--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`): @@ -52,6 +52,7 @@ NXF_OPTS='-Xms1g -Xmx4g' ## Running the pipeline + The typical command for running the pipeline is as follows: ```bash @@ -70,6 +71,7 @@ results # Finished results (configurable, see below) ``` ### Updating the pipeline + When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: ```bash @@ -77,31 +79,40 @@ nextflow pull nf-core/rnafusion ``` ### Reproducibility + It's a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. First, go to the [nf-core/rnafusion releases page](https://github.com/nf-core/rnafusion/releases) and find the latest version number - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. 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 ### `-profile` -Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. Note that multiple profiles can be loaded, for example: `-profile docker` - the order of arguments is important! -If `-profile` is not specified at all the pipeline will be run locally and expects all software to be installed and available on the `PATH`. +Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. + +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Conda) - see below. + +> We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. + +The pipeline also dynamically loads configurations from [https://github.com/nf-core/configs](https://github.com/nf-core/configs) when it runs, making multiple config profiles for various institutional clusters available at run time. For more information and to see if your system is available in these configs please see the [nf-core/configs documentation](https://github.com/nf-core/configs#documentation). + +Note that multiple profiles can be loaded, for example: `-profile test,docker` - the order of arguments is important! +They are loaded in sequence, so later profiles can overwrite earlier profiles. + +If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. -* `awsbatch` - * A generic configuration profile to be used with AWS Batch. -* `conda` - * A generic configuration profile to be used with [conda](https://conda.io/docs/) - * Pulls most software from [Bioconda](https://bioconda.github.io/) * `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/) * `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/) +* `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/) + * Pulls most software from [Bioconda](https://bioconda.github.io/) * `test` * A profile with a complete configuration for automated testing * Includes links to test data so needs no other parameters @@ -109,6 +120,7 @@ If `-profile` is not specified at all the pipeline will be run locally and expec ### `--reads` + Use this to specify the location of your input FastQ files. For example: ```bash @@ -123,21 +135,22 @@ Please note the following requirements: If left unspecified, a default pattern is used: `data/*{1,2}.fastq.gz` -### `--singleEnd` -By default, the pipeline expects paired-end data. If you have single-end data, you need to specify `--singleEnd` 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: +### `--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 ---singleEnd --reads '*.fastq' +--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) + There are 31 different species supported in the iGenomes references. To run the pipeline, you must specify which to use with the `--genome` flag. You can find the keys to specify the genomes in the [iGenomes config file](../conf/igenomes.config). Common genomes that are supported are: @@ -171,33 +184,48 @@ params { ``` + ### `--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]' ``` -### `--igenomesIgnore` +### `--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. 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-core-invite.herokuapp.com/). +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 the `-awsbatch` profile and then specify all of the following 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. + ### `--awsregion` -The AWS region to run your job in. Default is set to `eu-west-1` but can be adjusted to your needs. + +The AWS region in which to run your job. Default is set to `eu-west-1` but can be adjusted to your needs. + +### `--awscli` + +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`. 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. @@ -206,12 +234,23 @@ Please make sure to also set the `-w/--work-dir` and `--outdir` parameters to a ### `--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). @@ -219,6 +258,7 @@ This is used in the MultiQC report (if not default) and in the summary HTML / e- **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. @@ -226,6 +266,7 @@ You can also supply a run name to resume a specific run: `-resume [run-name]`. U **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) @@ -233,7 +274,8 @@ Specify the path to a specific config file (this is a core NextFlow command). 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 is set to `master`. + +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 @@ -241,6 +283,7 @@ Provide git commit id for custom Institutional configs hosted at `nf-core/config ``` ### `--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 @@ -261,22 +304,28 @@ nextflow run /path/to/pipeline/ --custom_config_base /path/to/my/configs/configs > 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 e5ecedae..2be75611 100644 --- a/environment.yml +++ b/environment.yml @@ -1,11 +1,15 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: nf-core-rnafusion-1.0.1 +name: nf-core-rnafusion-dev channels: - conda-forge - bioconda - defaults dependencies: + - conda-forge::python=3.7.3 + - conda-forge::markdown=3.1.1 + - conda-forge::pymdown-extensions=6.0 + - conda-forge::pygments=2.5.2 # TODO nf-core: Add required software dependencies here - - fastqc=0.11.8 - - multiqc=1.7 + - bioconda::fastqc=0.11.8 + - bioconda::multiqc=1.7 diff --git a/main.nf b/main.nf index c011c986..d7801386 100644 --- a/main.nf +++ b/main.nf @@ -9,7 +9,6 @@ ---------------------------------------------------------------------------------------- */ - def helpMessage() { // TODO nf-core: Add to this help message with new command line parameters log.info nfcoreHeader() @@ -22,39 +21,41 @@ def helpMessage() { nextflow run nf-core/rnafusion --reads '*_R{1,2}.fastq.gz' -profile docker Mandatory arguments: - --reads Path to input data (must be surrounded with quotes) - -profile Configuration profile to use. Can use multiple (comma separated) - Available: conda, docker, singularity, awsbatch, test and more. + --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 Options: - --genome Name of iGenomes reference - --singleEnd Specifies that the input is single end reads + --genome [str] Name of iGenomes reference + --single_end [bool] Specifies that the input is single-end reads - References If not specified in the configuration file or you wish to overwrite any of the references. - --fasta Path to Fasta reference + References If not specified in the configuration file or you wish to overwrite any of the references + --fasta [file] Path to fasta reference Other options: - --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 - --maxMultiqcEmailFileSize 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) - -name Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic. + --outdir [file] The output directory where the results will be saved + --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) + -name [str] Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic AWSBatch options: - --awsqueue The AWSBatch JobQueue that needs to be set when running on AWSBatch - --awsregion The AWS Region for your AWS Batch job to run on + --awsqueue [str] The AWSBatch JobQueue that needs to be set when running on AWSBatch + --awsregion [str] The AWS Region for your AWS Batch job to run on + --awscli [str] Path to the AWS CLI tool """.stripIndent() } -/* - * SET UP CONFIGURATION VARIABLES - */ - -// Show help emssage -if (params.help){ +// Show help message +if (params.help) { helpMessage() exit 0 } +/* + * SET UP CONFIGURATION VARIABLES + */ + // Check if genome exists in the config file if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { exit 1, "The provided genome '${params.genome}' is not available in the iGenomes file. Currently the available genomes are ${params.genomes.keySet().join(", ")}" @@ -62,103 +63,101 @@ if (params.genomes && params.genome && !params.genomes.containsKey(params.genome // TODO nf-core: Add any reference files that are needed // Configurable reference genomes -fasta = params.genome ? params.genomes[ params.genome ].fasta ?: false : false -if ( params.fasta ){ - fasta = file(params.fasta) - if( !fasta.exists() ) exit 1, "Fasta file not found: ${params.fasta}" -} // // NOTE - THIS IS NOT USED IN THIS PIPELINE, EXAMPLE ONLY -// If you want to use the above in a process, define the following: +// If you want to use the channel below in a process, define the following: // input: -// file fasta from fasta +// file fasta from ch_fasta // - +params.fasta = params.genome ? params.genomes[ params.genome ].fasta ?: false : 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 custom_runName = params.name -if( !(workflow.runName ==~ /[a-z]+_[a-z]+/) ){ - custom_runName = workflow.runName +if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { + custom_runName = workflow.runName } - -if( workflow.profile == 'awsbatch') { - // AWSBatch sanity checking - if (!params.awsqueue || !params.awsregion) exit 1, "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" - // Check outdir paths to be S3 buckets if running on AWSBatch - // related: https://github.com/nextflow-io/nextflow/issues/813 - if (!params.outdir.startsWith('s3:')) exit 1, "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" - // Prevent trace files to be stored on S3 since S3 does not support rolling files. - if (workflow.tracedir.startsWith('s3:')) exit 1, "Specify a local tracedir or run without trace! S3 cannot be used for tracefiles." +if (workflow.profile.contains('awsbatch')) { + // AWSBatch sanity checking + if (!params.awsqueue || !params.awsregion) exit 1, "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" + // Check outdir paths to be S3 buckets if running on AWSBatch + // related: https://github.com/nextflow-io/nextflow/issues/813 + if (!params.outdir.startsWith('s3:')) exit 1, "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" + // Prevent trace files to be stored on S3 since S3 does not support rolling files. + if (params.tracedir.startsWith('s3:')) exit 1, "Specify a local tracedir or run without trace! S3 cannot be used for tracefiles." } // Stage config files -ch_multiqc_config = Channel.fromPath(params.multiqc_config) -ch_output_docs = Channel.fromPath("$baseDir/docs/output.md") +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) /* * Create a channel for input read files */ -if(params.readPaths){ - if(params.singleEnd){ +if (params.readPaths) { + if (params.single_end) { Channel .from(params.readPaths) - .map { row -> [ row[0], [file(row[1][0])]] } + .map { row -> [ row[0], [ file(row[1][0], checkIfExists: true) ] ] } .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } - .into { read_files_fastqc; read_files_trimming } + .into { ch_read_files_fastqc; ch_read_files_trimming } } else { Channel .from(params.readPaths) - .map { row -> [ row[0], [file(row[1][0]), file(row[1][1])]] } + .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" } - .into { read_files_fastqc; read_files_trimming } + .into { ch_read_files_fastqc; ch_read_files_trimming } } } else { Channel - .fromFilePairs( params.reads, size: params.singleEnd ? 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 --singleEnd on the command line." } - .into { read_files_fastqc; read_files_trimming } + .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." } + .into { ch_read_files_fastqc; ch_read_files_trimming } } - // Header log info log.info nfcoreHeader() def summary = [:] -if(workflow.revision) summary['Pipeline Release'] = workflow.revision +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['Fasta Ref'] = params.fasta -summary['Data Type'] = params.singleEnd ? 'Single-End' : 'Paired-End' +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" -if(workflow.containerEngine) summary['Container'] = "$workflow.containerEngine - $workflow.container" +if (workflow.containerEngine) summary['Container'] = "$workflow.containerEngine - $workflow.container" summary['Output dir'] = params.outdir summary['Launch dir'] = workflow.launchDir summary['Working dir'] = workflow.workDir summary['Script dir'] = workflow.projectDir summary['User'] = workflow.userName -if(workflow.profile == 'awsbatch'){ - summary['AWS Region'] = params.awsregion - summary['AWS Queue'] = params.awsqueue +if (workflow.profile.contains('awsbatch')) { + summary['AWS Region'] = params.awsregion + summary['AWS Queue'] = params.awsqueue + 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.email) { - summary['E-mail Address'] = params.email - summary['MultiQC maxsize'] = params.maxMultiqcEmailFileSize +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.email || params.email_on_fail) { + summary['E-mail Address'] = params.email + summary['E-mail on failure'] = params.email_on_fail + summary['MultiQC maxsize'] = params.max_multiqc_email_size } log.info summary.collect { k,v -> "${k.padRight(18)}: $v" }.join("\n") -log.info "\033[2m----------------------------------------------------\033[0m" +log.info "-\033[2m--------------------------------------------------\033[0m-" // Check the hostnames against configured profiles checkHostname() -def create_workflow_summary(summary) { - def yaml_file = workDir.resolve('workflow_summary_mqc.yaml') - yaml_file.text = """ +Channel.from(summary.collect{ [it.key, it.value] }) + .map { k,v -> "
$k
${v ?: 'N/A'}
" } + .reduce { a, b -> return [a, b].join("\n ") } + .map { x -> """ id: 'nf-core-rnafusion-summary' description: " - this information is collected when the pipeline is started." section_name: 'nf-core/rnafusion Workflow Summary' @@ -166,26 +165,23 @@ def create_workflow_summary(summary) { plot_type: 'html' data: |
-${summary.collect { k,v -> "
$k
${v ?: 'N/A'}
" }.join("\n")} + $x
- """.stripIndent() - - return yaml_file -} - + """.stripIndent() } + .set { ch_workflow_summary } /* * Parse software version numbers */ process get_software_versions { publishDir "${params.outdir}/pipeline_info", mode: 'copy', - saveAs: {filename -> - if (filename.indexOf(".csv") > 0) filename - else null - } + saveAs: { filename -> + if (filename.indexOf(".csv") > 0) filename + else null + } output: - file 'software_versions_mqc.yaml' into software_versions_yaml + file 'software_versions_mqc.yaml' into ch_software_versions_yaml file "software_versions.csv" script: @@ -199,30 +195,29 @@ process get_software_versions { """ } - - /* * STEP 1 - FastQC */ process fastqc { tag "$name" + label 'process_medium' publishDir "${params.outdir}/fastqc", mode: 'copy', - saveAs: {filename -> filename.indexOf(".zip") > 0 ? "zips/$filename" : "$filename"} + saveAs: { filename -> + filename.indexOf(".zip") > 0 ? "zips/$filename" : "$filename" + } input: - set val(name), file(reads) from read_files_fastqc + set val(name), file(reads) from ch_read_files_fastqc output: - file "*_fastqc.{zip,html}" into fastqc_results + file "*_fastqc.{zip,html}" into ch_fastqc_results script: """ - fastqc -q $reads + fastqc --quiet --threads $task.cpus $reads """ } - - /* * STEP 2 - MultiQC */ @@ -230,28 +225,28 @@ process multiqc { publishDir "${params.outdir}/MultiQC", mode: 'copy' input: - file multiqc_config from ch_multiqc_config + file (multiqc_config) from ch_multiqc_config + file (mqc_custom_config) from ch_multiqc_custom_config.collect().ifEmpty([]) // TODO nf-core: Add in log files from your new processes for MultiQC to find! - file ('fastqc/*') from fastqc_results.collect().ifEmpty([]) - file ('software_versions/*') from software_versions_yaml.collect() - file workflow_summary from create_workflow_summary(summary) + file ('fastqc/*') from ch_fastqc_results.collect().ifEmpty([]) + file ('software_versions/*') from ch_software_versions_yaml.collect() + file workflow_summary from ch_workflow_summary.collectFile(name: "workflow_summary_mqc.yaml") output: - file "*multiqc_report.html" into multiqc_report + file "*multiqc_report.html" into ch_multiqc_report file "*_data" file "multiqc_plots" script: rtitle = custom_runName ? "--title \"$custom_runName\"" : '' rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' + custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' // TODO nf-core: Specify which MultiQC modules to use with -m for a faster run time """ - multiqc -f $rtitle $rfilename --config $multiqc_config . + multiqc -f $rtitle $rfilename $custom_config_file . """ } - - /* * STEP 3 - Output Description HTML */ @@ -266,12 +261,10 @@ process output_documentation { script: """ - markdown_to_html.r $output_docs results_description.html + markdown_to_html.py $output_docs -o results_description.html """ } - - /* * Completion e-mail notification */ @@ -279,8 +272,8 @@ workflow.onComplete { // Set up the e-mail variables def subject = "[nf-core/rnafusion] Successful: $workflow.runName" - if(!workflow.success){ - subject = "[nf-core/rnafusion] FAILED: $workflow.runName" + if (!workflow.success) { + subject = "[nf-core/rnafusion] FAILED: $workflow.runName" } def email_fields = [:] email_fields['version'] = workflow.manifest.version @@ -298,21 +291,20 @@ workflow.onComplete { email_fields['summary']['Date Completed'] = workflow.complete email_fields['summary']['Pipeline script file path'] = workflow.scriptFile email_fields['summary']['Pipeline script hash ID'] = workflow.scriptId - if(workflow.repository) email_fields['summary']['Pipeline repository Git URL'] = workflow.repository - if(workflow.commitId) email_fields['summary']['Pipeline repository Git Commit'] = workflow.commitId - if(workflow.revision) email_fields['summary']['Pipeline Git branch/tag'] = workflow.revision - if(workflow.container) email_fields['summary']['Docker image'] = workflow.container + if (workflow.repository) email_fields['summary']['Pipeline repository Git URL'] = workflow.repository + if (workflow.commitId) email_fields['summary']['Pipeline repository Git Commit'] = workflow.commitId + if (workflow.revision) email_fields['summary']['Pipeline Git branch/tag'] = workflow.revision email_fields['summary']['Nextflow Version'] = workflow.nextflow.version email_fields['summary']['Nextflow Build'] = workflow.nextflow.build email_fields['summary']['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp - // TODO nf-core: If not using MultiQC, strip out this code (including params.maxMultiqcEmailFileSize) + // TODO nf-core: If not using MultiQC, strip out this code (including params.max_multiqc_email_size) // On success try attach the multiqc report def mqc_report = null try { if (workflow.success) { - mqc_report = multiqc_report.getVal() - if (mqc_report.getClass() == ArrayList){ + mqc_report = ch_multiqc_report.getVal() + if (mqc_report.getClass() == ArrayList) { log.warn "[nf-core/rnafusion] Found multiple reports from process 'multiqc', will use only one" mqc_report = mqc_report[0] } @@ -321,6 +313,12 @@ workflow.onComplete { log.warn "[nf-core/rnafusion] Could not attach MultiQC report to summary email" } + // Check if we are only sending emails on failure + email_address = params.email + if (!params.email && params.email_on_fail && !workflow.success) { + email_address = params.email_on_fail + } + // Render the TXT template def engine = new groovy.text.GStringTemplateEngine() def tf = new File("$baseDir/assets/email_template.txt") @@ -333,89 +331,89 @@ workflow.onComplete { def email_html = html_template.toString() // Render the sendmail template - def smail_fields = [ email: params.email, subject: subject, email_txt: email_txt, email_html: email_html, baseDir: "$baseDir", mqcFile: mqc_report, mqcMaxSize: params.maxMultiqcEmailFileSize.toBytes() ] + def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, baseDir: "$baseDir", mqcFile: mqc_report, mqcMaxSize: params.max_multiqc_email_size.toBytes() ] def sf = new File("$baseDir/assets/sendmail_template.txt") def sendmail_template = engine.createTemplate(sf).make(smail_fields) def sendmail_html = sendmail_template.toString() // Send the HTML e-mail - if (params.email) { + if (email_address) { try { - if( params.plaintext_email ){ throw GroovyException('Send plaintext e-mail, not HTML') } - // Try to send HTML e-mail using sendmail - [ 'sendmail', '-t' ].execute() << sendmail_html - log.info "[nf-core/rnafusion] Sent summary e-mail to $params.email (sendmail)" + if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } + // Try to send HTML e-mail using sendmail + [ 'sendmail', '-t' ].execute() << sendmail_html + log.info "[nf-core/rnafusion] Sent summary e-mail to $email_address (sendmail)" } catch (all) { - // Catch failures and try with plaintext - [ 'mail', '-s', subject, params.email ].execute() << email_txt - log.info "[nf-core/rnafusion] Sent summary e-mail to $params.email (mail)" + // Catch failures and try with plaintext + [ 'mail', '-s', subject, email_address ].execute() << email_txt + log.info "[nf-core/rnafusion] Sent summary e-mail to $email_address (mail)" } } // Write summary e-mail HTML to a file - def output_d = new File( "${params.outdir}/pipeline_info/" ) - if( !output_d.exists() ) { - output_d.mkdirs() + def output_d = new File("${params.outdir}/pipeline_info/") + if (!output_d.exists()) { + output_d.mkdirs() } - def output_hf = new File( output_d, "pipeline_report.html" ) + def output_hf = new File(output_d, "pipeline_report.html") output_hf.withWriter { w -> w << email_html } - def output_tf = new File( output_d, "pipeline_report.txt" ) + def output_tf = new File(output_d, "pipeline_report.txt") output_tf.withWriter { w -> w << email_txt } - c_reset = params.monochrome_logs ? '' : "\033[0m"; - c_purple = params.monochrome_logs ? '' : "\033[0;35m"; c_green = params.monochrome_logs ? '' : "\033[0;32m"; + c_purple = params.monochrome_logs ? '' : "\033[0;35m"; c_red = params.monochrome_logs ? '' : "\033[0;31m"; + c_reset = params.monochrome_logs ? '' : "\033[0m"; - if (workflow.stats.ignoredCountFmt > 0 && workflow.success) { - log.info "${c_purple}Warning, pipeline completed, but with errored process(es) ${c_reset}" - log.info "${c_red}Number of ignored errored process(es) : ${workflow.stats.ignoredCountFmt} ${c_reset}" - log.info "${c_green}Number of successfully ran process(es) : ${workflow.stats.succeedCountFmt} ${c_reset}" + if (workflow.stats.ignoredCount > 0 && workflow.success) { + log.info "-${c_purple}Warning, pipeline completed, but with errored process(es) ${c_reset}-" + log.info "-${c_red}Number of ignored errored process(es) : ${workflow.stats.ignoredCount} ${c_reset}-" + log.info "-${c_green}Number of successfully ran process(es) : ${workflow.stats.succeedCount} ${c_reset}-" } - if(workflow.success){ - log.info "${c_purple}[nf-core/rnafusion]${c_green} Pipeline completed successfully${c_reset}" + if (workflow.success) { + log.info "-${c_purple}[nf-core/rnafusion]${c_green} Pipeline completed successfully${c_reset}-" } else { checkHostname() - log.info "${c_purple}[nf-core/rnafusion]${c_red} Pipeline completed with errors${c_reset}" + log.info "-${c_purple}[nf-core/rnafusion]${c_red} Pipeline completed with errors${c_reset}-" } } -def nfcoreHeader(){ +def nfcoreHeader() { // Log colors ANSI codes - c_reset = params.monochrome_logs ? '' : "\033[0m"; - c_dim = params.monochrome_logs ? '' : "\033[2m"; c_black = params.monochrome_logs ? '' : "\033[0;30m"; - c_green = params.monochrome_logs ? '' : "\033[0;32m"; - c_yellow = params.monochrome_logs ? '' : "\033[0;33m"; c_blue = params.monochrome_logs ? '' : "\033[0;34m"; - c_purple = params.monochrome_logs ? '' : "\033[0;35m"; 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} + 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} + -${c_dim}--------------------------------------------------${c_reset}- """.stripIndent() } -def checkHostname(){ +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){ + 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)){ + 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" + diff --git a/nextflow.config b/nextflow.config index e66ac9c3..49451c6c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -10,29 +10,35 @@ params { // Workflow flags // TODO nf-core: Specify your pipeline's command line flags + genome = false reads = "data/*{1,2}.fastq.gz" - singleEnd = false + single_end = false outdir = './results' // Boilerplate options name = false - multiqc_config = "$baseDir/assets/multiqc_config.yaml" + multiqc_config = false email = false - maxMultiqcEmailFileSize = 25.MB + email_on_fail = false + max_multiqc_email_size = 25.MB plaintext_email = false monochrome_logs = false help = false - igenomes_base = "./iGenomes" + igenomes_base = 's3://ngi-igenomes/igenomes/' tracedir = "${params.outdir}/pipeline_info" - awsqueue = false - awsregion = 'eu-west-1' - igenomesIgnore = false + igenomes_ignore = false custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" hostnames = false config_profile_description = false config_profile_contact = false config_profile_url = false + + // Defaults only, expecting to be overwritten + max_memory = 128.GB + max_cpus = 16 + max_time = 240.h + } // Container slug. Stable releases should specify release tag! @@ -50,19 +56,33 @@ try { } profiles { - awsbatch { includeConfig 'conf/awsbatch.config' } conda { process.conda = "$baseDir/environment.yml" } debug { process.beforeScript = 'echo $HOSTNAME' } - docker { docker.enabled = true } - singularity { singularity.enabled = true } + docker { + docker.enabled = true + // Avoid this error: + // WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap. + // Testing this in nf-core after discussion here https://github.com/nf-core/tools/pull/351 + // once this is established and works well, nextflow might implement this behavior as new default. + docker.runOptions = '-u \$(id -u):\$(id -g)' + } + singularity { + singularity.enabled = true + singularity.autoMounts = true + } test { includeConfig 'conf/test.config' } } // Load igenomes.config if required -if(!params.igenomesIgnore){ +if (!params.igenomes_ignore) { includeConfig 'conf/igenomes.config' } +// Export this variable to prevent local Python libraries from conflicting with those in the container +env { + PYTHONNOUSERSITE = 1 +} + // Capture exit codes from upstream processes when piping process.shell = ['/bin/bash', '-euo', 'pipefail'] @@ -85,20 +105,20 @@ dag { manifest { name = 'nf-core/rnafusion' - author = 'No author provided' + author = 'Martin Proks' homePage = 'https://github.com/nf-core/rnafusion' description = 'Nextflow rnafusion analysis pipeline, part of the nf-core community.' mainScript = 'main.nf' - nextflowVersion = '>=0.32.0' - version = '1.0.1' + nextflowVersion = '>=19.10.0' + version = 'dev' } // Function to ensure that resource requirements don't go beyond // a maximum limit def check_max(obj, type) { - if(type == 'memory'){ + if (type == 'memory') { try { - if(obj.compareTo(params.max_memory as nextflow.util.MemoryUnit) == 1) + if (obj.compareTo(params.max_memory as nextflow.util.MemoryUnit) == 1) return params.max_memory as nextflow.util.MemoryUnit else return obj @@ -106,9 +126,9 @@ def check_max(obj, type) { println " ### ERROR ### Max memory '${params.max_memory}' is not valid! Using default value: $obj" return obj } - } else if(type == 'time'){ + } else if (type == 'time') { try { - if(obj.compareTo(params.max_time as nextflow.util.Duration) == 1) + if (obj.compareTo(params.max_time as nextflow.util.Duration) == 1) return params.max_time as nextflow.util.Duration else return obj @@ -116,7 +136,7 @@ def check_max(obj, type) { println " ### ERROR ### Max time '${params.max_time}' is not valid! Using default value: $obj" return obj } - } else if(type == 'cpus'){ + } else if (type == 'cpus') { try { return Math.min( obj, params.max_cpus as int ) } catch (all) { From 9d5f7037be4ebcef0bd866c976e2f6ea4fd46ea8 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sun, 12 Apr 2020 17:44:54 +0200 Subject: [PATCH 0093/1520] fix: specify tag for nfcore:base in all fusion tool containers --- tools/arriba/Dockerfile | 4 ++-- tools/ericscript/Dockerfile | 4 ++-- tools/fusion-inspector/Dockerfile | 4 ++-- tools/fusioncatcher/Dockerfile | 4 ++-- tools/pizzly/Dockerfile | 4 ++-- tools/squid/Dockerfile | 4 ++-- tools/star-fusion/Dockerfile | 4 ++-- tools/star-fusion/environment.yml | 1 + 8 files changed, 15 insertions(+), 14 deletions(-) diff --git a/tools/arriba/Dockerfile b/tools/arriba/Dockerfile index 9cfb6c8b..c408ce65 100644 --- a/tools/arriba/Dockerfile +++ b/tools/arriba/Dockerfile @@ -1,6 +1,6 @@ -FROM nfcore/base +FROM nfcore/base:1.9 -LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin.proks@scilifelab.se" \ +LABEL authors="Martin Proks" \ description="Docker image containing all requirements for nfcore/rnafusion pipeline" COPY environment.yml / diff --git a/tools/ericscript/Dockerfile b/tools/ericscript/Dockerfile index 2eba204b..6b8cc077 100644 --- a/tools/ericscript/Dockerfile +++ b/tools/ericscript/Dockerfile @@ -1,6 +1,6 @@ -FROM nfcore/base +FROM nfcore/base:1.9 -LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin.proks@scilifelab.se" \ +LABEL authors="Martin Proks" \ description="Docker image containing all requirements for nfcore/rnafusion pipeline" COPY environment.yml / diff --git a/tools/fusion-inspector/Dockerfile b/tools/fusion-inspector/Dockerfile index 00a48364..c4abcf9a 100644 --- a/tools/fusion-inspector/Dockerfile +++ b/tools/fusion-inspector/Dockerfile @@ -1,6 +1,6 @@ -FROM nfcore/base +FROM nfcore/base:1.9 -LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin.proks@scilifelab.se" \ +LABEL authors="Martin Proks" \ description="Docker image containing all requirements for nfcore/rnafusion pipeline" COPY environment.yml / diff --git a/tools/fusioncatcher/Dockerfile b/tools/fusioncatcher/Dockerfile index fe3228bd..cb0ea4b9 100644 --- a/tools/fusioncatcher/Dockerfile +++ b/tools/fusioncatcher/Dockerfile @@ -1,6 +1,6 @@ -FROM nfcore/base +FROM nfcore/base:1.9 -LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin.proks@scilifelab.se" \ +LABEL authors="Martin Proks" \ description="Docker image containing all requirements for nfcore/rnafusion pipeline" COPY environment.yml / diff --git a/tools/pizzly/Dockerfile b/tools/pizzly/Dockerfile index 2c221bfb..c726a9b6 100644 --- a/tools/pizzly/Dockerfile +++ b/tools/pizzly/Dockerfile @@ -1,6 +1,6 @@ -FROM nfcore/base +FROM nfcore/base:1.9 -LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin.proks@scilifelab.se" \ +LABEL authors="Martin Proks" \ description="Docker image containing all requirements for nfcore/rnafusion pipeline" COPY environment.yml / diff --git a/tools/squid/Dockerfile b/tools/squid/Dockerfile index 48927f64..081a4a1e 100644 --- a/tools/squid/Dockerfile +++ b/tools/squid/Dockerfile @@ -1,6 +1,6 @@ -FROM nfcore/base +FROM nfcore/base:1.9 -LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin.proks@scilifelab.se" \ +LABEL authors="Martin Proks" \ description="Docker image containing all requirements for nfcore/rnafusion pipeline" COPY environment.yml / diff --git a/tools/star-fusion/Dockerfile b/tools/star-fusion/Dockerfile index 7e18775e..0224addb 100644 --- a/tools/star-fusion/Dockerfile +++ b/tools/star-fusion/Dockerfile @@ -1,6 +1,6 @@ -FROM nfcore/base +FROM nfcore/base:1.9 -LABEL authors="rickard.hammaren@scilifelab.se, phil.ewels@scilifelab.se, martin.proks@scilifelab.se" \ +LABEL authors="Martin Proks" \ description="Docker image containing all requirements for nfcore/rnafusion pipeline" COPY environment.yml / diff --git a/tools/star-fusion/environment.yml b/tools/star-fusion/environment.yml index 146ebf5d..b829ba0c 100644 --- a/tools/star-fusion/environment.yml +++ b/tools/star-fusion/environment.yml @@ -10,3 +10,4 @@ dependencies: - bioconda::hmmer=3.2.1 - conda-forge::unzip=6.0 - bioconda::dfam=2.0 + - conda-forge::awscli=1.18.39 From 511e65e3bb68a5473c4f6eb9e90c78122b111ab8 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 13 Apr 2020 15:17:19 +0200 Subject: [PATCH 0094/1520] fix: refactoring configuration (#110) --- conf/base.config | 32 ++- conf/igenomes.config | 420 ------------------------------ conf/singularity.config | 25 ++ conf/test.config | 26 -- example/custom-docker.config | 40 --- example/custom-singularity.config | 66 ----- nextflow.config | 46 ++-- 7 files changed, 77 insertions(+), 578 deletions(-) delete mode 100644 conf/igenomes.config create mode 100644 conf/singularity.config delete mode 100644 conf/test.config delete mode 100644 example/custom-docker.config delete mode 100644 example/custom-singularity.config diff --git a/conf/base.config b/conf/base.config index a73aa349..801b159f 100644 --- a/conf/base.config +++ b/conf/base.config @@ -9,7 +9,7 @@ * run on the logged in environment. */ -process{ +process { cpus = { check_max( 1 * task.attempt, 'cpus' ) } memory = { check_max( 7.GB * task.attempt, 'memory' ) } @@ -19,12 +19,6 @@ process{ 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' ) } @@ -43,8 +37,30 @@ process{ withLabel:process_long { time = { check_max( 20.h * task.attempt, 'time' ) } } - withName:get_software_versions { + withName:get_softwares { cache = false } + // Fusion tools + withName:"arriba|arriba_visualization" { + container = "nfcore/rnafusion:arriba_v${params.versions.arriba}" + } + withName:ericscript { + container = "nfcore/rnafusion:ericscript_v${params.versions.ericscript}" + } + withName:fusioncatcher { + container = "nfcore/rnafusion:fusioncatcher_v${params.versions.fusioncatcher}" + } + withName:fusion_inspector { + container = "nfcore/rnafusion:fusion-inspector_v${params.versions.fusion_inspector}" + } + withName:pizzly { + container = "nfcore/rnafusion:pizzly_v${params.versions.pizzly}" + } + withName:squid { + container = "nfcore/rnafusion:squid_v${params.versions.squid}" + } + withName:"star_fusion|download_star_fusion" { + container = "nfcore/rnafusion:star-fusion_v${params.versions.star_fusion}" + } } \ No newline at end of file diff --git a/conf/igenomes.config b/conf/igenomes.config deleted file mode 100644 index 2de92422..00000000 --- a/conf/igenomes.config +++ /dev/null @@ -1,420 +0,0 @@ -/* - * ------------------------------------------------- - * 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" - } - '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/singularity.config b/conf/singularity.config new file mode 100644 index 00000000..c0fd6977 --- /dev/null +++ b/conf/singularity.config @@ -0,0 +1,25 @@ +process { + container = "${params.images_path}/rnafusion_v${workflow.manifest.version}.img" + + withName: "arriba|arriba_visualization" { + container = "${params.images_path}/rnafusion_arriba_v${params.versions.arriba}.img" + } + withName: "star_fusion|download_star_fusion" { + container = "${params.images_path}/rnafusion_star-fusion_v${params.versions.star_fusion}.img" + } + withName:fusioncatcher { + container = "${params.images_path}/rnafusion_fusioncatcher_v${params.versions.fusioncatcher}.img" + } + withName:fusion_inspector { + container = "${params.images_path}/rnafusion_fusion-inspector_v${params.versions.fusion_inspector}.img" + } + withName:ericscript { + container = "${params.images_path}/rnafusion_ericscript_v${params.versions.ericscript}.img" + } + withName:pizzly { + container = "${params.images_path}/rnafusion_pizzly_v${params.versions.pizzly}.img" + } + withName:squid { + container = "${params.images_path}/rnafusion_squid_v${params.versions.squid}.img" + } +} \ No newline at end of file diff --git a/conf/test.config b/conf/test.config deleted file mode 100644 index 3112650d..00000000 --- a/conf/test.config +++ /dev/null @@ -1,26 +0,0 @@ -/* - * ------------------------------------------------- - * Nextflow config file for running tests - * ------------------------------------------------- - * Defines bundled input files and everything required - * to run a fast and simple test. Use as follows: - * nextflow run nf-core/rnafusion -profile test, - */ - -params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function' - // Limit resources so that this can run on GitHub Actions - max_cpus = 2 - max_memory = 6.GB - max_time = 48.h - - // 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 - 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/example/custom-docker.config b/example/custom-docker.config deleted file mode 100644 index a90c17c7..00000000 --- a/example/custom-docker.config +++ /dev/null @@ -1,40 +0,0 @@ -/* - * ------------------------------------------------- - * Nextflow example configuration for Docker - * ------------------------------------------------- - */ - -params { - max_cpus = 24 - max_memory = 256.GB - max_time = 72.h - container_version = 'dev' - - // Tool versions - arriba_version = '1.1.0' - ericscript_version = '0.5.5' - fusioncatcher_version = '1.20' - fusion_inspector_version = '1.3.1-star2.7.0f' - pizzly_version = '0.37.3' - squid_version = '1.5-star2.7.0f' - star_fusion_version = '1.6.0' - - // Extra parameters for fusion tools - arriba_opt = '' - fusioncatcher_opt = '' - fusion_report_opt = '' - star_fusion_opt = '' - - // References - reference_base = '/path/to/references' - fasta = "${params.reference_base}/Homo_sapiens.GRCh38_r97.all.fa" - gtf = "${params.reference_base}/Homo_sapiens.GRCh38_r97.gtf" - transcript = "${params.reference_base}/Homo_sapiens.GRCh38_r97.cdna.all.fa.gz" - databases = "${params.reference_base}/1.1.0/databases" - - // Fusion tools - arriba_ref = "${params.reference_base}/arriba" - ericscript_ref = "${params.reference_base}/ericscript/ericscript_db_homosapiens_ensembl84" - fusioncatcher_ref = "${params.reference_base}/fusioncatcher/human_v98" - star_fusion_ref = "${params.reference_base}/star-fusion/ctat_genome_lib_build_dir" -} \ No newline at end of file diff --git a/example/custom-singularity.config b/example/custom-singularity.config deleted file mode 100644 index 1406352c..00000000 --- a/example/custom-singularity.config +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ------------------------------------------------- - * Nextflow example configuration for Singularity - * ------------------------------------------------- - */ - -params { - max_cpus = 24 - max_memory = 256.GB - max_time = 72.h - container_version = 'dev' - - // Tool versions - arriba_version = '1.1.0' - ericscript_version = '0.5.5' - fusioncatcher_version = '1.20' - fusion_inspector_version = '1.3.1-star2.7.0f' - pizzly_version = '0.37.3' - squid_version = '1.5-star2.7.0f' - star_fusion_version = '1.6.0' - - // Extra parameters for fusion tools - arriba_opt = '' - fusioncatcher_opt = '' - fusion_report_opt = '' - star_fusion_opt = '' - - // References - reference_base = '/path/to/references' - fasta = "${params.reference_base}/Homo_sapiens.GRCh38_r97.all.fa" - gtf = "${params.reference_base}/Homo_sapiens.GRCh38_r97.gtf" - transcript = "${params.reference_base}/Homo_sapiens.GRCh38_r97.cdna.all.fa.gz" - databases = "${params.reference_base}/1.1.0/databases" - - // Fusion tools - arriba_ref = "${params.reference_base}/arriba" - ericscript_ref = "${params.reference_base}/ericscript/ericscript_db_homosapiens_ensembl84" - fusioncatcher_ref = "${params.reference_base}/fusioncatcher/human_v98" - star_fusion_ref = "${params.reference_base}/star-fusion/ctat_genome_lib_build_dir" -} - -process { - container = "${params.containerPath}/rnafusion_v${container_version}.img" - - withName: "arriba|arriba_visualization" { - container = "${params.containerPath}/rnafusion_arriba_v${params.arriba_version}.img" - } - withName: "star_fusion|download_star_fusion" { - container = "${params.containerPath}/rnafusion_star-fusion_v${params.star_fusion_version}.img" - } - withName:fusioncatcher { - container = "${params.containerPath}/rnafusion_fusioncatcher_v${params.fusioncatcher_version}.img" - } - withName:fusion_inspector { - container = "${params.containerPath}/rnafusion_fusion-inspector_v${params.fusion_inspector_version}.img" - } - withName:ericscript { - container = "${params.containerPathCommon}/rnafusion_ericscript_v${params.ericscript_version}.img" - } - withName:pizzly { - container = "${params.containerPathCommon}/rnafusion_pizzly_v${params.pizzly_version}.img" - } - withName:squid { - container = "${params.containerPath}/rnafusion_squid_v${params.squid_version}.img" - } -} diff --git a/nextflow.config b/nextflow.config index 31db98e6..fa722874 100644 --- a/nextflow.config +++ b/nextflow.config @@ -7,21 +7,38 @@ // Global default params, used in configs params { + + versions { + arriba = '1.1.0' + ericscript = '0.5.5' + fusioncatcher = '1.20' + fusion_inspector = '1.3.1-star2.7.0f' + pizzly = '0.37.3' + squid = '1.5-star2.7.0f' + star_fusion = '1.6.0' + } + + // Necessary paths + referece_path = false + images_path = false - // Options: Tool versions - arriba_version = '1.1.0' - ericscript_version = '0.5.5' - fusioncatcher_version = '1.20' - fusion_inspector_version = '1.3.1-star2.7.0f' - pizzly_version = '0.37.3' - squid_version = '1.5-star2.7.0f' - star_fusion_version = '1.6.0' - + reference_release = '97' + fasta = "${params.referece_path}/Homo_sapiens.GRCh38_r${params.reference_release}.all.fa" + gtf = "${params.referece_path}/Homo_sapiens.GRCh38_r${params.reference_release}.gtf" + transcript = "${params.referece_path}/Homo_sapiens.GRCh38_r${params.reference_release}.cdna.all.fa.gz" + databases = "${params.referece_path}/databases" + + // Fusion tool references + arriba_ref = "${params.referece_path}/arriba" + ericscript_ref = "${params.referece_path}/ericscript/ericscript_db_homosapiens_ensembl84" + fusioncatcher_ref = "${params.referece_path}/fusioncatcher/human_v98" + star_fusion_ref = "${params.referece_path}/star-fusion/ctat_genome_lib_build_dir" + // Options: Building STAR-star_index star_index = false read_length = 100 - // Options: References + // Fusion tools arriba = false star_fusion = false fusioncatcher = false @@ -50,7 +67,6 @@ params { fusion_report_opt = false // Defaults - genome = false reads = "data/*{1,2}.fastq.gz" single_end = false clusterOptions = false @@ -77,9 +93,7 @@ params { plaintext_email = false monochrome_logs = false help = false - igenomes_base = 's3://ngi-igenomes/igenomes/' tracedir = "${params.outdir}/pipeline_info" - igenomes_ignore = false custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" hostnames = false @@ -122,15 +136,11 @@ profiles { singularity { singularity.enabled = true singularity.autoMounts = true + includeConfig 'conf/singularity.config' } test { includeConfig 'conf/test.config' } } -// Load igenomes.config if required -if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' -} - // Export this variable to prevent local Python libraries from conflicting with those in the container env { PYTHONNOUSERSITE = 1 From bc3f5cc22739e1ac744d332b13be91e322f8378d Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 13 Apr 2020 15:19:59 +0200 Subject: [PATCH 0095/1520] fix: version tool parsing (#110) --- utils/download-singularity-img.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/download-singularity-img.sh b/utils/download-singularity-img.sh index 3d1676b4..c8475c3e 100644 --- a/utils/download-singularity-img.sh +++ b/utils/download-singularity-img.sh @@ -1,7 +1,7 @@ #!/bin/bash get_tool_version() { - echo $(cat ../nextflow.config | grep "$1_version" | cut -d"=" -f2 | tr -d \' | tr -d ' ') + echo $(cat ../nextflow.config | grep -m1 "$1" | cut -d"=" -f2 | tr -d \' | tr -d ' ') } if [ $# -eq 0 ]; then From 3a9375aa69fcf646a391f4fe0739bb61dde66cda Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 13 Apr 2020 15:28:20 +0200 Subject: [PATCH 0096/1520] fix: parse correct versions for tools (#110) --- download-singularity-img.nf | 46 ++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/download-singularity-img.nf b/download-singularity-img.nf index 37de4428..9414ee16 100644 --- a/download-singularity-img.nf +++ b/download-singularity-img.nf @@ -54,23 +54,23 @@ def helpMessage() { // Show help emssage if (params.help) exit 0, helpMessage() -params.running_tools = ["nf-core/rnafusion/${workflow.manifest.version}"] +running_tools = ["nf-core/rnafusion/${workflow.manifest.version}"] if (!params.outdir) exit 1, "Output directory not specified!" -if (params.arriba || params.download_all) params.running_tools.add("Arriba") -if (params.star_fusion || params.download_all) params.running_tools.add("STAR-Fusion") -if (params.fusioncatcher || params.download_all) params.running_tools.add("Fusioncatcher") -if (params.ericscript || params.download_all) params.running_tools.add("Ericscript") -if (params.pizzly || params.download_all) params.running_tools.add("Pizzly") -if (params.squid || params.download_all) params.running_tools.add("Squid") -if (params.fusion_inspector || params.download_all) params.running_tools.add("Fusion-Inspector") +if (params.arriba || params.download_all) running_tools.add("Arriba") +if (params.star_fusion || params.download_all) running_tools.add("STAR-Fusion") +if (params.fusioncatcher || params.download_all) running_tools.add("Fusioncatcher") +if (params.ericscript || params.download_all) running_tools.add("Ericscript") +if (params.pizzly || params.download_all) running_tools.add("Pizzly") +if (params.squid || params.download_all) running_tools.add("Squid") +if (params.fusion_inspector || params.download_all) running_tools.add("Fusion-Inspector") // Header log info log.info nfcoreHeader() def summary = [:] summary['Pipeline Name'] = 'nf-core/rnafusion/download-singularity-img.nf' summary['Pipeline Version'] = workflow.manifest.version -summary['Tool images'] = params.running_tools.size() == 0 ? 'None' : params.running_tools.join(", ") +summary['Tool images'] = running_tools.size() == 0 ? 'None' : running_tools.join(", ") 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 @@ -110,11 +110,11 @@ process download_arriba { params.arriba || params.download_all output: - file "rnafusion_arriba_v${params.arriba_version}.img" + file "rnafusion_arriba_v${params.versions.arriba}.img" script: """ - singularity pull --name "rnafusion_arriba_v${params.arriba_version}.img" docker://nfcore/rnafusion:arriba_v${params.arriba_version} + singularity pull --name "rnafusion_arriba_v${params.versions.arriba}.img" docker://nfcore/rnafusion:arriba_v${params.versions.arriba} """ } @@ -125,11 +125,11 @@ process download_ericscript { params.ericscript || params.download_all output: - file "rnafusion_ericscript_v${params.ericscript_version}.img" + file "rnafusion_ericscript_v${params.versions.ericscript}.img" script: """ - singularity pull --name "rnafusion_ericscript_v${params.ericscript_version}.img" docker://nfcore/rnafusion:ericscript_v${params.ericscript_version} + singularity pull --name "rnafusion_ericscript_v${params.versions.ericscript}.img" docker://nfcore/rnafusion:ericscript_v${params.versions.ericscript} """ } @@ -140,11 +140,11 @@ process download_fusioncatcher { params.fusioncatcher || params.download_all output: - file "rnafusion_fusioncatcher_v${params.fusioncatcher_version}.img" + file "rnafusion_fusioncatcher_v${params.versions.fusioncatcher}.img" script: """ - singularity pull --name "rnafusion_fusioncatcher_v${params.fusioncatcher_version}.img" docker://nfcore/rnafusion:fusioncatcher_v${params.fusioncatcher_version} + singularity pull --name "rnafusion_fusioncatcher_v${params.versions.fusioncatcher}.img" docker://nfcore/rnafusion:fusioncatcher_v${params.versions.fusioncatcher} """ } @@ -155,11 +155,11 @@ process download_fusion_inspector { params.fusion_inspector || params.download_all output: - file "rnafusion_fusion-inspector_v${params.fusion_inspector_version}.img" + file "rnafusion_fusion-inspector_v${params.versions.fusion_inspector}.img" script: """ - singularity pull --name "rnafusion_fusion-inspector_v${params.fusion_inspector_version}.img" docker://nfcore/rnafusion:fusion-inspector_v${params.fusion_inspector_version} + singularity pull --name "rnafusion_fusion-inspector_v${params.versions.fusion_inspector}.img" docker://nfcore/rnafusion:fusion-inspector_v${params.versions.fusion_inspector} """ } @@ -170,11 +170,11 @@ process download_pizzly { params.pizzly || params.download_all output: - file "rnafusion_pizzly_v${params.pizzly_version}.img" + file "rnafusion_pizzly_v${params.versions.pizzly}.img" script: """ - singularity pull --name "rnafusion_pizzly_v${params.pizzly_version}.img" docker://nfcore/rnafusion:pizzly_v${params.pizzly_version} + singularity pull --name "rnafusion_pizzly_v${params.versions.pizzly}.img" docker://nfcore/rnafusion:pizzly_v${params.versions.pizzly} """ } @@ -185,11 +185,11 @@ process download_squid { params.squid || params.download_all output: - file "rnafusion_squid_v${params.squid_version}.img" + file "rnafusion_squid_v${params.versions.squid}.img" script: """ - singularity pull --name "rnafusion_squid_v${params.squid_version}.img" docker://nfcore/rnafusion:squid_v${params.squid_version} + singularity pull --name "rnafusion_squid_v${params.versions.squid}.img" docker://nfcore/rnafusion:squid_v${params.versions.squid} """ } @@ -200,11 +200,11 @@ process download_star_fusion { params.star_fusion || params.download_all output: - file "rnafusion_star-fusion_v${params.star_fusion_version}.img" + file "rnafusion_star-fusion_v${params.versions.star_fusion}.img" script: """ - singularity pull --name "rnafusion_star-fusion_v${params.star_fusion_version}.img" docker://nfcore/rnafusion:star-fusion_v${params.star_fusion_version} + singularity pull --name "rnafusion_star-fusion_v${params.versions.star_fusion}.img" docker://nfcore/rnafusion:star-fusion_v${params.versions.star_fusion} """ } From 951e56544ebd11ed5e88518d04ca1b206baf25a2 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 18 Apr 2020 10:49:20 +0200 Subject: [PATCH 0097/1520] fix: support for singularity (#110) --- conf/base.config | 2 +- conf/singularity.config | 2 +- nextflow.config | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/conf/base.config b/conf/base.config index 801b159f..fe96d09d 100644 --- a/conf/base.config +++ b/conf/base.config @@ -60,7 +60,7 @@ process { withName:squid { container = "nfcore/rnafusion:squid_v${params.versions.squid}" } - withName:"star_fusion|download_star_fusion" { + withName:"star_fusion" { container = "nfcore/rnafusion:star-fusion_v${params.versions.star_fusion}" } } \ No newline at end of file diff --git a/conf/singularity.config b/conf/singularity.config index c0fd6977..1142e03b 100644 --- a/conf/singularity.config +++ b/conf/singularity.config @@ -1,5 +1,5 @@ process { - container = "${params.images_path}/rnafusion_v${workflow.manifest.version}.img" + container = "${params.images_path}/rnafusion_vdev.img" withName: "arriba|arriba_visualization" { container = "${params.images_path}/rnafusion_arriba_v${params.versions.arriba}.img" diff --git a/nextflow.config b/nextflow.config index fa722874..e634fd98 100644 --- a/nextflow.config +++ b/nextflow.config @@ -20,7 +20,6 @@ params { // Necessary paths referece_path = false - images_path = false reference_release = '97' fasta = "${params.referece_path}/Homo_sapiens.GRCh38_r${params.reference_release}.all.fa" From 0f147cb6d56b7f3d5d9a208cb5d51a2a27c9939e Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 18 Apr 2020 10:51:14 +0200 Subject: [PATCH 0098/1520] fix: simplified --- utils/download-singularity-img.sh | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/utils/download-singularity-img.sh b/utils/download-singularity-img.sh index c8475c3e..b3ce000c 100644 --- a/utils/download-singularity-img.sh +++ b/utils/download-singularity-img.sh @@ -23,15 +23,12 @@ elif [ -d "$1" ]; then FUSIONCATCHER=$(get_tool_version "fusioncatcher") FUSION_INSPECTOR=$(get_tool_version "fusion_inspector") PIZZLY=$(get_tool_version "pizzly") - RNAFUSION="$(cat ../nextflow.config | grep "container" | cut -d":" -f2 | cut -d "'" -f1)" + RNAFUSION="$(cat ../nextflow.config | grep -m1 "container" | cut -d":" -f2 | cut -d "'" -f1)" SQUID=$(get_tool_version "squid") STAR_FUSION=$(get_tool_version "star_fusion") - - cwd=$1/rnafusion_containers_v$RNAFUSION - echo "Creating folder $cwd" - mkdir $cwd && cd $cwd - echo "Pulling images ..." - + + cd $1 && echo "Pulling images ..." + singularity pull --name "rnafusion_arriba_v${ARRIBA}.img" docker://nfcore/rnafusion:arriba_v${ARRIBA} singularity pull --name "rnafusion_ericscript_v${ERICSCRIPT}.img" docker://nfcore/rnafusion:ericscript_v${ERICSCRIPT} singularity pull --name "rnafusion_fusioncatcher_v${FUSIONCATCHER}.img" docker://nfcore/rnafusion:fusioncatcher_v${FUSIONCATCHER} @@ -40,8 +37,8 @@ elif [ -d "$1" ]; then singularity pull --name "rnafusion_v${RNAFUSION}.img" docker://nfcore/rnafusion:${RNAFUSION} singularity pull --name "rnafusion_squid_v${SQUID}.img" docker://nfcore/rnafusion:squid_v${SQUID} singularity pull --name "rnafusion_star-fusion_v${STAR_FUSION}.img" docker://nfcore/rnafusion:star-fusion_v${STAR_FUSION} - + else echo "Path doesn't exists" exit 1 -fi +fi \ No newline at end of file From c05abcc17e3665e010c6005b63b784af3ebb2d6d Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 18 Apr 2020 10:53:30 +0200 Subject: [PATCH 0099/1520] chore: add environment export to file (arriba) --- tools/arriba/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/arriba/Dockerfile b/tools/arriba/Dockerfile index c408ce65..546dacfe 100644 --- a/tools/arriba/Dockerfile +++ b/tools/arriba/Dockerfile @@ -6,3 +6,6 @@ LABEL authors="Martin Proks" \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a ENV PATH /opt/conda/envs/arriba_v1.1.0/bin:$PATH + +# Dump the details of the installed packages to a file for posterity +RUN conda env export --name arriba_v1.1.0 > arriba_v1.1.0.yml \ No newline at end of file From f8f385120b3be0258d50f3aea71d135a9ff7c90c Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 18 Apr 2020 10:55:16 +0200 Subject: [PATCH 0100/1520] chore: add environment export to file (squid) --- tools/squid/Dockerfile | 11 ++++++----- tools/squid/environment.yml | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/tools/squid/Dockerfile b/tools/squid/Dockerfile index 081a4a1e..9a26ba21 100644 --- a/tools/squid/Dockerfile +++ b/tools/squid/Dockerfile @@ -7,9 +7,10 @@ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a ENV PATH /opt/conda/envs/squid_v1.5-star2.7.0f/bin:$PATH -RUN wget https://raw.githubusercontent.com/Kingsford-Group/squid/master/utils/AnnotateSQUIDOutput.py -O /AnnotateSQUIDOutput.py \ - && chmod +x /AnnotateSQUIDOutput.py \ - && ln -s /AnnotateSQUIDOutput.py /usr/local/bin \ - && ln -s /opt/conda/envs/squid_v1.5-star2.7.0f/bin/python3 /bin/python +RUN cd /opt/conda/envs/squid_v1.5-star2.7.0f/bin \ + && wget https://raw.githubusercontent.com/Kingsford-Group/squid/f45c9025d41cffd982ecbbdd52844e5a4f074de9/utils/AnnotateSQUIDOutput.py \ + && chmod +x /opt/conda/envs/squid_v1.5-star2.7.0f/bin/AnnotateSQUIDOutput.py \ + && ln -s /opt/conda/envs/squid_v1.5-star2.7.0f/bin/python3 /bin/python -RUN ln -s /lib/x86_64-linux-gnu/libcrypt.so.1 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 +# Dump the details of the installed packages to a file for posterity +RUN conda env export --name squid_v1.5-star2.7.0f > squid_v1.5-star2.7.0f.yml \ No newline at end of file diff --git a/tools/squid/environment.yml b/tools/squid/environment.yml index fa4e5dac..288c89f3 100644 --- a/tools/squid/environment.yml +++ b/tools/squid/environment.yml @@ -3,8 +3,8 @@ channels: - bioconda - conda-forge dependencies: + - python=3.7.4 - squid=1.5 - bioconda::star=2.7.0f - bioconda::samtools=1.9 - - conda-forge::python=3.7.1 - - conda-forge::numpy=1.15.4 + - conda-forge::numpy=1.18.1 From b6cba04033de8b31eb0a29ba64973b28c14deb87 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 18 Apr 2020 10:55:37 +0200 Subject: [PATCH 0101/1520] chore: add environment export to file (pizzly) --- tools/pizzly/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/pizzly/Dockerfile b/tools/pizzly/Dockerfile index c726a9b6..6cb1ce39 100644 --- a/tools/pizzly/Dockerfile +++ b/tools/pizzly/Dockerfile @@ -6,3 +6,6 @@ LABEL authors="Martin Proks" \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a ENV PATH /opt/conda/envs/pizzly_v0.37.3/bin:$PATH + +# Dump the details of the installed packages to a file for posterity +RUN conda env export --name pizzly_v0.37.3 > pizzly_v0.37.3.yml \ No newline at end of file From 184053052767ab566e7488e9fbe6edac808832b4 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 18 Apr 2020 10:56:02 +0200 Subject: [PATCH 0102/1520] chore: add environment export to file (fusion-inspector) --- tools/fusion-inspector/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/fusion-inspector/Dockerfile b/tools/fusion-inspector/Dockerfile index c4abcf9a..c6d3031e 100644 --- a/tools/fusion-inspector/Dockerfile +++ b/tools/fusion-inspector/Dockerfile @@ -7,4 +7,5 @@ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a ENV PATH /opt/conda/envs/fusion-inspector_v1.3.1-star2.7.0f/bin:$PATH -RUN ln -s /lib/x86_64-linux-gnu/libcrypt.so.1 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 \ No newline at end of file +# Dump the details of the installed packages to a file for posterity +RUN conda env export --name fusion-inspector_v1.3.1-star2.7.0f > fusion-inspector_v1.3.1-star2.7.0f.yml \ No newline at end of file From 57a45380931d68d8cbcc71d7c109b63757017194 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 18 Apr 2020 10:56:25 +0200 Subject: [PATCH 0103/1520] chore: add environment export to file (fusioncatcher) --- tools/fusioncatcher/Dockerfile | 5 ++++- tools/fusioncatcher/environment.yml | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/fusioncatcher/Dockerfile b/tools/fusioncatcher/Dockerfile index cb0ea4b9..0047a3fa 100644 --- a/tools/fusioncatcher/Dockerfile +++ b/tools/fusioncatcher/Dockerfile @@ -1,4 +1,4 @@ -FROM nfcore/base:1.9 +FROM nfcore/base:1.7 LABEL authors="Martin Proks" \ description="Docker image containing all requirements for nfcore/rnafusion pipeline" @@ -6,3 +6,6 @@ LABEL authors="Martin Proks" \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a ENV PATH /opt/conda/envs/fusioncatcher_v1.20/bin:$PATH + +# Dump the details of the installed packages to a file for posterity +RUN conda env export --name fusioncatcher_v1.20 > fusioncatcher_v1.20.yml \ No newline at end of file diff --git a/tools/fusioncatcher/environment.yml b/tools/fusioncatcher/environment.yml index b54b8484..c00cfc58 100644 --- a/tools/fusioncatcher/environment.yml +++ b/tools/fusioncatcher/environment.yml @@ -1,5 +1,6 @@ name: fusioncatcher_v1.20 channels: + - anaconda - bioconda - conda-forge dependencies: From 7240d900899b0c0cff3520c35108c3b1018dcb57 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 18 Apr 2020 10:56:42 +0200 Subject: [PATCH 0104/1520] chore: add environment export to file (star-fusion) --- tools/star-fusion/Dockerfile | 3 +++ tools/star-fusion/environment.yml | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/star-fusion/Dockerfile b/tools/star-fusion/Dockerfile index 0224addb..f911b81a 100644 --- a/tools/star-fusion/Dockerfile +++ b/tools/star-fusion/Dockerfile @@ -19,3 +19,6 @@ ENV PATH /opt/conda/envs/star-fusion_v1.6.0/ctat-genome-lib-builder-2830cd708c5b RUN ln -s /opt/conda/envs/star-fusion_v1.6.0/lib/libssl.so /opt/conda/envs/star-fusion_v1.6.0/lib/libssl.so.1.0.0 && \ ln -s /opt/conda/envs/star-fusion_v1.6.0/lib/libcrypto.so /opt/conda/envs/star-fusion_v1.6.0/lib/libcrypto.so.1.0.0 + +# Dump the details of the installed packages to a file for posterity +RUN conda env export --name star-fusion_v1.6.0 > star-fusion_v1.6.0.yml \ No newline at end of file diff --git a/tools/star-fusion/environment.yml b/tools/star-fusion/environment.yml index b829ba0c..22dd1dee 100644 --- a/tools/star-fusion/environment.yml +++ b/tools/star-fusion/environment.yml @@ -9,5 +9,4 @@ dependencies: - conda-forge::perl-carp-assert - bioconda::hmmer=3.2.1 - conda-forge::unzip=6.0 - - bioconda::dfam=2.0 - - conda-forge::awscli=1.18.39 + - bioconda::dfam=2.0 \ No newline at end of file From a183fa6c4c800fbeb24ff11ed4639be181d9240b Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 18 Apr 2020 10:58:12 +0200 Subject: [PATCH 0105/1520] chore: ericscript build 4 --- tools/ericscript/Dockerfile | 7 +++---- tools/ericscript/environment.yml | 4 +++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/tools/ericscript/Dockerfile b/tools/ericscript/Dockerfile index 6b8cc077..1b7419a8 100644 --- a/tools/ericscript/Dockerfile +++ b/tools/ericscript/Dockerfile @@ -5,8 +5,7 @@ LABEL authors="Martin Proks" \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/ericscript/bin:$PATH +ENV PATH /opt/conda/envs/ericscript_v0.5.5/bin:$PATH -RUN ln -s /lib/x86_64-linux-gnu/libreadline.so.7.0 /lib/x86_64-linux-gnu/libreadline.so.6 -RUN sed -i 's/system("R.*CheckDB.R");/#&/' /opt/conda/envs/ericscript_v0.5.5/bin/ericscript.pl -RUN echo 1 > /opt/conda/envs/ericscript_v0.5.5/share/ericscript-0.5.5-3/lib/data/_resources/.flag.dbexists \ No newline at end of file +# Dump the details of the installed packages to a file for posterity +RUN conda env export --name ericscript_v0.5.5 > ericscript_v0.5.5.yml \ No newline at end of file diff --git a/tools/ericscript/environment.yml b/tools/ericscript/environment.yml index 415e1908..065a7c39 100644 --- a/tools/ericscript/environment.yml +++ b/tools/ericscript/environment.yml @@ -1,5 +1,7 @@ name: ericscript_v0.5.5 channels: - bioconda + - conda-forge dependencies: - - ericscript=0.5.5 + - conda-forge::ncurses=6.1 + - bioconda::ericscript=0.5.5 From df712708012b80f85b88e01e768a57c4d79a3a2a Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 18 Apr 2020 10:58:57 +0200 Subject: [PATCH 0106/1520] fix: base container version parsing (#110) --- tools/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build.sh b/tools/build.sh index daa57cf5..b7f03c5f 100755 --- a/tools/build.sh +++ b/tools/build.sh @@ -33,7 +33,7 @@ if [ $1 == "all" ]; then create_container `pwd`/$TOOL ${TOOL%?} done # Build main cotainer - VERSION="$(cat ../nextflow.config | grep "container" | cut -d":" -f2 | cut -d "'" -f1)" + VERSION="$(cat ../nextflow.config | grep -m1 "container" | cut -d":" -f2 | cut -d "'" -f1)" CONTAINER_NAME=$PREFIX:$VERSION echo "Building [$CONTAINER_NAME]" docker build ../. -t $CONTAINER_NAME From f7a2b9e84c1baf489dcc05c39d4e6d1fb806d6ca Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 18 Apr 2020 11:00:26 +0200 Subject: [PATCH 0107/1520] feat: download STAR-Fusion reference from iGenomes (#109) --- download-references.nf | 42 ++++++++++-------------------------------- environment.yml | 5 ++++- 2 files changed, 14 insertions(+), 33 deletions(-) diff --git a/download-references.nf b/download-references.nf index 7ae14bf1..0362ef37 100644 --- a/download-references.nf +++ b/download-references.nf @@ -54,13 +54,13 @@ if (params.help) exit 0, helpMessage() if (!params.reference_release) exit 1, "You did not specify the release number of reference!" if (!params.outdir) exit 1, "Output directory not specified!" -params.running_tools = [] -if (params.arriba || params.download_all) params.running_tools.add("Arriba") -if (params.star_fusion || params.download_all) params.running_tools.add("STAR-Fusion") -if (params.fusioncatcher || params.download_all) params.running_tools.add("Fusioncatcher") -if (params.ericscript || params.download_all) params.running_tools.add("Ericscript") +running_tools = [] +if (params.arriba || params.download_all) running_tools.add("Arriba") +if (params.star_fusion || params.download_all) running_tools.add("STAR-Fusion") +if (params.fusioncatcher || params.download_all) running_tools.add("Fusioncatcher") +if (params.ericscript || params.download_all) running_tools.add("Ericscript") if (params.download_all) { - params.running_tools.add('fusion-report') + running_tools.add('fusion-report') if (!params.cosmic_usr || !params.cosmic_passwd) exit 1, "Database credentials are required parameter!" } @@ -69,7 +69,7 @@ log.info nfcoreHeader() def summary = [:] summary['Pipeline Name'] = 'nf-core/rnafusion/download-references.nf' summary['Pipeline Version'] = workflow.manifest.version -summary['References'] = params.running_tools.size() == 0 ? 'None' : params.running_tools.join(", ") +summary['References'] = running_tools.size() == 0 ? 'None' : running_tools.join(", ") 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 @@ -128,36 +128,14 @@ process download_star_fusion { when: params.star_fusion || params.download_all - input: - file fasta - file gtf - output: file '*' script: """ - 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 - - # 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/star-fusion_v1.6.0/ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625/AnnotFilterRuleLib/AnnotFilterRule.pm \\ - --fusion_annot_lib CTAT_HumanFusionLib.dat.gz \\ - --pfam_db Pfam-A.hmm \\ - --dfam_db homo_sapiens_dfam.hmm \\ - --CPU ${task.cpus} + aws s3 --no-sign-request --region eu-west-1 sync s3://ngi-igenomes/igenomes/Homo_sapiens/NCBI/GRCh38/Annotation/CTAT/ . + tar -xf GRCh38_gencode_v32_CTAT_lib_Dec062019.tar.xz --strip-components 5 + rm GRCh38_gencode_v32_CTAT_lib_Dec062019.tar.xz """ } diff --git a/environment.yml b/environment.yml index 59228058..83c73c4b 100644 --- a/environment.yml +++ b/environment.yml @@ -18,4 +18,7 @@ dependencies: - conda-forge::r-data.table=1.12.8 - conda-forge::r-gplots=3.0.1.2 - bioconda::bioconductor-edger=3.28.0 - - bioconda::fusion-report=2.0.1 + - bioconda::fusion-report=2.0.2 + # Star-Fusion + - conda-forge::awscli=1.18.39 + - conda-forge::tar=1.32 \ No newline at end of file From a753bc4ec542666a37e26b36bd0dc030386b78bc Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 18 Apr 2020 11:02:32 +0200 Subject: [PATCH 0108/1520] chore: separate script for building STAR-Fusion reference (#111) --- build-ctat.nf | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 build-ctat.nf diff --git a/build-ctat.nf b/build-ctat.nf new file mode 100644 index 00000000..6d4ea16a --- /dev/null +++ b/build-ctat.nf @@ -0,0 +1,160 @@ +#!/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/utils/build-ctat.nf -profile [PROFILE] [OPTIONS] --outdir /path/to/output + + Mandatory arguments: + --fasta [file] Path to fasta reference + --gtf [file] Path to GTF annotation + --reference_release [int] Release number of Ensembl reference for FASTA and GTF + example: 97 -> ftp://ftp.ensembl.org/pub/release-97 + --outdir [path] Output directory for downloading + -profile [str] Configuration profile [https://github.com/nf-core/configs] + """.stripIndent() +} + +/* + * SET UP CONFIGURATION VARIABLES + */ + +// Show help emssage +if (params.help) exit 0, helpMessage() + +if (!params.reference_release) exit 1, "You did not specify the release number of reference!" +if (!params.outdir) exit 1, "Output directory not specified!" + +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}"} + +// Header log info +log.info nfcoreHeader() +def summary = [:] +summary['Pipeline Name'] = 'nf-core/rnafusion/download-references.nf' +summary['Pipeline Version'] = workflow.manifest.version +summary['References'] = params.running_tools.size() == 0 ? 'None' : params.running_tools.join(", ") +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' + publishDir "${params.outdir}", mode: 'copy' + + input: + file(fasta) from ch_fasta + file(gtf) from ch_gtf + + output: + file '*' + + script: + """ + 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 + + # 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/star-fusion_v1.6.0/ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625/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/download-references.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" + + "============================================================" + } + } + } + } +} \ No newline at end of file From 68254418034b8b1bcd362ec7ac1e2264faaf51cd Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 18 Apr 2020 15:37:59 +0200 Subject: [PATCH 0109/1520] fix: updated main.nf --- main.nf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index bc0eabb3..0c56057b 100644 --- a/main.nf +++ b/main.nf @@ -55,7 +55,6 @@ def helpMessage() { --ericscript_ref [file] Path to Ericscript reference --fasta [file] Path to fasta reference --fusioncatcher_ref [file] Path to Fusioncatcher reference - --genome [str] Name of iGenomes reference --gtf [file] Path to GTF annotation --star_index [file] Path to STAR-Index reference --star_fusion_ref [file] Path to STAR-Fusion reference @@ -100,6 +99,8 @@ reference = [ star_fusion: false ] +if (!Channel.fromPath(params.referece_path, checkIfExists: true)) {exit 1, "Directory ${params.referece_path} doesn't exist."} + 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}"} ch_transcript = Channel.value(file(params.transcript)).ifEmpty{exit 1, "Transcript file not found: ${params.transcript}"} @@ -783,8 +784,8 @@ process multiqc { file (mqc_custom_config) from ch_multiqc_custom_config.collect().ifEmpty([]) file ('fastqc/*') from ch_fastqc_results.collect().ifEmpty([]) file ('software_versions/*') from ch_software_versions_yaml.collect() - file workflow_summary from create_workflow_summary(summary) file (fusions_mq) from summary_fusions_mq.collect().ifEmpty([]) + file workflow_summary from ch_workflow_summary.collectFile(name: "workflow_summary_mqc.yaml") output: file "*multiqc_report.html" into ch_multiqc_report From c83dec76b5450aeda5e902a44576c0517aa3f5a8 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 25 Apr 2020 08:56:08 +0200 Subject: [PATCH 0110/1520] fix: typo referece_path (#113) --- main.nf | 2 +- nextflow.config | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/main.nf b/main.nf index 0c56057b..7995afe8 100644 --- a/main.nf +++ b/main.nf @@ -99,7 +99,7 @@ reference = [ star_fusion: false ] -if (!Channel.fromPath(params.referece_path, checkIfExists: true)) {exit 1, "Directory ${params.referece_path} doesn't exist."} +if (!Channel.fromPath(params.reference_path, checkIfExists: true)) {exit 1, "Directory ${params.reference_path} doesn't exist."} 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}"} diff --git a/nextflow.config b/nextflow.config index e634fd98..96a368c1 100644 --- a/nextflow.config +++ b/nextflow.config @@ -19,19 +19,19 @@ params { } // Necessary paths - referece_path = false + reference_path = false reference_release = '97' - fasta = "${params.referece_path}/Homo_sapiens.GRCh38_r${params.reference_release}.all.fa" - gtf = "${params.referece_path}/Homo_sapiens.GRCh38_r${params.reference_release}.gtf" - transcript = "${params.referece_path}/Homo_sapiens.GRCh38_r${params.reference_release}.cdna.all.fa.gz" - databases = "${params.referece_path}/databases" + fasta = "${params.reference_path}/Homo_sapiens.GRCh38_r${params.reference_release}.all.fa" + gtf = "${params.reference_path}/Homo_sapiens.GRCh38_r${params.reference_release}.gtf" + transcript = "${params.reference_path}/Homo_sapiens.GRCh38_r${params.reference_release}.cdna.all.fa.gz" + databases = "${params.reference_path}/databases" // Fusion tool references - arriba_ref = "${params.referece_path}/arriba" - ericscript_ref = "${params.referece_path}/ericscript/ericscript_db_homosapiens_ensembl84" - fusioncatcher_ref = "${params.referece_path}/fusioncatcher/human_v98" - star_fusion_ref = "${params.referece_path}/star-fusion/ctat_genome_lib_build_dir" + arriba_ref = "${params.reference_path}/arriba" + ericscript_ref = "${params.reference_path}/ericscript/ericscript_db_homosapiens_ensembl84" + fusioncatcher_ref = "${params.reference_path}/fusioncatcher/human_v98" + star_fusion_ref = "${params.reference_path}/star-fusion/ctat_genome_lib_build_dir" // Options: Building STAR-star_index star_index = false From 01fd810e5fa5470951b4af84225904db7510cb69 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 25 Apr 2020 08:57:05 +0200 Subject: [PATCH 0111/1520] fix: added reference_path and image_path to help --- main.nf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 7995afe8..b2eec1dc 100644 --- a/main.nf +++ b/main.nf @@ -30,7 +30,9 @@ 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: conda, docker, singularity, test, awsbatch, and more + Available: conda, 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 @@ -65,6 +67,7 @@ def helpMessage() { --single_end [bool] Specifies that the input is single-end reads Other Options: + --image_path [str] Path to singularity images when using Singularity. --debug [bool] Flag to run only specific fusion tool/s and not the whole pipeline. Only works on tool flags. --outdir [file] The output directory where the results will be saved --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 From bc510a9e3b4366bc7ad6854d982a0be7872236e8 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 09:56:28 +0200 Subject: [PATCH 0112/1520] simplify singularity config --- conf/base.config | 2 +- conf/singularity.config | 25 ------------------------- conf/test.config | 1 + download-singularity-img.nf | 32 ++++++++++++++++---------------- nextflow.config | 1 - 5 files changed, 18 insertions(+), 43 deletions(-) delete mode 100644 conf/singularity.config create mode 100644 conf/test.config diff --git a/conf/base.config b/conf/base.config index fe96d09d..5ee211d1 100644 --- a/conf/base.config +++ b/conf/base.config @@ -37,7 +37,7 @@ process { withLabel:process_long { time = { check_max( 20.h * task.attempt, 'time' ) } } - withName:get_softwares { + withName:get_software_versions { cache = false } diff --git a/conf/singularity.config b/conf/singularity.config deleted file mode 100644 index 1142e03b..00000000 --- a/conf/singularity.config +++ /dev/null @@ -1,25 +0,0 @@ -process { - container = "${params.images_path}/rnafusion_vdev.img" - - withName: "arriba|arriba_visualization" { - container = "${params.images_path}/rnafusion_arriba_v${params.versions.arriba}.img" - } - withName: "star_fusion|download_star_fusion" { - container = "${params.images_path}/rnafusion_star-fusion_v${params.versions.star_fusion}.img" - } - withName:fusioncatcher { - container = "${params.images_path}/rnafusion_fusioncatcher_v${params.versions.fusioncatcher}.img" - } - withName:fusion_inspector { - container = "${params.images_path}/rnafusion_fusion-inspector_v${params.versions.fusion_inspector}.img" - } - withName:ericscript { - container = "${params.images_path}/rnafusion_ericscript_v${params.versions.ericscript}.img" - } - withName:pizzly { - container = "${params.images_path}/rnafusion_pizzly_v${params.versions.pizzly}.img" - } - withName:squid { - container = "${params.images_path}/rnafusion_squid_v${params.versions.squid}.img" - } -} \ No newline at end of file diff --git a/conf/test.config b/conf/test.config new file mode 100644 index 00000000..45cd99c8 --- /dev/null +++ b/conf/test.config @@ -0,0 +1 @@ +params.help = true \ No newline at end of file diff --git a/download-singularity-img.nf b/download-singularity-img.nf index 9414ee16..b26793bc 100644 --- a/download-singularity-img.nf +++ b/download-singularity-img.nf @@ -95,11 +95,11 @@ process download_base_image { params.download_all output: - file "rnafusion_v${workflow.manifest.version}.img" + file "nf-core-rnafusion-v${workflow.manifest.version}.img" script: """ - singularity pull --name "rnafusion_v${workflow.manifest.version}.img" docker://nfcore/rnafusion:${workflow.manifest.version} + singularity pull --name "nf-core-rnafusion-v${workflow.manifest.version}.img" docker://nfcore/rnafusion:${workflow.manifest.version} """ } @@ -110,11 +110,11 @@ process download_arriba { params.arriba || params.download_all output: - file "rnafusion_arriba_v${params.versions.arriba}.img" + file "nf-core-rnafusion-arriba_v${params.versions.arriba}.img" script: """ - singularity pull --name "rnafusion_arriba_v${params.versions.arriba}.img" docker://nfcore/rnafusion:arriba_v${params.versions.arriba} + singularity pull --name "nf-core-rnafusion-arriba_v${params.versions.arriba}.img" docker://nfcore/rnafusion:arriba_v${params.versions.arriba} """ } @@ -125,11 +125,11 @@ process download_ericscript { params.ericscript || params.download_all output: - file "rnafusion_ericscript_v${params.versions.ericscript}.img" + file "nf-core-rnafusion-ericscript_v${params.versions.ericscript}.img" script: """ - singularity pull --name "rnafusion_ericscript_v${params.versions.ericscript}.img" docker://nfcore/rnafusion:ericscript_v${params.versions.ericscript} + singularity pull --name "nf-core-rnafusion-ericscript_v${params.versions.ericscript}.img" docker://nfcore/rnafusion:ericscript_v${params.versions.ericscript} """ } @@ -140,11 +140,11 @@ process download_fusioncatcher { params.fusioncatcher || params.download_all output: - file "rnafusion_fusioncatcher_v${params.versions.fusioncatcher}.img" + file "nf-core-rnafusion-fusioncatcher_v${params.versions.fusioncatcher}.img" script: """ - singularity pull --name "rnafusion_fusioncatcher_v${params.versions.fusioncatcher}.img" docker://nfcore/rnafusion:fusioncatcher_v${params.versions.fusioncatcher} + singularity pull --name "nf-core-rnafusion-fusioncatcher_v${params.versions.fusioncatcher}.img" docker://nfcore/rnafusion:fusioncatcher_v${params.versions.fusioncatcher} """ } @@ -155,11 +155,11 @@ process download_fusion_inspector { params.fusion_inspector || params.download_all output: - file "rnafusion_fusion-inspector_v${params.versions.fusion_inspector}.img" + file "nf-core-rnafusion-fusion-inspector_v${params.versions.fusion_inspector}.img" script: """ - singularity pull --name "rnafusion_fusion-inspector_v${params.versions.fusion_inspector}.img" docker://nfcore/rnafusion:fusion-inspector_v${params.versions.fusion_inspector} + singularity pull --name "nf-core-rnafusion-fusion-inspector_v${params.versions.fusion_inspector}.img" docker://nfcore/rnafusion:fusion-inspector_v${params.versions.fusion_inspector} """ } @@ -170,11 +170,11 @@ process download_pizzly { params.pizzly || params.download_all output: - file "rnafusion_pizzly_v${params.versions.pizzly}.img" + file "nf-core-rnafusion-pizzly_v${params.versions.pizzly}.img" script: """ - singularity pull --name "rnafusion_pizzly_v${params.versions.pizzly}.img" docker://nfcore/rnafusion:pizzly_v${params.versions.pizzly} + singularity pull --name "nf-core-rnafusion-pizzly_v${params.versions.pizzly}.img" docker://nfcore/rnafusion:pizzly_v${params.versions.pizzly} """ } @@ -185,11 +185,11 @@ process download_squid { params.squid || params.download_all output: - file "rnafusion_squid_v${params.versions.squid}.img" + file "nf-core-rnafusion-squid_v${params.versions.squid}.img" script: """ - singularity pull --name "rnafusion_squid_v${params.versions.squid}.img" docker://nfcore/rnafusion:squid_v${params.versions.squid} + singularity pull --name "nf-core-rnafusion-squid_v${params.versions.squid}.img" docker://nfcore/rnafusion:squid_v${params.versions.squid} """ } @@ -200,11 +200,11 @@ process download_star_fusion { params.star_fusion || params.download_all output: - file "rnafusion_star-fusion_v${params.versions.star_fusion}.img" + file "nf-core-rnafusion-star-fusion_v${params.versions.star_fusion}.img" script: """ - singularity pull --name "rnafusion_star-fusion_v${params.versions.star_fusion}.img" docker://nfcore/rnafusion:star-fusion_v${params.versions.star_fusion} + singularity pull --name "nf-core-rnafusion-star-fusion_v${params.versions.star_fusion}.img" docker://nfcore/rnafusion:star-fusion_v${params.versions.star_fusion} """ } diff --git a/nextflow.config b/nextflow.config index 96a368c1..e05a5816 100644 --- a/nextflow.config +++ b/nextflow.config @@ -135,7 +135,6 @@ profiles { singularity { singularity.enabled = true singularity.autoMounts = true - includeConfig 'conf/singularity.config' } test { includeConfig 'conf/test.config' } } From f060f811ca3d86c6e5c2100239cd86053a0427fa Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 09:56:38 +0200 Subject: [PATCH 0113/1520] spacing --- download-references.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/download-references.nf b/download-references.nf index 0362ef37..f1275b88 100644 --- a/download-references.nf +++ b/download-references.nf @@ -39,8 +39,8 @@ def helpMessage() { --fusioncatcher [bool] Download Fusioncatcher references --ericscript [bool] Download Ericscript references --fusion_report [bool] Download databases for fusion-report - --cosmic_usr [str] [Required] COSMIC username - --cosmic_passwd [str] [Required] COSMIC password + --cosmic_usr [str] [Required] COSMIC username + --cosmic_passwd [str] [Required] COSMIC password """.stripIndent() } From 7dc54c783ba074b4c002a5296b52c6ff874150f1 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 10:16:44 +0200 Subject: [PATCH 0114/1520] forgot about download_star_fusion --- conf/base.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/base.config b/conf/base.config index 5ee211d1..16b2d33e 100644 --- a/conf/base.config +++ b/conf/base.config @@ -60,7 +60,7 @@ process { withName:squid { container = "nfcore/rnafusion:squid_v${params.versions.squid}" } - withName:"star_fusion" { + withName:"star_fusion|download_star_fusion" { container = "nfcore/rnafusion:star-fusion_v${params.versions.star_fusion}" } } \ No newline at end of file From 469f12de2892af9e05193f08e74c7cfc164db8a6 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 27 Apr 2020 11:08:26 +0200 Subject: [PATCH 0115/1520] refactor: remove image_path (#114) --- main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/main.nf b/main.nf index b2eec1dc..2d28cda5 100644 --- a/main.nf +++ b/main.nf @@ -67,7 +67,6 @@ def helpMessage() { --single_end [bool] Specifies that the input is single-end reads Other Options: - --image_path [str] Path to singularity images when using Singularity. --debug [bool] Flag to run only specific fusion tool/s and not the whole pipeline. Only works on tool flags. --outdir [file] The output directory where the results will be saved --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 From 03b869463d20876b4a67552dc37aa40a9884ee34 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 27 Apr 2020 11:09:13 +0200 Subject: [PATCH 0116/1520] refactor: rename singularity file names (#114) --- utils/download-singularity-img.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/utils/download-singularity-img.sh b/utils/download-singularity-img.sh index b3ce000c..2684fc55 100644 --- a/utils/download-singularity-img.sh +++ b/utils/download-singularity-img.sh @@ -29,14 +29,14 @@ elif [ -d "$1" ]; then cd $1 && echo "Pulling images ..." - singularity pull --name "rnafusion_arriba_v${ARRIBA}.img" docker://nfcore/rnafusion:arriba_v${ARRIBA} - singularity pull --name "rnafusion_ericscript_v${ERICSCRIPT}.img" docker://nfcore/rnafusion:ericscript_v${ERICSCRIPT} - singularity pull --name "rnafusion_fusioncatcher_v${FUSIONCATCHER}.img" docker://nfcore/rnafusion:fusioncatcher_v${FUSIONCATCHER} - singularity pull --name "rnafusion_fusion-inspector_v${FUSION_INSPECTOR}.img" docker://nfcore/rnafusion:fusion-inspector_v${FUSION_INSPECTOR} - singularity pull --name "rnafusion_pizzly_v${PIZZLY}.img" docker://nfcore/rnafusion:pizzly_v${PIZZLY} - singularity pull --name "rnafusion_v${RNAFUSION}.img" docker://nfcore/rnafusion:${RNAFUSION} - singularity pull --name "rnafusion_squid_v${SQUID}.img" docker://nfcore/rnafusion:squid_v${SQUID} - singularity pull --name "rnafusion_star-fusion_v${STAR_FUSION}.img" docker://nfcore/rnafusion:star-fusion_v${STAR_FUSION} + singularity pull --name "nf-core-rnafusion-arriba_v${ARRIBA}.img" docker://nfcore/rnafusion:arriba_v${ARRIBA} + singularity pull --name "nf-core-rnafusion-ericscript_v${ERICSCRIPT}.img" docker://nfcore/rnafusion:ericscript_v${ERICSCRIPT} + singularity pull --name "nf-core-rnafusion-fusioncatcher_v${FUSIONCATCHER}.img" docker://nfcore/rnafusion:fusioncatcher_v${FUSIONCATCHER} + singularity pull --name "nf-core-rnafusion-fusion-inspector_v${FUSION_INSPECTOR}.img" docker://nfcore/rnafusion:fusion-inspector_v${FUSION_INSPECTOR} + singularity pull --name "nf-core-rnafusion-pizzly_v${PIZZLY}.img" docker://nfcore/rnafusion:pizzly_v${PIZZLY} + singularity pull --name "nf-core-rnafusion-v${RNAFUSION}.img" docker://nfcore/rnafusion:${RNAFUSION} + singularity pull --name "nf-core-rnafusion-squid_v${SQUID}.img" docker://nfcore/rnafusion:squid_v${SQUID} + singularity pull --name "nf-core-rnafusion-star-fusion_v${STAR_FUSION}.img" docker://nfcore/rnafusion:star-fusion_v${STAR_FUSION} else echo "Path doesn't exists" From c8a97fd33559557380e1523e619028ca97661cbc Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 27 Apr 2020 11:09:35 +0200 Subject: [PATCH 0117/1520] refactor: move fusion tool version to `base.config` --- conf/base.config | 14 +++++++++++++- nextflow.config | 10 ---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/conf/base.config b/conf/base.config index 16b2d33e..427f27b9 100644 --- a/conf/base.config +++ b/conf/base.config @@ -9,6 +9,18 @@ * run on the logged in environment. */ +params { + versions { + arriba = '1.1.0' + ericscript = '0.5.5' + fusioncatcher = '1.20' + fusion_inspector = '1.3.1-star2.7.0f' + pizzly = '0.37.3' + squid = '1.5-star2.7.0f' + star_fusion = '1.6.0' + } +} + process { cpus = { check_max( 1 * task.attempt, 'cpus' ) } @@ -60,7 +72,7 @@ process { withName:squid { container = "nfcore/rnafusion:squid_v${params.versions.squid}" } - withName:"star_fusion|download_star_fusion" { + withName:"star_fusion" { container = "nfcore/rnafusion:star-fusion_v${params.versions.star_fusion}" } } \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index e05a5816..88eca1c5 100644 --- a/nextflow.config +++ b/nextflow.config @@ -8,16 +8,6 @@ // Global default params, used in configs params { - versions { - arriba = '1.1.0' - ericscript = '0.5.5' - fusioncatcher = '1.20' - fusion_inspector = '1.3.1-star2.7.0f' - pizzly = '0.37.3' - squid = '1.5-star2.7.0f' - star_fusion = '1.6.0' - } - // Necessary paths reference_path = false From 91539e9382d1272cc86aece1f9db3f83b7d3db99 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 20:30:37 +0200 Subject: [PATCH 0118/1520] update script with new paths --- scripts/build.sh | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100755 scripts/build.sh diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 00000000..817153f8 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +PREFIX="nfcore/rnafusion" + +create_container() { + TOOL_PATH=$1 + VERSION="$(cat $TOOL_PATH/environment.yml | grep "name:" | cut -d":" -f2 | cut -d " " -f2)" + CONTAINER_NAME="$PREFIX:$VERSION" + echo "Building [$CONTAINER_NAME]" + docker build $TOOL_PATH -t $CONTAINER_NAME + docker push $CONTAINER_NAME +} + +if [ $# -eq 0 ]; then + echo "No tool name specified!" + echo "Run build.sh -h for help" + exit 1 +fi + +if [ $1 == "-h" ]; then + echo "Utility for building docker containers from tools/" + echo "Usage: build.sh [options]" + echo + echo "Options:" + echo " all build all tools including main image" + echo " builds specific tool" + echo " Example: sh build.sh ericscript" + exit 0 +fi + +if [ $1 == "all" ]; then + for TOOL in containers/*/; do + create_container `pwd`/$TOOL ${TOOL%?} + done + # Build main container + VERSION="$(cat nextflow.config | grep -m1 "container" | cut -d":" -f2 | cut -d "'" -f1)" + CONTAINER_NAME=$PREFIX:$VERSION + echo "Building [$CONTAINER_NAME]" + docker build . -t $CONTAINER_NAME +else + TOOL=$1 + TOOL_PATH="$(pwd)/containers/$TOOL" + if [ ! -d $TOOL_PATH ]; then + echo "The tool doesn't exist" + exit 1 + else + create_container $TOOL_PATH + fi +fi From b69ff5d6881272baba8ab2ab6fcc94d920da114c Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 20:31:04 +0200 Subject: [PATCH 0119/1520] change paths of files --- {tools => containers}/arriba/Dockerfile | 0 {tools => containers}/arriba/environment.yml | 1 + {tools => containers}/ericscript/Dockerfile | 0 .../ericscript/environment.yml | 3 +- .../fusion-inspector/Dockerfile | 0 .../fusion-inspector/environment.yml | 2 + .../fusioncatcher/Dockerfile | 0 .../fusioncatcher/environment.yml | 4 +- {tools => containers}/pizzly/Dockerfile | 0 {tools => containers}/pizzly/environment.yml | 3 +- {tools => containers}/squid/Dockerfile | 0 {tools => containers}/squid/environment.yml | 3 +- {tools => containers}/star-fusion/Dockerfile | 0 .../star-fusion/environment.yml | 3 +- tools/build.sh | 49 ------------------- 15 files changed, 13 insertions(+), 55 deletions(-) rename {tools => containers}/arriba/Dockerfile (100%) rename {tools => containers}/arriba/environment.yml (95%) rename {tools => containers}/ericscript/Dockerfile (100%) rename {tools => containers}/ericscript/environment.yml (91%) rename {tools => containers}/fusion-inspector/Dockerfile (100%) rename {tools => containers}/fusion-inspector/environment.yml (81%) rename {tools => containers}/fusioncatcher/Dockerfile (100%) rename {tools => containers}/fusioncatcher/environment.yml (89%) rename {tools => containers}/pizzly/Dockerfile (100%) rename {tools => containers}/pizzly/environment.yml (92%) rename {tools => containers}/squid/Dockerfile (100%) rename {tools => containers}/squid/environment.yml (93%) rename {tools => containers}/star-fusion/Dockerfile (100%) rename {tools => containers}/star-fusion/environment.yml (95%) delete mode 100755 tools/build.sh diff --git a/tools/arriba/Dockerfile b/containers/arriba/Dockerfile similarity index 100% rename from tools/arriba/Dockerfile rename to containers/arriba/Dockerfile diff --git a/tools/arriba/environment.yml b/containers/arriba/environment.yml similarity index 95% rename from tools/arriba/environment.yml rename to containers/arriba/environment.yml index 52b0f59d..d24c2372 100644 --- a/tools/arriba/environment.yml +++ b/containers/arriba/environment.yml @@ -2,6 +2,7 @@ name: arriba_v1.1.0 channels: - conda-forge - bioconda + - defaults dependencies: - arriba=1.1.0 - bioconda::star=2.7.0f diff --git a/tools/ericscript/Dockerfile b/containers/ericscript/Dockerfile similarity index 100% rename from tools/ericscript/Dockerfile rename to containers/ericscript/Dockerfile diff --git a/tools/ericscript/environment.yml b/containers/ericscript/environment.yml similarity index 91% rename from tools/ericscript/environment.yml rename to containers/ericscript/environment.yml index 065a7c39..5f224eb9 100644 --- a/tools/ericscript/environment.yml +++ b/containers/ericscript/environment.yml @@ -1,7 +1,8 @@ name: ericscript_v0.5.5 channels: - - bioconda - conda-forge + - bioconda + - defaults dependencies: - conda-forge::ncurses=6.1 - bioconda::ericscript=0.5.5 diff --git a/tools/fusion-inspector/Dockerfile b/containers/fusion-inspector/Dockerfile similarity index 100% rename from tools/fusion-inspector/Dockerfile rename to containers/fusion-inspector/Dockerfile diff --git a/tools/fusion-inspector/environment.yml b/containers/fusion-inspector/environment.yml similarity index 81% rename from tools/fusion-inspector/environment.yml rename to containers/fusion-inspector/environment.yml index aa7c4517..c6fb62a2 100644 --- a/tools/fusion-inspector/environment.yml +++ b/containers/fusion-inspector/environment.yml @@ -1,6 +1,8 @@ name: fusion-inspector_v1.3.1-star2.7.0f channels: + - conda-forge - bioconda + - defaults dependencies: - bioconda::star=2.7.0f - fusion-inspector=1.3.1 diff --git a/tools/fusioncatcher/Dockerfile b/containers/fusioncatcher/Dockerfile similarity index 100% rename from tools/fusioncatcher/Dockerfile rename to containers/fusioncatcher/Dockerfile diff --git a/tools/fusioncatcher/environment.yml b/containers/fusioncatcher/environment.yml similarity index 89% rename from tools/fusioncatcher/environment.yml rename to containers/fusioncatcher/environment.yml index c00cfc58..afcb4497 100644 --- a/tools/fusioncatcher/environment.yml +++ b/containers/fusioncatcher/environment.yml @@ -1,7 +1,7 @@ name: fusioncatcher_v1.20 channels: - - anaconda - - bioconda - conda-forge + - bioconda + - defaults dependencies: - bioconda::fusioncatcher=1.20 diff --git a/tools/pizzly/Dockerfile b/containers/pizzly/Dockerfile similarity index 100% rename from tools/pizzly/Dockerfile rename to containers/pizzly/Dockerfile diff --git a/tools/pizzly/environment.yml b/containers/pizzly/environment.yml similarity index 92% rename from tools/pizzly/environment.yml rename to containers/pizzly/environment.yml index a64e87c9..fe042a60 100644 --- a/tools/pizzly/environment.yml +++ b/containers/pizzly/environment.yml @@ -1,7 +1,8 @@ name: pizzly_v0.37.3 channels: - - bioconda - conda-forge + - bioconda + - defaults dependencies: - bioconda::pizzly=0.37.3 - bioconda::kallisto=0.44.0 diff --git a/tools/squid/Dockerfile b/containers/squid/Dockerfile similarity index 100% rename from tools/squid/Dockerfile rename to containers/squid/Dockerfile diff --git a/tools/squid/environment.yml b/containers/squid/environment.yml similarity index 93% rename from tools/squid/environment.yml rename to containers/squid/environment.yml index 288c89f3..885b4a8d 100644 --- a/tools/squid/environment.yml +++ b/containers/squid/environment.yml @@ -1,7 +1,8 @@ name: squid_v1.5-star2.7.0f channels: - - bioconda - conda-forge + - bioconda + - defaults dependencies: - python=3.7.4 - squid=1.5 diff --git a/tools/star-fusion/Dockerfile b/containers/star-fusion/Dockerfile similarity index 100% rename from tools/star-fusion/Dockerfile rename to containers/star-fusion/Dockerfile diff --git a/tools/star-fusion/environment.yml b/containers/star-fusion/environment.yml similarity index 95% rename from tools/star-fusion/environment.yml rename to containers/star-fusion/environment.yml index 22dd1dee..9138f140 100644 --- a/tools/star-fusion/environment.yml +++ b/containers/star-fusion/environment.yml @@ -1,7 +1,8 @@ name: star-fusion_v1.6.0 channels: - - bioconda - conda-forge + - bioconda + - defaults dependencies: - bioconda::star=2.7.0f - bioconda::star-fusion=1.6.0 diff --git a/tools/build.sh b/tools/build.sh deleted file mode 100755 index b7f03c5f..00000000 --- a/tools/build.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -PREFIX="nfcore/rnafusion" - -create_container() { - TOOL_PATH=$1 - VERSION="$(cat $TOOL_PATH/environment.yml | grep "name:" | cut -d":" -f2 | cut -d " " -f2)" - CONTAINER_NAME="$PREFIX:$VERSION" - echo "Building [$CONTAINER_NAME]" - docker build $TOOL_PATH -t $CONTAINER_NAME - docker push $CONTAINER_NAME -} - -if [ $# -eq 0 ]; then - echo "No tool name specified!" - echo "Run build.sh -h for help" - exit 1 -fi - -if [ $1 == "-h" ]; then - echo "Utility for building docker containers from tools/" - echo "Usage: build.sh [options]" - echo - echo "Options:" - echo " all build all tools including main image" - echo " builds specific tool" - echo " Example: sh build.sh ericscript" - exit 0 -fi - -if [ $1 == "all" ]; then - for TOOL in */; do - create_container `pwd`/$TOOL ${TOOL%?} - done - # Build main cotainer - VERSION="$(cat ../nextflow.config | grep -m1 "container" | cut -d":" -f2 | cut -d "'" -f1)" - CONTAINER_NAME=$PREFIX:$VERSION - echo "Building [$CONTAINER_NAME]" - docker build ../. -t $CONTAINER_NAME -else - TOOL=$1 - TOOL_PATH="$(pwd)/$TOOL" - if [ ! -d $TOOL_PATH ]; then - echo "The tool doesn't exist" - exit 1 - else - create_container $TOOL_PATH - fi -fi From bceeebd08c655eaa6c1b9109b567c9cedac5f595 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 20:32:27 +0200 Subject: [PATCH 0120/1520] update path --- scripts/build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/build.sh b/scripts/build.sh index 817153f8..418317af 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -13,18 +13,18 @@ create_container() { if [ $# -eq 0 ]; then echo "No tool name specified!" - echo "Run build.sh -h for help" + echo "Run scripts/build.sh -h for help" exit 1 fi if [ $1 == "-h" ]; then echo "Utility for building docker containers from tools/" - echo "Usage: build.sh [options]" + echo "Usage: scripts/build.sh [options]" echo echo "Options:" echo " all build all tools including main image" echo " builds specific tool" - echo " Example: sh build.sh ericscript" + echo " Example: sh scripts/build.sh ericscript" exit 0 fi From ee628507687c765f71c2d97333c101d7f5821385 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 21:20:33 +0200 Subject: [PATCH 0121/1520] fix ssl issue --- containers/arriba/environment.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/containers/arriba/environment.yml b/containers/arriba/environment.yml index d24c2372..a3b3fbc7 100644 --- a/containers/arriba/environment.yml +++ b/containers/arriba/environment.yml @@ -4,10 +4,11 @@ channels: - bioconda - defaults dependencies: - - arriba=1.1.0 - - bioconda::star=2.7.0f + - bioconda::arriba=1.1.0 + - bioconda::bioconductor-genomicalignments + - bioconda::bioconductor-genomicranges - bioconda::samtools=1.9 + - bioconda::star=2.7.0f + - conda-forge::openssl=1.0 - conda-forge::r-circlize - - conda-forge::readline=6.2 - - bioconda::bioconductor-genomicalignments - - bioconda::bioconductor-genomicranges \ No newline at end of file + - conda-forge::readline=6.2 \ No newline at end of file From 80b3f2cd75c8ccc50684d3224bce56df2387f4ca Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 21:52:28 +0200 Subject: [PATCH 0122/1520] update files --- containers/arriba/Dockerfile | 7 +++++-- containers/arriba/environment.yml | 2 +- containers/ericscript/Dockerfile | 7 +++++-- containers/ericscript/environment.yml | 4 ++-- containers/fusion-inspector/Dockerfile | 7 +++++-- containers/fusion-inspector/environment.yml | 4 ++-- containers/fusioncatcher/Dockerfile | 7 +++++-- containers/fusioncatcher/environment.yml | 2 +- containers/pizzly/Dockerfile | 7 +++++-- containers/pizzly/environment.yml | 4 ++-- containers/squid/Dockerfile | 13 ++++++++----- containers/squid/environment.yml | 8 ++++---- containers/star-fusion/Dockerfile | 16 +++++++++------- containers/star-fusion/environment.yml | 10 +++++----- 14 files changed, 59 insertions(+), 39 deletions(-) diff --git a/containers/arriba/Dockerfile b/containers/arriba/Dockerfile index 546dacfe..889d2a76 100644 --- a/containers/arriba/Dockerfile +++ b/containers/arriba/Dockerfile @@ -3,9 +3,12 @@ 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 -ENV PATH /opt/conda/envs/arriba_v1.1.0/bin:$PATH + +# Add conda installation dir to PATH (instead of doing 'conda activate') +ENV PATH /opt/conda/envs/nf-core-rnafusion-arriba_1.1.0/bin:$PATH # Dump the details of the installed packages to a file for posterity -RUN conda env export --name arriba_v1.1.0 > arriba_v1.1.0.yml \ No newline at end of file +RUN conda env export --name nf-core-rnafusion-arriba_1.1.0 > nf-core-rnafusion-arriba_1.1.0.yml \ No newline at end of file diff --git a/containers/arriba/environment.yml b/containers/arriba/environment.yml index a3b3fbc7..688c7c33 100644 --- a/containers/arriba/environment.yml +++ b/containers/arriba/environment.yml @@ -1,4 +1,4 @@ -name: arriba_v1.1.0 +name: nf-core-rnafusion-arriba_1.1.0 channels: - conda-forge - bioconda diff --git a/containers/ericscript/Dockerfile b/containers/ericscript/Dockerfile index 1b7419a8..50fc7f2e 100644 --- a/containers/ericscript/Dockerfile +++ b/containers/ericscript/Dockerfile @@ -3,9 +3,12 @@ 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 -ENV PATH /opt/conda/envs/ericscript_v0.5.5/bin:$PATH + +# 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 # Dump the details of the installed packages to a file for posterity -RUN conda env export --name ericscript_v0.5.5 > ericscript_v0.5.5.yml \ No newline at end of file +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 index 5f224eb9..3edc48ce 100644 --- a/containers/ericscript/environment.yml +++ b/containers/ericscript/environment.yml @@ -1,8 +1,8 @@ -name: ericscript_v0.5.5 +name: nf-core-rnafusion-ericscript_0.5.5 channels: - conda-forge - bioconda - defaults dependencies: - - conda-forge::ncurses=6.1 - bioconda::ericscript=0.5.5 + - conda-forge::ncurses=6.1 \ No newline at end of file diff --git a/containers/fusion-inspector/Dockerfile b/containers/fusion-inspector/Dockerfile index c6d3031e..8ead9a37 100644 --- a/containers/fusion-inspector/Dockerfile +++ b/containers/fusion-inspector/Dockerfile @@ -3,9 +3,12 @@ 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 -ENV PATH /opt/conda/envs/fusion-inspector_v1.3.1-star2.7.0f/bin:$PATH + +# Add conda installation dir to PATH (instead of doing 'conda activate') +ENV PATH /opt/conda/envs/nf-core-rnafusion-fusion-inspector_1.3.1-star2.7.0f/bin:$PATH # Dump the details of the installed packages to a file for posterity -RUN conda env export --name fusion-inspector_v1.3.1-star2.7.0f > fusion-inspector_v1.3.1-star2.7.0f.yml \ No newline at end of file +RUN conda env export --name nf-core-rnafusion-fusion-inspector_1.3.1-star2.7.0f > nf-core-rnafusion-fusion-inspector_1.3.1-star2.7.0f.yml \ No newline at end of file diff --git a/containers/fusion-inspector/environment.yml b/containers/fusion-inspector/environment.yml index c6fb62a2..c308c0b1 100644 --- a/containers/fusion-inspector/environment.yml +++ b/containers/fusion-inspector/environment.yml @@ -1,8 +1,8 @@ -name: fusion-inspector_v1.3.1-star2.7.0f +name: nf-core-rnafusion-fusion-inspector_1.3.1-star2.7.0f channels: - conda-forge - bioconda - defaults dependencies: - bioconda::star=2.7.0f - - fusion-inspector=1.3.1 + - bioconda::fusion-inspector=1.3.1 diff --git a/containers/fusioncatcher/Dockerfile b/containers/fusioncatcher/Dockerfile index 0047a3fa..203bb32a 100644 --- a/containers/fusioncatcher/Dockerfile +++ b/containers/fusioncatcher/Dockerfile @@ -3,9 +3,12 @@ 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 -ENV PATH /opt/conda/envs/fusioncatcher_v1.20/bin:$PATH + +# 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 fusioncatcher_v1.20 > fusioncatcher_v1.20.yml \ No newline at end of file +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 index afcb4497..1d6a105d 100644 --- a/containers/fusioncatcher/environment.yml +++ b/containers/fusioncatcher/environment.yml @@ -1,4 +1,4 @@ -name: fusioncatcher_v1.20 +name: nf-core-rnafusion-fusioncatcher_1.20 channels: - conda-forge - bioconda diff --git a/containers/pizzly/Dockerfile b/containers/pizzly/Dockerfile index 6cb1ce39..2817069f 100644 --- a/containers/pizzly/Dockerfile +++ b/containers/pizzly/Dockerfile @@ -3,9 +3,12 @@ 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 -ENV PATH /opt/conda/envs/pizzly_v0.37.3/bin:$PATH + +# 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 pizzly_v0.37.3 > pizzly_v0.37.3.yml \ No newline at end of file +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 index fe042a60..79974871 100644 --- a/containers/pizzly/environment.yml +++ b/containers/pizzly/environment.yml @@ -1,9 +1,9 @@ -name: pizzly_v0.37.3 +name: nf-core-rnafusion-pizzly_0.37.3 channels: - conda-forge - bioconda - defaults dependencies: - - bioconda::pizzly=0.37.3 - 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 index 9a26ba21..44f67fec 100644 --- a/containers/squid/Dockerfile +++ b/containers/squid/Dockerfile @@ -3,14 +3,17 @@ 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 -ENV PATH /opt/conda/envs/squid_v1.5-star2.7.0f/bin:$PATH -RUN cd /opt/conda/envs/squid_v1.5-star2.7.0f/bin \ +# Add conda installation dir to PATH (instead of doing 'conda activate') +ENV PATH /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.0f/bin:$PATH + +RUN cd /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.0f/bin \ && wget https://raw.githubusercontent.com/Kingsford-Group/squid/f45c9025d41cffd982ecbbdd52844e5a4f074de9/utils/AnnotateSQUIDOutput.py \ - && chmod +x /opt/conda/envs/squid_v1.5-star2.7.0f/bin/AnnotateSQUIDOutput.py \ - && ln -s /opt/conda/envs/squid_v1.5-star2.7.0f/bin/python3 /bin/python + && chmod +x /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.0f/bin/AnnotateSQUIDOutput.py \ + && ln -s /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.0f/bin/python3 /bin/python # Dump the details of the installed packages to a file for posterity -RUN conda env export --name squid_v1.5-star2.7.0f > squid_v1.5-star2.7.0f.yml \ No newline at end of file +RUN conda env export --name nf-core-rnafusion-squid_1.5-star2.7.0f > nf-core-rnafusion-squid_1.5-star2.7.0f.yml \ No newline at end of file diff --git a/containers/squid/environment.yml b/containers/squid/environment.yml index 885b4a8d..34440f11 100644 --- a/containers/squid/environment.yml +++ b/containers/squid/environment.yml @@ -1,11 +1,11 @@ -name: squid_v1.5-star2.7.0f +name: nf-core-rnafusion-squid_1.5-star2.7.0f channels: - conda-forge - bioconda - defaults dependencies: - - python=3.7.4 - - squid=1.5 - - bioconda::star=2.7.0f - bioconda::samtools=1.9 + - bioconda::squid=1.5 + - bioconda::star=2.7.0f - conda-forge::numpy=1.18.1 + - conda-forge::python=3.7.4 diff --git a/containers/star-fusion/Dockerfile b/containers/star-fusion/Dockerfile index f911b81a..df3d3afc 100644 --- a/containers/star-fusion/Dockerfile +++ b/containers/star-fusion/Dockerfile @@ -3,22 +3,24 @@ 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 -ENV PATH /opt/conda/envs/star-fusion_v1.6.0/bin:$PATH +# Add conda installation dir to PATH (instead of doing 'conda activate') +ENV PATH /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/bin:$PATH # ctat-genome-lib-builder -RUN cd /opt/conda/envs/star-fusion_v1.6.0/ && \ +RUN cd /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/ && \ wget https://github.com/NCIP/ctat-genome-lib-builder/archive/2830cd708c5bb9353878ca98069427e83acdd625.zip && \ unzip 2830cd708c5bb9353878ca98069427e83acdd625.zip && \ cd ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625 && \ - rm /opt/conda/envs/star-fusion_v1.6.0/bin/prep_genome_lib.pl + rm /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/bin/prep_genome_lib.pl -ENV PATH /opt/conda/envs/star-fusion_v1.6.0/ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625/:$PATH +ENV PATH /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625/:$PATH -RUN ln -s /opt/conda/envs/star-fusion_v1.6.0/lib/libssl.so /opt/conda/envs/star-fusion_v1.6.0/lib/libssl.so.1.0.0 && \ - ln -s /opt/conda/envs/star-fusion_v1.6.0/lib/libcrypto.so /opt/conda/envs/star-fusion_v1.6.0/lib/libcrypto.so.1.0.0 +RUN ln -s /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/lib/libssl.so /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/lib/libssl.so.1.0.0 && \ + ln -s /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/lib/libcrypto.so /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/lib/libcrypto.so.1.0.0 # Dump the details of the installed packages to a file for posterity -RUN conda env export --name star-fusion_v1.6.0 > star-fusion_v1.6.0.yml \ No newline at end of file +RUN conda env export --name nf-core-rnafusion-star-fusion_1.6.0 > nf-core-rnafusion-star-fusion_1.6.0.yml \ No newline at end of file diff --git a/containers/star-fusion/environment.yml b/containers/star-fusion/environment.yml index 9138f140..007b7a85 100644 --- a/containers/star-fusion/environment.yml +++ b/containers/star-fusion/environment.yml @@ -1,13 +1,13 @@ -name: star-fusion_v1.6.0 +name: nf-core-rnafusion-star-fusion_1.6.0 channels: - conda-forge - bioconda - defaults dependencies: - - bioconda::star=2.7.0f + - bioconda::dfam=2.0 + - bioconda::hmmer=3.2.1 - bioconda::star-fusion=1.6.0 + - bioconda::star=2.7.0f - bioconda::trinity=2.6.6 - conda-forge::perl-carp-assert - - bioconda::hmmer=3.2.1 - - conda-forge::unzip=6.0 - - bioconda::dfam=2.0 \ No newline at end of file + - conda-forge::unzip=6.0 \ No newline at end of file From 695137e6d30b5cfdfb46f434374972c9af38f07d Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 21:54:28 +0200 Subject: [PATCH 0123/1520] fix typos --- build-ctat.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build-ctat.nf b/build-ctat.nf index 6d4ea16a..5dc3124f 100644 --- a/build-ctat.nf +++ b/build-ctat.nf @@ -24,7 +24,7 @@ def helpMessage() { The typical command for downloading references is as follows: - nextflow run nf-core/rnafusion/utils/build-ctat.nf -profile [PROFILE] [OPTIONS] --outdir /path/to/output + nextflow run nf-core/rnafusion/build-ctat.nf -profile [PROFILE] [OPTIONS] --outdir /path/to/output Mandatory arguments: --fasta [file] Path to fasta reference @@ -112,7 +112,7 @@ process star_fusion { * Completion */ workflow.onComplete { - log.info "[nf-core/rnafusion/download-references.nf] Pipeline Complete" + log.info "[nf-core/rnafusion/build-ctat.nf] Pipeline Complete" } def nfcoreHeader() { From 1ea7dcfae2fb31b0ca4a20c50e755f08160a7718 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 21:59:22 +0200 Subject: [PATCH 0124/1520] update container names --- conf/base.config | 14 +++++++------- download-singularity-img.nf | 32 ++++++++++++++++---------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/conf/base.config b/conf/base.config index 427f27b9..14784047 100644 --- a/conf/base.config +++ b/conf/base.config @@ -55,24 +55,24 @@ process { // Fusion tools withName:"arriba|arriba_visualization" { - container = "nfcore/rnafusion:arriba_v${params.versions.arriba}" + container = "nfcore/rnafusion:arriba_${params.versions.arriba}" } withName:ericscript { - container = "nfcore/rnafusion:ericscript_v${params.versions.ericscript}" + container = "nfcore/rnafusion:ericscript_${params.versions.ericscript}" } withName:fusioncatcher { - container = "nfcore/rnafusion:fusioncatcher_v${params.versions.fusioncatcher}" + container = "nfcore/rnafusion:fusioncatcher_${params.versions.fusioncatcher}" } withName:fusion_inspector { - container = "nfcore/rnafusion:fusion-inspector_v${params.versions.fusion_inspector}" + container = "nfcore/rnafusion:fusion-inspector_${params.versions.fusion_inspector}" } withName:pizzly { - container = "nfcore/rnafusion:pizzly_v${params.versions.pizzly}" + container = "nfcore/rnafusion:pizzly_${params.versions.pizzly}" } withName:squid { - container = "nfcore/rnafusion:squid_v${params.versions.squid}" + container = "nfcore/rnafusion:squid_${params.versions.squid}" } withName:"star_fusion" { - container = "nfcore/rnafusion:star-fusion_v${params.versions.star_fusion}" + container = "nfcore/rnafusion:star-fusion_${params.versions.star_fusion}" } } \ No newline at end of file diff --git a/download-singularity-img.nf b/download-singularity-img.nf index b26793bc..ea14a703 100644 --- a/download-singularity-img.nf +++ b/download-singularity-img.nf @@ -95,11 +95,11 @@ process download_base_image { params.download_all output: - file "nf-core-rnafusion-v${workflow.manifest.version}.img" + file "nf-core-rnafusion-${workflow.manifest.version}.img" script: """ - singularity pull --name "nf-core-rnafusion-v${workflow.manifest.version}.img" docker://nfcore/rnafusion:${workflow.manifest.version} + singularity pull --name nf-core-rnafusion-${workflow.manifest.version}.img docker://nfcore/rnafusion:${workflow.manifest.version} """ } @@ -110,11 +110,11 @@ process download_arriba { params.arriba || params.download_all output: - file "nf-core-rnafusion-arriba_v${params.versions.arriba}.img" + file "nf-core-rnafusion-arriba_${params.versions.arriba}.img" script: """ - singularity pull --name "nf-core-rnafusion-arriba_v${params.versions.arriba}.img" docker://nfcore/rnafusion:arriba_v${params.versions.arriba} + singularity pull --name nf-core-rnafusion-arriba_${params.versions.arriba}.img docker://nfcore/rnafusion:arriba_${params.versions.arriba} """ } @@ -125,11 +125,11 @@ process download_ericscript { params.ericscript || params.download_all output: - file "nf-core-rnafusion-ericscript_v${params.versions.ericscript}.img" + file "nf-core-rnafusion-ericscript_${params.versions.ericscript}.img" script: """ - singularity pull --name "nf-core-rnafusion-ericscript_v${params.versions.ericscript}.img" docker://nfcore/rnafusion:ericscript_v${params.versions.ericscript} + singularity pull --name nf-core-rnafusion-ericscript_${params.versions.ericscript}.img docker://nfcore/rnafusion:ericscript_${params.versions.ericscript} """ } @@ -140,11 +140,11 @@ process download_fusioncatcher { params.fusioncatcher || params.download_all output: - file "nf-core-rnafusion-fusioncatcher_v${params.versions.fusioncatcher}.img" + file "nf-core-rnafusion-fusioncatcher_${params.versions.fusioncatcher}.img" script: """ - singularity pull --name "nf-core-rnafusion-fusioncatcher_v${params.versions.fusioncatcher}.img" docker://nfcore/rnafusion:fusioncatcher_v${params.versions.fusioncatcher} + singularity pull --name nf-core-rnafusion-fusioncatcher_${params.versions.fusioncatcher}.img docker://nfcore/rnafusion:fusioncatcher_${params.versions.fusioncatcher} """ } @@ -155,11 +155,11 @@ process download_fusion_inspector { params.fusion_inspector || params.download_all output: - file "nf-core-rnafusion-fusion-inspector_v${params.versions.fusion_inspector}.img" + file "nf-core-rnafusion-fusion-inspector_${params.versions.fusion_inspector}.img" script: """ - singularity pull --name "nf-core-rnafusion-fusion-inspector_v${params.versions.fusion_inspector}.img" docker://nfcore/rnafusion:fusion-inspector_v${params.versions.fusion_inspector} + singularity pull --name nf-core-rnafusion-fusion-inspector_${params.versions.fusion_inspector}.img docker://nfcore/rnafusion:fusion-inspector_${params.versions.fusion_inspector} """ } @@ -170,11 +170,11 @@ process download_pizzly { params.pizzly || params.download_all output: - file "nf-core-rnafusion-pizzly_v${params.versions.pizzly}.img" + file "nf-core-rnafusion-pizzly_${params.versions.pizzly}.img" script: """ - singularity pull --name "nf-core-rnafusion-pizzly_v${params.versions.pizzly}.img" docker://nfcore/rnafusion:pizzly_v${params.versions.pizzly} + singularity pull --name nf-core-rnafusion-pizzly_${params.versions.pizzly}.img docker://nfcore/rnafusion:pizzly_${params.versions.pizzly} """ } @@ -185,11 +185,11 @@ process download_squid { params.squid || params.download_all output: - file "nf-core-rnafusion-squid_v${params.versions.squid}.img" + file "nf-core-rnafusion-squid_${params.versions.squid}.img" script: """ - singularity pull --name "nf-core-rnafusion-squid_v${params.versions.squid}.img" docker://nfcore/rnafusion:squid_v${params.versions.squid} + singularity pull --name nf-core-rnafusion-squid_${params.versions.squid}.img docker://nfcore/rnafusion:squid_${params.versions.squid} """ } @@ -200,11 +200,11 @@ process download_star_fusion { params.star_fusion || params.download_all output: - file "nf-core-rnafusion-star-fusion_v${params.versions.star_fusion}.img" + file "nf-core-rnafusion-star-fusion_${params.versions.star_fusion}.img" script: """ - singularity pull --name "nf-core-rnafusion-star-fusion_v${params.versions.star_fusion}.img" docker://nfcore/rnafusion:star-fusion_v${params.versions.star_fusion} + singularity pull --name nf-core-rnafusion-star-fusion_${params.versions.star_fusion}.img docker://nfcore/rnafusion:star-fusion_${params.versions.star_fusion} """ } From ac4cb75012b602fcb71e40cd7cb71d8daeb61b95 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 22:14:41 +0200 Subject: [PATCH 0125/1520] update CHANGELOG --- CHANGELOG.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f12bfd7d..f86ebfc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ 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/) +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). ## dev nfcore/rnafusion @@ -29,12 +29,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. * `MultiQC v1.7` * `STAR aligner v2.7.0f` -### Added +### Added - [1.1.0] * 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 +### Changed - [1.1.0] * Updated examples and configurations * Upgraded `fusion-report v1.0.0` to `fusion-report v2.0.1` @@ -46,12 +46,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. * Updated logos * Updated to nf-core `1.8` TEMPLATE -### Fixed +### Fixed - [1.1.0] * 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 +### Removed - [1.1.0] * Variables `pizzly_fasta` and `pizzly_gtf` have been removed and replaced with `transcript` and `gtf` * `Jenkisfile`, test configuration, pylintrc configuration @@ -61,11 +61,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [1.0.2] nfcore/rnafusion - 2019/05/13 -### Changed +### Changed - [1.0.2] * Bumped nf-core template to 1.6 [#69](https://github.com/nf-core/rnafusion/pull/69) -### Fixed +### Fixed - [1.0.2] * 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) @@ -75,7 +75,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [1.0.1] nfcore/rnafusion - 2019/04/06 -### Added +### Added - [1.0.1] * Added support for extra parameters for tools STAR-Fusion, FusionCatcher and fusion-report * Added example configuration for `singularity` and `docker` @@ -84,18 +84,18 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. * Added nextflow helper script `download-references.nf` * Added `Jenkinsfile` for in-house testing -### Changed +### Changed - [1.0.1] * Updated installation of `FusionCatcher` (available now on bioconda) -### Fixed +### Fixed - [1.0.1] * 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 - [1.0.1] * Removed `Singularity` From f88d2e76b7dada26fc3aeb9fc4533c0b1d11ad79 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 22:18:59 +0200 Subject: [PATCH 0126/1520] fix markdownlint --- docs/usage.md | 132 +++++++++++++++++++++++--------------------------- 1 file changed, 61 insertions(+), 71 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 16ee0c2a..44ecf99f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -2,71 +2,67 @@ ## Table of contents -* [Table of contents](#table-of-contents) -* [Introduction](#introduction) -* [Running the pipeline](#running-the-pipeline) - * [Using Docker](#running-the-pipeline-using-docker) - * [Using Singularity](#running-the-pipeline-using-singularity) - * [Running specific tools](#running-specific-tools) - * [Updating the pipeline](#updating-the-pipeline) - * [Reproducibility](#reproducibility) -* [Main arguments](#main-arguments) - * [`-profile`](#-profile-single-dash) - * [`--reads`](#--reads) - * [`--single_end`](#--single_end) -* [Tool flags](#tool-flags) - * [`--arriba`](#--arriba) - * [`--arriba_opt`](#--arriba_opt) - * [`--ericscript`](#--ericscript) - * [`--ericscript_opt`](#--ericscript_opt) - * [`--fusioncatcher`](#--fusioncatcher) - * [`--fusioncatcher_opt`](#--fusioncatcher_opt) - * [`--fusion_report_opt`](#--fusion_report_opt) - * [`--pizzly`](#--pizzly) - * [`--pizzly_k`](#--pizzly_k) - * [`--squid`](#--squid) - * [`--star_fusion`](#--star_fusion) - * [`--star_fusion_opt`](#--star_fusion_opt) -* [Visualization flags](#visualization-flags) - * [`--arriba_vis`](#--arriba_vis) - * [`--fusion_inspector`](#--fusion_inspector) -* [Reference genomes](#reference-genomes) - * [`--arriba_ref`](#--arriba_ref) - * [`--databases`](#--databases) - * [`--ericscript_ref`](#--ericscript_ref) - * [`--fasta`](#--fasta) - * [`--fusioncatcher_ref`](#--fusioncatcher_ref) - * [`--genome` (using iGenomes)](#--genome-using-igenomes) - * [`--gtf`](#--gtf) - * [`--igenomes_ignore`](#--igenomes_ignore) - * [`--star_index`](#--star_index) - * [`--star_fusion_ref`](#--star_fusion_ref) - * [`--transcript`](#--transcript) -* [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) - * [`--debug`](#--debug) - * [`--read_length`](#--read_length) - * [`--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) +- [nf-core/rnafusion: Usage](#nf-corernafusion-usage) + - [Table of contents](#table-of-contents) + - [Introduction](#introduction) + - [Running the pipeline](#running-the-pipeline) + - [Running the pipeline using Docker](#running-the-pipeline-using-docker) + - [Running the pipeline using Singularity](#running-the-pipeline-using-singularity) + - [Running specific tools](#running-specific-tools) + - [Updating the pipeline](#updating-the-pipeline) + - [Reproducibility](#reproducibility) + - [Main arguments](#main-arguments) + - [`-profile`](#-profile) + - [`--reads`](#--reads) + - [`--single_end`](#--single_end) + - [Tool flags](#tool-flags) + - [`--arriba`](#--arriba) + - [`--ericscript`](#--ericscript) + - [`--fusioncatcher`](#--fusioncatcher) + - [`--fusion_report_opt`](#--fusion_report_opt) + - [`--pizzly`](#--pizzly) + - [`--squid`](#--squid) + - [`--star_fusion`](#--star_fusion) + - [Visualization flags](#visualization-flags) + - [`--arriba_vis`](#--arriba_vis) + - [`--fusion_inspector`](#--fusion_inspector) + - [Reference genomes](#reference-genomes) + - [`--arriba_ref`](#--arriba_ref) + - [`--genome` (using iGenomes)](#--genome-using-igenomes) + - [`--databases`](#--databases) + - [`--ericscript_ref`](#--ericscript_ref) + - [`--fasta`](#--fasta) + - [`--igenomes_ignore`](#--igenomes_ignore) + - [`--fusioncatcher_ref`](#--fusioncatcher_ref) + - [`--gtf`](#--gtf) + - [`--star_index`](#--star_index) + - [`--star_fusion_ref`](#--star_fusion_ref) + - [`--transcript`](#--transcript) + - [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) + - [`--debug`](#--debug) + - [`--read_length`](#--read_length) + - [`--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 @@ -385,12 +381,6 @@ The AWS region in which to run your job. Default is set to `eu-west-1` but can b 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`. -The AWS region in which to run your job. Default is set to `eu-west-1` but can be adjusted to your needs. - -### `--awscli` - -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`. - The AWS region to run your job in. Default is set to `eu-west-1` but can be adjusted to your needs. 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. From 69a4826519ecd87a549e3f2d09a16a7cec1b66d6 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 22:24:45 +0200 Subject: [PATCH 0127/1520] update CHANGELOG --- CHANGELOG.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f86ebfc0..8f799d28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,12 +29,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. * `MultiQC v1.7` * `STAR aligner v2.7.0f` -### Added - [1.1.0] +### 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 - [1.1.0] +### Changed * Updated examples and configurations * Upgraded `fusion-report v1.0.0` to `fusion-report v2.0.1` @@ -46,12 +46,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. * Updated logos * Updated to nf-core `1.8` TEMPLATE -### Fixed - [1.1.0] +### 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 - [1.1.0] +### Removed * Variables `pizzly_fasta` and `pizzly_gtf` have been removed and replaced with `transcript` and `gtf` * `Jenkisfile`, test configuration, pylintrc configuration @@ -61,11 +61,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [1.0.2] nfcore/rnafusion - 2019/05/13 -### Changed - [1.0.2] +### Changed * Bumped nf-core template to 1.6 [#69](https://github.com/nf-core/rnafusion/pull/69) -### Fixed - [1.0.2] +### 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) @@ -75,7 +75,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [1.0.1] nfcore/rnafusion - 2019/04/06 -### Added - [1.0.1] +### Added * Added support for extra parameters for tools STAR-Fusion, FusionCatcher and fusion-report * Added example configuration for `singularity` and `docker` @@ -84,18 +84,18 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. * Added nextflow helper script `download-references.nf` * Added `Jenkinsfile` for in-house testing -### Changed - [1.0.1] +### Changed * Updated installation of `FusionCatcher` (available now on bioconda) -### Fixed - [1.0.1] +### 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 - [1.0.1] +### Removed * Removed `Singularity` From 188204757a27d8e9b023d059789fbdbda5901efc Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 27 Apr 2020 22:27:42 +0200 Subject: [PATCH 0128/1520] fix markdown lint --- docs/usage.md | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 44ecf99f..f08295d9 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -178,19 +178,19 @@ 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/) -* `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/) -* `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/) - * Pulls most software from [Bioconda](https://bioconda.github.io/) -* `test` - * A profile with a complete configuration for automated testing - * Includes links to test data so needs no other parameters +- `docker` + - A generic configuration profile to be used with [Docker](http://docker.com/) + - Pulls software from DockerHub: [`nfcore/rnafusion`](http://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/) +- `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/) + - Pulls most software from [Bioconda](https://bioconda.github.io/) +- `test` + - A profile with a complete configuration for automated testing + - Includes links to test data so needs no other parameters ### `--reads` @@ -222,22 +222,22 @@ By default, the pipeline expects paired-end data. If you have single-end data, y If enabled, executes `Arriba` tool. -* `--arriba_opt` - * Specify additional parameters. For more info, please refer to the [documentation](http://arriba.readthedocs.io/en/latest/quickstart/) of the tool. +- `--arriba_opt` + - Specify additional parameters. For more info, please refer to the [documentation](http://arriba.readthedocs.io/en/latest/quickstart/) of the tool. ### `--ericscript` If enabled, executes `Ericscript` tool. -* `--ericscript_opt` - * Specify additional parameters. For more info, please refer to the [documentation](https://sites.google.com/site/bioericscript/home) of the tool. +- `--ericscript_opt` + - Specify additional parameters. For more info, please refer to the [documentation](https://sites.google.com/site/bioericscript/home) of the tool. ### `--fusioncatcher` If enabled, executes `Fusioncatcher` tool. -* `--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. +- `--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. ### `--fusion_report_opt` @@ -247,8 +247,8 @@ Specify additional parameters. For more info, please refer to the [documentation If enabled, executes `Pizzly` tool. -* `--pizzly_k` - * Number of k-mers. Deafult 31. +- `--pizzly_k` + - Number of k-mers. Deafult 31. ### `--squid` @@ -258,8 +258,8 @@ If enabled, executes `Squid` tool. If enabled, executes `STAR-Fusion` tool. -* `--star_fusion_opt` - * Parameter for specifying additional parameters. For more info, please refer to the [documentation](https://github.com/STAR-Fusion/STAR-Fusion/wiki) of the tool. +- `--star_fusion_opt` + - Parameter for specifying additional parameters. For more info, please refer to the [documentation](https://github.com/STAR-Fusion/STAR-Fusion/wiki) of the tool. ## Visualization flags From ec0bf3e951baf2c3eef6454d98897397a93c23e3 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 27 Apr 2020 22:37:18 +0200 Subject: [PATCH 0129/1520] refactor: move `download-singularity-img.sh` to scripts --- {utils => scripts}/download-singularity-img.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename {utils => scripts}/download-singularity-img.sh (87%) diff --git a/utils/download-singularity-img.sh b/scripts/download-singularity-img.sh similarity index 87% rename from utils/download-singularity-img.sh rename to scripts/download-singularity-img.sh index 2684fc55..7f6d1b31 100644 --- a/utils/download-singularity-img.sh +++ b/scripts/download-singularity-img.sh @@ -1,7 +1,7 @@ #!/bin/bash get_tool_version() { - echo $(cat ../nextflow.config | grep -m1 "$1" | cut -d"=" -f2 | tr -d \' | tr -d ' ') + echo $(cat nextflow.config | grep -m1 "$1" | cut -d"=" -f2 | tr -d \' | tr -d ' ') } if [ $# -eq 0 ]; then @@ -14,7 +14,7 @@ if [ $1 == "-h" ]; then echo "Utility for downloading singularity images from DockerHub" echo echo "Usage: download-singularity-img.sh [output directory]" - echo "Example: sh download-singularity-img.sh /path" + echo "Example: sh scripts/download-singularity-img.sh /path" echo exit 0 elif [ -d "$1" ]; then @@ -23,7 +23,7 @@ elif [ -d "$1" ]; then FUSIONCATCHER=$(get_tool_version "fusioncatcher") FUSION_INSPECTOR=$(get_tool_version "fusion_inspector") PIZZLY=$(get_tool_version "pizzly") - RNAFUSION="$(cat ../nextflow.config | grep -m1 "container" | cut -d":" -f2 | cut -d "'" -f1)" + RNAFUSION="$(cat nextflow.config | grep -m1 "container" | cut -d":" -f2 | cut -d "'" -f1)" SQUID=$(get_tool_version "squid") STAR_FUSION=$(get_tool_version "star_fusion") From 1e1dc79c319619885c3f51b8e3c98a5541416577 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 27 Apr 2020 23:09:34 +0200 Subject: [PATCH 0130/1520] feat: added genomes.config --- conf/genomes.config | 23 +++++++++++++++++++++++ main.nf | 10 +++++++++- nextflow.config | 17 ++++------------- 3 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 conf/genomes.config diff --git a/conf/genomes.config b/conf/genomes.config new file mode 100644 index 00000000..985345cc --- /dev/null +++ b/conf/genomes.config @@ -0,0 +1,23 @@ +/* + * ------------------------------------------------- + * 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" + } + } +} \ No newline at end of file diff --git a/main.nf b/main.nf index 2d28cda5..e30b8a77 100644 --- a/main.nf +++ b/main.nf @@ -101,7 +101,15 @@ reference = [ star_fusion: false ] -if (!Channel.fromPath(params.reference_path, checkIfExists: true)) {exit 1, "Directory ${params.reference_path} doesn't exist."} +if (!Channel.fromPath(params.genomes_base, checkIfExists: true)) {exit 1, "Directory ${params.genomes_base} doesn't exist."} + +params.fasta = params.genome ? params.genomes[params.genome].fasta : null +params.gtf = params.genome ? params.genomes[params.genome].gtf : null +params.transcript = params.genome ? params.genomes[params.genome].transcript : null +params.arriba = params.genome ? params.genomes[params.genome].arriba_ref : null +params.ericscript_ref = params.genome ? params.genomes[params.genome].ericscript_ref : null +params.fusioncatcher_ref = params.genome ? params.genomes[params.genome].fusioncatcher_ref : null +params.star_fusion_ref = params.genome ? params.genomes[params.genome].star_fusion_ref : 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}"} diff --git a/nextflow.config b/nextflow.config index 88eca1c5..8d674cbb 100644 --- a/nextflow.config +++ b/nextflow.config @@ -8,20 +8,8 @@ // Global default params, used in configs params { - // Necessary paths - reference_path = false - reference_release = '97' - fasta = "${params.reference_path}/Homo_sapiens.GRCh38_r${params.reference_release}.all.fa" - gtf = "${params.reference_path}/Homo_sapiens.GRCh38_r${params.reference_release}.gtf" - transcript = "${params.reference_path}/Homo_sapiens.GRCh38_r${params.reference_release}.cdna.all.fa.gz" - databases = "${params.reference_path}/databases" - - // Fusion tool references - arriba_ref = "${params.reference_path}/arriba" - ericscript_ref = "${params.reference_path}/ericscript/ericscript_db_homosapiens_ensembl84" - fusioncatcher_ref = "${params.reference_path}/fusioncatcher/human_v98" - star_fusion_ref = "${params.reference_path}/star-fusion/ctat_genome_lib_build_dir" + genomes = 'GRCh38' // Options: Building STAR-star_index star_index = false @@ -104,6 +92,9 @@ process.container = 'nfcore/rnafusion:dev' // Load base.config by default for all pipelines includeConfig 'conf/base.config' +// Load genomes.config +includeConfig 'conf/genomes.config' + // Load nf-core custom profiles from different Institutions try { includeConfig "${params.custom_config_base}/nfcore_custom.config" From a5348a58fbf8478be301a1c0902a1158145e7aed Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Tue, 28 Apr 2020 12:04:05 +0200 Subject: [PATCH 0131/1520] fix: added missing `genomes_base` --- nextflow.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 8d674cbb..3cd7b16b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -7,7 +7,8 @@ // Global default params, used in configs params { - + + genomes_base = false reference_release = '97' genomes = 'GRCh38' From 35d7f3c78b453c64a8b651f90bbafe93abc3ac29 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Tue, 28 Apr 2020 12:07:11 +0200 Subject: [PATCH 0132/1520] fix: extract proper container name and version --- scripts/build.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/build.sh b/scripts/build.sh index 418317af..5c439c43 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -4,8 +4,9 @@ PREFIX="nfcore/rnafusion" create_container() { TOOL_PATH=$1 - VERSION="$(cat $TOOL_PATH/environment.yml | grep "name:" | cut -d":" -f2 | cut -d " " -f2)" - CONTAINER_NAME="$PREFIX:$VERSION" + VERSION="$(cat $TOOL_PATH/environment.yml | grep "name:" | cut -d":" -f2 | cut -d "_" -f2)" + TOOL_NAME=`basename $TOOL_PATH` + CONTAINER_NAME="${PREFIX}:${TOOL_NAME}_${VERSION}" echo "Building [$CONTAINER_NAME]" docker build $TOOL_PATH -t $CONTAINER_NAME docker push $CONTAINER_NAME @@ -37,6 +38,7 @@ if [ $1 == "all" ]; then CONTAINER_NAME=$PREFIX:$VERSION echo "Building [$CONTAINER_NAME]" docker build . -t $CONTAINER_NAME + docker push $CONTAINER_NAME else TOOL=$1 TOOL_PATH="$(pwd)/containers/$TOOL" From 63436f0f04d84795b16c75edf020bbacdfb5ad7d Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Tue, 28 Apr 2020 12:08:26 +0200 Subject: [PATCH 0133/1520] fix: correct singularity name --- scripts/download-singularity-img.sh | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/scripts/download-singularity-img.sh b/scripts/download-singularity-img.sh index 7f6d1b31..abc02652 100644 --- a/scripts/download-singularity-img.sh +++ b/scripts/download-singularity-img.sh @@ -18,6 +18,7 @@ if [ $1 == "-h" ]; then echo exit 0 elif [ -d "$1" ]; then + PREFIX="nf-core-rnafusion" ARRIBA=$(get_tool_version "arriba") ERICSCRIPT=$(get_tool_version "ericscript") FUSIONCATCHER=$(get_tool_version "fusioncatcher") @@ -29,14 +30,14 @@ elif [ -d "$1" ]; then cd $1 && echo "Pulling images ..." - singularity pull --name "nf-core-rnafusion-arriba_v${ARRIBA}.img" docker://nfcore/rnafusion:arriba_v${ARRIBA} - singularity pull --name "nf-core-rnafusion-ericscript_v${ERICSCRIPT}.img" docker://nfcore/rnafusion:ericscript_v${ERICSCRIPT} - singularity pull --name "nf-core-rnafusion-fusioncatcher_v${FUSIONCATCHER}.img" docker://nfcore/rnafusion:fusioncatcher_v${FUSIONCATCHER} - singularity pull --name "nf-core-rnafusion-fusion-inspector_v${FUSION_INSPECTOR}.img" docker://nfcore/rnafusion:fusion-inspector_v${FUSION_INSPECTOR} - singularity pull --name "nf-core-rnafusion-pizzly_v${PIZZLY}.img" docker://nfcore/rnafusion:pizzly_v${PIZZLY} - singularity pull --name "nf-core-rnafusion-v${RNAFUSION}.img" docker://nfcore/rnafusion:${RNAFUSION} - singularity pull --name "nf-core-rnafusion-squid_v${SQUID}.img" docker://nfcore/rnafusion:squid_v${SQUID} - singularity pull --name "nf-core-rnafusion-star-fusion_v${STAR_FUSION}.img" docker://nfcore/rnafusion:star-fusion_v${STAR_FUSION} + singularity pull --name "${PREFIX}-arriba_${ARRIBA}.img" docker://nfcore/rnafusion:arriba_${ARRIBA} + singularity pull --name "${PREFIX}-ericscript_${ERICSCRIPT}.img" docker://nfcore/rnafusion:ericscript_${ERICSCRIPT} + singularity pull --name "${PREFIX}-fusioncatcher_${FUSIONCATCHER}.img" docker://nfcore/rnafusion:fusioncatcher_${FUSIONCATCHER} + singularity pull --name "${PREFIX}-fusion-inspector_${FUSION_INSPECTOR}.img" docker://nfcore/rnafusion:fusion-inspector_${FUSION_INSPECTOR} + singularity pull --name "${PREFIX}-pizzly_${PIZZLY}.img" docker://nfcore/rnafusion:pizzly_${PIZZLY} + singularity pull --name "${PREFIX}-${RNAFUSION}.img" docker://nfcore/rnafusion:${RNAFUSION} + singularity pull --name "${PREFIX}-squid_${SQUID}.img" docker://nfcore/rnafusion:squid_${SQUID} + singularity pull --name "${PREFIX}-star-fusion_${STAR_FUSION}.img" docker://nfcore/rnafusion:star-fusion_${STAR_FUSION} else echo "Path doesn't exists" From 78182720d490ec67e5c362a0f1b9b6a7963ce157 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Tue, 28 Apr 2020 13:14:06 +0200 Subject: [PATCH 0134/1520] fix: missing python version in squid --- containers/squid/environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/squid/environment.yml b/containers/squid/environment.yml index 34440f11..a25830d9 100644 --- a/containers/squid/environment.yml +++ b/containers/squid/environment.yml @@ -8,4 +8,4 @@ dependencies: - bioconda::squid=1.5 - bioconda::star=2.7.0f - conda-forge::numpy=1.18.1 - - conda-forge::python=3.7.4 + - conda-forge::python=3.7.6 From 42364891bd02e547db1ab4278cb864fe08d71a28 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 16:58:16 +0200 Subject: [PATCH 0135/1520] reorganize config --- conf/base.config | 13 ------------- nextflow.config | 12 ++++++++++-- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/conf/base.config b/conf/base.config index 14784047..8673e3b1 100644 --- a/conf/base.config +++ b/conf/base.config @@ -9,20 +9,7 @@ * run on the logged in environment. */ -params { - versions { - arriba = '1.1.0' - ericscript = '0.5.5' - fusioncatcher = '1.20' - fusion_inspector = '1.3.1-star2.7.0f' - pizzly = '0.37.3' - squid = '1.5-star2.7.0f' - star_fusion = '1.6.0' - } -} - process { - cpus = { check_max( 1 * task.attempt, 'cpus' ) } memory = { check_max( 7.GB * task.attempt, 'memory' ) } time = { check_max( 4.h * task.attempt, 'time' ) } diff --git a/nextflow.config b/nextflow.config index 3cd7b16b..f3195fbd 100644 --- a/nextflow.config +++ b/nextflow.config @@ -7,7 +7,6 @@ // Global default params, used in configs params { - genomes_base = false reference_release = '97' genomes = 'GRCh38' @@ -17,6 +16,16 @@ params { read_length = 100 // Fusion tools + versions { + arriba = '1.1.0' + ericscript = '0.5.5' + fusioncatcher = '1.20' + fusion_inspector = '1.3.1-star2.7.0f' + pizzly = '0.37.3' + squid = '1.5-star2.7.0f' + star_fusion = '1.6.0' + } + arriba = false star_fusion = false fusioncatcher = false @@ -83,7 +92,6 @@ params { max_memory = 128.GB max_cpus = 16 max_time = 240.h - } // Container slug. Stable releases should specify release tag! From ce2f75599f1957202c947ce1976c406e3df1ca4e Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 16:59:43 +0200 Subject: [PATCH 0136/1520] add institutional pipeline specific configs --- nextflow.config | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nextflow.config b/nextflow.config index f3195fbd..5088d573 100644 --- a/nextflow.config +++ b/nextflow.config @@ -111,6 +111,13 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } +// Load nf-core/rnafusion custom profiles from different Institutions +try { + includeConfig "${params.custom_config_base}/pipeline/rnafusion.config" +} catch (Exception e) { + System.err.println("WARNING: Could not load nf-core/config/rnafusion profiles: ${params.custom_config_base}/pipeline/rnafusion.config") +} + profiles { conda { process.conda = "$baseDir/environment.yml" } debug { process.beforeScript = 'echo $HOSTNAME' } From 750e7016270cae622b62adae82899634c8bae59a Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 17:00:18 +0200 Subject: [PATCH 0137/1520] reorganize params --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 5088d573..7fd8f7e8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -7,9 +7,9 @@ // Global default params, used in configs params { + genomes = 'GRCh38' genomes_base = false reference_release = '97' - genomes = 'GRCh38' // Options: Building STAR-star_index star_index = false From 314cb332e52b62caf20587b73d79c6d7532d888f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 17:11:46 +0200 Subject: [PATCH 0138/1520] refactor reference files --- main.nf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index e30b8a77..4267f45d 100644 --- a/main.nf +++ b/main.nf @@ -103,13 +103,13 @@ reference = [ if (!Channel.fromPath(params.genomes_base, checkIfExists: true)) {exit 1, "Directory ${params.genomes_base} doesn't exist."} -params.fasta = params.genome ? params.genomes[params.genome].fasta : null -params.gtf = params.genome ? params.genomes[params.genome].gtf : null -params.transcript = params.genome ? params.genomes[params.genome].transcript : null -params.arriba = params.genome ? params.genomes[params.genome].arriba_ref : null -params.ericscript_ref = params.genome ? params.genomes[params.genome].ericscript_ref : null -params.fusioncatcher_ref = params.genome ? params.genomes[params.genome].fusioncatcher_ref : null -params.star_fusion_ref = params.genome ? params.genomes[params.genome].star_fusion_ref : null +params.fasta = params.genome ? params.genomes[params.genome].fasta ?: null : null +params.gtf = params.genome ? params.genomes[params.genome].gtf ?: null : null +params.transcript = params.genome ? params.genomes[params.genome].transcript ?: null : null +params.arriba = params.genome ? params.genomes[params.genome].arriba ?: null : null +params.ericscript_ref = params.genome ? params.genomes[params.genome].ericscript_ref ?: null : null +params.fusioncatcher_ref = params.genome ? params.genomes[params.genome].fusioncatcher_ref ?: null : null +params.star_fusion_ref = params.genome ? params.genomes[params.genome].star_fusion_ref ?: 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}"} From adc03d7204fd03e0041d42ae8c886ca1cf0f299a Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 17:15:21 +0200 Subject: [PATCH 0139/1520] add check for genomes.config key --- main.nf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/main.nf b/main.nf index 4267f45d..38e000b9 100644 --- a/main.nf +++ b/main.nf @@ -101,6 +101,11 @@ reference = [ star_fusion: false ] +// Check if genome exists in the config file +if (params.genome && !params.genomes.containsKey(params.genome) { + exit 1, "The provided genome '${params.genome}' is not available in the genomes file. Currently the available genomes are ${params.genomes.keySet().join(", ")}" +} + if (!Channel.fromPath(params.genomes_base, checkIfExists: true)) {exit 1, "Directory ${params.genomes_base} doesn't exist."} params.fasta = params.genome ? params.genomes[params.genome].fasta ?: null : null From 1741a4d24f476296d5ddea0242fdbeb77a2c9d97 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 17:16:52 +0200 Subject: [PATCH 0140/1520] typo --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 38e000b9..b25f976c 100644 --- a/main.nf +++ b/main.nf @@ -102,7 +102,7 @@ reference = [ ] // Check if genome exists in the config file -if (params.genome && !params.genomes.containsKey(params.genome) { +if (params.genome && !params.genomes.containsKey(params.genome)) { exit 1, "The provided genome '${params.genome}' is not available in the genomes file. Currently the available genomes are ${params.genomes.keySet().join(", ")}" } From 91df4984cb838b3cc967898081aadcffa9f16c2a Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 17:17:53 +0200 Subject: [PATCH 0141/1520] typo --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 7fd8f7e8..293435ad 100644 --- a/nextflow.config +++ b/nextflow.config @@ -7,7 +7,7 @@ // Global default params, used in configs params { - genomes = 'GRCh38' + genome = 'GRCh38' genomes_base = false reference_release = '97' From f035c2680223ae7ffd535ec71d1bd1740b5da88e Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 17:20:05 +0200 Subject: [PATCH 0142/1520] add params.databases --- main.nf | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index b25f976c..673f3000 100644 --- a/main.nf +++ b/main.nf @@ -108,13 +108,14 @@ if (params.genome && !params.genomes.containsKey(params.genome)) { if (!Channel.fromPath(params.genomes_base, checkIfExists: true)) {exit 1, "Directory ${params.genomes_base} doesn't exist."} -params.fasta = params.genome ? params.genomes[params.genome].fasta ?: null : null -params.gtf = params.genome ? params.genomes[params.genome].gtf ?: null : null -params.transcript = params.genome ? params.genomes[params.genome].transcript ?: null : null params.arriba = params.genome ? params.genomes[params.genome].arriba ?: null : null +params.databases = params.genome ? params.genomes[params.genome].databases ?: null : null params.ericscript_ref = params.genome ? params.genomes[params.genome].ericscript_ref ?: null : null +params.fasta = params.genome ? params.genomes[params.genome].fasta ?: null : null params.fusioncatcher_ref = params.genome ? params.genomes[params.genome].fusioncatcher_ref ?: null : null +params.gtf = params.genome ? params.genomes[params.genome].gtf ?: null : null params.star_fusion_ref = params.genome ? params.genomes[params.genome].star_fusion_ref ?: null : null +params.transcript = params.genome ? params.genomes[params.genome].transcript ?: 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}"} From 1fae3f54a122f535842dcdb0670aaa6a98da1e54 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 17:21:08 +0200 Subject: [PATCH 0143/1520] typo --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 673f3000..ed94671b 100644 --- a/main.nf +++ b/main.nf @@ -108,7 +108,7 @@ if (params.genome && !params.genomes.containsKey(params.genome)) { if (!Channel.fromPath(params.genomes_base, checkIfExists: true)) {exit 1, "Directory ${params.genomes_base} doesn't exist."} -params.arriba = params.genome ? params.genomes[params.genome].arriba ?: null : null +params.arriba_ref = params.genome ? params.genomes[params.genome].arriba_ref ?: null : null params.databases = params.genome ? params.genomes[params.genome].databases ?: null : null params.ericscript_ref = params.genome ? params.genomes[params.genome].ericscript_ref ?: null : null params.fasta = params.genome ? params.genomes[params.genome].fasta ?: null : null From eaa7a1088e04760b8e0e14567eeac8510ca9d74e Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 17:42:58 +0200 Subject: [PATCH 0144/1520] fix path to tools --- main.nf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index ed94671b..aa7e199f 100644 --- a/main.nf +++ b/main.nf @@ -752,13 +752,13 @@ process get_software_versions { echo ${workflow.nextflow.version} > v_nextflow.txt fastqc --version > v_fastqc.txt multiqc --version > v_multiqc.txt - cat ${baseDir}/tools/arriba/environment.yml > v_arriba.txt - cat ${baseDir}/tools/fusioncatcher/environment.yml > v_fusioncatcher.txt - cat ${baseDir}/tools/fusion-inspector/environment.yml > v_fusion_inspector.txt - cat ${baseDir}/tools/star-fusion/environment.yml > v_star_fusion.txt - cat ${baseDir}/tools/ericscript/environment.yml > v_ericscript.txt - cat ${baseDir}/tools/pizzly/environment.yml > v_pizzly.txt - cat ${baseDir}/tools/squid/environment.yml > v_squid.txt + cat ${baseDir}/containers/arriba/environment.yml > v_arriba.txt + cat ${baseDir}/containers/fusioncatcher/environment.yml > v_fusioncatcher.txt + cat ${baseDir}/containers/fusion-inspector/environment.yml > v_fusion_inspector.txt + cat ${baseDir}/containers/star-fusion/environment.yml > 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 cat ${baseDir}/environment.yml > v_fusion_report.txt scrape_software_versions.py &> software_versions_mqc.yaml """ From ee28fa4873782fd65736fbca1edb20da676e0e80 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 18:05:50 +0200 Subject: [PATCH 0145/1520] revert params.versions --- conf/base.config | 12 ++++++++++++ nextflow.config | 19 +------------------ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/conf/base.config b/conf/base.config index 8673e3b1..5f0f2b8c 100644 --- a/conf/base.config +++ b/conf/base.config @@ -9,6 +9,18 @@ * run on the logged in environment. */ +params { + versions { + arriba = '1.1.0' + ericscript = '0.5.5' + fusioncatcher = '1.20' + fusion_inspector = '1.3.1-star2.7.0f' + pizzly = '0.37.3' + squid = '1.5-star2.7.0f' + star_fusion = '1.6.0' + } +} + process { cpus = { check_max( 1 * task.attempt, 'cpus' ) } memory = { check_max( 7.GB * task.attempt, 'memory' ) } diff --git a/nextflow.config b/nextflow.config index 293435ad..8da84766 100644 --- a/nextflow.config +++ b/nextflow.config @@ -7,25 +7,15 @@ // Global default params, used in configs params { - genome = 'GRCh38' genomes_base = false reference_release = '97' + genomes = 'GRCh38' // Options: Building STAR-star_index star_index = false read_length = 100 // Fusion tools - versions { - arriba = '1.1.0' - ericscript = '0.5.5' - fusioncatcher = '1.20' - fusion_inspector = '1.3.1-star2.7.0f' - pizzly = '0.37.3' - squid = '1.5-star2.7.0f' - star_fusion = '1.6.0' - } - arriba = false star_fusion = false fusioncatcher = false @@ -111,13 +101,6 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } -// Load nf-core/rnafusion custom profiles from different Institutions -try { - includeConfig "${params.custom_config_base}/pipeline/rnafusion.config" -} catch (Exception e) { - System.err.println("WARNING: Could not load nf-core/config/rnafusion profiles: ${params.custom_config_base}/pipeline/rnafusion.config") -} - profiles { conda { process.conda = "$baseDir/environment.yml" } debug { process.beforeScript = 'echo $HOSTNAME' } From adc1aa2a705906ea79163c06c48609f2b28c4478 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 18:08:24 +0200 Subject: [PATCH 0146/1520] reverted too much --- nextflow.config | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 8da84766..92231506 100644 --- a/nextflow.config +++ b/nextflow.config @@ -7,9 +7,9 @@ // Global default params, used in configs params { + genome = 'GRCh38' genomes_base = false reference_release = '97' - genomes = 'GRCh38' // Options: Building STAR-star_index star_index = false @@ -101,6 +101,13 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } +// Load nf-core/rnafusion custom profiles from different Institutions +try { + includeConfig "${params.custom_config_base}/pipeline/rnafusion.config" +} catch (Exception e) { + System.err.println("WARNING: Could not load nf-core/config/rnafusion profiles: ${params.custom_config_base}/pipeline/rnafusion.config") +} + profiles { conda { process.conda = "$baseDir/environment.yml" } debug { process.beforeScript = 'echo $HOSTNAME' } From 1e64af42241c928c7b82b9d8948859abaac318c9 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 18:35:20 +0200 Subject: [PATCH 0147/1520] trying empty genomes_base --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 92231506..d5799c29 100644 --- a/nextflow.config +++ b/nextflow.config @@ -8,7 +8,7 @@ // Global default params, used in configs params { genome = 'GRCh38' - genomes_base = false + genomes_base = "" reference_release = '97' // Options: Building STAR-star_index From 97c5595b751cfd4ba97c5c4f09a23ac6642a0b78 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 28 Apr 2020 18:37:29 +0200 Subject: [PATCH 0148/1520] changing loading order for institutional configs --- nextflow.config | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/nextflow.config b/nextflow.config index d5799c29..02efa465 100644 --- a/nextflow.config +++ b/nextflow.config @@ -8,7 +8,7 @@ // Global default params, used in configs params { genome = 'GRCh38' - genomes_base = "" + genomes_base = false reference_release = '97' // Options: Building STAR-star_index @@ -88,12 +88,6 @@ params { // Developmental code should specify :dev process.container = 'nfcore/rnafusion:dev' -// Load base.config by default for all pipelines -includeConfig 'conf/base.config' - -// Load genomes.config -includeConfig 'conf/genomes.config' - // Load nf-core custom profiles from different Institutions try { includeConfig "${params.custom_config_base}/nfcore_custom.config" @@ -108,6 +102,12 @@ try { System.err.println("WARNING: Could not load nf-core/config/rnafusion profiles: ${params.custom_config_base}/pipeline/rnafusion.config") } +// Load base.config by default for all pipelines +includeConfig 'conf/base.config' + +// Load genomes.config +includeConfig 'conf/genomes.config' + profiles { conda { process.conda = "$baseDir/environment.yml" } debug { process.beforeScript = 'echo $HOSTNAME' } From 5958cd3b9080cf24c6f25de1f899e2bc96b9fd80 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 29 Apr 2020 16:41:25 +0200 Subject: [PATCH 0149/1520] fix: upgrade `STAR` aligner and `STAR-Fusion` --- build-ctat.nf | 2 +- conf/base.config | 12 ++++-------- containers/arriba/Dockerfile | 4 ++-- containers/arriba/environment.yml | 4 ++-- containers/fusion-inspector/Dockerfile | 14 -------------- containers/fusion-inspector/environment.yml | 8 -------- containers/squid/Dockerfile | 10 +++++----- containers/squid/environment.yml | 4 ++-- containers/star-fusion/Dockerfile | 14 +++++++------- containers/star-fusion/environment.yml | 6 +++--- environment.yml | 2 +- 11 files changed, 27 insertions(+), 53 deletions(-) delete mode 100644 containers/fusion-inspector/Dockerfile delete mode 100644 containers/fusion-inspector/environment.yml diff --git a/build-ctat.nf b/build-ctat.nf index 5dc3124f..39deacfb 100644 --- a/build-ctat.nf +++ b/build-ctat.nf @@ -100,7 +100,7 @@ process star_fusion { prep_genome_lib.pl \\ --genome_fa ${fasta} \\ --gtf ${gtf} \\ - --annot_filter_rule /opt/conda/envs/star-fusion_v1.6.0/ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625/AnnotFilterRuleLib/AnnotFilterRule.pm \\ + --annot_filter_rule /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625/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 5f0f2b8c..2b6fb97d 100644 --- a/conf/base.config +++ b/conf/base.config @@ -11,13 +11,12 @@ params { versions { - arriba = '1.1.0' + arriba = '1.1.0-star2.7.2b' ericscript = '0.5.5' fusioncatcher = '1.20' - fusion_inspector = '1.3.1-star2.7.0f' pizzly = '0.37.3' - squid = '1.5-star2.7.0f' - star_fusion = '1.6.0' + squid = '1.5-star2.7.2b' + star_fusion = '1.8.1' } } @@ -62,16 +61,13 @@ process { withName:fusioncatcher { container = "nfcore/rnafusion:fusioncatcher_${params.versions.fusioncatcher}" } - withName:fusion_inspector { - container = "nfcore/rnafusion:fusion-inspector_${params.versions.fusion_inspector}" - } withName:pizzly { container = "nfcore/rnafusion:pizzly_${params.versions.pizzly}" } withName:squid { container = "nfcore/rnafusion:squid_${params.versions.squid}" } - withName:"star_fusion" { + withName:"star_fusion|fusion_inspector" { container = "nfcore/rnafusion:star-fusion_${params.versions.star_fusion}" } } \ No newline at end of file diff --git a/containers/arriba/Dockerfile b/containers/arriba/Dockerfile index 889d2a76..7e5b88f6 100644 --- a/containers/arriba/Dockerfile +++ b/containers/arriba/Dockerfile @@ -8,7 +8,7 @@ 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.1.0/bin:$PATH +ENV PATH /opt/conda/envs/nf-core-rnafusion-arriba_1.1.0-star2.7.2b/bin:$PATH # Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-rnafusion-arriba_1.1.0 > nf-core-rnafusion-arriba_1.1.0.yml \ No newline at end of file +RUN conda env export --name nf-core-rnafusion-arriba_1.1.0-star2.7.2b > nf-core-rnafusion-arriba_1.1.0-star2.7.2b.yml \ No newline at end of file diff --git a/containers/arriba/environment.yml b/containers/arriba/environment.yml index 688c7c33..38a0daf9 100644 --- a/containers/arriba/environment.yml +++ b/containers/arriba/environment.yml @@ -1,4 +1,4 @@ -name: nf-core-rnafusion-arriba_1.1.0 +name: nf-core-rnafusion-arriba_1.1.0-star2.7.2b channels: - conda-forge - bioconda @@ -8,7 +8,7 @@ dependencies: - bioconda::bioconductor-genomicalignments - bioconda::bioconductor-genomicranges - bioconda::samtools=1.9 - - bioconda::star=2.7.0f + - bioconda::star=2.7.2b - conda-forge::openssl=1.0 - conda-forge::r-circlize - conda-forge::readline=6.2 \ No newline at end of file diff --git a/containers/fusion-inspector/Dockerfile b/containers/fusion-inspector/Dockerfile deleted file mode 100644 index 8ead9a37..00000000 --- a/containers/fusion-inspector/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-fusion-inspector_1.3.1-star2.7.0f/bin:$PATH - -# Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-rnafusion-fusion-inspector_1.3.1-star2.7.0f > nf-core-rnafusion-fusion-inspector_1.3.1-star2.7.0f.yml \ No newline at end of file diff --git a/containers/fusion-inspector/environment.yml b/containers/fusion-inspector/environment.yml deleted file mode 100644 index c308c0b1..00000000 --- a/containers/fusion-inspector/environment.yml +++ /dev/null @@ -1,8 +0,0 @@ -name: nf-core-rnafusion-fusion-inspector_1.3.1-star2.7.0f -channels: - - conda-forge - - bioconda - - defaults -dependencies: - - bioconda::star=2.7.0f - - bioconda::fusion-inspector=1.3.1 diff --git a/containers/squid/Dockerfile b/containers/squid/Dockerfile index 44f67fec..8e30f66b 100644 --- a/containers/squid/Dockerfile +++ b/containers/squid/Dockerfile @@ -8,12 +8,12 @@ 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.0f/bin:$PATH +ENV PATH /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.2b/bin:$PATH -RUN cd /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.0f/bin \ +RUN cd /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.2b/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.0f/bin/AnnotateSQUIDOutput.py \ - && ln -s /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.0f/bin/python3 /bin/python + && chmod +x /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.2b/bin/AnnotateSQUIDOutput.py \ + && ln -s /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.2b/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.0f > nf-core-rnafusion-squid_1.5-star2.7.0f.yml \ No newline at end of file +RUN conda env export --name nf-core-rnafusion-squid_1.5-star2.7.2b > nf-core-rnafusion-squid_1.5-star2.7.2b.yml \ No newline at end of file diff --git a/containers/squid/environment.yml b/containers/squid/environment.yml index a25830d9..902307fb 100644 --- a/containers/squid/environment.yml +++ b/containers/squid/environment.yml @@ -1,4 +1,4 @@ -name: nf-core-rnafusion-squid_1.5-star2.7.0f +name: nf-core-rnafusion-squid_1.5-star2.7.2b channels: - conda-forge - bioconda @@ -6,6 +6,6 @@ channels: dependencies: - bioconda::samtools=1.9 - bioconda::squid=1.5 - - bioconda::star=2.7.0f + - bioconda::star=2.7.2b - conda-forge::numpy=1.18.1 - conda-forge::python=3.7.6 diff --git a/containers/star-fusion/Dockerfile b/containers/star-fusion/Dockerfile index df3d3afc..3cb6d68a 100644 --- a/containers/star-fusion/Dockerfile +++ b/containers/star-fusion/Dockerfile @@ -8,19 +8,19 @@ 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.6.0/bin:$PATH +ENV PATH /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/bin:$PATH # ctat-genome-lib-builder -RUN cd /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/ && \ +RUN cd /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/ && \ wget https://github.com/NCIP/ctat-genome-lib-builder/archive/2830cd708c5bb9353878ca98069427e83acdd625.zip && \ unzip 2830cd708c5bb9353878ca98069427e83acdd625.zip && \ cd ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625 && \ - rm /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/bin/prep_genome_lib.pl + rm /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/bin/prep_genome_lib.pl -ENV PATH /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625/:$PATH +ENV PATH /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625/:$PATH -RUN ln -s /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/lib/libssl.so /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/lib/libssl.so.1.0.0 && \ - ln -s /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/lib/libcrypto.so /opt/conda/envs/nf-core-rnafusion-star-fusion_1.6.0/lib/libcrypto.so.1.0.0 +RUN ln -s /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/libssl.so /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/libssl.so.1.0.0 && \ + ln -s /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/libcrypto.so /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/libcrypto.so.1.0.0 # Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-rnafusion-star-fusion_1.6.0 > nf-core-rnafusion-star-fusion_1.6.0.yml \ No newline at end of file +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 index 007b7a85..8cb34ff3 100644 --- a/containers/star-fusion/environment.yml +++ b/containers/star-fusion/environment.yml @@ -1,4 +1,4 @@ -name: nf-core-rnafusion-star-fusion_1.6.0 +name: nf-core-rnafusion-star-fusion_1.8.1 channels: - conda-forge - bioconda @@ -6,8 +6,8 @@ channels: dependencies: - bioconda::dfam=2.0 - bioconda::hmmer=3.2.1 - - bioconda::star-fusion=1.6.0 - - bioconda::star=2.7.0f + - bioconda::star-fusion=1.8.1 + - bioconda::fusion-inspector=2.2.1 - bioconda::trinity=2.6.6 - conda-forge::perl-carp-assert - conda-forge::unzip=6.0 \ No newline at end of file diff --git a/environment.yml b/environment.yml index 83c73c4b..bc5636a5 100644 --- a/environment.yml +++ b/environment.yml @@ -14,7 +14,7 @@ dependencies: - bioconda::fastqc=0.11.8 - bioconda::multiqc=1.7 # Custom packages - - bioconda::star=2.7.0f # update STAR-Fusion and Fusion-Inspector, Arriba + - bioconda::star=2.7.2b # update STAR-Fusion and Arriba - conda-forge::r-data.table=1.12.8 - conda-forge::r-gplots=3.0.1.2 - bioconda::bioconductor-edger=3.28.0 From d62059094d6e3d09a2bd51edc5d5e215ba7bbf8a Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 29 Apr 2020 16:53:10 +0200 Subject: [PATCH 0150/1520] fix: removed `reference_release` --- build-ctat.nf | 4 ---- 1 file changed, 4 deletions(-) diff --git a/build-ctat.nf b/build-ctat.nf index 39deacfb..e1931145 100644 --- a/build-ctat.nf +++ b/build-ctat.nf @@ -29,8 +29,6 @@ def helpMessage() { Mandatory arguments: --fasta [file] Path to fasta reference --gtf [file] Path to GTF annotation - --reference_release [int] Release number of Ensembl reference for FASTA and GTF - example: 97 -> ftp://ftp.ensembl.org/pub/release-97 --outdir [path] Output directory for downloading -profile [str] Configuration profile [https://github.com/nf-core/configs] """.stripIndent() @@ -42,8 +40,6 @@ def helpMessage() { // Show help emssage if (params.help) exit 0, helpMessage() - -if (!params.reference_release) exit 1, "You did not specify the release number of reference!" if (!params.outdir) exit 1, "Output directory not specified!" ch_fasta = Channel.value(file(params.fasta)).ifEmpty{exit 1, "Fasta file not found: ${params.fasta}"} From fdcfac7ca6dc4df2321e8eb911d421824ed8ddd3 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 29 Apr 2020 16:53:47 +0200 Subject: [PATCH 0151/1520] chore: removed fusion-inspector container --- scripts/download-singularity-img.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/download-singularity-img.sh b/scripts/download-singularity-img.sh index abc02652..c0df23d4 100644 --- a/scripts/download-singularity-img.sh +++ b/scripts/download-singularity-img.sh @@ -33,7 +33,6 @@ elif [ -d "$1" ]; then singularity pull --name "${PREFIX}-arriba_${ARRIBA}.img" docker://nfcore/rnafusion:arriba_${ARRIBA} singularity pull --name "${PREFIX}-ericscript_${ERICSCRIPT}.img" docker://nfcore/rnafusion:ericscript_${ERICSCRIPT} singularity pull --name "${PREFIX}-fusioncatcher_${FUSIONCATCHER}.img" docker://nfcore/rnafusion:fusioncatcher_${FUSIONCATCHER} - singularity pull --name "${PREFIX}-fusion-inspector_${FUSION_INSPECTOR}.img" docker://nfcore/rnafusion:fusion-inspector_${FUSION_INSPECTOR} singularity pull --name "${PREFIX}-pizzly_${PIZZLY}.img" docker://nfcore/rnafusion:pizzly_${PIZZLY} singularity pull --name "${PREFIX}-${RNAFUSION}.img" docker://nfcore/rnafusion:${RNAFUSION} singularity pull --name "${PREFIX}-squid_${SQUID}.img" docker://nfcore/rnafusion:squid_${SQUID} From 4b2fbd253957cc82607e73aba4ce518e8db24e20 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 29 Apr 2020 16:56:47 +0200 Subject: [PATCH 0152/1520] chore: removed fusion-inspector variable --- scripts/download-singularity-img.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/download-singularity-img.sh b/scripts/download-singularity-img.sh index c0df23d4..96bdba35 100644 --- a/scripts/download-singularity-img.sh +++ b/scripts/download-singularity-img.sh @@ -22,7 +22,6 @@ elif [ -d "$1" ]; then ARRIBA=$(get_tool_version "arriba") ERICSCRIPT=$(get_tool_version "ericscript") FUSIONCATCHER=$(get_tool_version "fusioncatcher") - FUSION_INSPECTOR=$(get_tool_version "fusion_inspector") PIZZLY=$(get_tool_version "pizzly") RNAFUSION="$(cat nextflow.config | grep -m1 "container" | cut -d":" -f2 | cut -d "'" -f1)" SQUID=$(get_tool_version "squid") From cc70c4518685757db221eebf61f02d171c7e39de Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 29 Apr 2020 16:59:33 +0200 Subject: [PATCH 0153/1520] refactor: support genome for build-ctat.nf --- build-ctat.nf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build-ctat.nf b/build-ctat.nf index e1931145..c324b5e0 100644 --- a/build-ctat.nf +++ b/build-ctat.nf @@ -42,6 +42,9 @@ def helpMessage() { if (params.help) exit 0, helpMessage() if (!params.outdir) exit 1, "Output directory not specified!" +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}"} From 8c95c21315c460cfaf79edbe6c1b6a67f1d7c08a Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 29 Apr 2020 17:00:45 +0200 Subject: [PATCH 0154/1520] refactor: move code around --- build-ctat.nf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build-ctat.nf b/build-ctat.nf index c324b5e0..3ba394f4 100644 --- a/build-ctat.nf +++ b/build-ctat.nf @@ -38,9 +38,8 @@ def helpMessage() { * SET UP CONFIGURATION VARIABLES */ -// Show help emssage +// Show help message if (params.help) exit 0, helpMessage() -if (!params.outdir) exit 1, "Output directory not specified!" params.fasta = params.genome ? params.genomes[params.genome].fasta ?: null : null params.gtf = params.genome ? params.genomes[params.genome].gtf ?: null : null @@ -48,6 +47,8 @@ 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 = [:] From 24847c015eab95abb8284fe730e31c7e52b908a5 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 29 Apr 2020 17:01:40 +0200 Subject: [PATCH 0155/1520] fix: wrong file in 'Pipeline Name' --- build-ctat.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-ctat.nf b/build-ctat.nf index 3ba394f4..6ba8bc43 100644 --- a/build-ctat.nf +++ b/build-ctat.nf @@ -52,7 +52,7 @@ if (!params.outdir) exit 1, "Output directory not specified!" // Header log info log.info nfcoreHeader() def summary = [:] -summary['Pipeline Name'] = 'nf-core/rnafusion/download-references.nf' +summary['Pipeline Name'] = 'nf-core/rnafusion/build-ctat.nf' summary['Pipeline Version'] = workflow.manifest.version summary['References'] = params.running_tools.size() == 0 ? 'None' : params.running_tools.join(", ") if(workflow.containerEngine) summary['Container'] = "$workflow.containerEngine - $workflow.container" From 56e0c77c66997347b42850b489781e768c93d5a2 Mon Sep 17 00:00:00 2001 From: Maxime Garcia Date: Thu, 30 Apr 2020 12:01:24 +0200 Subject: [PATCH 0156/1520] Update build-ctat.nf --- build-ctat.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build-ctat.nf b/build-ctat.nf index 6ba8bc43..341de73f 100644 --- a/build-ctat.nf +++ b/build-ctat.nf @@ -54,7 +54,6 @@ log.info nfcoreHeader() def summary = [:] summary['Pipeline Name'] = 'nf-core/rnafusion/build-ctat.nf' summary['Pipeline Version'] = workflow.manifest.version -summary['References'] = params.running_tools.size() == 0 ? 'None' : params.running_tools.join(", ") 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 @@ -157,4 +156,4 @@ def checkHostname() { } } } -} \ No newline at end of file +} From 1f1667d6a84b67d7102e94be51f864ed13d64326 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Sun, 3 May 2020 16:04:30 +0200 Subject: [PATCH 0157/1520] more time --- build-ctat.nf | 1 + conf/base.config | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/build-ctat.nf b/build-ctat.nf index 341de73f..e41f7bac 100644 --- a/build-ctat.nf +++ b/build-ctat.nf @@ -72,6 +72,7 @@ checkHostname() process star_fusion { label 'process_high' + label 'process_long' publishDir "${params.outdir}", mode: 'copy' input: diff --git a/conf/base.config b/conf/base.config index 2b6fb97d..6d0610e5 100644 --- a/conf/base.config +++ b/conf/base.config @@ -23,7 +23,7 @@ params { process { cpus = { check_max( 1 * task.attempt, 'cpus' ) } memory = { check_max( 7.GB * task.attempt, 'memory' ) } - time = { check_max( 4.h * task.attempt, 'time' ) } + time = { check_max( 6.h * task.attempt, 'time' ) } errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' } maxRetries = 1 @@ -37,15 +37,15 @@ process { withLabel:process_medium { cpus = { check_max( 6 * task.attempt, 'cpus' ) } memory = { check_max( 42.GB * task.attempt, 'memory' ) } - time = { check_max( 8.h * task.attempt, 'time' ) } + time = { check_max( 12.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( 10.h * task.attempt, 'time' ) } + time = { check_max( 24.h * task.attempt, 'time' ) } } withLabel:process_long { - time = { check_max( 20.h * task.attempt, 'time' ) } + time = { check_max( 48.h * task.attempt, 'time' ) } } withName:get_software_versions { cache = false From a38767ad4051e0e7d5dde6e11481daa8162ee901 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 4 May 2020 21:59:31 +0200 Subject: [PATCH 0158/1520] fix get_software_versions --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index aa7e199f..1b8cfccd 100644 --- a/main.nf +++ b/main.nf @@ -754,7 +754,7 @@ 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/fusion-inspector/environment.yml > v_fusion_inspector.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}/containers/ericscript/environment.yml > v_ericscript.txt cat ${baseDir}/containers/pizzly/environment.yml > v_pizzly.txt From b579d7104c93836a2bebbb83ae46b54864f0e99a Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 6 May 2020 14:30:05 +0200 Subject: [PATCH 0159/1520] chore: downloade STAR 2.7.1a for `star-index` --- environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment.yml b/environment.yml index bc5636a5..7cccb3c7 100644 --- a/environment.yml +++ b/environment.yml @@ -14,7 +14,7 @@ dependencies: - bioconda::fastqc=0.11.8 - bioconda::multiqc=1.7 # Custom packages - - bioconda::star=2.7.2b # update STAR-Fusion and Arriba + - bioconda::star=2.7.1a # has to be for star index - conda-forge::r-data.table=1.12.8 - conda-forge::r-gplots=3.0.1.2 - bioconda::bioconductor-edger=3.28.0 From 49e695b081d86777aabaff3813ef43a96ecb5b37 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 6 May 2020 14:39:48 +0200 Subject: [PATCH 0160/1520] fix: FusionInspector comes with STAR-Fusion by default --- containers/star-fusion/Dockerfile | 14 ++++---------- containers/star-fusion/environment.yml | 4 +--- main.nf | 5 +++-- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/containers/star-fusion/Dockerfile b/containers/star-fusion/Dockerfile index 3cb6d68a..79c6fdbc 100644 --- a/containers/star-fusion/Dockerfile +++ b/containers/star-fusion/Dockerfile @@ -10,17 +10,11 @@ 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 -# ctat-genome-lib-builder -RUN cd /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/ && \ - wget https://github.com/NCIP/ctat-genome-lib-builder/archive/2830cd708c5bb9353878ca98069427e83acdd625.zip && \ - unzip 2830cd708c5bb9353878ca98069427e83acdd625.zip && \ - cd ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625 && \ - rm /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/bin/prep_genome_lib.pl - -ENV PATH /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/ctat-genome-lib-builder-2830cd708c5bb9353878ca98069427e83acdd625/:$PATH +# FusionInspector +ENV PATH /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/STAR-Fusion/FusionInspector:$PATH -RUN ln -s /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/libssl.so /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/libssl.so.1.0.0 && \ - ln -s /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/libcrypto.so /opt/conda/envs/nf-core-rnafusion-star-fusion_1.8.1/lib/libcrypto.so.1.0.0 +# 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 index 8cb34ff3..f7c0408c 100644 --- a/containers/star-fusion/environment.yml +++ b/containers/star-fusion/environment.yml @@ -7,7 +7,5 @@ dependencies: - bioconda::dfam=2.0 - bioconda::hmmer=3.2.1 - bioconda::star-fusion=1.8.1 - - bioconda::fusion-inspector=2.2.1 - bioconda::trinity=2.6.6 - - conda-forge::perl-carp-assert - - conda-forge::unzip=6.0 \ No newline at end of file + - conda-forge::perl-carp-assert \ No newline at end of file diff --git a/main.nf b/main.nf index 1b8cfccd..ca74d3a8 100644 --- a/main.nf +++ b/main.nf @@ -709,7 +709,7 @@ process fusion_inspector { file(reference) from reference.fusion_inspector output: - file("*.{fa,gtf,bed,bam,bai,txt}") into fusion_inspector_output + file("*.{fa,gtf,bed,bam,bai,txt,html}") into fusion_inspector_output when: params.fusion_inspector && (!params.single_end || params.debug) @@ -722,8 +722,9 @@ process fusion_inspector { --left_fq ${reads[0]} \\ --right_fq ${reads[1]} \\ --CPU ${task.cpus} \\ - --out_dir . \\ + -O . \\ --out_prefix finspector \\ + --vis \\ ${extra_params} """ } From fa19cdd6c4ab7ca3748e83d9382930bd81fed33f Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 6 May 2020 15:06:47 +0200 Subject: [PATCH 0161/1520] feat: upgrade `Arriba 1.1.0` to `Arriba 1.2.0` --- CHANGELOG.md | 4 ++++ conf/base.config | 2 +- containers/arriba/Dockerfile | 4 ++-- containers/arriba/environment.yml | 4 ++-- download-references.nf | 4 ++-- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f799d28..e0600477 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. * Added social preview image [#107](https://github.com/nf-core/rnafusion/issues/107) +### Changed + +* Upgrade `Arriba v1.1.0` to `Arriba v1.2.0` + ## [1.1.0] nfcore/rnafusion - 2020/02/10 * Fusion gene detection tools: diff --git a/conf/base.config b/conf/base.config index 6d0610e5..b608d685 100644 --- a/conf/base.config +++ b/conf/base.config @@ -11,7 +11,7 @@ params { versions { - arriba = '1.1.0-star2.7.2b' + arriba = '1.2.0' ericscript = '0.5.5' fusioncatcher = '1.20' pizzly = '0.37.3' diff --git a/containers/arriba/Dockerfile b/containers/arriba/Dockerfile index 7e5b88f6..f6a94950 100644 --- a/containers/arriba/Dockerfile +++ b/containers/arriba/Dockerfile @@ -8,7 +8,7 @@ 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.1.0-star2.7.2b/bin:$PATH +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.1.0-star2.7.2b > nf-core-rnafusion-arriba_1.1.0-star2.7.2b.yml \ No newline at end of file +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 index 38a0daf9..df1e2329 100644 --- a/containers/arriba/environment.yml +++ b/containers/arriba/environment.yml @@ -1,10 +1,10 @@ -name: nf-core-rnafusion-arriba_1.1.0-star2.7.2b +name: nf-core-rnafusion-arriba_1.2.0 channels: - conda-forge - bioconda - defaults dependencies: - - bioconda::arriba=1.1.0 + - bioconda::arriba=1.2.0 - bioconda::bioconductor-genomicalignments - bioconda::bioconductor-genomicranges - bioconda::samtools=1.9 diff --git a/download-references.nf b/download-references.nf index f1275b88..e7477db0 100644 --- a/download-references.nf +++ b/download-references.nf @@ -116,8 +116,8 @@ process download_arriba { script: """ - wget -N https://github.com/suhrig/arriba/releases/download/v1.1.0/arriba_v1.1.0.tar.gz -O arriba_v1.1.0.tar.gz - tar -xvzf arriba_v1.1.0.tar.gz && mv arriba_v1.1.0/database/* . && gunzip *.gz && rm -rf arriba_* + wget -N https://github.com/suhrig/arriba/releases/download/v1.2.0/arriba_v1.2.0.tar.gz -O arriba_v1.2.0.tar.gz + tar -xvzf arriba_v1.2.0.tar.gz && mv arriba_v1.2.0/database/* . && gunzip *.gz && rm -rf arriba_* """ } From 8606cc57e023c83ea1f5cd309a26fafff2307059 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 6 May 2020 18:46:06 +0200 Subject: [PATCH 0162/1520] fix: fully optional download-references (#125) --- download-references.nf | 21 +++++++++++++-------- nextflow.config | 4 +++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/download-references.nf b/download-references.nf index e7477db0..8cb98a86 100644 --- a/download-references.nf +++ b/download-references.nf @@ -27,20 +27,21 @@ def helpMessage() { nextflow run nf-core/rnafusion/download-references.nf -profile [PROFILE] [OPTIONS] --outdir /path/to/output Mandatory arguments: - --reference_release [int] Release number of Ensembl reference for FASTA and GTF - example: 97 -> ftp://ftp.ensembl.org/pub/release-97 --outdir [path] Output directory for downloading -profile [str] Configuration profile [https://github.com/nf-core/configs] Options: --download_all [bool] Download all references + --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 --fusion_report [bool] Download databases for fusion-report - --cosmic_usr [str] [Required] COSMIC username - --cosmic_passwd [str] [Required] COSMIC password + --cosmic_usr [str] [Required with fusion_report] COSMIC username + --cosmic_passwd [str] [Required with fusion_report] COSMIC password """.stripIndent() } @@ -50,16 +51,15 @@ def helpMessage() { // Show help emssage if (params.help) exit 0, helpMessage() - -if (!params.reference_release) exit 1, "You did not specify the release number of reference!" if (!params.outdir) exit 1, "Output directory not specified!" running_tools = [] +if (params.base || params.download_all) running_tools.add("Reference v${params.reference_release}") if (params.arriba || params.download_all) running_tools.add("Arriba") if (params.star_fusion || params.download_all) running_tools.add("STAR-Fusion") if (params.fusioncatcher || params.download_all) running_tools.add("Fusioncatcher") if (params.ericscript || params.download_all) running_tools.add("Ericscript") -if (params.download_all) { +if (params.fusion_report || params.download_all) { running_tools.add('fusion-report') if (!params.cosmic_usr || !params.cosmic_passwd) exit 1, "Database credentials are required parameter!" } @@ -89,6 +89,9 @@ 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 @@ -122,7 +125,6 @@ process download_arriba { } process download_star_fusion { - label 'process_high' publishDir "${params.outdir}/star-fusion", mode: 'copy' when: @@ -181,6 +183,9 @@ process download_ericscript { process download_databases { publishDir "${params.outdir}/databases", mode: 'copy' + when: + params.fusion_report || params.download_all + output: file '*' diff --git a/nextflow.config b/nextflow.config index 02efa465..78c878ea 100644 --- a/nextflow.config +++ b/nextflow.config @@ -23,7 +23,7 @@ params { ericscript = false pizzly = false squid = false - + // Options: Arriba arriba_opt = false arriba_vis = false @@ -53,7 +53,9 @@ params { debug = false // Options: download-references.nf + base = false download_all = false + fusion_report = false cosmic_usr = false cosmic_passwd = false From 4e282d038025279b5f4bd4f0d537869687bb3211 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 6 May 2020 21:54:28 +0200 Subject: [PATCH 0163/1520] fix: disable database check in ericscript (#119) --- containers/ericscript/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/containers/ericscript/Dockerfile b/containers/ericscript/Dockerfile index 50fc7f2e..d418d1c7 100644 --- a/containers/ericscript/Dockerfile +++ b/containers/ericscript/Dockerfile @@ -10,5 +10,8 @@ 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 From 2f717d88bb1fdbc857d53a59770485909a7943ce Mon Sep 17 00:00:00 2001 From: Maxime Garcia Date: Thu, 7 May 2020 11:07:04 +0200 Subject: [PATCH 0164/1520] Update main.nf --- main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index ca74d3a8..808adc65 100644 --- a/main.nf +++ b/main.nf @@ -41,7 +41,7 @@ def helpMessage() { --fusioncatcher_opt [srt] Specify extra parameters for FusionCatcher --fusion_report_opt [str] Specify extra parameters for fusion-report --pizzly [bool] Run Pizzly - --pizzly_k [int] Number of k-mers. Deafult 31 + --pizzly_k [int] Number of k-mers. Deafult 31 --squid [bool] Run Squid --star_fusion [bool] Run STAR-Fusion --star_fusion_opt [str] Specify extra parameters for STAR-Fusion @@ -995,4 +995,4 @@ def checkHostname() { } } } -} \ No newline at end of file +} From 97831e47248783ff05513886da4bd72c54956ec8 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 7 May 2020 13:36:58 +0200 Subject: [PATCH 0165/1520] small changes --- main.nf | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/main.nf b/main.nf index 808adc65..e3ff7644 100644 --- a/main.nf +++ b/main.nf @@ -276,27 +276,27 @@ process build_star_index { tag "$fasta" label 'process_medium' - publishDir "${params.outdir}/star-index", mode: 'copy' + publishDir params.outdir, mode: 'copy' input: file(fasta) from ch_fasta file(gtf) from ch_gtf output: - file("star") into star_index + file("star-index") into star_index when: !(params.star_index) script: def avail_mem = task.memory ? "--limitGenomeGenerateRAM ${task.memory.toBytes() - 100000000}" : '' """ - mkdir star + mkdir star-index STAR \\ --runMode genomeGenerate \\ --runThreadN ${task.cpus} \\ --sjdbGTFfile ${gtf} \\ --sjdbOverhang ${params.read_length - 1} \\ - --genomeDir star/ \\ + --genomeDir star-index/ \\ --genomeFastaFiles ${fasta} \\ $avail_mem """ @@ -329,8 +329,8 @@ process arriba { file(gtf) from ch_gtf output: - set val(sample), file("${sample}_arriba.tsv") optional true into arriba_fusions_summary - set val(sample), file("${sample}_arriba.bam"), file("${sample}_arriba.tsv") optional true into arriba_visualization + set val(sample), file("${sample}_arriba.tsv") optional true into arriba_fusions_summary, arriba_tsv + set val(sample), file("${sample}_arriba.bam") optional true into arriba_bam file("*.{tsv,txt}") into arriba_output when: params.arriba && (!params.single_end || params.debug) @@ -376,6 +376,7 @@ process arriba { } arriba_fusions_summary = arriba_fusions_summary.dump(tag:'arriba_fusions_summary') +arriba_visualization = arriba_bam.combine(arriba_tsv) /* * STAR-Fusion From 15642a759f291c354e291fb725221a889d57477c Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 7 May 2020 13:45:46 +0200 Subject: [PATCH 0166/1520] small refactoring --- main.nf | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/main.nf b/main.nf index e3ff7644..8d284952 100644 --- a/main.nf +++ b/main.nf @@ -273,7 +273,7 @@ Channel.from(summary.collect{ [it.key, it.value] }) */ process build_star_index { - tag "$fasta" + tag "${fasta}-${gtf}" label 'process_medium' publishDir params.outdir, mode: 'copy' @@ -298,7 +298,7 @@ process build_star_index { --sjdbOverhang ${params.read_length - 1} \\ --genomeDir star-index/ \\ --genomeFastaFiles ${fasta} \\ - $avail_mem + ${avail_mem} """ } @@ -316,7 +316,7 @@ ch_star_index = ch_star_index.dump(tag:'ch_star_index') * Arriba */ process arriba { - tag "$sample" + tag "${sample}" label 'process_medium' publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy' @@ -382,7 +382,7 @@ arriba_visualization = arriba_bam.combine(arriba_tsv) * STAR-Fusion */ process star_fusion { - tag "$sample" + tag "${sample}" label 'process_high' publishDir "${params.outdir}/tools/Star-Fusion/${sample}", mode: 'copy' @@ -449,7 +449,7 @@ star_fusion_fusions = star_fusion_fusions.dump(tag:'star_fusion_fusions') * Fusioncatcher */ process fusioncatcher { - tag "$sample" + tag "${sample}" label 'process_high' publishDir "${params.outdir}/tools/Fusioncatcher/${sample}", mode: 'copy' @@ -485,7 +485,7 @@ fusioncatcher_fusions = fusioncatcher_fusions.dump(tag:'fusioncatcher_fusions') * Ericscript */ process ericscript { - tag "$sample" + tag "${sample}" label 'process_high' publishDir "${params.outdir}/tools/EricScript/${sample}", mode: 'copy' @@ -521,7 +521,7 @@ ericscript_fusions = ericscript_fusions.dump(tag:'ericscript_fusions') * Pizzly */ process pizzly { - tag "$sample" + tag "${sample}" label 'process_medium' publishDir "${params.outdir}/tools/Pizzly/${sample}", mode: 'copy' @@ -563,7 +563,7 @@ pizzly_fusions = pizzly_fusions.dump(tag:'pizzly_fusions') * Squid */ process squid { - tag "$sample" + tag "${sample}" label 'process_high' publishDir "${params.outdir}/tools/Squid/${sample}", mode: 'copy' @@ -589,7 +589,8 @@ process squid { --readFilesIn ${reads} \\ --twopassMode Basic \\ --chimOutType SeparateSAMold --chimSegmentMin 20 --chimJunctionOverhangMin 12 --alignSJDBoverhangMin 10 --outReadsUnmapped Fastx --outSAMstrandField intronMotif \\ - --outSAMtype BAM SortedByCoordinate ${avail_mem} \\ + --outSAMtype BAM SortedByCoordinate \\ + ${avail_mem} \\ --readFilesCommand zcat mv Aligned.sortedByCoord.out.bam ${sample}Aligned.sortedByCoord.out.bam samtools view -bS Chimeric.out.sam > ${sample}Chimeric.out.bam @@ -621,7 +622,7 @@ files_and_reports_summary = files_and_reports_summary.dump(tag:'files_and_report */ process summary { - tag "$sample" + tag "${sample}" publishDir "${params.outdir}/Reports/${sample}", mode: 'copy' @@ -660,7 +661,7 @@ process summary { * Arriba Visualization */ process arriba_visualization { - tag "$sample" + tag "${sample}" label 'process_medium' publishDir "${params.outdir}/tools/Arriba/${sample}", mode: 'copy' @@ -700,7 +701,7 @@ fusion_inspector_input = fusion_inspector_input.dump(tag:'fusion_inspector_input * Fusion Inspector */ process fusion_inspector { - tag "$sample" + tag "${sample}" label 'process_high' publishDir "${params.outdir}/tools/FusionInspector/${sample}", mode: 'copy' From 3e9f20de74327c4917a6f0ef7a3ab80136f032e5 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 7 May 2020 14:57:44 +0200 Subject: [PATCH 0167/1520] update proteinDomain for arriba_visualization --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 8d284952..775584d4 100644 --- a/main.nf +++ b/main.nf @@ -688,7 +688,7 @@ process arriba_visualization { --output=${sample}.pdf \\ --annotation=${gtf} \\ --cytobands=${reference}/cytobands_hg38_GRCh38_2018-02-23.tsv \\ - --proteinDomains=${reference}/protein_domains_hg38_GRCh38_2018-03-06.gff3 + --proteinDomains=${reference}/protein_domains_hg38_GRCh38_2019-07-05.gff3 """ } From 1a9f4991cf335ffbb8cbdbbf1b168c05184c33d0 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 7 May 2020 15:00:45 +0200 Subject: [PATCH 0168/1520] fix joining channels --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 775584d4..08ec63ff 100644 --- a/main.nf +++ b/main.nf @@ -376,7 +376,7 @@ process arriba { } arriba_fusions_summary = arriba_fusions_summary.dump(tag:'arriba_fusions_summary') -arriba_visualization = arriba_bam.combine(arriba_tsv) +arriba_visualization = arriba_bam.join(arriba_tsv) /* * STAR-Fusion From 5755830e1c487747aade429481b7d68967b66919 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 7 May 2020 16:01:14 +0200 Subject: [PATCH 0169/1520] better ericscript output --- main.nf | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index 08ec63ff..61b1878b 100644 --- a/main.nf +++ b/main.nf @@ -495,8 +495,8 @@ process ericscript { file(reference) from reference.ericscript output: - set val(sample), file("./tmp/${sample}_ericscript.tsv") optional true into ericscript_fusions - file("./tmp/fusions.results.total.tsv") optional true into ericscript_output + set val(sample), file("${sample}_ericscript.tsv") optional true into ericscript_fusions + set val(sample), file("${sample}_ericscript_total.tsv") optional true into ericscript_output when: params.ericscript && (!params.single_end || params.debug) @@ -510,7 +510,11 @@ process ericscript { ${reads} if [-f ./tmp/fusions.results.filtered.tsv]; then - mv ./tmp/fusions.results.filtered.tsv ./tmp/${sample}_ericscript.tsv + mv ./tmp/fusions.results.filtered.tsv ${sample}_ericscript.tsv + fi + + if [-f ./tmp/fusions.results.total.tsv]; then + mv ./tmp/fusions.results.total.tsv ${sample}_ericscript_total.tsv fi """ } @@ -588,7 +592,12 @@ process squid { --runThreadN ${task.cpus} \\ --readFilesIn ${reads} \\ --twopassMode Basic \\ - --chimOutType SeparateSAMold --chimSegmentMin 20 --chimJunctionOverhangMin 12 --alignSJDBoverhangMin 10 --outReadsUnmapped Fastx --outSAMstrandField intronMotif \\ + --chimOutType SeparateSAMold \\ + --chimSegmentMin 20 \\ + --chimJunctionOverhangMin 12 \\ + --alignSJDBoverhangMin 10 \\ + --outReadsUnmapped Fastx \\ + --outSAMstrandField intronMotif \\ --outSAMtype BAM SortedByCoordinate \\ ${avail_mem} \\ --readFilesCommand zcat From acf764963ddd70165b0e80c56a84ca814204ab8f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 7 May 2020 16:05:55 +0200 Subject: [PATCH 0170/1520] better ericscript output --- main.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index 61b1878b..d94aa724 100644 --- a/main.nf +++ b/main.nf @@ -509,12 +509,12 @@ process ericscript { -o ./tmp \\ ${reads} - if [-f ./tmp/fusions.results.filtered.tsv]; then - mv ./tmp/fusions.results.filtered.tsv ${sample}_ericscript.tsv + if [-f tmp/fusions.results.filtered.tsv]; then + mv tmp/fusions.results.filtered.tsv ${sample}_ericscript.tsv fi - if [-f ./tmp/fusions.results.total.tsv]; then - mv ./tmp/fusions.results.total.tsv ${sample}_ericscript_total.tsv + if [-f tmp/fusions.results.total.tsv]; then + mv tmp/fusions.results.total.tsv ${sample}_ericscript_total.tsv fi """ } From 7fee10fb5cc498388646bfa443c8b69745037278 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 7 May 2020 16:10:06 +0200 Subject: [PATCH 0171/1520] better ericscript output --- main.nf | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index d94aa724..5bf55186 100644 --- a/main.nf +++ b/main.nf @@ -509,13 +509,8 @@ process ericscript { -o ./tmp \\ ${reads} - if [-f tmp/fusions.results.filtered.tsv]; then - mv tmp/fusions.results.filtered.tsv ${sample}_ericscript.tsv - fi - - if [-f tmp/fusions.results.total.tsv]; then - mv tmp/fusions.results.total.tsv ${sample}_ericscript_total.tsv - fi + mv tmp/fusions.results.filtered.tsv ${sample}_ericscript.tsv + mv tmp/fusions.results.total.tsv ${sample}_ericscript_total.tsv """ } From 856ca988b806a2bf183212ea16879f54236cef03 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 8 May 2020 09:48:35 +0200 Subject: [PATCH 0172/1520] manage optionnal output for ericscript --- main.nf | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 5bf55186..85d8624a 100644 --- a/main.nf +++ b/main.nf @@ -509,8 +509,13 @@ process ericscript { -o ./tmp \\ ${reads} - mv tmp/fusions.results.filtered.tsv ${sample}_ericscript.tsv - mv tmp/fusions.results.total.tsv ${sample}_ericscript_total.tsv + if [[ -f "tmp/fusions.results.filtered.tsv" ]]; then + mv tmp/fusions.results.filtered.tsv ${sample}_ericscript.tsv + fi + + if [[ -f "tmp/fusions.results.filtered.tsv" ]]; then + mv tmp/fusions.results.total.tsv ${sample}_ericscript_total.tsv + fi """ } From e28f791f077b70f6817e8d61635bbe6997a2ca30 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 8 May 2020 09:50:07 +0200 Subject: [PATCH 0173/1520] spaces --- main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 85d8624a..8483a9a5 100644 --- a/main.nf +++ b/main.nf @@ -511,11 +511,11 @@ process ericscript { if [[ -f "tmp/fusions.results.filtered.tsv" ]]; then mv tmp/fusions.results.filtered.tsv ${sample}_ericscript.tsv - fi + fi if [[ -f "tmp/fusions.results.filtered.tsv" ]]; then mv tmp/fusions.results.total.tsv ${sample}_ericscript_total.tsv - fi + fi """ } From de8585f0da643731452544c679e97d82c40e6c05 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 8 May 2020 09:52:47 +0200 Subject: [PATCH 0174/1520] typo --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 8483a9a5..ae97763e 100644 --- a/main.nf +++ b/main.nf @@ -513,7 +513,7 @@ process ericscript { mv tmp/fusions.results.filtered.tsv ${sample}_ericscript.tsv fi - if [[ -f "tmp/fusions.results.filtered.tsv" ]]; then + if [[ -f "tmp/fusions.results.total.tsv" ]]; then mv tmp/fusions.results.total.tsv ${sample}_ericscript_total.tsv fi """ From 5076ac4ddb88b6e671edfc214bb8d4e3910b4015 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 8 May 2020 10:53:59 +0200 Subject: [PATCH 0175/1520] fix: STAR downgrade STAR 2.7.2b is broken and doesn't generate Chimeric.out.sam, solved by 2.7.2.d --- conf/base.config | 2 +- containers/squid/Dockerfile | 10 +++++----- containers/squid/environment.yml | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/conf/base.config b/conf/base.config index b608d685..0081fde2 100644 --- a/conf/base.config +++ b/conf/base.config @@ -15,7 +15,7 @@ params { ericscript = '0.5.5' fusioncatcher = '1.20' pizzly = '0.37.3' - squid = '1.5-star2.7.2b' + squid = '1.5-star2.7.1a' star_fusion = '1.8.1' } } diff --git a/containers/squid/Dockerfile b/containers/squid/Dockerfile index 8e30f66b..5dbcaf4c 100644 --- a/containers/squid/Dockerfile +++ b/containers/squid/Dockerfile @@ -8,12 +8,12 @@ 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.2b/bin:$PATH +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.2b/bin \ +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.2b/bin/AnnotateSQUIDOutput.py \ - && ln -s /opt/conda/envs/nf-core-rnafusion-squid_1.5-star2.7.2b/bin/python3 /bin/python + && 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.2b > nf-core-rnafusion-squid_1.5-star2.7.2b.yml \ No newline at end of file +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 index 902307fb..7385b163 100644 --- a/containers/squid/environment.yml +++ b/containers/squid/environment.yml @@ -1,4 +1,4 @@ -name: nf-core-rnafusion-squid_1.5-star2.7.2b +name: nf-core-rnafusion-squid_1.5-star2.7.1a channels: - conda-forge - bioconda @@ -6,6 +6,6 @@ channels: dependencies: - bioconda::samtools=1.9 - bioconda::squid=1.5 - - bioconda::star=2.7.2b + - bioconda::star=2.7.1a - conda-forge::numpy=1.18.1 - conda-forge::python=3.7.6 From a2ace46e65ce928a7724866eeda5b2f3e7025b31 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 8 May 2020 11:10:00 +0200 Subject: [PATCH 0176/1520] chore: downloade STAR 2.7.1a for `arriba` --- containers/arriba/environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/arriba/environment.yml b/containers/arriba/environment.yml index df1e2329..393b2e11 100644 --- a/containers/arriba/environment.yml +++ b/containers/arriba/environment.yml @@ -8,7 +8,7 @@ dependencies: - bioconda::bioconductor-genomicalignments - bioconda::bioconductor-genomicranges - bioconda::samtools=1.9 - - bioconda::star=2.7.2b + - 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 From 4db90ce84438edeb36d67bd85ce87476757cb4b9 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 11 May 2020 16:50:18 +0200 Subject: [PATCH 0177/1520] update CTAT file --- download-references.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/download-references.nf b/download-references.nf index 8cb98a86..815c4c37 100644 --- a/download-references.nf +++ b/download-references.nf @@ -135,9 +135,9 @@ process download_star_fusion { script: """ - aws s3 --no-sign-request --region eu-west-1 sync s3://ngi-igenomes/igenomes/Homo_sapiens/NCBI/GRCh38/Annotation/CTAT/ . - tar -xf GRCh38_gencode_v32_CTAT_lib_Dec062019.tar.xz --strip-components 5 - rm GRCh38_gencode_v32_CTAT_lib_Dec062019.tar.xz + aws s3 --no-sign-request --region eu-west-1 sync 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 + rm ctat_star_fusion_1_8_1.tar.gz """ } From cd771543355ca740b9637c4eb2dbfc9b7dcb8a08 Mon Sep 17 00:00:00 2001 From: Maxime Garcia Date: Wed, 13 May 2020 10:03:39 +0200 Subject: [PATCH 0178/1520] Update download-references.nf Co-authored-by: Martin Proks --- download-references.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/download-references.nf b/download-references.nf index 815c4c37..4f1ffb5e 100644 --- a/download-references.nf +++ b/download-references.nf @@ -135,7 +135,7 @@ process download_star_fusion { script: """ - aws s3 --no-sign-request --region eu-west-1 sync s3://ngi-igenomes/Homo_sapiens/Ensembl/GRCh38/Genome/CTAT/ctat_star_fusion_1_8_1.tar.gz . + aws s3 --no-sign-request --region ${params.awsregion} sync 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 rm ctat_star_fusion_1_8_1.tar.gz """ @@ -244,4 +244,4 @@ def checkHostname() { } } } -} \ No newline at end of file +} From 7088b1a8a3618c25f99db29e99af264cbdae1331 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 14 May 2020 23:22:41 +0200 Subject: [PATCH 0179/1520] docs: release 1.2.0 --- README.md | 33 +++++++---- docs/output.md | 25 +++++---- docs/references.md | 74 +++++++------------------ docs/usage.md | 133 +++++++++++++++++++++++---------------------- 4 files changed, 127 insertions(+), 138 deletions(-) diff --git a/README.md b/README.md index 38a09100..f0c25981 100644 --- a/README.md +++ b/README.md @@ -14,16 +14,18 @@ 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. -| Tool | Single-end reads | CPU (recommended) | RAM (recommended) | -| --------------- |:----------------:|:-----------------:|:-----------------:| -| [Arriba](https://github.com/suhrig/arriba) | **No** | >=16 cores | ~30GB | -| [EricScript](https://sites.google.com/site/bioericscript/getting-started) | **No** | >=16 cores | ~30GB | -| [FusionCatcher](https://github.com/ndaniel/fusioncatcher) | Yes | >=16 cores | ~64GB | -| [fusion-report](https://github.com/matq007/fusion-report) | - | - | - | -| [Pizzly](https://github.com/pmelsted/pizzly) | **No** | >=16 cores | ~30GB | -| [Squid](https://github.com/Kingsford-Group/squid) | **No** | >=16 cores | ~30GB | -| [Star-Fusion](https://github.com/STAR-Fusion/STAR-Fusion) | Yes | >=16 cores | ~30GB | -| [FusionInspector](https://github.com/FusionInspector/FusionInspector) | **No** | >=16 cores | ~30GB | +> 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.2.0` | +| [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` | For available parameters or help run: @@ -70,7 +72,16 @@ Use predefined configuration for desired Institution cluster provided at [nfcore ## Credits -This pipeline was originally written by Martin Proks ([@matq007](https://github.com/matq007)) in collaboration with Karolinska Institutet, SciLifeLab and University of Southern Denmark as a master thesis. This is a follow-up development started by Rickard Hammarén ([@Hammarn](https://github.com/Hammarn)). Special thanks goes to all supervisors: Teresita Díaz de Ståhl, PhD., Assoc. Prof.; Monica Nistér, MD, PhD; Maxime U Garcia PhD ([@MaxUlysse](https://github.com/MaxUlysse)); Szilveszter Juhos ([@szilvajuhos](https://github.com/szilvajuhos)); Phil Ewels PhD ([@ewels](https://github.com/ewels)) and Lars Grøntved, PhD., Assoc. Prof. +This pipeline was originally written by Martin Proks ([@matq007](https://github.com/matq007)) in collaboration with Karolinska Institutet, SciLifeLab and University of Southern Denmark as a master thesis. This is a follow-up development started by Rickard Hammarén ([@Hammarn](https://github.com/Hammarn)). + +Special thanks goes to all supervisors: + +* [Assoc. Prof. Teresita Díaz de Ståhl, PhD](https://ki.se/en/onkpat/teresita-diaz-de-stahls-group) +* [MD. Monica Nistér, PhD](https://ki.se/en/onkpat/research-team-monica-nister) +* [Maxime U Garcia, PhD](https://github.com/MaxUlysse) +* [Szilveszter Juhos](https://github.com/szilvajuhos) +* [Phil Ewels, PhD](https://github.com/ewels) +* [Assoc. Prof. Lars Grøntved, PhD](https://portal.findresearcher.sdu.dk/en/persons/larsgr) ## Tool References diff --git a/docs/output.md b/docs/output.md index 6c68d00e..0a32f64f 100644 --- a/docs/output.md +++ b/docs/output.md @@ -7,16 +7,21 @@ This document describes the output produced by the pipeline. The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -* [Arriba](#arriba) -* [EricScript](#ericscript) -* [FastQC](#fastqc) - read quality control -* [FusionCatcher](#fusioncatcher) -* [FusionInspector](#fusion-inspector) -* [fusion-report](#fusion-report) -* [MultiQC](#multiqc) - aggregate report, describing results of the whole pipeline -* [Pizzly](#pizzly) -* [Squid](#squid) -* [Star-Fusion](#star-fusion) +- [nf-core/rnafusion: Output](#nf-corernafusion-output) + - [Pipeline overview](#pipeline-overview) + - [Arriba](#arriba) + - [EricScript](#ericscript) + - [FastQC](#fastqc) + - [Fusioncatcher](#fusioncatcher) + - [Fusion Inspector](#fusion-inspector) + - [fusion-report](#fusion-report) + - [Tool detection](#tool-detection) + - [Found in database](#found-in-database) + - [Tool detection distribution](#tool-detection-distribution) + - [MultiQC](#multiqc) + - [Pizzly](#pizzly) + - [Squid](#squid) + - [Star-Fusion](#star-fusion) ## Arriba diff --git a/docs/references.md b/docs/references.md index ea2dc474..15281665 100644 --- a/docs/references.md +++ b/docs/references.md @@ -1,7 +1,5 @@ # nfcore/rnafusion: Download references for tools -## Use nextflow helper script - Downloading references manually is a tedious long process. To make the pipeline easier to work with, we provide a script to download all necessary references for fusion detection tools. > **TL;DR:** Make sure to download the correct references for your need! @@ -10,66 +8,36 @@ Downloading references manually is a tedious long process. To make the pipeline nextflow run nf-core/rnafusion/download-references.nf --help ``` +## Download all references + ```bash -# Example to download all tools +# Replace and with yout credentials from COSMIC nextflow run nf-core/rnafusion/download-references.nf \ -profile \ - --arriba \ - --ericscript \ - --fusioncatcher \ - --fusion_report --cosmic_usr --cosmic_passwd \ - --pizzly \ - --star_fusion \ - --outdir + --download_all \ + --outdir \ + --cosmic_usr --cosmic_passwd ``` +## Download specific references + ```bash # Example of downloading specific tools nextflow run nf-core/rnafusion/download-references.nf \ - -profile \ - --arriba \ - --fusion_report --cosmic_usr --cosmic_passwd \ - --outdir +-profile \ +--arriba \ +--outdir ``` ## Tool reference requirements -### STAR-Fusion - -- STAR-index -- FASTA -- GTF -- ctat_genome_lib_build_dir (built using `prep_genome_lib.pl`) - -### Fusioncatcher - -- Custom reference (human) -- FASTA -- GTF - -### Ericscript - -- Custom reference -- FASTA -- GTF - -### Pizzly - -- Transcript -- FASTA -- GTF - -### Squid - -- STAR-index -- GTF file - -### Fusion-Inspector - -- ctat_genome_lib_build_dir -- FASTA -- GTF - -### fusion-report - -- internal databases +| Tool | FASTA | GTF | STAR-index | Other | +| ---------------- | :----------------: | :----------------: | :----------------: | :----------------: | +| Arriba | :white_check_mark: | :white_check_mark: | :white_check_mark: | `custom_reference` | +| EricScript | :x: | :x: | :x: | `custom_reference` | +| FusionCatcher | :x: | :x: | :x: | `custom_reference` | +| Fusion-Inspector | :white_check_mark: | :white_check_mark: | :white_check_mark: | `ctat_genome_lib` | +| fusion-report | :x: | :x: | :x: | `databases` | +| Pizzly | :x: | :white_check_mark: | :white_check_mark: | `cDNA` | +| Squid | :x: | :white_check_mark: | :white_check_mark: | - | +| Star-Fusion | :white_check_mark: | :white_check_mark: | :white_check_mark: | `ctat_genome_lib` | diff --git a/docs/usage.md b/docs/usage.md index f08295d9..8c6edd3c 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -12,57 +12,57 @@ - [Updating the pipeline](#updating-the-pipeline) - [Reproducibility](#reproducibility) - [Main arguments](#main-arguments) - - [`-profile`](#-profile) - - [`--reads`](#--reads) - - [`--single_end`](#--single_end) + - [`-profile`](#profile) + - [`--reads`](#reads) + - [`--single_end`](#singleend) - [Tool flags](#tool-flags) - - [`--arriba`](#--arriba) - - [`--ericscript`](#--ericscript) - - [`--fusioncatcher`](#--fusioncatcher) - - [`--fusion_report_opt`](#--fusion_report_opt) - - [`--pizzly`](#--pizzly) - - [`--squid`](#--squid) - - [`--star_fusion`](#--star_fusion) + - [`--arriba`](#arriba) + - [`--ericscript`](#ericscript) + - [`--fusioncatcher`](#fusioncatcher) + - [`--fusion_report`](#fusionreport) + - [`--pizzly`](#pizzly) + - [`--squid`](#squid) + - [`--star_fusion`](#starfusion) - [Visualization flags](#visualization-flags) - - [`--arriba_vis`](#--arriba_vis) - - [`--fusion_inspector`](#--fusion_inspector) + - [`--arriba_vis`](#arribavis) + - [`--fusion_inspector`](#fusioninspector) - [Reference genomes](#reference-genomes) - - [`--arriba_ref`](#--arriba_ref) - - [`--genome` (using iGenomes)](#--genome-using-igenomes) - - [`--databases`](#--databases) - - [`--ericscript_ref`](#--ericscript_ref) - - [`--fasta`](#--fasta) - - [`--igenomes_ignore`](#--igenomes_ignore) - - [`--fusioncatcher_ref`](#--fusioncatcher_ref) - - [`--gtf`](#--gtf) - - [`--star_index`](#--star_index) - - [`--star_fusion_ref`](#--star_fusion_ref) - - [`--transcript`](#--transcript) + - [`--arriba_ref`](#arribaref) + - [`--databases`](#databases) + - [`--ericscript_ref`](#ericscriptref) + - [`--fasta`](#fasta) + - [`--fusioncatcher_ref`](#fusioncatcherref) + - [`--genome`](#genome) + - [`--gtf`](#gtf) + - [`--reference_release`](#referencerelease) + - [`--star_index`](#starindex) + - [`--star_fusion_ref`](#starfusionref) + - [`--transcript`](#transcript) - [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) + - [`--awsqueue`](#awsqueue) + - [`--awsregion`](#awsregion) + - [`--awscli`](#awscli) - [Other command line parameters](#other-command-line-parameters) - - [`--debug`](#--debug) - - [`--read_length`](#--read_length) - - [`--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) + - [`--debug`](#debug) + - [`--read_length`](#readlength) + - [`--outdir`](#outdir) + - [`--email`](#email) + - [`--email_on_fail`](#emailonfail) + - [`--max_multiqc_email_size`](#maxmultiqcemailsize) + - [`-name`](#name) + - [`-resume`](#resume) + - [`-c`](#c) + - [`--custom_config_version`](#customconfigversion) + - [`--custom_config_base`](#customconfigbase) + - [`--max_memory`](#maxmemory) + - [`--max_time`](#maxtime) + - [`--max_cpus`](#maxcpus) + - [`--plaintext_email`](#plaintextemail) + - [`--monochrome_logs`](#monochromelogs) + - [`--multiqc_config`](#multiqcconfig) ## Introduction @@ -80,11 +80,9 @@ The typical command for running the pipeline is as follows. ### Running the pipeline using Docker -This will launch the pipeline using `docker` with configuration profile [example-docker.config](https://github.com/nf-core/rnafusion/blob/master/example/custom-docker.config). See below for more information about profiles. - ```bash nextflow run nf-core/rnafusion \ - -profile docker -c 'example/custom-docker.config' \ + -profile docker \ --reads '*_R{1,2}.fastq.gz' \ --arriba \ --star_fusion \ @@ -98,8 +96,6 @@ nextflow run nf-core/rnafusion \ ### Running the pipeline using Singularity -First start by downloading singularity images. - ```bash nextflow run nf-core/rnafusion/download-singularity-img.nf --download_all --outdir /path ``` @@ -110,11 +106,11 @@ If the nextflow download script crashes (network issue), please use the bash scr cd utils && sh download-singularity-img.sh /path/to/images ``` -The command bellow will launch the pipeline using `singularity` with configuration profile [example-singularity.config](https://github.com/nf-core/rnafusion/blob/master/example/custom-singularity.config). See below for more information about profiles. +The command bellow will launch the pipeline using `singularity`. ```bash nextflow run nf-core/rnafusion \ - -profile singularity -c 'example/custom-singularity.config' \ + -profile singularity \ --reads '*_R{1,2}.fastq.gz' \ --arriba \ --star_fusion \ @@ -184,10 +180,6 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - `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/) -- `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/) - - Pulls most software from [Bioconda](https://bioconda.github.io/) - `test` - A profile with a complete configuration for automated testing - Includes links to test data so needs no other parameters @@ -239,9 +231,12 @@ If enabled, executes `Fusioncatcher` tool. - `--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. -### `--fusion_report_opt` +### `--fusion_report` -Specify additional parameters. For more info, please refer to the [documentation](https://matq007.github.io/fusion-report/#/) of the tool. +If enabled, download databases for `fusion-report`. + +- `fusion_report_opt` + - Specify additional parameters. For more info, please refer to the [documentation](https://matq007.github.io/fusion-report/#/) of the tool. ### `--pizzly` @@ -275,10 +270,6 @@ If enabled, executes `Fusion-Inspector` tool. ### `--arriba_ref` -### `--genome` (using iGenomes) - -There are 31 different species supported in the iGenomes references. To run the pipeline, you must specify which to use with the `--genome` flag. - ```bash --arriba_ref '[path to Arriba reference]' ``` @@ -307,10 +298,6 @@ If you prefer, you can specify the full path to your reference genome when you r --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`. - ### `--fusioncatcher_ref` Required reference in order to run `Fusioncatcher`. @@ -319,6 +306,15 @@ Required reference in order to run `Fusioncatcher`. --fusioncatcher_ref '[path to Fusioncatcher reference]' ``` +### `--genome` + +This pipeline uses only `Homo Sapiens` version `GRCh38`. Also make sure to specify +`--genomes_base`. + +```bash +--genome 'GRCh38' --genome_base '/path/to/references' +``` + ### `--gtf` Required annotation file. @@ -327,6 +323,15 @@ Required annotation file. --gtf '[path to GTF annotation]' ``` +### `--reference_release` + +Ensembl version. + +```bash +# ftp://ftp.ensembl.org/pub/release-97/fasta/homo_sapiens/ +--reference_release '97' +``` + ### `--star_index` If you prefer, you can specify the full path for `STAR` index when you run the pipeline. If not specified, the pipeline will build the index using for reads with length 100bp (can be adjusted with parameter `--read_length`). From a0025f92c207ba683650cad6c4454555b72931a6 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 14 May 2020 23:23:27 +0200 Subject: [PATCH 0180/1520] refactor: removed `conda` profile, doesn't work with all fusion tools --- download-singularity-img.nf | 2 +- main.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/download-singularity-img.nf b/download-singularity-img.nf index ea14a703..3775ead3 100644 --- a/download-singularity-img.nf +++ b/download-singularity-img.nf @@ -32,7 +32,7 @@ def helpMessage() { Mandatory arguments: --outdir [path] Output directory for downloading -profile [str] Configuration profile to use. Can use multiple (comma separated) - Available: standard, conda, docker, singularity, awsbatch, test + Available: standard, docker, singularity, awsbatch, test Options: --download_all [bool] Download all images diff --git a/main.nf b/main.nf index ae97763e..165ef6ed 100644 --- a/main.nf +++ b/main.nf @@ -30,7 +30,7 @@ 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: conda, 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: From eb6be28b43ff9a566d0c1c4479cad7179f9923c3 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 14 May 2020 23:23:55 +0200 Subject: [PATCH 0181/1520] test: updated internal testing script for 1.2.0 --- test.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test.sh b/test.sh index c69bc16c..bd9b0d39 100644 --- a/test.sh +++ b/test.sh @@ -1,13 +1,13 @@ #!/bin/bash # Test tools only -nextflow run nf-core/rnafusion -profile munin -c /data1/references/rnafusion/1.1.0/munin-singularity.config --reads "/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --debug +nextflow run nf-core/rnafusion -profile munin --ericscript --reads "/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --debug # Test batch mode -nextflow run nf-core/rnafusion -profile munin -c /data1/references/rnafusion/1.1.0/munin-singularity.config --reads "/data1/references/rnafusion/1.1.0/batch_data/new_reads/*_R{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid +nextflow run nf-core/rnafusion -profile munin --reads "/data1/references/rnafusion/1.1.0/batch_data/new_reads/*_R{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid # Test the whole pipeline -nextflow run nf-core/rnafusion -profile munin -c /data1/references/rnafusion/1.1.0/munin-singularity.config --reads "/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector +nextflow run nf-core/rnafusion -profile munin --reads "/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector # Test the whole pipeline in batch mode -nextflow run nf-core/rnafusion -profile munin -c /data1/references/rnafusion/1.1.0/munin-singularity.config --reads "/data1/references/rnafusion/1.1.0/batch_data/new_reads/*_R{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector \ No newline at end of file +nextflow run nf-core/rnafusion -profile munin --reads "/data1/references/rnafusion/1.1.0/batch_data/new_reads/*_R{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector \ No newline at end of file From 6f73d40856ebbeef9406539375771c3f4e4e0043 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 15 May 2020 08:54:30 +0200 Subject: [PATCH 0182/1520] fix: markdown linting --- README.md | 2 +- docs/output.md | 96 +++++++++++++++++++++++++------------------------- docs/usage.md | 3 +- 3 files changed, 50 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index f0c25981..c4773475 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ Use predefined configuration for desired Institution cluster provided at [nfcore ## Credits -This pipeline was originally written by Martin Proks ([@matq007](https://github.com/matq007)) in collaboration with Karolinska Institutet, SciLifeLab and University of Southern Denmark as a master thesis. This is a follow-up development started by Rickard Hammarén ([@Hammarn](https://github.com/Hammarn)). +This pipeline was originally written by Martin Proks ([@matq007](https://github.com/matq007)) in collaboration with Karolinska Institutet, SciLifeLab and University of Southern Denmark as a master thesis. This is a follow-up development started by Rickard Hammarén ([@Hammarn](https://github.com/Hammarn)). Special thanks goes to all supervisors: diff --git a/docs/output.md b/docs/output.md index 0a32f64f..a0e2917a 100644 --- a/docs/output.md +++ b/docs/output.md @@ -27,19 +27,19 @@ and processes data using the following steps: **Output directory: `results/tools/Arriba`** -* `fusions.tsv` - * contains fusions which pass all of Arriba's filters. It should be highly enriched for true predictions. The predictions are listed from highest to lowest confidence. -* `fusions.discarded.tsv` - * contains all events that Arriba classified as an artifact or that are also observed in healthy tissue. This file may be useful, if one suspects that an event should be present, but was erroneously discarded by Arriba. -* `.pdf` - * contains fusion visualization when opted for `--arriba_vis` +- `fusions.tsv` + - contains fusions which pass all of Arriba's filters. It should be highly enriched for true predictions. The predictions are listed from highest to lowest confidence. +- `fusions.discarded.tsv` + - contains all events that Arriba classified as an artifact or that are also observed in healthy tissue. This file may be useful, if one suspects that an event should be present, but was erroneously discarded by Arriba. +- `.pdf` + - contains fusion visualization when opted for `--arriba_vis` ## EricScript **Output directory: `results/tools/Ericscript/tmp`** -* `fusions.results.filtered.tsv` - * contains all the predicted gene fusions +- `fusions.results.filtered.tsv` + - contains all the predicted gene fusions |  Column | Description | | ------- | ----------- | @@ -81,17 +81,17 @@ For further reading and documentation see the [FastQC help](http://www.bioinform **Output directory: `results/fastqc`** -* `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 +- `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 ## Fusioncatcher **Output directory: `results/tools/Fusioncatcher`** -* `final-list_candidate-fusion-genes.txt` - * contains all the predicted gene fusions +- `final-list_candidate-fusion-genes.txt` + - contains all the predicted gene fusions |  Column | Description | | ------- | ----------- | @@ -120,23 +120,23 @@ For more info check the [documentation](https://github.com/ndaniel/fusioncatcher **Output directory: `results/tools/FusionInspector`** -* `finspector.fa` - * the candidate fusion-gene contigs (if you copy things elsewhere, make sure to also copy the index file: `finspector.fa.fai`) -* `finspector.bed` - * the reference gene structure annotations for fusion partners -* `finspector.junction_reads.bam` - * alignments of the breakpoint-junction supporting reads. -* `finspector.spanning_reads.bam` - * alignments of the breakpoint-spanning paired-end reads. +- `finspector.fa` + - the candidate fusion-gene contigs (if you copy things elsewhere, make sure to also copy the index file: `finspector.fa.fai`) +- `finspector.bed` + - the reference gene structure annotations for fusion partners +- `finspector.junction_reads.bam` + - alignments of the breakpoint-junction supporting reads. +- `finspector.spanning_reads.bam` + - alignments of the breakpoint-spanning paired-end reads. To visualize fusion genes in [IGV tool](https://software.broadinstitute.org/software/igv/igvtools) first create a genome `Menu->Genomes->Create .genome File`, choose name and description, then choose the following files: -* `finspector.fa` - * make sure the index file finspector.fa.fai is in the same folder -* `finspector.gtf` - * use this for 'Genes' -* `cytoBand.txt` - * use this for 'optional Cytoband' +- `finspector.fa` + - make sure the index file finspector.fa.fai is in the same folder +- `finspector.gtf` + - use this for 'Genes' +- `cytoBand.txt` + - use this for 'optional Cytoband' Add the bam files by choosing `File->Load from File` and make sure to select your generated mini genome in the upper-left corner. For more info and help check [wiki page](https://github.com/FusionInspector/FusionInspector/wiki). @@ -145,16 +145,16 @@ For more info and help check [wiki page](https://github.com/FusionInspector/Fusi **Output directory: `results/Report-`** -* `fusions.json` - * contains all main information about found fusions (fusion name, score, explanation of the score calculation, cherry picked output from fusion tools) -* `index.html` - * main dashboard containing the list of all detected fusions -* `*.html` - * each fusion gets a custom page with fetched data from the local database -* `fusions_list_filtered.txt` - * 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 +- `fusions.json` + - contains all main information about found fusions (fusion name, score, explanation of the score calculation, cherry picked output from fusion tools) +- `index.html` + - main dashboard containing the list of all detected fusions +- `*.html` + - each fusion gets a custom page with fetched data from the local database +- `fusions_list_filtered.txt` + - 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 ### Tool detection @@ -182,10 +182,10 @@ The pipeline has special steps which allow the software versions used to be repo **Output directory: `results/multiqc`** -* `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 +- `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 For more information about how to use MultiQC reports, see [http://multiqc.info](http://multiqc.info) @@ -193,8 +193,8 @@ For more information about how to use MultiQC reports, see [http://multiqc.info] **Output directory: `results/tools/Pizzly`** -* `pizzly_fusions.json` - * contains all the predicted gene fusions +- `pizzly_fusions.json` + - contains all the predicted gene fusions |  Column | Description | | ------- | ----------- | @@ -211,8 +211,8 @@ For more info check the [documentation](https://github.com/pmelsted/pizzly#outpu **Output directory: `results/tools/Squid`** -* `fusions_annotated.txt` - * contains all the predicted gene fusions +- `fusions_annotated.txt` + - contains all the predicted gene fusions |  Column | Description | | ------- | ----------- | @@ -235,8 +235,8 @@ For more info check the [documentation](https://github.com/Kingsford-Group/squid **Output directory: `results/tools/StarFusion`** -* `star-fusion.fusion_predictions.tsv` - * contains all the predicted gene fusions +- `star-fusion.fusion_predictions.tsv` + - contains all the predicted gene fusions |  Column | Description | | ------- | ----------- | diff --git a/docs/usage.md b/docs/usage.md index 8c6edd3c..47a29c55 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -308,8 +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 only `Homo Sapiens` version `GRCh38`. Also make sure to specify `--genomes_base`. ```bash --genome 'GRCh38' --genome_base '/path/to/references' From 904970ae0c05f05b0e81c90edada1238408f8eba Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 15 May 2020 09:57:08 +0200 Subject: [PATCH 0183/1520] fix: omiting introduction headers --- docs/output.md | 30 ++++++------ docs/usage.md | 122 ++++++++++++++++++++++++------------------------- 2 files changed, 76 insertions(+), 76 deletions(-) diff --git a/docs/output.md b/docs/output.md index a0e2917a..436ef45d 100644 --- a/docs/output.md +++ b/docs/output.md @@ -1,27 +1,27 @@ + # nf-core/rnafusion: Output This document describes the output produced by the pipeline. + ## Pipeline overview The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -- [nf-core/rnafusion: Output](#nf-corernafusion-output) - - [Pipeline overview](#pipeline-overview) - - [Arriba](#arriba) - - [EricScript](#ericscript) - - [FastQC](#fastqc) - - [Fusioncatcher](#fusioncatcher) - - [Fusion Inspector](#fusion-inspector) - - [fusion-report](#fusion-report) - - [Tool detection](#tool-detection) - - [Found in database](#found-in-database) - - [Tool detection distribution](#tool-detection-distribution) - - [MultiQC](#multiqc) - - [Pizzly](#pizzly) - - [Squid](#squid) - - [Star-Fusion](#star-fusion) +- [Arriba](#arriba) +- [EricScript](#ericscript) +- [FastQC](#fastqc) +- [Fusioncatcher](#fusioncatcher) +- [Fusion Inspector](#fusion-inspector) +- [fusion-report](#fusion-report) + - [Tool detection](#tool-detection) + - [Found in database](#found-in-database) + - [Tool detection distribution](#tool-detection-distribution) +- [MultiQC](#multiqc) +- [Pizzly](#pizzly) +- [Squid](#squid) +- [Star-Fusion](#star-fusion) ## Arriba diff --git a/docs/usage.md b/docs/usage.md index 47a29c55..43d5b918 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,68 +1,68 @@ + # nf-core/rnafusion: Usage + ## Table of contents -- [nf-core/rnafusion: Usage](#nf-corernafusion-usage) - - [Table of contents](#table-of-contents) - - [Introduction](#introduction) - - [Running the pipeline](#running-the-pipeline) - - [Running the pipeline using Docker](#running-the-pipeline-using-docker) - - [Running the pipeline using Singularity](#running-the-pipeline-using-singularity) - - [Running specific tools](#running-specific-tools) - - [Updating the pipeline](#updating-the-pipeline) - - [Reproducibility](#reproducibility) - - [Main arguments](#main-arguments) - - [`-profile`](#profile) - - [`--reads`](#reads) - - [`--single_end`](#singleend) - - [Tool flags](#tool-flags) - - [`--arriba`](#arriba) - - [`--ericscript`](#ericscript) - - [`--fusioncatcher`](#fusioncatcher) - - [`--fusion_report`](#fusionreport) - - [`--pizzly`](#pizzly) - - [`--squid`](#squid) - - [`--star_fusion`](#starfusion) - - [Visualization flags](#visualization-flags) - - [`--arriba_vis`](#arribavis) - - [`--fusion_inspector`](#fusioninspector) - - [Reference genomes](#reference-genomes) - - [`--arriba_ref`](#arribaref) - - [`--databases`](#databases) - - [`--ericscript_ref`](#ericscriptref) - - [`--fasta`](#fasta) - - [`--fusioncatcher_ref`](#fusioncatcherref) - - [`--genome`](#genome) - - [`--gtf`](#gtf) - - [`--reference_release`](#referencerelease) - - [`--star_index`](#starindex) - - [`--star_fusion_ref`](#starfusionref) - - [`--transcript`](#transcript) - - [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) - - [`--debug`](#debug) - - [`--read_length`](#readlength) - - [`--outdir`](#outdir) - - [`--email`](#email) - - [`--email_on_fail`](#emailonfail) - - [`--max_multiqc_email_size`](#maxmultiqcemailsize) - - [`-name`](#name) - - [`-resume`](#resume) - - [`-c`](#c) - - [`--custom_config_version`](#customconfigversion) - - [`--custom_config_base`](#customconfigbase) - - [`--max_memory`](#maxmemory) - - [`--max_time`](#maxtime) - - [`--max_cpus`](#maxcpus) - - [`--plaintext_email`](#plaintextemail) - - [`--monochrome_logs`](#monochromelogs) - - [`--multiqc_config`](#multiqcconfig) +- [Introduction](#introduction) +- [Running the pipeline](#running-the-pipeline) + - [Running the pipeline using Docker](#running-the-pipeline-using-docker) + - [Running the pipeline using Singularity](#running-the-pipeline-using-singularity) + - [Running specific tools](#running-specific-tools) + - [Updating the pipeline](#updating-the-pipeline) + - [Reproducibility](#reproducibility) +- [Main arguments](#main-arguments) + - [`-profile`](#profile) + - [`--reads`](#reads) + - [`--single_end`](#singleend) +- [Tool flags](#tool-flags) + - [`--arriba`](#arriba) + - [`--ericscript`](#ericscript) + - [`--fusioncatcher`](#fusioncatcher) + - [`--fusion_report`](#fusionreport) + - [`--pizzly`](#pizzly) + - [`--squid`](#squid) + - [`--star_fusion`](#starfusion) +- [Visualization flags](#visualization-flags) + - [`--arriba_vis`](#arribavis) + - [`--fusion_inspector`](#fusioninspector) +- [Reference genomes](#reference-genomes) + - [`--arriba_ref`](#arribaref) + - [`--databases`](#databases) + - [`--ericscript_ref`](#ericscriptref) + - [`--fasta`](#fasta) + - [`--fusioncatcher_ref`](#fusioncatcherref) + - [`--genome`](#genome) + - [`--gtf`](#gtf) + - [`--reference_release`](#referencerelease) + - [`--star_index`](#starindex) + - [`--star_fusion_ref`](#starfusionref) + - [`--transcript`](#transcript) +- [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) + - [`--debug`](#debug) + - [`--read_length`](#readlength) + - [`--outdir`](#outdir) + - [`--email`](#email) + - [`--email_on_fail`](#emailonfail) + - [`--max_multiqc_email_size`](#maxmultiqcemailsize) + - [`-name`](#name) + - [`-resume`](#resume) + - [`-c`](#c) + - [`--custom_config_version`](#customconfigversion) + - [`--custom_config_base`](#customconfigbase) + - [`--max_memory`](#maxmemory) + - [`--max_time`](#maxtime) + - [`--max_cpus`](#maxcpus) + - [`--plaintext_email`](#plaintextemail) + - [`--monochrome_logs`](#monochromelogs) + - [`--multiqc_config`](#multiqcconfig) ## Introduction From 1a7ceb3d5976655957ac49ebe68a9b9dc420c3e5 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 15 May 2020 09:58:32 +0200 Subject: [PATCH 0184/1520] fix: parameter order in `test.sh` Co-authored-by: Maxime Garcia --- test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test.sh b/test.sh index bd9b0d39..e17c6f19 100644 --- a/test.sh +++ b/test.sh @@ -1,7 +1,7 @@ #!/bin/bash # Test tools only -nextflow run nf-core/rnafusion -profile munin --ericscript --reads "/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --debug +nextflow run nf-core/rnafusion -profile munin --reads "/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --debug # Test batch mode nextflow run nf-core/rnafusion -profile munin --reads "/data1/references/rnafusion/1.1.0/batch_data/new_reads/*_R{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid @@ -10,4 +10,4 @@ nextflow run nf-core/rnafusion -profile munin --reads "/data1/references/rnafusi nextflow run nf-core/rnafusion -profile munin --reads "/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector # Test the whole pipeline in batch mode -nextflow run nf-core/rnafusion -profile munin --reads "/data1/references/rnafusion/1.1.0/batch_data/new_reads/*_R{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector \ No newline at end of file +nextflow run nf-core/rnafusion -profile munin --reads "/data1/references/rnafusion/1.1.0/batch_data/new_reads/*_R{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector From 8439575beb535ca91a2512aab9ba4b58739b71cc Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 15 May 2020 11:45:22 +0200 Subject: [PATCH 0185/1520] fix: removed awsbatch profile from `download-singularity-img.nf` --- download-singularity-img.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download-singularity-img.nf b/download-singularity-img.nf index 3775ead3..55c4bc1a 100644 --- a/download-singularity-img.nf +++ b/download-singularity-img.nf @@ -32,7 +32,7 @@ def helpMessage() { Mandatory arguments: --outdir [path] Output directory for downloading -profile [str] Configuration profile to use. Can use multiple (comma separated) - Available: standard, docker, singularity, awsbatch, test + Available: standard, docker, singularity Options: --download_all [bool] Download all images From 8df24a6243fb1798163154ae96352885a01316ec Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Fri, 15 May 2020 11:59:48 +0200 Subject: [PATCH 0186/1520] fix: TOC in usage.md --- docs/usage.md | 86 +++++++++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 43d5b918..99ae7c4e 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -12,57 +12,57 @@ - [Updating the pipeline](#updating-the-pipeline) - [Reproducibility](#reproducibility) - [Main arguments](#main-arguments) - - [`-profile`](#profile) - - [`--reads`](#reads) - - [`--single_end`](#singleend) + - [`-profile`](#-profile) + - [`--reads`](#--reads) + - [`--single_end`](#--single_end) - [Tool flags](#tool-flags) - - [`--arriba`](#arriba) - - [`--ericscript`](#ericscript) - - [`--fusioncatcher`](#fusioncatcher) - - [`--fusion_report`](#fusionreport) - - [`--pizzly`](#pizzly) - - [`--squid`](#squid) - - [`--star_fusion`](#starfusion) + - [`--arriba`](#--arriba) + - [`--ericscript`](#--ericscript) + - [`--fusioncatcher`](#--fusioncatcher) + - [`--fusion_report`](#--fusion_report) + - [`--pizzly`](#--pizzly) + - [`--squid`](#--squid) + - [`--star_fusion`](#--star_fusion) - [Visualization flags](#visualization-flags) - - [`--arriba_vis`](#arribavis) - - [`--fusion_inspector`](#fusioninspector) + - [`--arriba_vis`](#--arriba_vis) + - [`--fusion_inspector`](#--fusion_inspector) - [Reference genomes](#reference-genomes) - - [`--arriba_ref`](#arribaref) - - [`--databases`](#databases) - - [`--ericscript_ref`](#ericscriptref) - - [`--fasta`](#fasta) - - [`--fusioncatcher_ref`](#fusioncatcherref) - - [`--genome`](#genome) - - [`--gtf`](#gtf) - - [`--reference_release`](#referencerelease) - - [`--star_index`](#starindex) - - [`--star_fusion_ref`](#starfusionref) - - [`--transcript`](#transcript) + - [`--arriba_ref`](#--arriba_ref) + - [`--databases`](#--databases) + - [`--ericscript_ref`](#--ericscript_ref) + - [`--fasta`](#--fasta) + - [`--fusioncatcher_ref`](#--fusioncatcher_ref) + - [`--genome`](#--genome) + - [`--gtf`](#--gtf) + - [`--reference_release`](#--reference_release) + - [`--star_index`](#--star_index) + - [`--star_fusion_ref`](#--star_fusion_ref) + - [`--transcript`](#--transcript) - [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) + - [`--awsqueue`](#--awsqueue) + - [`--awsregion`](#--awsregion) + - [`--awscli`](#--awscli) - [Other command line parameters](#other-command-line-parameters) - - [`--debug`](#debug) - - [`--read_length`](#readlength) - - [`--outdir`](#outdir) - - [`--email`](#email) - - [`--email_on_fail`](#emailonfail) - - [`--max_multiqc_email_size`](#maxmultiqcemailsize) - - [`-name`](#name) - - [`-resume`](#resume) - - [`-c`](#c) - - [`--custom_config_version`](#customconfigversion) - - [`--custom_config_base`](#customconfigbase) - - [`--max_memory`](#maxmemory) - - [`--max_time`](#maxtime) - - [`--max_cpus`](#maxcpus) - - [`--plaintext_email`](#plaintextemail) - - [`--monochrome_logs`](#monochromelogs) - - [`--multiqc_config`](#multiqcconfig) + - [`--debug`](#--debug) + - [`--read_length`](#--read_length) + - [`--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 From 716bbf541f3f6be9096c3563b7e60a59b911d32c Mon Sep 17 00:00:00 2001 From: Maxime Garcia Date: Wed, 27 May 2020 17:15:11 +0200 Subject: [PATCH 0187/1520] Update download-references.nf Fix and closes #134 --- download-references.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download-references.nf b/download-references.nf index 4f1ffb5e..826491de 100644 --- a/download-references.nf +++ b/download-references.nf @@ -135,7 +135,7 @@ process download_star_fusion { script: """ - aws s3 --no-sign-request --region ${params.awsregion} sync s3://ngi-igenomes/Homo_sapiens/Ensembl/GRCh38/Genome/CTAT/ctat_star_fusion_1_8_1.tar.gz . + 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 rm ctat_star_fusion_1_8_1.tar.gz """ From 66e8ce11961965c2ad6fa8b7563099ada18e4c94 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 28 May 2020 21:41:53 +0200 Subject: [PATCH 0188/1520] fix: drop funsion-inspector from download-singularity-img.nf --- download-singularity-img.nf | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/download-singularity-img.nf b/download-singularity-img.nf index 55c4bc1a..0b07952f 100644 --- a/download-singularity-img.nf +++ b/download-singularity-img.nf @@ -63,7 +63,6 @@ if (params.fusioncatcher || params.download_all) running_tools.add("Fusioncatche if (params.ericscript || params.download_all) running_tools.add("Ericscript") if (params.pizzly || params.download_all) running_tools.add("Pizzly") if (params.squid || params.download_all) running_tools.add("Squid") -if (params.fusion_inspector || params.download_all) running_tools.add("Fusion-Inspector") // Header log info log.info nfcoreHeader() @@ -148,21 +147,6 @@ process download_fusioncatcher { """ } -process download_fusion_inspector { - publishDir "${params.outdir}", mode: 'copy' - - when: - params.fusion_inspector || params.download_all - - output: - file "nf-core-rnafusion-fusion-inspector_${params.versions.fusion_inspector}.img" - - script: - """ - singularity pull --name nf-core-rnafusion-fusion-inspector_${params.versions.fusion_inspector}.img docker://nfcore/rnafusion:fusion-inspector_${params.versions.fusion_inspector} - """ -} - process download_pizzly { publishDir "${params.outdir}", mode: 'copy' From b68858cc2384e4773af59ab5d0603b16f9313748 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sun, 31 May 2020 09:29:30 +0200 Subject: [PATCH 0189/1520] fix: parse versions from `base.config` --- scripts/download-singularity-img.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/download-singularity-img.sh b/scripts/download-singularity-img.sh index 96bdba35..a093ee01 100644 --- a/scripts/download-singularity-img.sh +++ b/scripts/download-singularity-img.sh @@ -1,7 +1,7 @@ #!/bin/bash get_tool_version() { - echo $(cat nextflow.config | grep -m1 "$1" | cut -d"=" -f2 | tr -d \' | tr -d ' ') + echo $(cat conf/base.config | grep -m1 "$1" | cut -d"=" -f2 | tr -d \' | tr -d ' ') } if [ $# -eq 0 ]; then @@ -28,7 +28,6 @@ elif [ -d "$1" ]; then STAR_FUSION=$(get_tool_version "star_fusion") cd $1 && echo "Pulling images ..." - singularity pull --name "${PREFIX}-arriba_${ARRIBA}.img" docker://nfcore/rnafusion:arriba_${ARRIBA} singularity pull --name "${PREFIX}-ericscript_${ERICSCRIPT}.img" docker://nfcore/rnafusion:ericscript_${ERICSCRIPT} singularity pull --name "${PREFIX}-fusioncatcher_${FUSIONCATCHER}.img" docker://nfcore/rnafusion:fusioncatcher_${FUSIONCATCHER} From 01e9c8539d44693517b51d5f7d7803846daec357 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 11 Jun 2020 11:07:23 +0200 Subject: [PATCH 0190/1520] chore: upgrade fusion-report 2.1.0 --- CHANGELOG.md | 1 + README.md | 2 +- environment.yml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0600477..6b8d534f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Changed * Upgrade `Arriba v1.1.0` to `Arriba v1.2.0` +* * Upgrade `fusion-report v2.0.2` to `fusion-report v2.1.0` ## [1.1.0] nfcore/rnafusion - 2020/02/10 diff --git a/README.md b/README.md index c4773475..2de1c7e7 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool | [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.2.0` | +| [fusion-report](https://github.com/matq007/fusion-report) | - | `2.1.0` | | [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` | diff --git a/environment.yml b/environment.yml index 7cccb3c7..f3f10864 100644 --- a/environment.yml +++ b/environment.yml @@ -18,7 +18,7 @@ dependencies: - conda-forge::r-data.table=1.12.8 - conda-forge::r-gplots=3.0.1.2 - bioconda::bioconductor-edger=3.28.0 - - bioconda::fusion-report=2.0.2 + - bioconda::fusion-report=2.1.0 # Star-Fusion - conda-forge::awscli=1.18.39 - conda-forge::tar=1.32 \ No newline at end of file From 8514f854943e2ef2a950935f527ff46d46996e75 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 11 Jun 2020 11:10:00 +0200 Subject: [PATCH 0191/1520] docs: lint CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b8d534f..abe80ca7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Changed * Upgrade `Arriba v1.1.0` to `Arriba v1.2.0` -* * Upgrade `fusion-report v2.0.2` to `fusion-report v2.1.0` +* Upgrade `fusion-report v2.0.2` to `fusion-report v2.1.0` ## [1.1.0] nfcore/rnafusion - 2020/02/10 From 20db2c9b38837dac6cfa85132719f15b00716fa6 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 11 Jun 2020 17:47:15 +0200 Subject: [PATCH 0192/1520] fix: remove `profile` from helper scripts (#139) --- CHANGELOG.md | 4 ++++ download-references.nf | 1 - download-singularity-img.nf | 2 -- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abe80ca7..1af22b01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. * Upgrade `Arriba v1.1.0` to `Arriba v1.2.0` * Upgrade `fusion-report v2.0.2` to `fusion-report v2.1.0` +### Fixed + +* Removed `profile` from helper scripts [#139](https://github.com/nf-core/rnafusion/issues/139) + ## [1.1.0] nfcore/rnafusion - 2020/02/10 * Fusion gene detection tools: diff --git a/download-references.nf b/download-references.nf index 826491de..2f711d70 100644 --- a/download-references.nf +++ b/download-references.nf @@ -28,7 +28,6 @@ def helpMessage() { Mandatory arguments: --outdir [path] Output directory for downloading - -profile [str] Configuration profile [https://github.com/nf-core/configs] Options: --download_all [bool] Download all references diff --git a/download-singularity-img.nf b/download-singularity-img.nf index 0b07952f..15336c87 100644 --- a/download-singularity-img.nf +++ b/download-singularity-img.nf @@ -31,8 +31,6 @@ def helpMessage() { Mandatory arguments: --outdir [path] Output directory for downloading - -profile [str] Configuration profile to use. Can use multiple (comma separated) - Available: standard, docker, singularity Options: --download_all [bool] Download all images From 0bd9a3a147f3aa8e11077a1528152213d404d5a9 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Thu, 11 Jun 2020 17:52:26 +0200 Subject: [PATCH 0193/1520] fix: url path for `Pfam-A.hmm.gz` --- CHANGELOG.md | 1 + build-ctat.nf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1af22b01..87df6c98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Fixed * 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) ## [1.1.0] nfcore/rnafusion - 2020/02/10 diff --git a/build-ctat.nf b/build-ctat.nf index e41f7bac..b8b46f78 100644 --- a/build-ctat.nf +++ b/build-ctat.nf @@ -84,7 +84,7 @@ process star_fusion { script: """ - wget -N ftp://ftp.ebi.ac.uk/pub/databases/Pfam/current_release/Pfam-A.hmm.gz + wget -N ftp://ftp.ebi.ac.uk/pub/databases/Pfam/current_releases/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 From 67c6fe1dae4b5bd6988e6d3b8043342a4ed2f685 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 15 Jun 2020 09:06:32 +0200 Subject: [PATCH 0194/1520] fix: empty header in FusionInspector --- CHANGELOG.md | 1 + containers/star-fusion/environment.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87df6c98..1c59e087 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Fixed +* `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) diff --git a/containers/star-fusion/environment.yml b/containers/star-fusion/environment.yml index f7c0408c..4ca4be91 100644 --- a/containers/star-fusion/environment.yml +++ b/containers/star-fusion/environment.yml @@ -8,4 +8,5 @@ dependencies: - 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 From 472596570f2408be5fb3253a34c71bd25ab2a2dd Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 15 Jun 2020 09:25:13 +0200 Subject: [PATCH 0195/1520] chore: upgrade fusion-report 2.1.1 --- CHANGELOG.md | 1 + environment.yml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c59e087..20b309dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Changed +* 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` diff --git a/environment.yml b/environment.yml index f3f10864..46ef0a9b 100644 --- a/environment.yml +++ b/environment.yml @@ -18,7 +18,7 @@ dependencies: - conda-forge::r-data.table=1.12.8 - conda-forge::r-gplots=3.0.1.2 - bioconda::bioconductor-edger=3.28.0 - - bioconda::fusion-report=2.1.0 + - bioconda::fusion-report=2.1.1 # Star-Fusion - conda-forge::awscli=1.18.39 - conda-forge::tar=1.32 \ No newline at end of file From 425883ddb37ab6c07586c5c3e2a6e311d63f05be Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 15 Jun 2020 09:46:20 +0200 Subject: [PATCH 0196/1520] fix: missing prefix in cdna #143 --- CHANGELOG.md | 1 + download-references.nf | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20b309dc..2d45709d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Fixed +* 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) diff --git a/download-references.nf b/download-references.nf index 2f711d70..f6509338 100644 --- a/download-references.nf +++ b/download-references.nf @@ -94,7 +94,7 @@ process download_base { 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_${params.reference_release}.cdna.all.fa.gz" into transcript + file "Homo_sapiens.GRCh38_r${params.reference_release}.cdna.all.fa.gz" into transcript script: """ @@ -103,7 +103,7 @@ process download_base { 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_${params.reference_release}.cdna.all.fa.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 """ } From 0e450023b164bbdd924ac5ea1bdfe1847467dc1b Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 15 Jun 2020 16:09:41 +0200 Subject: [PATCH 0197/1520] docs: updated README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2de1c7e7..bccf0d0f 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool | [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.0` | +| [fusion-report](https://github.com/matq007/fusion-report) | - | `2.1.1` | | [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` | @@ -42,7 +42,7 @@ ii. Install either [`Docker`](https://docs.docker.com/engine/installation/) or [ iii. Download the pipeline and test it on a minimal dataset with a single command ```bash -nextflow run nf-core/rnafusion -profile test, +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. @@ -50,7 +50,7 @@ nextflow run nf-core/rnafusion -profile test, -c './example/custom-docker.config' --reads '*_R{1,2}.fastq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector +nextflow run nf-core/rnafusion -profile --reads '*_R{1,2}.fastq.gz' --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. From ccde848481df4bcddd7be8e92e984770ef7417fb Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Tue, 16 Jun 2020 09:42:21 +0200 Subject: [PATCH 0198/1520] fix: missing `strip-components` in download-references.nf/star-fusion --- CHANGELOG.md | 1 + download-references.nf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d45709d..ff13f813 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.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) diff --git a/download-references.nf b/download-references.nf index f6509338..c9545338 100644 --- a/download-references.nf +++ b/download-references.nf @@ -135,7 +135,7 @@ 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 + tar -xf ctat_star_fusion_1_8_1.tar.gz --strip-components=5 rm ctat_star_fusion_1_8_1.tar.gz """ } From 6fc58599469610d9ebe167d36b5138899d14e2cd Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 24 Jun 2020 11:06:56 +0200 Subject: [PATCH 0199/1520] chore: upgrade fusion-report 2.1.2 --- CHANGELOG.md | 1 + environment.yml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff13f813..d12a838a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Changed +* 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` diff --git a/environment.yml b/environment.yml index 46ef0a9b..b537c04a 100644 --- a/environment.yml +++ b/environment.yml @@ -18,7 +18,7 @@ dependencies: - conda-forge::r-data.table=1.12.8 - conda-forge::r-gplots=3.0.1.2 - bioconda::bioconductor-edger=3.28.0 - - bioconda::fusion-report=2.1.1 + - bioconda::fusion-report=2.1.2 # Star-Fusion - conda-forge::awscli=1.18.39 - conda-forge::tar=1.32 \ No newline at end of file From e8617aa5d4c0f6437c06f1436597d477732453e0 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 24 Jun 2020 13:24:19 +0200 Subject: [PATCH 0200/1520] docs: updated README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bccf0d0f..bf5d2a78 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool | [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.1` | +| [fusion-report](https://github.com/matq007/fusion-report) | - | `2.1.2` | | [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` | From f16b0e2f697e60e6fb918602a668935b2a91e04b Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 27 Jun 2020 16:05:12 +0200 Subject: [PATCH 0201/1520] chore: remove singularity helper scripts --- CHANGELOG.md | 4 + download-singularity-img.nf | 242 ---------------------------- scripts/download-singularity-img.sh | 42 ----- 3 files changed, 4 insertions(+), 284 deletions(-) delete mode 100644 download-singularity-img.nf delete mode 100644 scripts/download-singularity-img.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index d12a838a..957e48b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. * 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: diff --git a/download-singularity-img.nf b/download-singularity-img.nf deleted file mode 100644 index 15336c87..00000000 --- a/download-singularity-img.nf +++ /dev/null @@ -1,242 +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 singularity images is as follows: - - nextflow run nf-core/rnafusion/download-singularity-img.nf -profile [PROFILE] [OPTIONS] --outdir /path/to/output - - By default main image is downloaded. - - Mandatory arguments: - --outdir [path] Output directory for downloading - - Options: - --download_all [bool] Download all images - --arriba [bool] Download Arriba image - --ericscript [bool] Download Ericscript image - --fusioncatcher [bool] Download Fusioncatcher image - --fusion_inspector [bool] Download Fusion-Inspector image - --pizzly [bool] Download Pizzly image - --squid [bool] Download Squid image - --star_fusion [bool] Download STAR-Fusion image - - """.stripIndent() -} - -/* - * SET UP CONFIGURATION VARIABLES - */ - -// Show help emssage -if (params.help) exit 0, helpMessage() - -running_tools = ["nf-core/rnafusion/${workflow.manifest.version}"] -if (!params.outdir) exit 1, "Output directory not specified!" - -if (params.arriba || params.download_all) running_tools.add("Arriba") -if (params.star_fusion || params.download_all) running_tools.add("STAR-Fusion") -if (params.fusioncatcher || params.download_all) running_tools.add("Fusioncatcher") -if (params.ericscript || params.download_all) running_tools.add("Ericscript") -if (params.pizzly || params.download_all) running_tools.add("Pizzly") -if (params.squid || params.download_all) running_tools.add("Squid") - -// Header log info -log.info nfcoreHeader() -def summary = [:] -summary['Pipeline Name'] = 'nf-core/rnafusion/download-singularity-img.nf' -summary['Pipeline Version'] = workflow.manifest.version -summary['Tool images'] = running_tools.size() == 0 ? 'None' : running_tools.join(", ") -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 -summary['Config Profile'] = workflow.profile -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 download_base_image { - publishDir "${params.outdir}", mode: 'copy' - - when: - params.download_all - - output: - file "nf-core-rnafusion-${workflow.manifest.version}.img" - - script: - """ - singularity pull --name nf-core-rnafusion-${workflow.manifest.version}.img docker://nfcore/rnafusion:${workflow.manifest.version} - """ -} - -process download_arriba { - publishDir "${params.outdir}", mode: 'copy' - - when: - params.arriba || params.download_all - - output: - file "nf-core-rnafusion-arriba_${params.versions.arriba}.img" - - script: - """ - singularity pull --name nf-core-rnafusion-arriba_${params.versions.arriba}.img docker://nfcore/rnafusion:arriba_${params.versions.arriba} - """ -} - -process download_ericscript { - publishDir "${params.outdir}", mode: 'copy' - - when: - params.ericscript || params.download_all - - output: - file "nf-core-rnafusion-ericscript_${params.versions.ericscript}.img" - - script: - """ - singularity pull --name nf-core-rnafusion-ericscript_${params.versions.ericscript}.img docker://nfcore/rnafusion:ericscript_${params.versions.ericscript} - """ -} - -process download_fusioncatcher { - publishDir "${params.outdir}", mode: 'copy' - - when: - params.fusioncatcher || params.download_all - - output: - file "nf-core-rnafusion-fusioncatcher_${params.versions.fusioncatcher}.img" - - script: - """ - singularity pull --name nf-core-rnafusion-fusioncatcher_${params.versions.fusioncatcher}.img docker://nfcore/rnafusion:fusioncatcher_${params.versions.fusioncatcher} - """ -} - -process download_pizzly { - publishDir "${params.outdir}", mode: 'copy' - - when: - params.pizzly || params.download_all - - output: - file "nf-core-rnafusion-pizzly_${params.versions.pizzly}.img" - - script: - """ - singularity pull --name nf-core-rnafusion-pizzly_${params.versions.pizzly}.img docker://nfcore/rnafusion:pizzly_${params.versions.pizzly} - """ -} - -process download_squid { - publishDir "${params.outdir}", mode: 'copy' - - when: - params.squid || params.download_all - - output: - file "nf-core-rnafusion-squid_${params.versions.squid}.img" - - script: - """ - singularity pull --name nf-core-rnafusion-squid_${params.versions.squid}.img docker://nfcore/rnafusion:squid_${params.versions.squid} - """ -} - -process download_star_fusion { - publishDir "${params.outdir}", mode: 'copy' - - when: - params.star_fusion || params.download_all - - output: - file "nf-core-rnafusion-star-fusion_${params.versions.star_fusion}.img" - - script: - """ - singularity pull --name nf-core-rnafusion-star-fusion_${params.versions.star_fusion}.img docker://nfcore/rnafusion:star-fusion_${params.versions.star_fusion} - """ -} - -/* - * Completion - */ -workflow.onComplete { - log.info "[nf-core/rnafusion/download-singularity-img.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" + - "============================================================" - } - } - } - } -} \ No newline at end of file diff --git a/scripts/download-singularity-img.sh b/scripts/download-singularity-img.sh deleted file mode 100644 index a093ee01..00000000 --- a/scripts/download-singularity-img.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -get_tool_version() { - echo $(cat conf/base.config | grep -m1 "$1" | cut -d"=" -f2 | tr -d \' | tr -d ' ') -} - -if [ $# -eq 0 ]; then - echo "No output path specified" - echo "Run download-singularity-img.sh -h for help" - exit 1 -fi - -if [ $1 == "-h" ]; then - echo "Utility for downloading singularity images from DockerHub" - echo - echo "Usage: download-singularity-img.sh [output directory]" - echo "Example: sh scripts/download-singularity-img.sh /path" - echo - exit 0 -elif [ -d "$1" ]; then - PREFIX="nf-core-rnafusion" - ARRIBA=$(get_tool_version "arriba") - ERICSCRIPT=$(get_tool_version "ericscript") - FUSIONCATCHER=$(get_tool_version "fusioncatcher") - PIZZLY=$(get_tool_version "pizzly") - RNAFUSION="$(cat nextflow.config | grep -m1 "container" | cut -d":" -f2 | cut -d "'" -f1)" - SQUID=$(get_tool_version "squid") - STAR_FUSION=$(get_tool_version "star_fusion") - - cd $1 && echo "Pulling images ..." - singularity pull --name "${PREFIX}-arriba_${ARRIBA}.img" docker://nfcore/rnafusion:arriba_${ARRIBA} - singularity pull --name "${PREFIX}-ericscript_${ERICSCRIPT}.img" docker://nfcore/rnafusion:ericscript_${ERICSCRIPT} - singularity pull --name "${PREFIX}-fusioncatcher_${FUSIONCATCHER}.img" docker://nfcore/rnafusion:fusioncatcher_${FUSIONCATCHER} - singularity pull --name "${PREFIX}-pizzly_${PIZZLY}.img" docker://nfcore/rnafusion:pizzly_${PIZZLY} - singularity pull --name "${PREFIX}-${RNAFUSION}.img" docker://nfcore/rnafusion:${RNAFUSION} - singularity pull --name "${PREFIX}-squid_${SQUID}.img" docker://nfcore/rnafusion:squid_${SQUID} - singularity pull --name "${PREFIX}-star-fusion_${STAR_FUSION}.img" docker://nfcore/rnafusion:star-fusion_${STAR_FUSION} - -else - echo "Path doesn't exists" - exit 1 -fi \ No newline at end of file From 7820b1745a431ddf321336d0fba88771b8dbf5fe Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 27 Jun 2020 16:13:11 +0200 Subject: [PATCH 0202/1520] chore: bump-version 1.2.0 --- .github/workflows/ci.yml | 2 +- Dockerfile | 4 ++-- environment.yml | 2 +- nextflow.config | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c2f1e55f..5e445fd8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: - name: Pull docker image run: | docker pull nfcore/rnafusion:dev - docker tag nfcore/rnafusion:dev nfcore/rnafusion:dev + docker tag nfcore/rnafusion:dev nfcore/rnafusion:1.2.0 - name: Run pipeline run: | nextflow run ${GITHUB_WORKSPACE} --help diff --git a/Dockerfile b/Dockerfile index c3748956..5e5af29f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ 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-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 diff --git a/environment.yml b/environment.yml index b537c04a..87bcc6a1 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/nextflow.config b/nextflow.config index 78c878ea..30aa2405 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:dev' +process.container = 'nfcore/rnafusion:1.2.0' // Load nf-core custom profiles from different Institutions try { @@ -160,7 +160,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 From 0e488410b7881f58364a189ef72e8685f5748985 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sat, 27 Jun 2020 16:19:32 +0200 Subject: [PATCH 0203/1520] chore: remove singularity CI test --- .github/workflows/ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5e445fd8..a33e998d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,3 @@ jobs: - name: Run pipeline for downloading references run: | nextflow run ${GITHUB_WORKSPACE}/download-references.nf --help - - name: Run pipeline for downloading singularity images - run: | - nextflow run ${GITHUB_WORKSPACE}/download-singularity-img.nf --help From 6b49641d29038a708b446ce2507953d631f75927 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Mon, 6 Jul 2020 07:23:38 +0200 Subject: [PATCH 0204/1520] chore: upgrade fusion-report 2.1.3 --- CHANGELOG.md | 1 + README.md | 2 +- environment.yml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 957e48b4..9e48ab3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### 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` diff --git a/README.md b/README.md index bf5d2a78..5a8dda05 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool | [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.2` | +| [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` | diff --git a/environment.yml b/environment.yml index 87bcc6a1..645b707a 100644 --- a/environment.yml +++ b/environment.yml @@ -18,7 +18,7 @@ dependencies: - conda-forge::r-data.table=1.12.8 - conda-forge::r-gplots=3.0.1.2 - bioconda::bioconductor-edger=3.28.0 - - bioconda::fusion-report=2.1.2 + - bioconda::fusion-report=2.1.3 # Star-Fusion - conda-forge::awscli=1.18.39 - conda-forge::tar=1.32 \ No newline at end of file From 4033fdb927f6db05fc5bd729e14320e72a3a5c05 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 8 Jul 2020 22:22:51 +0200 Subject: [PATCH 0205/1520] docs: updated running instructions --- README.md | 17 ++++++++++++----- docs/references.md | 2 -- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 5a8dda05..c9ce4322 100644 --- a/README.md +++ b/README.md @@ -39,20 +39,27 @@ i. 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)) -iii. Download the pipeline and test it on a minimal dataset with a single command +iii. Download references for all tools ```bash -nextflow run nf-core/rnafusion -profile test, +nextflow run nf-core/rnafusion + --download_all \ + --outdir \ + --cosmic_usr --cosmic_passwd ``` -> 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! ```bash -nextflow run nf-core/rnafusion -profile --reads '*_R{1,2}.fastq.gz' --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector +nextflow run nf-core/rnafusion -profile \ + --reads '*_R{1,2}.fastq.gz' \ + --genomes_base 'reference_path_from_above' + --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid \ + --arriba_vis --fusion_inspector ``` +> 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. + See [usage docs](docs/usage.md) for all of the available options when running the pipeline. ## Documentation diff --git a/docs/references.md b/docs/references.md index 15281665..d59d2dc5 100644 --- a/docs/references.md +++ b/docs/references.md @@ -13,7 +13,6 @@ nextflow run nf-core/rnafusion/download-references.nf --help ```bash # Replace and with yout credentials from COSMIC nextflow run nf-core/rnafusion/download-references.nf \ - -profile \ --download_all \ --outdir \ --cosmic_usr --cosmic_passwd @@ -24,7 +23,6 @@ nextflow run nf-core/rnafusion/download-references.nf \ ```bash # Example of downloading specific tools nextflow run nf-core/rnafusion/download-references.nf \ --profile \ --arriba \ --outdir ``` From 6fad082068e425534906148cef9316c09bd8a319 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 8 Jul 2020 22:50:06 +0200 Subject: [PATCH 0206/1520] fix: extra params are not processed correctly --- main.nf | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/main.nf b/main.nf index 165ef6ed..b4f9151c 100644 --- a/main.nf +++ b/main.nf @@ -336,7 +336,7 @@ process arriba { when: params.arriba && (!params.single_end || params.debug) script: - def extra_params = params.arriba_opt ? "${params.arriba_opt}" : '' + def extra_params = params.arriba_opt ? params.arriba_opt : '' """ STAR \\ --genomeDir ${star_index} \\ @@ -368,8 +368,7 @@ process arriba { -g ${gtf} \\ -b ${reference}/blacklist_hg38_GRCh38_2018-11-04.tsv \\ -o ${sample}_arriba.tsv -O ${sample}_discarded_arriba.tsv \\ - -T -P \\ - ${extra_params} + -T -P ${extra_params} mv Aligned.out.bam ${sample}_arriba.bam """ @@ -401,7 +400,7 @@ process star_fusion { script: def avail_mem = task.memory ? "--limitBAMsortRAM ${task.memory.toBytes() - 100000000}" : '' option = params.single_end ? "--left_fq ${reads[0]}" : "--left_fq ${reads[0]} --right_fq ${reads[1]}" - def extra_params = params.star_fusion_opt ? "${params.star_fusion_opt}" : '' + def extra_params = params.star_fusion_opt ? params.star_fusion_opt : '' """ STAR \\ --genomeDir ${star_index} \\ @@ -466,7 +465,7 @@ process fusioncatcher { script: option = params.single_end ? reads[0] : "${reads[0]},${reads[1]}" - def extra_params = params.fusioncatcher_opt ? "${params.fusioncatcher_opt}" : '' + def extra_params = params.fusioncatcher_opt ? params.fusioncatcher_opt : '' """ fusioncatcher.py \\ -d ${data_dir} \\ @@ -647,7 +646,7 @@ process summary { script: - def extra_params = params.fusion_report_opt ? "${params.fusion_report_opt}" : '' + def extra_params = params.fusion_report_opt ? params.fusion_report_opt : '' def tools = !arriba.empty() ? "--arriba ${arriba} " : '' tools += !ericscript.empty() ? "--ericscript ${ericscript} " : '' tools += !fusioncatcher.empty() ? "--fusioncatcher ${fusioncatcher} " : '' @@ -725,7 +724,7 @@ process fusion_inspector { when: params.fusion_inspector && (!params.single_end || params.debug) script: - def extra_params = params.fusion_inspector_opt ? "${params.fusion_inspector_opt}" : '' + def extra_params = params.fusion_inspector_opt ? params.fusion_inspector_opt : '' """ FusionInspector \\ --fusions ${fi_input_list} \\ @@ -735,8 +734,7 @@ process fusion_inspector { --CPU ${task.cpus} \\ -O . \\ --out_prefix finspector \\ - --vis \\ - ${extra_params} + --vis ${extra_params} """ } From f04408c71d260866ac66b9412d349f1a61b2507b Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Sun, 12 Jul 2020 10:41:47 +0200 Subject: [PATCH 0207/1520] docs: updated README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c9ce4322..d6a8f8e8 100644 --- a/README.md +++ b/README.md @@ -42,12 +42,14 @@ ii. Install either [`Docker`](https://docs.docker.com/engine/installation/) or [ iii. Download references for all tools ```bash -nextflow run nf-core/rnafusion +nextflow run nf-core/rnafusion/download-references.nf -profile \ --download_all \ --outdir \ --cosmic_usr --cosmic_passwd ``` +> 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! ```bash @@ -58,8 +60,6 @@ nextflow run nf-core/rnafusion -profile \ --arriba_vis --fusion_inspector ``` -> 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. - See [usage docs](docs/usage.md) for all of the available options when running the pipeline. ## Documentation From 59011ab5c5b1c4c03177e5cbe6bde9b076e53369 Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 15 Jul 2020 15:15:38 +0200 Subject: [PATCH 0208/1520] docs: updated CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e48ab3b..5a990f62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ 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). -## dev nfcore/rnafusion +## [1.2.0] nfcore/rnafusion - 2020/07/15 ### Added From 2e3d5de9dc718bd23eaa2f6f693cd9c311a459cf Mon Sep 17 00:00:00 2001 From: Martin Proks Date: Wed, 15 Jul 2020 15:21:59 +0200 Subject: [PATCH 0209/1520] chore: removed internal testing script --- test.sh | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 test.sh diff --git a/test.sh b/test.sh deleted file mode 100644 index e17c6f19..00000000 --- a/test.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -# Test tools only -nextflow run nf-core/rnafusion -profile munin --reads "/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --debug - -# Test batch mode -nextflow run nf-core/rnafusion -profile munin --reads "/data1/references/rnafusion/1.1.0/batch_data/new_reads/*_R{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid - -# Test the whole pipeline -nextflow run nf-core/rnafusion -profile munin --reads "/data1/references/rnafusion/1.1.0/reads_{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector - -# Test the whole pipeline in batch mode -nextflow run nf-core/rnafusion -profile munin --reads "/data1/references/rnafusion/1.1.0/batch_data/new_reads/*_R{1,2}.fq.gz" --arriba --star_fusion --fusioncatcher --ericscript --pizzly --squid --arriba_vis --fusion_inspector From 758fd35e720eb8c49b29ae5e98fe6ef55d4806d6 Mon Sep 17 00:00:00 2001 From: brucemoran Date: Thu, 23 Jul 2020 13:40:59 +0100 Subject: [PATCH 0210/1520] 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 0211/1520] 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("