From 1bb7f8497490ed8b7f9064b5dc948d0d1eb244af Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 9 Dec 2020 17:14:27 +0100 Subject: [PATCH 1/8] Template update for nf-core/tools version 1.12.1 --- .github/.dockstore.yml | 5 + .github/CONTRIBUTING.md | 129 +++++- .github/ISSUE_TEMPLATE/bug_report.md | 75 ++- .github/ISSUE_TEMPLATE/config.yml | 8 + .github/ISSUE_TEMPLATE/feature_request.md | 36 +- .github/PULL_REQUEST_TEMPLATE.md | 35 +- .github/markdownlint.yml | 13 +- .github/workflows/awsfulltest.yml | 43 ++ .github/workflows/awstest.yml | 39 ++ .github/workflows/branch.yml | 37 ++ .github/workflows/ci.yml | 57 +++ .github/workflows/linting.yml | 77 ++++ .github/workflows/linting_comment.yml | 29 ++ .github/workflows/push_dockerhub_dev.yml | 28 ++ .github/workflows/push_dockerhub_release.yml | 29 ++ .gitignore | 4 +- .travis.yml | 42 -- CHANGELOG.md | 16 +- CODE_OF_CONDUCT.md | 8 +- Dockerfile | 20 +- LICENSE | 2 +- README.md | 88 +++- assets/email_template.html | 2 + assets/email_template.txt | 12 +- assets/multiqc_config.yaml | 4 +- assets/nf-core-sarek_logo.png | Bin 0 -> 106689 bytes assets/sendmail_template.txt | 17 + bin/markdown_to_html.py | 91 ++++ bin/markdown_to_html.r | 51 --- bin/scrape_software_versions.py | 51 ++- conf/awsbatch.config | 18 - conf/base.config | 37 +- conf/igenomes.config | 452 +++++++++++++++---- conf/test.config | 9 +- conf/test_full.config | 22 + docs/README.md | 16 +- docs/images/nf-core-sarek_logo.png | Bin 0 -> 106689 bytes docs/output.md | 58 ++- docs/usage.md | 264 +++-------- environment.yml | 10 +- main.nf | 315 ++++++------- nextflow.config | 69 ++- nextflow_schema.json | 259 +++++++++++ 43 files changed, 1823 insertions(+), 754 deletions(-) create mode 100644 .github/.dockstore.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/workflows/awsfulltest.yml create mode 100644 .github/workflows/awstest.yml create mode 100644 .github/workflows/branch.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/linting.yml create mode 100644 .github/workflows/linting_comment.yml create mode 100644 .github/workflows/push_dockerhub_dev.yml create mode 100644 .github/workflows/push_dockerhub_release.yml delete mode 100644 .travis.yml create mode 100644 assets/nf-core-sarek_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 conf/test_full.config create mode 100644 docs/images/nf-core-sarek_logo.png create mode 100644 nextflow_schema.json diff --git a/.github/.dockstore.yml b/.github/.dockstore.yml new file mode 100644 index 0000000000..030138a0ca --- /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 aa11820ab2..b53404407d 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,47 +1,128 @@ # nf-core/sarek: Contributing Guidelines -Hi there! Many thanks for taking an interest in improving nf-core/sarek. +Hi there! +Many thanks for taking an interest in improving nf-core/sarek. -We try to manage the required tasks for nf-core/sarek 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/sarek 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/sarek 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/sarek then the best place to ask is on the nf-core Slack [#sarek](https://nfcore.slack.com/channels/sarek) channel ([join our Slack here](https://nf-co.re/join/slack)). ## Contribution workflow -If you'd like to write some code for nf-core/sarek, the standard workflow -is as follows: -1. Check that there isn't already an issue about your idea in the - [nf-core/sarek issues](https://github.com/nf-core/sarek/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/sarek repository](https://github.com/nf-core/sarek) 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'd like to write some code for nf-core/sarek, the standard workflow is as follows: -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/). +1. Check that there isn't already an issue about your idea in the [nf-core/sarek issues](https://github.com/nf-core/sarek/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](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/sarek repository](https://github.com/nf-core/sarek) to your GitHub account +3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) +4. Use `nf-core schema build .` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). +5. 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. +### Lint tests + +`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. +### Pipeline tests + +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/sarek documentation](https://github.com/nf-core/sarek#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/sarek documentation](https://nf-co.re/sarek/usage) and don't hesitate to get in touch on the nf-core Slack [#sarek](https://nfcore.slack.com/channels/sarek) channel ([join our Slack here](https://nf-co.re/join/slack)). + +## Pipeline contribution conventions + +To make the nf-core/sarek code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. + +### Adding a new step + +If you wish to contribute a new step, please use the following coding standards: + +1. Define the corresponding input channel into your new process from the expected previous process channel +2. Write the process block (see below). +3. Define the output channel if needed (see below). +4. Add any new flags/options to `nextflow.config` with a default (see below). +5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build .`) +6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). +7. Add sanity checks for all relevant parameters. +8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. +9. Do local tests that the new code works properly and as expected. +10. Add a new test command in `.github/workflow/ci.yaml`. +11. If applicable add a [MultiQC](https://https://multiqc.info/) module. +12. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. +13. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. + +### Default values + +Parameters should be initialised / defined with default values in `nextflow.config` under the `params` scope. + +Once there, use `nf-core schema build .` to add to `nextflow_schema.json`. + +### Default processes resource requirements + +Sensible defaults for process resource requirements (CPUs / memory / time) for a process should be defined in `conf/base.config`. These should generally be specified generic with `withLabel:` selectors so they can be shared across multiple processes/steps of the pipeline. A nf-core standard set of labels that should be followed where possible can be seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/master/nf_core/pipeline-template/%7B%7Bcookiecutter.name_noslash%7D%7D/conf/base.config), which has the default process as a single core-process, and then different levels of multi-core configurations for increasingly large memory requirements defined with standardised labels. + +The process resources can be passed on to the tool dynamically within the process with the `${task.cpu}` and `${task.memory}` variables in the `script:` block. + +### Naming schemes + +Please use the following naming schemes, to make it easy to understand what is going where. + +* initial process channel: `ch_output_from_` +* intermediate and terminal channels: `ch__for_` + +### Nextflow version bumping + +If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` + +### Software version reporting + +If you add a new tool to the pipeline, please ensure you add the information of the tool to the `get_software_version` process. + +Add to the script block of the process, something like the following: + +```bash + --version &> v_.txt 2>&1 || true +``` + +or + +```bash + --help | head -n 1 &> v_.txt 2>&1 || true +``` + +You then need to edit the script `bin/scrape_software_versions.py` to: + +1. Add a Python regex for your tool's `--version` output (as in stored in the `v_.txt` file), to ensure the version is reported as a `v` and the version number e.g. `v2.1.1` +2. Add a HTML entry to the `OrderedDict` for formatting in MultiQC. + +### Images and figures + +For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 6df6c5052c..6cc7e4d0fd 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,31 +1,64 @@ +--- +name: Bug report +about: Report something that is broken or incorrect +labels: bug +--- + + + +## Check Documentation + +I have checked the following places for your error: -#### Describe the bug -A clear and concise description of what the bug is. +- [ ] [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) +- [ ] [nf-core/sarek pipeline documentation](https://nf-co.re/nf-core/sarek/usage) + +## Description of the bug + + + +## 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 -A clear and concise description of what you expected to happen. +1. Command line: +2. See error: + +## Expected behaviour + + + +## Log files + +Have you provided the following extra information/files: + +- [ ] The command used to run the pipeline +- [ ] The `.nextflow.log` file + +## System + +- Hardware: +- Executor: +- OS: +- Version + +## Nextflow Installation + +- Version: -#### 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...] +## 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/sarek:1.0.0] +## Additional context -#### Additional context -Add any other context about the problem here. + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..f390abc544 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Join nf-core + url: https://nf-co.re/join + about: Please join the nf-core community here + - name: "Slack #sarek channel" + url: https://nfcore.slack.com/channels/sarek + about: Discussion about the nf-core/sarek pipeline diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 1f025b779c..feb8368ecc 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,16 +1,32 @@ +--- +name: Feature request +about: Suggest an idea for the nf-core website +labels: enhancement +--- + + + +## Is your feature request related to a problem? Please describe + + + + + +## Describe the solution you'd like + + -#### 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 alternatives you've considered -#### 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 -#### 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 f9fe1f9ffa..afcb05a6cb 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,15 +1,26 @@ -Many thanks to contributing to nf-core/sarek! + ## 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/sarek branch on the nf-core/test-datasets repo]( https://github.com/nf-core/test-datasets/pull/new/nf-core/sarek) - - [ ] 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/sarek/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 you've added a new tool - add to the software_versions process and a regex to `scrape_software_versions.py` + - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/sarek/tree/master/.github/CONTRIBUTING.md) + - [ ] If necessary, also make a PR on the nf-core/sarek _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. +- [ ] Make sure your code lints (`nf-core lint .`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). +- [ ] Usage Documentation in `docs/usage.md` is updated. +- [ ] Output Documentation in `docs/output.md` is updated. +- [ ] `CHANGELOG.md` is updated. +- [ ] `README.md` is updated (including new tool citations and authors/contributors). diff --git a/.github/markdownlint.yml b/.github/markdownlint.yml index e052a635aa..8d7eb53b07 100644 --- a/.github/markdownlint.yml +++ b/.github/markdownlint.yml @@ -1,9 +1,12 @@ # Markdownlint configuration file -default: true, +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 +no-inline-html: + allowed_elements: + - img + - p + - kbd + - details + - summary diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml new file mode 100644 index 0000000000..342dbd3b98 --- /dev/null +++ b/.github/workflows/awsfulltest.yml @@ -0,0 +1,43 @@ +name: nf-core AWS full size tests +# 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: + workflow_run: + workflows: ["nf-core Docker push (release)"] + types: [completed] + workflow_dispatch: + +jobs: + run-awstest: + name: Run AWS full tests + if: github.repository == 'nf-core/sarek' + runs-on: ubuntu-latest + steps: + - name: Setup Miniconda + uses: conda-incubator/setup-miniconda@v2 + 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-sarek \ + --job-queue $AWS_JOB_QUEUE \ + --job-definition $AWS_JOB_DEFINITION \ + --container-overrides '{"command": ["nf-core/sarek", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/sarek/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/sarek/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 0000000000..630b9d19ad --- /dev/null +++ b/.github/workflows/awstest.yml @@ -0,0 +1,39 @@ +name: nf-core AWS test +# This workflow is triggered on push to the master branch. +# It can be additionally triggered manually with GitHub actions workflow dispatch. +# It runs the -profile 'test' on AWS batch. + +on: + workflow_dispatch: + +jobs: + run-awstest: + name: Run AWS tests + if: github.repository == 'nf-core/sarek' + runs-on: ubuntu-latest + steps: + - name: Setup Miniconda + uses: conda-incubator/setup-miniconda@v2 + 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-sarek \ + --job-queue $AWS_JOB_QUEUE \ + --job-definition $AWS_JOB_DEFINITION \ + --container-overrides '{"command": ["nf-core/sarek", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/sarek/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/sarek/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 new file mode 100644 index 0000000000..f923a4bc76 --- /dev/null +++ b/.github/workflows/branch.yml @@ -0,0 +1,37 @@ +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_target: + branches: [master] + +jobs: + test: + runs-on: ubuntu-latest + steps: + # PRs to the nf-core repo master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches + - name: Check PRs + if: github.repository == 'nf-core/sarek' + run: | + { [[ ${{github.event.pull_request.head.repo.full_name}} == nf-core/sarek ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + + + # If the above check failed, post a comment on the PR explaining the failure + # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets + - 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 new file mode 100644 index 0000000000..a04d449126 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,57 @@ +name: nf-core CI +# 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/sarek') }} + runs-on: ubuntu-latest + env: + NXF_VER: ${{ matrix.nxf_ver }} + NXF_ANSI_LOG: false + strategy: + matrix: + # Nextflow versions: check pipeline minimum and current latest + nxf_ver: ['20.04.0', ''] + steps: + - name: Check out pipeline code + uses: actions/checkout@v2 + + - name: Check if Dockerfile or Conda environment changed + uses: technote-space/get-diff-action@v4 + with: + FILES: | + Dockerfile + environment.yml + + - name: Build new docker image + if: env.MATCHED_FILES + run: docker build --no-cache . -t nfcore/sarek:dev + + - name: Pull docker image + if: ${{ !env.MATCHED_FILES }} + run: | + docker pull nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:dev + + - name: Install Nextflow + env: + CAPSULE_LOG: none + 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: | + nextflow run ${GITHUB_WORKSPACE} -profile test,docker diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml new file mode 100644 index 0000000000..bef81e6190 --- /dev/null +++ b/.github/workflows/linting.yml @@ -0,0 +1,77 @@ +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: + + - name: Check out pipeline code + uses: actions/checkout@v2 + + - name: Install Nextflow + env: + CAPSULE_LOG: none + 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 -l lint_log.txt lint ${GITHUB_WORKSPACE} --markdown lint_results.md + + - name: Save PR number + if: ${{ always() }} + run: echo ${{ github.event.pull_request.number }} > PR_number.txt + + - name: Upload linting log file artifact + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: linting-log-file + path: | + lint_log.txt + lint_results.md + PR_number.txt + diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml new file mode 100644 index 0000000000..90f03c6f91 --- /dev/null +++ b/.github/workflows/linting_comment.yml @@ -0,0 +1,29 @@ + +name: nf-core linting comment +# This workflow is triggered after the linting action is complete +# It posts an automated comment to the PR, even if the PR is coming from a fork + +on: + workflow_run: + workflows: ["nf-core linting"] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Download lint results + uses: dawidd6/action-download-artifact@v2 + with: + workflow: linting.yml + + - name: Get PR number + id: pr_number + run: echo "::set-output name=pr_number::$(cat linting-logs/PR_number.txt)" + + - name: Post PR comment + uses: marocchino/sticky-pull-request-comment@v2 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + number: ${{ steps.pr_number.outputs.pr_number }} + path: linting-logs/lint_results.md + diff --git a/.github/workflows/push_dockerhub_dev.yml b/.github/workflows/push_dockerhub_dev.yml new file mode 100644 index 0000000000..bcf8018d56 --- /dev/null +++ b/.github/workflows/push_dockerhub_dev.yml @@ -0,0 +1,28 @@ +name: nf-core Docker push (dev) +# 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 + +jobs: + push_dockerhub: + name: Push new Docker image to Docker Hub (dev) + runs-on: ubuntu-latest + # Only run for the nf-core repo, for releases and merged PRs + if: ${{ github.repository == 'nf-core/sarek' }} + 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/sarek:dev + + - name: Push Docker image to DockerHub (dev) + run: | + echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin + docker push nfcore/sarek:dev diff --git a/.github/workflows/push_dockerhub_release.yml b/.github/workflows/push_dockerhub_release.yml new file mode 100644 index 0000000000..dd4cda6d51 --- /dev/null +++ b/.github/workflows/push_dockerhub_release.yml @@ -0,0 +1,29 @@ +name: nf-core Docker push (release) +# 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: + release: + types: [published] + +jobs: + push_dockerhub: + name: Push new Docker image to Docker Hub (release) + runs-on: ubuntu-latest + # Only run for the nf-core repo, for releases and merged PRs + if: ${{ github.repository == 'nf-core/sarek' }} + 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/sarek:latest + + - name: Push Docker image to DockerHub (release) + run: | + echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin + docker push nfcore/sarek:latest + docker tag nfcore/sarek:latest nfcore/sarek:${{ github.event.release.tag_name }} + docker push nfcore/sarek:${{ github.event.release.tag_name }} diff --git a/.gitignore b/.gitignore index 5b54e3e6c2..aa4bb5b375 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,7 @@ work/ data/ results/ .DS_Store -tests/test_data +tests/ +testing/ +testing* *.pyc diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 5477cf5611..0000000000 --- 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/sarek: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/sarek:dev nfcore/sarek: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 3a0c68eccd..082ded50e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,16 @@ # nf-core/sarek: Changelog -## v2.5dev - [date] -Initial release of nf-core/sarek, created with the [nf-core](http://nf-co.re/) template. +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). + +## v3.0dev - [date] + +Initial release of nf-core/sarek, created with the [nf-core](https://nf-co.re/) template. + +### `Added` + +### `Fixed` + +### `Dependencies` + +### `Deprecated` diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 09226d0d8d..405fb1bfd7 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -34,13 +34,13 @@ 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. ## 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 8cb51fe468..dbdec87e1c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,17 @@ -FROM nfcore/base -LABEL authors="Maxime Garcia" \ - description="Docker image containing all requirements for nf-core/sarek pipeline" +FROM nfcore/base:1.12.1 +LABEL authors="Maxime Garcia, Szilveszter Juhos" \ + description="Docker image containing all software requirements for the nf-core/sarek 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-sarek-2.5dev/bin:$PATH +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-sarek-3.0dev/bin:$PATH + +# Dump the details of the installed packages to a file for posterity +RUN conda env export --name nf-core-sarek-3.0dev > nf-core-sarek-3.0dev.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/LICENSE b/LICENSE index bceca733b3..6060922966 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) Maxime Garcia +Copyright (c) Maxime Garcia, Szilveszter Juhos 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 f8efe7afa3..6988f19520 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,90 @@ -# nf-core/sarek +# ![nf-core/sarek](docs/images/nf-core-sarek_logo.png) **An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing**. -[![Build Status](https://travis-ci.com/nf-core/sarek.svg?branch=master)](https://travis-ci.com/nf-core/sarek) -[![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/sarek/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/sarek/actions) +[![GitHub Actions Linting Status](https://github.com/nf-core/sarek/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/sarek/actions) +[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A520.04.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/sarek.svg)](https://hub.docker.com/r/nfcore/sarek) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23sarek-4A154B?logo=slack)](https://nfcore.slack.com/channels/sarek) ## Introduction + + +**nf-core/sarek** is a bioinformatics best-practise analysis pipeline for + 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 + +1. Install [`nextflow`](https://nf-co.re/usage/installation) + +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 the pipeline and test it on a minimal dataset with a single command: + + ```bash + nextflow run nf-core/sarek -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. + +4. Start running your own analysis! + + + + ```bash + nextflow run nf-core/sarek -profile --input '*_R{1,2}.fastq.gz' --genome GRCh37 + ``` + +See [usage docs](https://nf-co.re/sarek/usage) for all of the available options when running the pipeline. + +## Pipeline Summary + +By default, the pipeline currently performs the following: + + + +* Sequencing quality control (`FastQC`) +* Overall pipeline run summaries (`MultiQC`) ## Documentation -The nf-core/sarek 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/sarek pipeline comes with documentation about the pipeline: [usage](https://nf-co.re/sarek/usage) and [output](https://nf-co.re/sarek/output). ## Credits -nf-core/sarek was originally written by Maxime Garcia. + +nf-core/sarek was originally written by Maxime Garcia, Szilveszter Juhos. + +We thank the following people for their extensive assistance in the development +of this pipeline: + + + +## 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 the [Slack `#sarek` channel](https://nfcore.slack.com/channels/sarek) (you can join with [this invite](https://nf-co.re/join/slack)). + +## Citations + + + + +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) + +In addition, references of tools and data used in this pipeline are as follows: + + diff --git a/assets/email_template.html b/assets/email_template.html index 20a5dd5da4..1d069c4254 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -11,6 +11,8 @@
+ +

nf-core/sarek v${version}

Run Name: $runName

diff --git a/assets/email_template.txt b/assets/email_template.txt index 76e9ae7e57..2be647eac1 100644 --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -1,6 +1,12 @@ -======================================== - nf-core/sarek v${version} -======================================== +---------------------------------------------------- + ,--./,-. + ___ __ __ __ ___ /,-._.--~\\ + |\\ | |__ __ / ` / \\ |__) |__ } { + | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, + `._,._,' + nf-core/sarek v${version} +---------------------------------------------------- + Run Name: $runName <% if (success){ diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index fe8d008cb4..cd2444f81d 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/sarek-software-versions: + software_versions: order: -1000 + nf-core-sarek-summary: + order: -1001 export_plots: true diff --git a/assets/nf-core-sarek_logo.png b/assets/nf-core-sarek_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cf440e8e19d9d0d53d3a6b354d3a3cb10c763ba9 GIT binary patch literal 106689 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 CdrsZ} literal 0 HcmV?d00001 diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index 2d67122006..b64049b87b 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-sarek_logo.png" +Content-Transfer-Encoding: base64 +Content-ID: +Content-Disposition: inline; filename="nf-core-sarek_logo.png" + +<% out << new File("$projectDir/assets/nf-core-sarek_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 0000000000..a26d1ff5e6 --- /dev/null +++ b/bin/markdown_to_html.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python +from __future__ import print_function +import argparse +import markdown +import os +import sys +import io + + +def convert_markdown(in_fn): + 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"}, + }, + ) + 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 abe1335070..0000000000 --- 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 0cb269ad8c..b2c755b30a 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -5,32 +5,36 @@ # TODO nf-core: Add additional regexes for new tools in process get_software_versions regexes = { - 'nf-core/sarek': ['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/sarek": ["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/sarek'] = 'N/A' -results['Nextflow'] = 'N/A' -results['FastQC'] = 'N/A' -results['MultiQC'] = 'N/A' +results["nf-core/sarek"] = '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(): - 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]) + del results[k] # Dump to YAML -print (''' +print( + """ id: 'software_versions' section_name: 'nf-core/sarek Software Versions' section_href: 'https://github.com/nf-core/sarek' @@ -38,12 +42,13 @@ description: 'are collected at run time from the software output.' data: |
-''') -for k,v in results.items(): - print("
{}
{}
".format(k,v)) -print ("
") +""" +) +for k, v in results.items(): + print("
{}
{}
".format(k, v)) +print(" ") # Write out regexes as csv file: -with open('software_versions.csv', 'w') as f: - for k,v in results.items(): - f.write("{}\t{}\n".format(k,v)) +with open("software_versions.csv", "w") as f: + for k, v in results.items(): + f.write("{}\t{}\n".format(k, v)) diff --git a/conf/awsbatch.config b/conf/awsbatch.config deleted file mode 100644 index 14af5866f5..0000000000 --- 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 bb54f1e010..bea0d66b67 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 d19e61f4b1..31b7ee6130 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -9,139 +9,413 @@ 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 = "${projectDir}/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 = "${projectDir}/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 = "${projectDir}/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 = "${projectDir}/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 = "${projectDir}/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 = "${projectDir}/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 84e483eb2a..5381aa401f 100644 --- a/conf/test.config +++ b/conf/test.config @@ -4,21 +4,22 @@ * ------------------------------------------------- * Defines bundled input files and everything required * to run a fast and simple test. Use as follows: - * nextflow run nf-core/sarek -profile test + * nextflow run nf-core/sarek -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 - readPaths = [ + 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/conf/test_full.config b/conf/test_full.config new file mode 100644 index 0000000000..cfbfe30ede --- /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/sarek -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 + 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/README.md b/docs/README.md index ca3fe27a91..06fe30bfec 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,12 +1,10 @@ # nf-core/sarek: Documentation -The nf-core/sarek documentation is split into the following files: +The nf-core/sarek documentation is split into the following pages: -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) +* [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/images/nf-core-sarek_logo.png b/docs/images/nf-core-sarek_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cf440e8e19d9d0d53d3a6b354d3a3cb10c763ba9 GIT binary patch literal 106689 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
8F`{~zw6_I&{pknjGv4={ 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 CdrsZ} literal 0 HcmV?d00001 diff --git a/docs/output.md b/docs/output.md index 65b4509093..915e75920e 100644 --- a/docs/output.md +++ b/docs/output.md @@ -1,41 +1,63 @@ # nf-core/sarek: Output +## :warning: Please read this documentation on the nf-core website: [https://nf-co.re/sarek/output](https://nf-co.re/sarek/output) + +> _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ + +## Introduction + 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 + 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. -For further reading and documentation see the [FastQC help](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). +[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. -> **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 further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). -**Output directory: `results/fastqc`** +**Output files:** -* `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 +* `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. +> **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. -The pipeline has special steps which allow the software versions used to be reported in the MultiQC output for future traceability. +[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. + +## 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 ee1162992a..ca7d4d6e6c 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,61 +1,19 @@ # nf-core/sarek: 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) - * [`--singleEnd`](#--singleend) -* [Reference genomes](#reference-genomes) - * [`--genome` (using iGenomes)](#--genome-using-igenomes) - * [`--fasta`](#--fasta) - * [`--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) - * [`--outdir`](#--outdir) - * [`--email`](#--email) - * [`-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) - +## :warning: Please read this documentation on the nf-core website: [https://nf-co.re/sarek/usage](https://nf-co.re/sarek/usage) +> _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ ## 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/sarek --reads '*_R{1,2}.fastq.gz' -profile docker +nextflow run nf-core/sarek --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. @@ -70,6 +28,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,206 +36,93 @@ nextflow pull nf-core/sarek ``` ### 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/sarek releases page](https://github.com/nf-core/sarek/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. +## Core Nextflow arguments -## Main arguments +> **NB:** These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen). ### `-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/sarek`](http://hub.docker.com/r/nfcore/sarek/) -* `singularity` - * A generic configuration profile to be used with [Singularity](http://singularity.lbl.gov/) - * Pulls software from DockerHub: [`nfcore/sarek`](http://hub.docker.com/r/nfcore/sarek/) -* `test` - * A profile with a complete configuration for automated testing - * Includes links to test data so needs no other parameters +Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. - +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Conda) - see below. -### `--reads` -Use this to specify the location of your input FastQ files. For example: +> We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. -```bash ---reads 'path/to/data/sample_*_{1,2}.fastq' -``` +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). -Please note the following requirements: +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. -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 `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. -If 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: - -```bash ---singleEnd --reads '*.fastq' -``` - -It is not possible to run a mixture of single-end and paired-end files in one run. - - -## Reference genomes +* `docker` + * A generic configuration profile to be used with [Docker](https://docker.com/) + * Pulls software from Docker Hub: [`nfcore/sarek`](https://hub.docker.com/r/nfcore/sarek/) +* `singularity` + * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) + * Pulls software from Docker Hub: [`nfcore/sarek`](https://hub.docker.com/r/nfcore/sarek/) +* `podman` + * A generic configuration profile to be used with [Podman](https://podman.io/) + * Pulls software from Docker Hub: [`nfcore/sarek`](https://hub.docker.com/r/nfcore/sarek/) +* `conda` + * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity or Podman. + * 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 -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. +### `-resume` -### `--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. +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]' -``` - -### `--igenomesIgnore` -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 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 above). 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) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). -## 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. -### `--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. +### Running in the background -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 handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. -## Other command line parameters +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. - +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). -### `--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. - -### `-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. +#### Nextflow memory requirements -**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 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: +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 4e6811ec55..3b985c97d6 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-sarek-2.5dev +name: nf-core-sarek-3.0dev 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 42567aca5c..f6ddc935f2 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() @@ -19,42 +18,45 @@ def helpMessage() { The typical command for running the pipeline is as follows: - nextflow run nf-core/sarek --reads '*_R{1,2}.fastq.gz' -profile docker + nextflow run nf-core/sarek --input '*_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. + --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 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 + --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] 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: - --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 +64,104 @@ 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 +// 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." +// 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!" + // 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("$projectDir/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("$projectDir/docs/output.md", checkIfExists: true) +ch_output_docs_images = file("$projectDir/docs/images/", checkIfExists: true) /* * Create a channel for input read files */ -if(params.readPaths){ - if(params.singleEnd){ +if (params.input_paths) { + if (params.single_end) { 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_trimming } + .from(params.input_paths) + .map { row -> [ row[0], [ file(row[1][0], checkIfExists: true) ] ] } + .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) - .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_trimming } + .from(params.input_paths) + .map { row -> [ row[0], [ file(row[1][0], checkIfExists: true), file(row[1][1], checkIfExists: true) ] ] } + .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.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.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 } } - // 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['Input'] = params.input 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 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 + 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
" } + .reduce { a, b -> return [a, b].join("\n ") } + .map { x -> """ id: 'nf-core-sarek-summary' description: " - this information is collected when the pipeline is started." section_name: 'nf-core/sarek Workflow Summary' @@ -166,26 +169,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 - } + publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode, + 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,79 +199,77 @@ process get_software_versions { """ } - - /* * STEP 1 - FastQC */ process fastqc { tag "$name" - publishDir "${params.outdir}/fastqc", mode: 'copy', - saveAs: {filename -> filename.indexOf(".zip") > 0 ? "zips/$filename" : "$filename"} + label 'process_medium' + publishDir "${params.outdir}/fastqc", mode: params.publish_dir_mode, + 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 */ 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 + 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 */ 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" 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 +277,8 @@ workflow.onComplete { // Set up the e-mail variables def subject = "[nf-core/sarek] Successful: $workflow.runName" - if(!workflow.success){ - subject = "[nf-core/sarek] FAILED: $workflow.runName" + if (!workflow.success) { + subject = "[nf-core/sarek] FAILED: $workflow.runName" } def email_fields = [:] email_fields['version'] = workflow.manifest.version @@ -298,21 +296,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/sarek] Found multiple reports from process 'multiqc', will use only one" mqc_report = mqc_report[0] } @@ -321,101 +318,111 @@ workflow.onComplete { log.warn "[nf-core/sarek] 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") + def tf = new File("$projectDir/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("$projectDir/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: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize: params.max_multiqc_email_size.toBytes() ] + def sf = new File("$projectDir/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/sarek] 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/sarek] 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/sarek] Sent summary e-mail to $params.email (mail)" + // Catch failures and try with plaintext + 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/sarek] 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/sarek]${c_green} Pipeline completed successfully${c_reset}" + if (workflow.success) { + log.info "-${c_purple}[nf-core/sarek]${c_green} Pipeline completed successfully${c_reset}-" } else { checkHostname() - log.info "${c_purple}[nf-core/sarek]${c_red} Pipeline completed with errors${c_reset}" + log.info "-${c_purple}[nf-core/sarek]${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/sarek 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 283569be80..05a9b42217 100644 --- a/nextflow.config +++ b/nextflow.config @@ -10,29 +10,36 @@ params { // Workflow flags // TODO nf-core: Specify your pipeline's command line flags - reads = "data/*{1,2}.fastq.gz" - singleEnd = false + genome = false + input = "data/*{1,2}.fastq.gz" + single_end = false outdir = './results' + publish_dir_mode = 'copy' // 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 +57,39 @@ try { } profiles { - awsbatch { includeConfig 'conf/awsbatch.config' } - conda { process.conda = "$baseDir/environment.yml" } + conda { process.conda = "$projectDir/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 + } + podman { + podman.enabled = true + } test { includeConfig 'conf/test.config' } + test_full { includeConfig 'conf/test_full.config' } } // Load igenomes.config if required -if(!params.igenomesIgnore){ +if (!params.igenomes_ignore) { includeConfig 'conf/igenomes.config' } +// 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 process.shell = ['/bin/bash', '-euo', 'pipefail'] @@ -85,20 +112,20 @@ dag { manifest { name = 'nf-core/sarek' - author = 'Maxime Garcia' + author = 'Maxime Garcia, Szilveszter Juhos' homePage = 'https://github.com/nf-core/sarek' description = 'An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing' mainScript = 'main.nf' - nextflowVersion = '>=0.32.0' - version = '2.5dev' + nextflowVersion = '>=20.04.0' + version = '3.0dev' } // 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 +133,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 +143,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) { diff --git a/nextflow_schema.json b/nextflow_schema.json new file mode 100644 index 0000000000..f45e347d87 --- /dev/null +++ b/nextflow_schema.json @@ -0,0 +1,259 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://raw.githubusercontent.com/nf-core/sarek/master/nextflow_schema.json", + "title": "nf-core/sarek pipeline parameters", + "description": "An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing", + "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", + "move" + ] + }, + "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 ae38007a8718bedc397633b6f7d851bdde9b7828 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 15 Jan 2021 17:31:29 +0100 Subject: [PATCH 2/8] update: link to new biotools id --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d13a6f7284..1b7ba1b960 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ The pipeline is built using [`Nextflow`](https://www.nextflow.io), a workflow to

-It's listed on [Elixir - Tools and Data Services Registry](https://bio.tools/Sarek) and [Dockstore](https://dockstore.org/workflows/github.com/nf-core/sarek). +It's listed on [Elixir - Tools and Data Services Registry](https://bio.tools/nf-core-sarek) and [Dockstore](https://dockstore.org/workflows/github.com/nf-core/sarek). ## Quick Start From 1781ce697adc82875d3dd83d346d85e543b675c1 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 15 Jan 2021 18:02:02 +0100 Subject: [PATCH 3/8] add: CITATIONS.md --- CITATIONS.md | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 CITATIONS.md diff --git a/CITATIONS.md b/CITATIONS.md new file mode 100644 index 0000000000..c2244e1b80 --- /dev/null +++ b/CITATIONS.md @@ -0,0 +1,91 @@ +# nf-core/sarek: Citations + +## [nf-core/sarek](https://pubmed.ncbi.nlm.nih.gov/32269765/) + +> Garcia MU, Juhos S, Larsson M, Olason PI, Martin M, Eisfeldt J, DiLorenzo S, Sandgren J, Díaz De Ståhl T, Ewels PA, Wirta V, Nistér M, Käller M, Nystedt B. Sarek: A portable workflow for whole-genome sequencing analysis of germline and somatic variants. F1000Res. 2020 Jan 29;9:63. eCollection 2020. doi: 10.12688/f1000research.16665.2. PubMed PMID: 32269765. + +## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/) + +> Ewels PA, Peltzer A, Fillinger S, Patel H, Alneberg J, Wilm A, Garcia MU, Di Tommaso P, Nahnsen S. The nf-core framework for community-curated bioinformatics pipelines. Nat Biotechnol. 2020 Mar;38(3):276-278. doi: 10.1038/s41587-020-0439-x. PubMed PMID: 32055031. + +## [Nextflow](https://pubmed.ncbi.nlm.nih.gov/28398311/) + +> Di Tommaso P, Chatzou M, Floden EW, Barja PP, Palumbo E, Notredame C. Nextflow enables reproducible computational workflows. Nat Biotechnol. 2017 Apr 11;35(4):316-319. doi: 10.1038/nbt.3820. PubMed PMID: 28398311. + +## Pipeline tools + +* [ASCAT](https://pubmed.ncbi.nlm.nih.gov/20837533/) + > Van Loo P, Nordgard SH, Lingjærde OC, et al.: Allele-specific copy number analysis of tumors. Proc Natl Acad Sci USA . 2010 Sep 28;107(39):16910-5. doi: 10.1073/pnas.1009843107. Epub 2010 Sep 13. PubMed PMID: 20837533; PubMed Central PMCID: PMC2947907. + +* [BCFTools](https://pubmed.ncbi.nlm.nih.gov/21903627/) + > Li H: A statistical framework for SNP calling, mutation discovery, association mapping and population genetical parameter estimation from sequencing data. Bioinformatics. 2011 Nov 1;27(21):2987-93. doi: 10.1093/bioinformatics/btr509. Epub 2011 Sep 8. PubMed PMID: 21903627; PubMed Central PMCID: PMC3198575. + +* [BWA-MEM](https://arxiv.org/abs/1303.3997v2) + > Li H: Aligning sequence reads, clone sequences and assembly contigs with BWA-MEM. arXiv 1303.3997v2. 2013 + +* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) + +* [Control-FREEC](https://pubmed.ncbi.nlm.nih.gov/22155870/) + > Boeva V, Popova T, Bleakley K, et al.: Control-FREEC: a tool for assessing copy number and allelic content using next-generation sequencing data. Bioinformatics. 2012; 28(3): 423–5. doi: 10.1093/bioinformatics/btr670. Epub 2011 Dec 6. PubMed PMID: 22155870; PubMed Central PMCID: PMC3268243. + +* [GATK](https://pubmed.ncbi.nlm.nih.gov/20644199/) + > McKenna A, Hanna M, Banks E, et al.: The Genome Analysis Toolkit: a MapReduce framework for analyzing next-generation DNA sequencing data. Genome Res. 2010 Sep;20(9):1297-303. doi: 10.1101/gr.107524.110. Epub 2010 Jul 19. PubMed PMID: 20644199; PubMed Central PMCID: PMC2928508. + +* [Manta](https://pubmed.ncbi.nlm.nih.gov/26647377/) + > Chen X, Schulz-Trieglaff O, Shaw R, et al.: Manta: rapid detection of structural variants and indels for germline and cancer sequencing applications. Bioinformatics. 2016 Apr 15;32(8):1220-2. doi: 10.1093/bioinformatics/btv710. Epub 2015 Dec 8. PubMed PMID: 26647377. + +* [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. + +* [Qualimap 2](https://pubmed.ncbi.nlm.nih.gov/26428292/) + > Okonechnikov K, Conesa A, García-Alcalde F. Qualimap 2: advanced multi-sample quality control for high-throughput sequencing data. Bioinformatics. 2016 Jan 15;32(2):292-4. doi: 10.1093/bioinformatics/btv566. Epub 2015 Oct 1. PubMed PMID: 26428292; PubMed Central PMCID: PMC4708105. + +* [SAMtools](https://pubmed.ncbi.nlm.nih.gov/19505943/) + > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. + +* [snpEff](https://pubmed.ncbi.nlm.nih.gov/22728672/) + > Cingolani P, Platts A, Wang le L, et al.: A program for annotating and predicting the effects of single nucleotide polymorphisms, SnpEff: SNPs in the genome of Drosophila melanogaster strain w1118; iso-2; iso-3. Fly (Austin). Apr-Jun 2012;6(2):80-92. doi: 10.4161/fly.19695. PubMed PMID: 22728672; PubMed Central PMCID: PMC3679285. + +* [Strelka2](https://pubmed.ncbi.nlm.nih.gov/30013048/) + > Kim S, Scheffler K, Halpern AL, et al.: Strelka2: fast and accurate calling of germline and somatic variants. Nat Methods. 2018 Aug;15(8):591-594. doi: 10.1038/s41592-018-0051-x. Epub 2018 Jul 16. PubMed PMID: 30013048. + +* [TIDDIT](https://pubmed.ncbi.nlm.nih.gov/28781756/) + > Eisfeldt J, Vezzi F, Olason P, et al.: TIDDIT, an efficient and comprehensive structural variant caller for massive parallel sequencing data. F1000Res. 2017 May 10;6:664. doi: 10.12688/f1000research.11168.2. eCollection 2017. PubMed PMID: 28781756; PubMed Central PMCID: PMC5521161. + +* [Trim Galore!](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/) + +* [VCFTools](https://pubmed.ncbi.nlm.nih.gov/21653522/) + > Danecek P, Auton A, Abecasis G, et al.: The variant call format and VCFtools. Bioinformatics. 2011 Aug 1;27(15):2156-8. doi: 10.1093/bioinformatics/btr330. Epub 2011 Jun 7. PubMed PMID: 21653522; PubMed Central PMCID: PMC3137218. + +* [VEP](https://pubmed.ncbi.nlm.nih.gov/27268795/) + > McLaren W, Gil L, Hunt SE, et al.: The Ensembl Variant Effect Predictor. Genome Biol. 2016 Jun 6;17(1):122. doi: 10.1186/s13059-016-0974-4. PubMed PMID: 27268795; PubMed Central PMCID: PMC4893825. + +## R packages + +* [R](https://www.R-project.org/) + > R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. + +* [ggplot2](https://cran.r-project.org/web/packages/ggplot2/index.html) + > H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016. + +* [optparse](https://CRAN.R-project.org/package=optparse) + > Trevor L Davis (2018). optparse: Command Line Option Parser. + +* [RColorBrewer](https://CRAN.R-project.org/package=RColorBrewer) + > Erich Neuwirth (2014). RColorBrewer: ColorBrewer Palettes. + +## Software packaging/containerisation tools + +* [Anaconda](https://anaconda.com) + > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web. + +* [Bioconda](https://pubmed.ncbi.nlm.nih.gov/29967506/) + > Grüning B, Dale R, Sjödin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, Köster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506. + +* [BioContainers](https://pubmed.ncbi.nlm.nih.gov/28379341/) + > da Veiga Leprevost F, Grüning B, Aflitos SA, Röst HL, Uszkoreit J, Barsnes H, Vaudel M, Moreno P, Gatto L, Weber J, Bai M, Jimenez RC, Sachsenberg T, Pfeuffer J, Alvarez RV, Griss J, Nesvizhskii AI, Perez-Riverol Y. BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics. 2017 Aug 15;33(16):2580-2582. doi: 10.1093/bioinformatics/btx192. PubMed PMID: 28379341; PubMed Central PMCID: PMC5870671. + +* [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241) + +* [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/) + > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. From 20d14424c16962a3291c1b577aa285bd415b492c Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 15 Jan 2021 18:04:42 +0100 Subject: [PATCH 4/8] fix: forgot to solve some merge conflicts --- main.nf | 188 ++++++++------------------------------------------------ 1 file changed, 26 insertions(+), 162 deletions(-) diff --git a/main.nf b/main.nf index 4a62130c98..4ffb187953 100644 --- a/main.nf +++ b/main.nf @@ -1,9 +1,9 @@ #!/usr/bin/env nextflow /* -################################################################################ +================================================================================ nf-core/sarek -################################################################################ +================================================================================ Started March 2016. Ported to nf-core May 2019. -------------------------------------------------------------------------------- @@ -183,9 +183,9 @@ def helpMessage() { if (params.help) exit 0, helpMessage() /* -################################################################################ +================================================================================ SET UP CONFIGURATION VARIABLES -################################################################################ +================================================================================ */ // Check if genome exists in the config file @@ -315,9 +315,9 @@ if (tsvPath) { (genderMap, statusMap, inputSample) = extractInfos(inputSample) /* -################################################################################ +================================================================================ CHECKING REFERENCES -################################################################################ +================================================================================ */ // Initialize each params in params.genomes, catch the command line first if it was defined @@ -375,9 +375,9 @@ ch_read_structure1 = params.read_structure1 ? Channel.value(params.read_structur ch_read_structure2 = params.read_structure2 ? Channel.value(params.read_structure2) : "null" /* -################################################################################ +================================================================================ PRINTING SUMMARY -################################################################################ +================================================================================ */ // Header log info @@ -582,9 +582,9 @@ process get_software_versions { ch_software_versions_yaml = ch_software_versions_yaml.dump(tag:'SOFTWARE VERSIONS') /* -################################################################################ +================================================================================ BUILDING INDEXES -################################################################################ +================================================================================ */ // And then initialize channels based on params or indexes that were just built @@ -770,9 +770,9 @@ process BuildIntervals { ch_intervals = params.no_intervals ? "null" : params.intervals && !('annotate' in step) ? Channel.value(file(params.intervals)) : intervalBuilt /* -################################################################################ +================================================================================ PREPROCESSING -################################################################################ +================================================================================ */ // STEP 0: CREATING INTERVALS FOR PARALLELIZATION (PREPROCESSING AND VARIANT CALLING) @@ -1008,9 +1008,9 @@ process TrimGalore { } /* -################################################################################ +================================================================================ UMIs PROCESSING -################################################################################ +================================================================================ */ // UMI - STEP 1 - ANNOTATE @@ -1940,9 +1940,9 @@ process BamQC { bamQCReport = bamQCReport.dump(tag:'BamQC') /* -################################################################################ +================================================================================ GERMLINE VARIANT CALLING -################################################################################ +================================================================================ */ // When using sentieon for mapping, Channel bam_recalibrated is bam_sentieon_recal @@ -2315,9 +2315,9 @@ process FreebayesSingle { vcfFreebayesSingle = vcfFreebayesSingle.groupTuple(by: [0,1,2]) /* -################################################################################ +================================================================================ SOMATIC VARIANT CALLING -################################################################################ +================================================================================ */ // Ascat, pileup, pileups with no intervals, recalibrated BAMs (bamAscat, bamMpileup, bamMpileupNoInt, bamRecalAll) = bamRecalAll.into(4) @@ -3586,9 +3586,9 @@ process Vcftools { vcftoolsReport = vcftoolsReport.dump(tag:'VCFTools') /* -################################################################################ +================================================================================ ANNOTATION -################################################################################ +================================================================================ */ if (step == 'annotate') { @@ -3683,7 +3683,6 @@ process Snpeff { snpeffReport = snpeffReport.dump(tag:'snpEff report') -<<<<<<< HEAD // STEP COMPRESS AND INDEX VCF.1 - SNPEFF process CompressVCFsnpEff { @@ -3718,33 +3717,6 @@ process VEP { if (it == "${reducedVCF}_VEP.summary.html") "Reports/${idSample}/VEP/${it}" else null } -======= -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-sarek-summary' - description: " - this information is collected when the pipeline is started." - section_name: 'nf-core/sarek Workflow Summary' - section_href: 'https://github.com/nf-core/sarek' - plot_type: 'html' - data: | -
- $x -
- """.stripIndent() } - .set { ch_workflow_summary } - -/* - * Parse software version numbers - */ -process get_software_versions { - publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode, - saveAs: { filename -> - if (filename.indexOf(".csv") > 0) filename - else null - } ->>>>>>> TEMPLATE input: set variantCaller, idSample, file(vcf), file(idx) from vcfVep @@ -3756,15 +3728,10 @@ process get_software_versions { file(cadd_WG_SNVs_tbi) from ch_cadd_wg_snvs_tbi output: -<<<<<<< HEAD set variantCaller, idSample, file("${reducedVCF}_VEP.ann.vcf") into vepVCF file("${reducedVCF}_VEP.summary.html") into vepReport when: 'vep' in tools -======= - file 'software_versions_mqc.yaml' into ch_software_versions_yaml - file "software_versions.csv" ->>>>>>> TEMPLATE script: reducedVCF = reduceVCF(vcf.fileName) @@ -3799,7 +3766,6 @@ process get_software_versions { """ } -<<<<<<< HEAD vepReport = vepReport.dump(tag:'VEP') // STEP VEP.2 - VEP AFTER SNPEFF @@ -3829,24 +3795,6 @@ process VEPmerge { file("${reducedVCF}_VEP.summary.html") into vepReportMerge when: 'merge' in tools -======= -/* - * STEP 1 - FastQC - */ -process fastqc { - tag "$name" - label 'process_medium' - publishDir "${params.outdir}/fastqc", mode: params.publish_dir_mode, - saveAs: { filename -> - filename.indexOf(".zip") > 0 ? "zips/$filename" : "$filename" - } - - input: - set val(name), file(reads) from ch_read_files_fastqc - - output: - file "*_fastqc.{zip,html}" into ch_fastqc_results ->>>>>>> TEMPLATE script: reducedVCF = reduceVCF(vcf.fileName) @@ -3855,7 +3803,6 @@ process fastqc { cadd = (params.cadd_cache && params.cadd_wg_snvs && params.cadd_indels) ? "--plugin CADD,whole_genome_SNVs.tsv.gz,InDels.tsv.gz" : "" genesplicer = params.genesplicer ? "--plugin GeneSplicer,/opt/conda/envs/nf-core-sarek-${workflow.manifest.version}/bin/genesplicer,/opt/conda/envs/nf-core-sarek-${workflow.manifest.version}/share/genesplicer-1.0-1/human,context=200,tmpdir=\$PWD/${reducedVCF}" : "--offline" """ -<<<<<<< HEAD mkdir ${reducedVCF} vep \ @@ -3908,9 +3855,9 @@ process CompressVCFvep { compressVCFOutVEP = compressVCFOutVEP.dump(tag:'VCF') /* -################################################################################ +================================================================================ MultiQC -################################################################################ +================================================================================ */ // STEP MULTIQC @@ -3932,50 +3879,6 @@ process MultiQC { file ('SamToolsStats/*') from samtoolsStatsReport.collect().ifEmpty([]) file ('snpEff/*') from snpeffReport.collect().ifEmpty([]) file ('VCFTools/*') from vcftoolsReport.collect().ifEmpty([]) -======= - fastqc --quiet --threads $task.cpus $reads - """ -} - -/* - * STEP 2 - MultiQC - */ -process multiqc { - publishDir "${params.outdir}/MultiQC", mode: params.publish_dir_mode - - input: - 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 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 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 $custom_config_file . - """ -} - -/* - * STEP 3 - Output Description HTML - */ -process output_documentation { - 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 ->>>>>>> TEMPLATE output: file "*multiqc_report.html" into ch_multiqc_report @@ -3989,7 +3892,6 @@ process output_documentation { rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' """ -<<<<<<< HEAD multiqc -f ${rtitle} ${rfilename} ${custom_config_file} . """ } @@ -4016,15 +3918,6 @@ process Output_documentation { } // Completion e-mail notification -======= - markdown_to_html.py $output_docs -o results_description.html - """ -} - -/* - * Completion e-mail notification - */ ->>>>>>> TEMPLATE workflow.onComplete { // Set up the e-mail variables @@ -4055,11 +3948,6 @@ workflow.onComplete { email_fields['summary']['Nextflow Build'] = workflow.nextflow.build email_fields['summary']['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp -<<<<<<< HEAD -======= - // TODO nf-core: If not using MultiQC, strip out this code (including params.max_multiqc_email_size) - // On success try attach the multiqc report ->>>>>>> TEMPLATE def mqc_report = null try { if (workflow.success) { @@ -4124,17 +4012,10 @@ workflow.onComplete { def output_tf = new File(output_d, "pipeline_report.txt") output_tf.withWriter { w -> w << email_txt } -<<<<<<< HEAD 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"; -======= - 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"; ->>>>>>> TEMPLATE if (workflow.stats.ignoredCount > 0 && workflow.success) { log.info "-${c_purple}Warning, pipeline completed, but with errored process(es) ${c_reset}-" @@ -4151,9 +4032,9 @@ workflow.onComplete { } /* -################################################################################ +================================================================================ nf-core functions -################################################################################ +================================================================================ */ def create_workflow_summary(summary) { @@ -4175,7 +4056,6 @@ ${summary.collect { k, v -> "
$k
${v ?: '>>>>>> TEMPLATE c_yellow = params.monochrome_logs ? '' : "\033[0;33m"; return """ -${c_dim}--------------------------------------------------${c_reset}- @@ -4214,15 +4084,9 @@ def nfcoreHeader() { } def checkHostname() { -<<<<<<< HEAD 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_reset = params.monochrome_logs ? '' : "\033[0m" - def c_white = params.monochrome_logs ? '' : "\033[0;37m" - def c_red = params.monochrome_logs ? '' : "\033[1;91m" ->>>>>>> TEMPLATE def c_yellow_bold = params.monochrome_logs ? '' : "\033[1;93m" if (params.hostnames) { def hostname = "hostname".execute().text.trim() @@ -4241,9 +4105,9 @@ def checkHostname() { } /* -################################################################################ +================================================================================ sarek functions -################################################################################ +================================================================================ */ // Check if a row has the expected number of item From b92bc05a5461367afe715eb4681aab3386e94f08 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 15 Jan 2021 18:08:19 +0100 Subject: [PATCH 5/8] fix: markdownlint --- docs/usage.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index c7eedc6c53..1fb93ca060 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -67,13 +67,13 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof * `docker` * A generic configuration profile to be used with [Docker](https://docker.com/) - * Pulls software from Docker Hub: [`{{ cookiecutter.name_docker }}`](https://hub.docker.com/r/{{ cookiecutter.name_docker }}/) + * Pulls software from Docker Hub: [`nfcore/sarek`](http://hub.docker.com/r/nfcore/sarek/) * `singularity` * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) - * Pulls software from Docker Hub: [`{{ cookiecutter.name_docker }}`](https://hub.docker.com/r/{{ cookiecutter.name_docker }}/) + * Pulls software from Docker Hub: [`nfcore/sarek`](http://hub.docker.com/r/nfcore/sarek/) * `podman` * A generic configuration profile to be used with [Podman](https://podman.io/) - * Pulls software from Docker Hub: [`{{ cookiecutter.name_docker }}`](https://hub.docker.com/r/{{ cookiecutter.name_docker }}/) + * Pulls software from Docker Hub: [`nfcore/sarek`](http://hub.docker.com/r/nfcore/sarek/) * `conda` * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity or Podman. * A generic configuration profile to be used with [Conda](https://conda.io/docs/) @@ -623,4 +623,4 @@ Such files are meant to be share between multiple users, so this script is mainl ```bash nextflow run download_cache.nf --cadd_cache --cadd_version --genome -``` \ No newline at end of file +``` From dc9914b1d278ac5b776634139d0786568a841217 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 15 Jan 2021 18:10:12 +0100 Subject: [PATCH 6/8] fix: update minimal Nextflow version for other CI tests --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8dfe3b028b..14c43a2141 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,7 +71,7 @@ jobs: sudo mv nextflow /usr/local/bin/ env: # Only check Nextflow pipeline minimum version - NXF_VER: '19.10.0' + NXF_VER: '20.04.0' - name: Pull docker image run: | docker pull nfcore/sarek:dev @@ -94,7 +94,7 @@ jobs: sudo mv nextflow /usr/local/bin/ env: # Only check Nextflow pipeline minimum version - NXF_VER: '19.10.0' + NXF_VER: '20.04.0' - name: Pull docker image run: docker pull nfcore/sarek:dev - name: Get test data @@ -122,7 +122,7 @@ jobs: sudo mv nextflow /usr/local/bin/ env: # Only check Nextflow pipeline minimum version - NXF_VER: '19.10.0' + NXF_VER: '20.04.0' - name: Pull docker image run: docker pull nfcore/sarek:dev - name: Run test for minimal genomes @@ -143,7 +143,7 @@ jobs: sudo mv nextflow /usr/local/bin/ env: # Only check Nextflow pipeline minimum version - NXF_VER: '19.10.0' + NXF_VER: '20.04.0' - name: Pull docker image run: docker pull nfcore/sarek:dev - name: Run ${{ matrix.profile }} test @@ -164,7 +164,7 @@ jobs: sudo mv nextflow /usr/local/bin/ env: # Only check Nextflow pipeline minimum version - NXF_VER: '19.10.0' + NXF_VER: '20.04.0' - name: Pull docker image run: docker pull nfcore/sarek:dev - name: Run ${{ matrix.profile }} test @@ -195,7 +195,7 @@ jobs: sudo mv nextflow /usr/local/bin/ env: # Only check Nextflow pipeline minimum version - NXF_VER: '19.10.0' + NXF_VER: '20.04.0' - name: Pull docker image run: docker pull nfcore/sarek:dev - name: Run ${{ matrix.tool }} test From 877fec4b1cd06da2c78f1a3fdb6339621aa3c93e Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 15 Jan 2021 18:22:34 +0100 Subject: [PATCH 7/8] fix: Remove TODO comment --- .github/workflows/ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 14c43a2141..13d636267f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,9 +49,6 @@ jobs: 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: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker From bc5562c9bce4dcbe959a563d95c74d8578190da7 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 18 Jan 2021 14:47:52 +0100 Subject: [PATCH 8/8] fix: markdownlint --- docs/output.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index ff4e453390..6daa45b311 100644 --- a/docs/output.md +++ b/docs/output.md @@ -1,6 +1,6 @@ # nf-core/sarek: Output -:warning: Please read this documentation on the nf-core website: [https://nf-co.re/sarek/output](https://nf-co.re/sarek/output) +## warning Please read this documentation on the nf-core website: [https://nf-co.re/sarek/output](https://nf-co.re/sarek/output) > _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._
${v ?: 'N/A'}