From 7907ca5dc827fd69895a6aeea8d17c39f72184d7 Mon Sep 17 00:00:00 2001 From: Olga Botvinnik Date: Fri, 2 Oct 2020 16:59:49 -0700 Subject: [PATCH 1/3] Initial template commit --- .gitattributes | 1 + .github/CONTRIBUTING.md | 57 +++ .github/ISSUE_TEMPLATE/bug_report.md | 42 +++ .github/ISSUE_TEMPLATE/feature_request.md | 24 ++ .github/PULL_REQUEST_TEMPLATE.md | 19 + .github/markdownlint.yml | 5 + .github/workflows/branch.yml | 16 + .github/workflows/ci.yml | 30 ++ .github/workflows/linting.yml | 50 +++ .gitignore | 8 + CHANGELOG.md | 16 + CODE_OF_CONDUCT.md | 46 +++ Dockerfile | 13 + LICENSE | 21 ++ README.md | 77 ++++ assets/email_template.html | 54 +++ assets/email_template.txt | 40 ++ assets/multiqc_config.yaml | 11 + assets/nf-core-kmermaid_logo.png | Bin 0 -> 12604 bytes assets/sendmail_template.txt | 53 +++ bin/markdown_to_html.py | 100 +++++ bin/scrape_software_versions.py | 52 +++ conf/base.config | 51 +++ conf/igenomes.config | 420 +++++++++++++++++++++ conf/test.config | 26 ++ docs/README.md | 12 + docs/images/nf-core-kmermaid_logo.png | Bin 0 -> 21237 bytes docs/output.md | 43 +++ docs/usage.md | 331 +++++++++++++++++ environment.yml | 15 + main.nf | 426 ++++++++++++++++++++++ nextflow.config | 147 ++++++++ 32 files changed, 2206 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/markdownlint.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 .gitignore create mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/email_template.html create mode 100644 assets/email_template.txt create mode 100644 assets/multiqc_config.yaml create mode 100644 assets/nf-core-kmermaid_logo.png create mode 100644 assets/sendmail_template.txt create mode 100755 bin/markdown_to_html.py create mode 100755 bin/scrape_software_versions.py create mode 100644 conf/base.config create mode 100644 conf/igenomes.config create mode 100644 conf/test.config create mode 100644 docs/README.md create mode 100644 docs/images/nf-core-kmermaid_logo.png create mode 100644 docs/output.md create mode 100644 docs/usage.md create mode 100644 environment.yml create mode 100644 main.nf create mode 100644 nextflow.config diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..7fe55006 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.config linguist-language=nextflow diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..f3c2dd3b --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,57 @@ +# nf-core/kmermaid: Contributing Guidelines + +Hi there! +Many thanks for taking an interest in improving nf-core/kmermaid. + +We try to manage the required tasks for nf-core/kmermaid 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/kmermaid then the best place to ask is on the nf-core Slack [#kmermaid](https://nfcore.slack.com/channels/kmermaid) channel ([join our Slack here](https://nf-co.re/join/slack)). + +## Contribution workflow + +If you'd like to write some code for nf-core/kmermaid, the standard workflow is as follows: + +1. Check that there isn't already an issue about your idea in the [nf-core/kmermaid issues](https://github.com/nf-core/kmermaid/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/kmermaid repository](https://github.com/nf-core/kmermaid) to your GitHub account +3. Make the necessary changes / additions within your forked repository +4. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged + +If you're not used to this workflow with git, you can start with some [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, [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 + +`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. +`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. + +## 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/kmermaid documentation](https://nf-co.re/nf-core/kmermaid/docs) and don't hesitate to get in touch on the nf-core Slack [#kmermaid](https://nfcore.slack.com/channels/kmermaid) channel ([join our Slack here](https://nf-co.re/join/slack)). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..318677aa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,42 @@ +# nf-core/kmermaid bug report + +Hi there! + +Thanks for telling us about a problem with the pipeline. +Please delete this text and anything that's not relevant from the template below: + +## Describe the bug + +A clear and concise description of what the bug is. + +## Steps to reproduce + +Steps to reproduce the behaviour: + +1. Command line: `nextflow run ...` +2. See error: _Please provide your error message_ + +## Expected behaviour + +A clear and concise description of what you expected to happen. + +## System + +- Hardware: +- Executor: +- OS: +- Version + +## Nextflow Installation + +- Version: + +## Container engine + +- Engine: +- version: +- Image tag: + +## Additional context + +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..93187011 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,24 @@ +# nf-core/kmermaid feature request + +Hi there! + +Thanks for suggesting a new feature for the pipeline! +Please delete this text and anything that's not relevant from the template below: + +## Is your feature request related to a problem? Please describe + +A clear and concise description of what the problem is. + +Ex. I'm always frustrated when [...] + +## Describe the solution you'd like + +A clear and concise description of what you want to happen. + +## Describe alternatives you've considered + +A clear and concise description of any alternative solutions or features you've considered. + +## Additional context + +Add any other context about the feature request here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..43fdbb02 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,19 @@ +# nf-core/kmermaid pull request + +Many thanks for contributing to nf-core/kmermaid! + +Please fill in the appropriate checklist below (delete whatever is not relevant). +These are the most common things requested on pull requests (PRs). + +## PR checklist + +- [ ] This comment contains a description of changes (with reason) +- [ ] If you've fixed a bug or added code that should be tested, add tests! +- [ ] If necessary, also make a PR on the [nf-core/kmermaid branch on the nf-core/test-datasets repo](https://github.com/nf-core/test-datasets/pull/new/nf-core/kmermaid) +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). +- [ ] Make sure your code lints (`nf-core lint .`). +- [ ] Documentation in `docs` is updated +- [ ] `CHANGELOG.md` is updated +- [ ] `README.md` is updated + +**Learn more about contributing:** [CONTRIBUTING.md](https://github.com/nf-core/kmermaid/tree/master/.github/CONTRIBUTING.md) \ No newline at end of file diff --git a/.github/markdownlint.yml b/.github/markdownlint.yml new file mode 100644 index 00000000..96b12a70 --- /dev/null +++ b/.github/markdownlint.yml @@ -0,0 +1,5 @@ +# Markdownlint configuration file +default: true, +line-length: false +no-duplicate-header: + siblings_only: true diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml new file mode 100644 index 00000000..ce0eda07 --- /dev/null +++ b/.github/workflows/branch.yml @@ -0,0 +1,16 @@ +name: nf-core branch protection +# This workflow is triggered on PRs to master branch on the repository +# It fails when someone tries to make a PR against the nf-core `master` branch instead of `dev` +on: + pull_request: + branches: + - master + +jobs: + test: + runs-on: ubuntu-18.04 + steps: + # PRs are only ok if coming from an nf-core `dev` branch or a fork `patch` branch + - name: Check PRs + run: | + { [[ $(git remote get-url origin) == *nf-core/kmermaid ]] && [[ ${GITHUB_HEAD_REF} = "dev" ]]; } || [[ ${GITHUB_HEAD_REF} == "patch" ]] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..f456ae88 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: nf-core CI +# This workflow is triggered on pushes and PRs to the repository. +# It runs the pipeline with the minimal test dataset to check that it completes without any syntax errors +on: [push, pull_request] + +jobs: + test: + env: + NXF_VER: ${{ matrix.nxf_ver }} + NXF_ANSI_LOG: false + runs-on: ubuntu-latest + strategy: + matrix: + # Nextflow versions: check pipeline minimum and current latest + nxf_ver: ['19.10.0', ''] + steps: + - uses: actions/checkout@v2 + - name: Install Nextflow + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + - name: Pull docker image + run: | + docker pull nfcore/kmermaid:dev + docker tag nfcore/kmermaid:dev nfcore/kmermaid:dev + - name: Run pipeline with test data + run: | + # TODO nf-core: You can customise CI pipeline run tests as required + # (eg. adding multiple test runs with different parameters) + nextflow run ${GITHUB_WORKSPACE} -profile test,docker diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml new file mode 100644 index 00000000..1e0827a8 --- /dev/null +++ b/.github/workflows/linting.yml @@ -0,0 +1,50 @@ +name: nf-core linting +# This workflow is triggered on pushes and PRs to the repository. +# It runs the `nf-core lint` and markdown lint tests to ensure that the code meets the nf-core guidelines +on: + push: + pull_request: + release: + types: [published] + +jobs: + Markdown: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: '10' + - name: Install markdownlint + run: npm install -g markdownlint-cli + - name: Run Markdownlint + run: markdownlint ${GITHUB_WORKSPACE} -c ${GITHUB_WORKSPACE}/.github/markdownlint.yml + YAML: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: '10' + - name: Install yaml-lint + run: npm install -g yaml-lint + - name: Run yaml-lint + run: yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml") + nf-core: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install Nextflow + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + - uses: actions/setup-python@v1 + with: + python-version: '3.6' + architecture: 'x64' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install nf-core + - name: Run nf-core lint + run: nf-core lint ${GITHUB_WORKSPACE} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..6354f370 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.nextflow* +work/ +data/ +results/ +.DS_Store +tests/ +testing/ +*.pyc diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..46a3fc7d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,16 @@ +# nf-core/kmermaid: Changelog + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## v1.0dev - [date] + +Initial release of nf-core/kmermaid, created with the [nf-core](http://nf-co.re/) template. + +### `Added` + +### `Fixed` + +### `Dependencies` + +### `Deprecated` diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..cf930c8a --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +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] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..dfb7a28d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM nfcore/base:1.9 +LABEL authors="Olga Botvinnik" \ + description="Docker image containing all software requirements for the nf-core/kmermaid pipeline" + +# Install the conda environment +COPY environment.yml / +RUN conda env create -f /environment.yml && conda clean -a + +# Add conda installation dir to PATH (instead of doing 'conda activate') +ENV PATH /opt/conda/envs/nf-core-kmermaid-1.0dev/bin:$PATH + +# Dump the details of the installed packages to a file for posterity +RUN conda env export --name nf-core-kmermaid-1.0dev > nf-core-kmermaid-1.0dev.yml diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..f5b05079 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Olga Botvinnik + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..f5e7cc90 --- /dev/null +++ b/README.md @@ -0,0 +1,77 @@ +# ![nf-core/kmermaid](docs/images/nf-core-kmermaid_logo.png) + +**k-mer similarity analysis pipeline**. + +[![GitHub Actions CI Status](https://github.com/nf-core/kmermaid/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/kmermaid/actions) +[![GitHub Actions Linting Status](https://github.com/nf-core/kmermaid/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/kmermaid/actions) +[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A519.10.0-brightgreen.svg)](https://www.nextflow.io/) + +[![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg)](http://bioconda.github.io/) +[![Docker](https://img.shields.io/docker/automated/nfcore/kmermaid.svg)](https://hub.docker.com/r/nfcore/kmermaid) + +## Introduction + +The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It comes with docker containers making installation trivial and results highly reproducible. + +## Quick Start + +i. Install [`nextflow`](https://nf-co.re/usage/installation) + +ii. Install either [`Docker`](https://docs.docker.com/engine/installation/) or [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) for full pipeline reproducibility (please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles)) + +iii. Download the pipeline and test it on a minimal dataset with a single command + +```bash +nextflow run nf-core/kmermaid -profile test, +``` + +> Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. + +iv. Start running your own analysis! + + + +```bash +nextflow run nf-core/kmermaid -profile --reads '*_R{1,2}.fastq.gz' --genome GRCh37 +``` + +See [usage docs](docs/usage.md) for all of the available options when running the pipeline. + +## Documentation + +The nf-core/kmermaid 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) + + + +## Credits + +nf-core/kmermaid was originally written by Olga Botvinnik. + +## Contributions and Support + +If you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md). + +For further information or help, don't hesitate to get in touch on [Slack](https://nfcore.slack.com/channels/kmermaid) (you can join with [this invite](https://nf-co.re/join/slack)). + +## Citation + + + + +You can cite the `nf-core` publication as follows: + +> **The nf-core framework for community-curated bioinformatics pipelines.** +> +> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. +> +> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). +> ReadCube: [Full Access Link](https://rdcu.be/b1GjZ) diff --git a/assets/email_template.html b/assets/email_template.html new file mode 100644 index 00000000..df4ab8e9 --- /dev/null +++ b/assets/email_template.html @@ -0,0 +1,54 @@ + + + + + + + + + nf-core/kmermaid Pipeline Report + + +
+ + + +

nf-core/kmermaid v${version}

+

Run Name: $runName

+ +<% if (!success){ + out << """ +
+

nf-core/kmermaid execution completed unsuccessfully!

+

The exit status of the task that caused the workflow execution to fail was: $exitStatus.

+

The full error message was:

+
${errorReport}
+
+ """ +} else { + out << """ +
+ nf-core/kmermaid execution completed successfully! +
+ """ +} +%> + +

The workflow was completed at $dateComplete (duration: $duration)

+

The command used to launch the workflow was as follows:

+
$commandLine
+ +

Pipeline Configuration:

+ + + <% out << summary.collect{ k,v -> "" }.join("\n") %> + +
$k
$v
+ +

nf-core/kmermaid

+

https://github.com/nf-core/kmermaid

+ +
+ + + diff --git a/assets/email_template.txt b/assets/email_template.txt new file mode 100644 index 00000000..d044f564 --- /dev/null +++ b/assets/email_template.txt @@ -0,0 +1,40 @@ +---------------------------------------------------- + ,--./,-. + ___ __ __ __ ___ /,-._.--~\\ + |\\ | |__ __ / ` / \\ |__) |__ } { + | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, + `._,._,' + nf-core/kmermaid v${version} +---------------------------------------------------- + +Run Name: $runName + +<% if (success){ + out << "## nf-core/kmermaid execution completed successfully! ##" +} else { + out << """#################################################### +## nf-core/kmermaid execution completed unsuccessfully! ## +#################################################### +The exit status of the task that caused the workflow execution to fail was: $exitStatus. +The full error message was: + +${errorReport} +""" +} %> + + +The workflow was completed at $dateComplete (duration: $duration) + +The command used to launch the workflow was as follows: + + $commandLine + + + +Pipeline Configuration: +----------------------- +<% out << summary.collect{ k,v -> " - $k: $v" }.join("\n") %> + +-- +nf-core/kmermaid +https://github.com/nf-core/kmermaid diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml new file mode 100644 index 00000000..097c5f54 --- /dev/null +++ b/assets/multiqc_config.yaml @@ -0,0 +1,11 @@ +report_comment: > + This report has been generated by the nf-core/kmermaid + analysis pipeline. For information about how to interpret these results, please see the + documentation. +report_section_order: + software_versions: + order: -1000 + nf-core-kmermaid-summary: + order: -1001 + +export_plots: true diff --git a/assets/nf-core-kmermaid_logo.png b/assets/nf-core-kmermaid_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0bb743712ece9f7dd292a1e09f3bc739088e85 GIT binary patch literal 12604 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 xNe{15 literal 0 HcmV?d00001 diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt new file mode 100644 index 00000000..b89d86ac --- /dev/null +++ b/assets/sendmail_template.txt @@ -0,0 +1,53 @@ +To: $email +Subject: $subject +Mime-Version: 1.0 +Content-Type: multipart/related;boundary="nfcoremimeboundary" + +--nfcoremimeboundary +Content-Type: text/html; charset=utf-8 + +$email_html + +--nfcoremimeboundary +Content-Type: image/png;name="nf-core-kmermaid_logo.png" +Content-Transfer-Encoding: base64 +Content-ID: +Content-Disposition: inline; filename="nf-core-kmermaid_logo.png" + +<% out << new File("$baseDir/assets/nf-core-kmermaid_logo.png"). + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' ) %> + +<% +if (mqcFile){ +def mqcFileObj = new File("$mqcFile") +if (mqcFileObj.length() < mqcMaxSize){ +out << """ +--nfcoremimeboundary +Content-Type: text/html; name=\"multiqc_report\" +Content-Transfer-Encoding: base64 +Content-ID: +Content-Disposition: attachment; filename=\"${mqcFileObj.getName()}\" + +${mqcFileObj. + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' )} +""" +}} +%> + +--nfcoremimeboundary-- diff --git a/bin/markdown_to_html.py b/bin/markdown_to_html.py new file mode 100755 index 00000000..57cc4263 --- /dev/null +++ b/bin/markdown_to_html.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python +from __future__ import print_function +import argparse +import markdown +import os +import sys + +def convert_markdown(in_fn): + input_md = open(in_fn, mode="r", encoding="utf-8").read() + html = markdown.markdown( + "[TOC]\n" + input_md, + extensions = [ + 'pymdownx.extra', + 'pymdownx.b64', + 'pymdownx.highlight', + 'pymdownx.emoji', + 'pymdownx.tilde', + 'toc' + ], + extension_configs = { + 'pymdownx.b64': { + 'base_path': os.path.dirname(in_fn) + }, + 'pymdownx.highlight': { + 'noclasses': True + }, + 'toc': { + 'title': 'Table of Contents' + } + } + ) + return html + +def wrap_html(contents): + header = """ + + + + + +
+ """ + footer = """ +
+ + + """ + return header + contents + footer + + +def parse_args(args=None): + parser = argparse.ArgumentParser() + parser.add_argument('mdfile', type=argparse.FileType('r'), nargs='?', + help='File to convert. Defaults to stdin.') + parser.add_argument('-o', '--out', type=argparse.FileType('w'), + default=sys.stdout, + help='Output file name. Defaults to stdout.') + return parser.parse_args(args) + +def main(args=None): + args = parse_args(args) + converted_md = convert_markdown(args.mdfile.name) + html = wrap_html(converted_md) + args.out.write(html) + +if __name__ == '__main__': + sys.exit(main()) diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py new file mode 100755 index 00000000..416d6501 --- /dev/null +++ b/bin/scrape_software_versions.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +from __future__ import print_function +from collections import OrderedDict +import re + +# TODO nf-core: Add additional regexes for new tools in process get_software_versions +regexes = { + 'nf-core/kmermaid': ['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/kmermaid'] = '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(): + 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 list(results): + if not results[k]: + del(results[k]) + +# Dump to YAML +print (''' +id: 'software_versions' +section_name: 'nf-core/kmermaid Software Versions' +section_href: 'https://github.com/nf-core/kmermaid' +plot_type: 'html' +description: 'are collected at run time from the software output.' +data: | +
+''') +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)) diff --git a/conf/base.config b/conf/base.config new file mode 100644 index 00000000..ed1e4011 --- /dev/null +++ b/conf/base.config @@ -0,0 +1,51 @@ +/* + * ------------------------------------------------- + * nf-core/kmermaid Nextflow base config file + * ------------------------------------------------- + * A 'blank slate' config file, appropriate for general + * use on most high performace compute environments. + * Assumes that all software is installed and available + * on the PATH. Runs in `local` mode - all jobs will be + * run on the logged in environment. + */ + +process { + + // TODO nf-core: Check the defaults for all processes + cpus = { check_max( 1 * task.attempt, 'cpus' ) } + memory = { check_max( 7.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } + + errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' } + maxRetries = 1 + maxErrors = '-1' + + // Process-specific resource requirements + // NOTE - Only one of the labels below are used in the fastqc process in the main script. + // If possible, it would be nice to keep the same label naming convention when + // adding in your processes. + // TODO nf-core: Customise requirements for specific processes. + // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors + withLabel:process_low { + cpus = { check_max( 2 * task.attempt, 'cpus' ) } + memory = { check_max( 14.GB * task.attempt, 'memory' ) } + 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 new file mode 100644 index 00000000..2de92422 --- /dev/null +++ b/conf/igenomes.config @@ -0,0 +1,420 @@ +/* + * ------------------------------------------------- + * Nextflow config file for iGenomes paths + * ------------------------------------------------- + * Defines reference genomes, using iGenome paths + * Can be used by any config that customises the base + * path using $params.igenomes_base / --igenomes_base + */ + +params { + // illumina iGenomes reference file paths + genomes { + 'GRCh37' { + fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "2.7e9" + blacklist = "${baseDir}/assets/blacklists/GRCh37-blacklist.bed" + } + 'GRCh38' { + fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${baseDir}/assets/blacklists/hg38-blacklist.bed" + } + 'GRCm38' { + fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "1.87e9" + blacklist = "${baseDir}/assets/blacklists/GRCm38-blacklist.bed" + } + 'TAIR10' { + fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt" + mito_name = "Mt" + } + 'EB2' { + fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt" + } + 'UMD3.1' { + fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt" + mito_name = "MT" + } + 'WBcel235' { + fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" + mito_name = "MtDNA" + macs_gsize = "9e7" + } + 'CanFam3.1' { + fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt" + mito_name = "MT" + } + 'GRCz10' { + fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'BDGP6' { + fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" + mito_name = "M" + macs_gsize = "1.2e8" + } + 'EquCab2' { + fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt" + mito_name = "MT" + } + 'EB1' { + fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt" + } + 'Galgal4' { + fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'Gm01' { + fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt" + } + 'Mmul_1' { + fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt" + mito_name = "MT" + } + 'IRGSP-1.0' { + fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" + mito_name = "Mt" + } + 'CHIMP2.1.4' { + fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt" + mito_name = "MT" + } + 'Rnor_6.0' { + fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'R64-1-1' { + fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" + mito_name = "MT" + macs_gsize = "1.2e7" + } + 'EF2' { + fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "1.21e7" + } + 'Sbi1' { + fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt" + } + 'Sscrofa10.2' { + fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt" + mito_name = "MT" + } + 'AGPv3' { + fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" + mito_name = "Mt" + } + 'hg38' { + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${baseDir}/assets/blacklists/hg38-blacklist.bed" + } + 'hg19' { + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${baseDir}/assets/blacklists/hg19-blacklist.bed" + } + 'mm10' { + fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "1.87e9" + blacklist = "${baseDir}/assets/blacklists/mm10-blacklist.bed" + } + 'bosTau8' { + fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed" + mito_name = "chrM" + } + 'ce10' { + fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "9e7" + } + 'canFam3' { + fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt" + mito_name = "chrM" + } + 'danRer10' { + fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" + mito_name = "chrM" + } + 'dm6' { + fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "1.2e8" + } + 'equCab2' { + fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt" + mito_name = "chrM" + } + 'galGal4' { + fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt" + mito_name = "chrM" + } + 'panTro4' { + fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt" + mito_name = "chrM" + } + 'rn6' { + fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed" + mito_name = "chrM" + } + 'sacCer3' { + fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" + readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "1.2e7" + } + 'susScr3' { + fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt" + mito_name = "chrM" + } + } +} diff --git a/conf/test.config b/conf/test.config new file mode 100644 index 00000000..cf36fbef --- /dev/null +++ b/conf/test.config @@ -0,0 +1,26 @@ +/* + * ------------------------------------------------- + * Nextflow config file for running tests + * ------------------------------------------------- + * Defines bundled input files and everything required + * to run a fast and simple test. Use as follows: + * nextflow run nf-core/kmermaid -profile test, + */ + +params { + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' + // Limit resources so that this can run on GitHub Actions + max_cpus = 2 + max_memory = 6.GB + max_time = 48.h + + // Input data + // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets + // TODO nf-core: Give any required params for the test so that command line flags are not needed + single_end = false + readPaths = [ + ['Testdata', ['https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R1.tiny.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R2.tiny.fastq.gz']], + ['SRR389222', ['https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub1.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub2.fastq.gz']] + ] +} diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..bda45c1e --- /dev/null +++ b/docs/README.md @@ -0,0 +1,12 @@ +# nf-core/kmermaid: Documentation + +The nf-core/kmermaid documentation is split into the following files: + +1. [Installation](https://nf-co.re/usage/installation) +2. Pipeline configuration + * [Local installation](https://nf-co.re/usage/local_installation) + * [Adding your own system config](https://nf-co.re/usage/adding_own_config) + * [Reference genomes](https://nf-co.re/usage/reference_genomes) +3. [Running the pipeline](usage.md) +4. [Output and how to interpret the results](output.md) +5. [Troubleshooting](https://nf-co.re/usage/troubleshooting) diff --git a/docs/images/nf-core-kmermaid_logo.png b/docs/images/nf-core-kmermaid_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..61d91b165e30d2c40d30db969708ca32c0185507 GIT binary patch literal 21237 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 literal 0 HcmV?d00001 diff --git a/docs/output.md b/docs/output.md new file mode 100644 index 00000000..c0d9ec07 --- /dev/null +++ b/docs/output.md @@ -0,0 +1,43 @@ +# nf-core/kmermaid: Output + +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. + + + +## 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](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your reads. It provides information about the quality score distribution across your reads, the per base sequence content (%T/A/G/C). You get information about adapter contamination and other overrepresented sequences. + +For further reading and documentation see the [FastQC help](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). + +> **NB:** The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. To see how your reads look after trimming, look at the FastQC reports in the `trim_galore` directory. + +**Output directory: `results/fastqc`** + +* `sample_fastqc.html` + * FastQC report, containing quality metrics for your untrimmed raw fastq files +* `zips/sample_fastqc.zip` + * zip file containing the FastQC report, tab-delimited data file and plot images + +## 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. + +**Output directory: `results/multiqc`** + +* `Project_multiqc_report.html` + * MultiQC report - a standalone HTML file that can be viewed in your web browser +* `Project_multiqc_data/` + * Directory containing parsed statistics from the different tools used in the pipeline + +For more information about how to use MultiQC reports, see [http://multiqc.info](http://multiqc.info) diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 00000000..99e55b26 --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,331 @@ +# nf-core/kmermaid: Usage + +## Table of contents + +* [Table of contents](#table-of-contents) +* [Introduction](#introduction) +* [Running the pipeline](#running-the-pipeline) + * [Updating the pipeline](#updating-the-pipeline) + * [Reproducibility](#reproducibility) +* [Main arguments](#main-arguments) + * [`-profile`](#-profile) + * [`--reads`](#--reads) + * [`--single_end`](#--single_end) +* [Reference genomes](#reference-genomes) + * [`--genome` (using iGenomes)](#--genome-using-igenomes) + * [`--fasta`](#--fasta) + * [`--igenomes_ignore`](#--igenomes_ignore) +* [Job resources](#job-resources) + * [Automatic resubmission](#automatic-resubmission) + * [Custom resource requests](#custom-resource-requests) +* [AWS Batch specific parameters](#aws-batch-specific-parameters) + * [`--awsqueue`](#--awsqueue) + * [`--awsregion`](#--awsregion) + * [`--awscli`](#--awscli) +* [Other command line parameters](#other-command-line-parameters) + * [`--outdir`](#--outdir) + * [`--email`](#--email) + * [`--email_on_fail`](#--email_on_fail) + * [`--max_multiqc_email_size`](#--max_multiqc_email_size) + * [`-name`](#-name) + * [`-resume`](#-resume) + * [`-c`](#-c) + * [`--custom_config_version`](#--custom_config_version) + * [`--custom_config_base`](#--custom_config_base) + * [`--max_memory`](#--max_memory) + * [`--max_time`](#--max_time) + * [`--max_cpus`](#--max_cpus) + * [`--plaintext_email`](#--plaintext_email) + * [`--monochrome_logs`](#--monochrome_logs) + * [`--multiqc_config`](#--multiqc_config) + +## Introduction + +Nextflow handles job submissions on SLURM or other environments, and supervises running the jobs. Thus the Nextflow process must run until the pipeline is finished. We recommend that you put the process running in the background through `screen` / `tmux` or similar tool. Alternatively you can run nextflow within a cluster job submitted your job scheduler. + +It is recommended to limit the Nextflow Java virtual machines memory. We recommend adding the following line to your environment (typically in `~/.bashrc` or `~./bash_profile`): + +```bash +NXF_OPTS='-Xms1g -Xmx4g' +``` + + + +## Running the pipeline + +The typical command for running the pipeline is as follows: + +```bash +nextflow run nf-core/kmermaid --reads '*_R{1,2}.fastq.gz' -profile docker +``` + +This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. + +Note that the pipeline will create the following files in your working directory: + +```bash +work # Directory containing the nextflow working files +results # Finished results (configurable, see below) +.nextflow_log # Log file from Nextflow +# Other nextflow hidden files, eg. history of pipeline runs and old logs. +``` + +### Updating the pipeline + +When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: + +```bash +nextflow pull nf-core/kmermaid +``` + +### 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/kmermaid releases page](https://github.com/nf-core/kmermaid/releases) and find the latest version number - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. + +This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. + +## Main arguments + +### `-profile` + +Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. + +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Conda) - see below. + +> We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. + +The pipeline also dynamically loads configurations from [https://github.com/nf-core/configs](https://github.com/nf-core/configs) when it runs, making multiple config profiles for various institutional clusters available at run time. For more information and to see if your system is available in these configs please see the [nf-core/configs documentation](https://github.com/nf-core/configs#documentation). + +Note that multiple profiles can be loaded, for example: `-profile test,docker` - the order of arguments is important! +They are loaded in sequence, so later profiles can overwrite earlier profiles. + +If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. + +* `docker` + * A generic configuration profile to be used with [Docker](http://docker.com/) + * Pulls software from dockerhub: [`nfcore/kmermaid`](http://hub.docker.com/r/nfcore/kmermaid/) +* `singularity` + * A generic configuration profile to be used with [Singularity](http://singularity.lbl.gov/) + * Pulls software from DockerHub: [`nfcore/kmermaid`](http://hub.docker.com/r/nfcore/kmermaid/) +* `conda` + * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker or Singularity. + * A generic configuration profile to be used with [Conda](https://conda.io/docs/) + * Pulls most software from [Bioconda](https://bioconda.github.io/) +* `test` + * A profile with a complete configuration for automated testing + * Includes links to test data so needs no other parameters + + + +### `--reads` + +Use this to specify the location of your input FastQ files. For example: + +```bash +--reads 'path/to/data/sample_*_{1,2}.fastq' +``` + +Please note the following requirements: + +1. The path must be enclosed in quotes +2. The path must have at least one `*` wildcard character +3. When using the pipeline with paired end data, the path must use `{1,2}` notation to specify read pairs. + +If left unspecified, a default pattern is used: `data/*{1,2}.fastq.gz` + +### `--single_end` + +By default, the pipeline expects paired-end data. If you have single-end data, you need to specify `--single_end` on the command line when you launch the pipeline. A normal glob pattern, enclosed in quotation marks, can then be used for `--reads`. For example: + +```bash +--single_end --reads '*.fastq' +``` + +It is not possible to run a mixture of single-end and paired-end files in one run. + +## Reference genomes + +The pipeline config files come bundled with paths to the illumina iGenomes reference index files. If running with docker or AWS, the configuration is set up to use the [AWS-iGenomes](https://ewels.github.io/AWS-iGenomes/) resource. + +### `--genome` (using iGenomes) + +There are 31 different species supported in the iGenomes references. To run the pipeline, you must specify which to use with the `--genome` flag. + +You can find the keys to specify the genomes in the [iGenomes config file](../conf/igenomes.config). Common genomes that are supported are: + +* Human + * `--genome GRCh37` +* Mouse + * `--genome GRCm38` +* _Drosophila_ + * `--genome BDGP6` +* _S. cerevisiae_ + * `--genome 'R64-1-1'` + +> There are numerous others - check the config file for more. + +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. + +The syntax for this reference configuration is as follows: + + + +```nextflow +params { + genomes { + 'GRCh37' { + fasta = '' // Used if no star index given + } + // Any number of additional genomes, key is used with --genome + } +} +``` + + + +### `--fasta` + +If you prefer, you can specify the full path to your reference genome when you run the pipeline: + +```bash +--fasta '[path to Fasta reference]' +``` + +### `--igenomes_ignore` + +Do not load `igenomes.config` when running the pipeline. You may choose this option if you observe clashes between custom parameters and those supplied in `igenomes.config`. + +## Job resources + +### Automatic resubmission + +Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with an error code of `143` (exceeded requested resources) it will automatically resubmit with higher requests (2 x original, then 3 x original). If it still fails after three times then the pipeline is stopped. + +### Custom resource requests + +Wherever process-specific requirements are set in the pipeline, the default value can be changed by creating a custom config file. See the files hosted at [`nf-core/configs`](https://github.com/nf-core/configs/tree/master/conf) for examples. + +If you are likely to be running `nf-core` pipelines regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter (see definition below). You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. + +If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack). + +## AWS Batch specific parameters + +Running the pipeline on AWS Batch requires a couple of specific parameters to be set according to your AWS Batch configuration. Please use [`-profile awsbatch`](https://github.com/nf-core/configs/blob/master/conf/awsbatch.config) and then specify all of the following parameters. + +### `--awsqueue` + +The JobQueue that you intend to use on AWS Batch. + +### `--awsregion` + +The AWS region in which to run your job. Default is set to `eu-west-1` but can be adjusted to your needs. + +### `--awscli` + +The [AWS CLI](https://www.nextflow.io/docs/latest/awscloud.html#aws-cli-installation) path in your custom AMI. Default: `/home/ec2-user/miniconda/bin/aws`. + +Please make sure to also set the `-w/--work-dir` and `--outdir` parameters to a S3 storage bucket of your choice - you'll get an error message notifying you if you didn't. + +## Other command line parameters + + + +### `--outdir` + +The output directory where the results will be saved. + +### `--email` + +Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run. + +### `--email_on_fail` + +This works exactly as with `--email`, except emails are only sent if the workflow is not successful. + +### `--max_multiqc_email_size` + +Threshold size for MultiQC report to be attached in notification email. If file generated by pipeline exceeds the threshold, it will not be attached (Default: 25MB). + +### `-name` + +Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic. + +This is used in the MultiQC report (if not default) and in the summary HTML / e-mail (always). + +**NB:** Single hyphen (core Nextflow option) + +### `-resume` + +Specify this when restarting a pipeline. Nextflow will used cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. + +You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. + +**NB:** Single hyphen (core Nextflow option) + +### `-c` + +Specify the path to a specific config file (this is a core NextFlow command). + +**NB:** Single hyphen (core Nextflow option) + +Note - you can use this to override pipeline defaults. + +### `--custom_config_version` + +Provide git commit id for custom Institutional configs hosted at `nf-core/configs`. This was implemented for reproducibility purposes. Default: `master`. + +```bash +## Download and use config file with following git commid id +--custom_config_version d52db660777c4bf36546ddb188ec530c3ada1b96 +``` + +### `--custom_config_base` + +If you're running offline, nextflow will not be able to fetch the institutional config files +from the internet. If you don't need them, then this is not a problem. If you do need them, +you should download the files from the repo and tell nextflow where to find them with the +`custom_config_base` option. For example: + +```bash +## Download and unzip the config files +cd /path/to/my/configs +wget https://github.com/nf-core/configs/archive/master.zip +unzip master.zip + +## Run the pipeline +cd /path/to/my/data +nextflow run /path/to/pipeline/ --custom_config_base /path/to/my/configs/configs-master/ +``` + +> Note that the nf-core/tools helper package has a `download` command to download all required pipeline +> files + singularity containers + institutional configs in one go for you, to make this process easier. + +### `--max_memory` + +Use to set a top-limit for the default memory requirement for each process. +Should be a string in the format integer-unit. eg. `--max_memory '8.GB'` + +### `--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 new file mode 100644 index 00000000..5d00dbe1 --- /dev/null +++ b/environment.yml @@ -0,0 +1,15 @@ +# You can use this file to create a conda environment for this pipeline: +# conda env create -f environment.yml +name: nf-core-kmermaid-1.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 + - bioconda::fastqc=0.11.8 + - bioconda::multiqc=1.7 diff --git a/main.nf b/main.nf new file mode 100644 index 00000000..e0d1d81e --- /dev/null +++ b/main.nf @@ -0,0 +1,426 @@ +#!/usr/bin/env nextflow +/* +======================================================================================== + nf-core/kmermaid +======================================================================================== + nf-core/kmermaid Analysis Pipeline. + #### Homepage / Documentation + https://github.com/nf-core/kmermaid +---------------------------------------------------------------------------------------- +*/ + +def helpMessage() { + // TODO nf-core: Add to this help message with new command line parameters + log.info nfcoreHeader() + log.info""" + + Usage: + + The typical command for running the pipeline is as follows: + + nextflow run nf-core/kmermaid --reads '*_R{1,2}.fastq.gz' -profile docker + + Mandatory arguments: + --reads [file] Path to input data (must be surrounded with quotes) + -profile [str] Configuration profile to use. Can use multiple (comma separated) + Available: conda, docker, singularity, test, awsbatch, and more + + Options: + --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 [file] Path to fasta reference + + Other options: + --outdir [file] The output directory where the results will be saved + --email [email] Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits + --email_on_fail [email] Same as --email, except only send mail if the workflow is not successful + --max_multiqc_email_size [str] Theshold size for MultiQC report to be attached in notification email. If file generated by pipeline exceeds the threshold, it will not be attached (Default: 25MB) + -name [str] Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic + + AWSBatch options: + --awsqueue [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() +} + +// 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(", ")}" +} + +// TODO nf-core: Add any reference files that are needed +// Configurable reference genomes +// +// NOTE - THIS IS NOT USED IN THIS PIPELINE, EXAMPLE ONLY +// If you want to use the channel below in a process, define the following: +// input: +// file fasta from ch_fasta +// +params.fasta = params.genome ? params.genomes[ params.genome ].fasta ?: false : false +if (params.fasta) { ch_fasta = file(params.fasta, checkIfExists: true) } + +// Has the run name been specified by the user? +// this has the bonus effect of catching both -name and --name +custom_runName = params.name +if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { + custom_runName = workflow.runName +} + +if (workflow.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 = file("$baseDir/assets/multiqc_config.yaml", checkIfExists: true) +ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config, checkIfExists: true) : Channel.empty() +ch_output_docs = file("$baseDir/docs/output.md", checkIfExists: true) + +/* + * Create a channel for input read files + */ +if (params.readPaths) { + if (params.single_end) { + Channel + .from(params.readPaths) + .map { row -> [ row[0], [ file(row[1][0], checkIfExists: true) ] ] } + .ifEmpty { exit 1, "params.readPaths 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], checkIfExists: true), file(row[1][1], checkIfExists: true) ] ] } + .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } + .into { ch_read_files_fastqc; ch_read_files_trimming } + } +} else { + Channel + .fromFilePairs(params.reads, size: params.single_end ? 1 : 2) + .ifEmpty { exit 1, "Cannot find any reads matching: ${params.reads}\nNB: Path needs to be enclosed in quotes!\nIf this is single-end data, please specify --single_end on the command line." } + .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 +summary['Run Name'] = custom_runName ?: workflow.runName +// TODO nf-core: Report custom parameters here +summary['Reads'] = params.reads +summary['Fasta Ref'] = params.fasta +summary['Data Type'] = params.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" +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.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 || 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-" + +// Check the hostnames against configured profiles +checkHostname() + +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-kmermaid-summary' + description: " - this information is collected when the pipeline is started." + section_name: 'nf-core/kmermaid Workflow Summary' + section_href: 'https://github.com/nf-core/kmermaid' + plot_type: 'html' + data: | +
+ $x +
+ """.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 + } + + output: + file 'software_versions_mqc.yaml' into ch_software_versions_yaml + file "software_versions.csv" + + script: + // TODO nf-core: Get all tools to print their version number here + """ + echo $workflow.manifest.version > v_pipeline.txt + echo $workflow.nextflow.version > v_nextflow.txt + fastqc --version > v_fastqc.txt + multiqc --version > v_multiqc.txt + scrape_software_versions.py &> software_versions_mqc.yaml + """ +} + +/* + * STEP 1 - FastQC + */ +process fastqc { + tag "$name" + label 'process_medium' + publishDir "${params.outdir}/fastqc", mode: 'copy', + saveAs: { filename -> + filename.indexOf(".zip") > 0 ? "zips/$filename" : "$filename" + } + + input: + set val(name), file(reads) from ch_read_files_fastqc + + output: + file "*_fastqc.{zip,html}" into ch_fastqc_results + + script: + """ + fastqc --quiet --threads $task.cpus $reads + """ +} + +/* + * STEP 2 - MultiQC + */ +process multiqc { + publishDir "${params.outdir}/MultiQC", mode: 'copy' + + 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: 'copy' + + input: + file output_docs from ch_output_docs + + output: + file "results_description.html" + + script: + """ + markdown_to_html.py $output_docs -o results_description.html + """ +} + +/* + * Completion e-mail notification + */ +workflow.onComplete { + + // Set up the e-mail variables + def subject = "[nf-core/kmermaid] Successful: $workflow.runName" + if (!workflow.success) { + subject = "[nf-core/kmermaid] FAILED: $workflow.runName" + } + def email_fields = [:] + email_fields['version'] = workflow.manifest.version + email_fields['runName'] = custom_runName ?: workflow.runName + email_fields['success'] = workflow.success + email_fields['dateComplete'] = workflow.complete + email_fields['duration'] = workflow.duration + email_fields['exitStatus'] = workflow.exitStatus + email_fields['errorMessage'] = (workflow.errorMessage ?: 'None') + email_fields['errorReport'] = (workflow.errorReport ?: 'None') + email_fields['commandLine'] = workflow.commandLine + email_fields['projectDir'] = workflow.projectDir + email_fields['summary'] = summary + email_fields['summary']['Date Started'] = workflow.start + 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 + 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.max_multiqc_email_size) + // On success try attach the multiqc report + def mqc_report = null + try { + if (workflow.success) { + mqc_report = ch_multiqc_report.getVal() + if (mqc_report.getClass() == ArrayList) { + log.warn "[nf-core/kmermaid] Found multiple reports from process 'multiqc', will use only one" + mqc_report = mqc_report[0] + } + } + } catch (all) { + log.warn "[nf-core/kmermaid] 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 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 html_template = engine.createTemplate(hf).make(email_fields) + def email_html = html_template.toString() + + // Render the sendmail template + def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, baseDir: "$baseDir", mqcFile: mqc_report, mqcMaxSize: params.max_multiqc_email_size.toBytes() ] + def sf = new File("$baseDir/assets/sendmail_template.txt") + def sendmail_template = engine.createTemplate(sf).make(smail_fields) + def sendmail_html = sendmail_template.toString() + + // Send the HTML e-mail + if (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/kmermaid] Sent summary e-mail to $email_address (sendmail)" + } catch (all) { + // Catch failures and try with plaintext + [ 'mail', '-s', subject, email_address ].execute() << email_txt + log.info "[nf-core/kmermaid] 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_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") + output_tf.withWriter { w -> w << email_txt } + + 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.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/kmermaid]${c_green} Pipeline completed successfully${c_reset}-" + } else { + checkHostname() + log.info "-${c_purple}[nf-core/kmermaid]${c_red} Pipeline completed with errors${c_reset}-" + } + +} + + +def nfcoreHeader() { + // Log colors ANSI codes + c_black = params.monochrome_logs ? '' : "\033[0;30m"; + c_blue = params.monochrome_logs ? '' : "\033[0;34m"; + c_cyan = params.monochrome_logs ? '' : "\033[0;36m"; + c_dim = params.monochrome_logs ? '' : "\033[2m"; + c_green = params.monochrome_logs ? '' : "\033[0;32m"; + c_purple = params.monochrome_logs ? '' : "\033[0;35m"; + c_reset = params.monochrome_logs ? '' : "\033[0m"; + c_white = params.monochrome_logs ? '' : "\033[0;37m"; + c_yellow = params.monochrome_logs ? '' : "\033[0;33m"; + + return """ -${c_dim}--------------------------------------------------${c_reset}- + ${c_green},--.${c_black}/${c_green},-.${c_reset} + ${c_blue} ___ __ __ __ ___ ${c_green}/,-._.--~\'${c_reset} + ${c_blue} |\\ | |__ __ / ` / \\ |__) |__ ${c_yellow}} {${c_reset} + ${c_blue} | \\| | \\__, \\__/ | \\ |___ ${c_green}\\`-._,-`-,${c_reset} + ${c_green}`._,._,\'${c_reset} + ${c_purple} nf-core/kmermaid v${workflow.manifest.version}${c_reset} + -${c_dim}--------------------------------------------------${c_reset}- + """.stripIndent() +} + +def checkHostname() { + def c_reset = params.monochrome_logs ? '' : "\033[0m" + def c_white = params.monochrome_logs ? '' : "\033[0;37m" + def c_red = params.monochrome_logs ? '' : "\033[1;91m" + def c_yellow_bold = params.monochrome_logs ? '' : "\033[1;93m" + if (params.hostnames) { + def hostname = "hostname".execute().text.trim() + params.hostnames.each { prof, hnames -> + hnames.each { hname -> + if (hostname.contains(hname) && !workflow.profile.contains(prof)) { + log.error "====================================================\n" + + " ${c_red}WARNING!${c_reset} You are running with `-profile $workflow.profile`\n" + + " but your machine hostname is ${c_white}'$hostname'${c_reset}\n" + + " ${c_yellow_bold}It's highly recommended that you use `-profile $prof${c_reset}`\n" + + "============================================================" + } + } + } + } +} diff --git a/nextflow.config b/nextflow.config new file mode 100644 index 00000000..bfca9cb7 --- /dev/null +++ b/nextflow.config @@ -0,0 +1,147 @@ +/* + * ------------------------------------------------- + * nf-core/kmermaid Nextflow config file + * ------------------------------------------------- + * Default config options for all environments. + */ + +// Global default params, used in configs +params { + + // Workflow flags + // TODO nf-core: Specify your pipeline's command line flags + genome = false + reads = "data/*{1,2}.fastq.gz" + single_end = false + outdir = './results' + + // Boilerplate options + name = false + multiqc_config = false + email = false + email_on_fail = false + max_multiqc_email_size = 25.MB + plaintext_email = false + monochrome_logs = false + help = false + igenomes_base = 's3://ngi-igenomes/igenomes/' + tracedir = "${params.outdir}/pipeline_info" + igenomes_ignore = false + custom_config_version = 'master' + custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" + hostnames = false + 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! +// Developmental code should specify :dev +process.container = 'nfcore/kmermaid:dev' + +// Load base.config by default for all pipelines +includeConfig 'conf/base.config' + +// Load nf-core custom profiles from different Institutions +try { + includeConfig "${params.custom_config_base}/nfcore_custom.config" +} catch (Exception e) { + System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") +} + +profiles { + conda { process.conda = "$baseDir/environment.yml" } + debug { process.beforeScript = 'echo $HOSTNAME' } + docker { + docker.enabled = true + // Avoid this error: + // WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap. + // Testing this in nf-core after discussion here https://github.com/nf-core/tools/pull/351 + // once this is established and works well, nextflow might implement this behavior as new default. + docker.runOptions = '-u \$(id -u):\$(id -g)' + } + singularity { + singularity.enabled = true + singularity.autoMounts = true + } + test { includeConfig 'conf/test.config' } +} + +// Load igenomes.config if required +if (!params.igenomes_ignore) { + includeConfig 'conf/igenomes.config' +} + +// Export this variable to prevent local Python libraries from conflicting with those in the container +env { + PYTHONNOUSERSITE = 1 +} + +// Capture exit codes from upstream processes when piping +process.shell = ['/bin/bash', '-euo', 'pipefail'] + +timeline { + enabled = true + file = "${params.tracedir}/execution_timeline.html" +} +report { + enabled = true + file = "${params.tracedir}/execution_report.html" +} +trace { + enabled = true + file = "${params.tracedir}/execution_trace.txt" +} +dag { + enabled = true + file = "${params.tracedir}/pipeline_dag.svg" +} + +manifest { + name = 'nf-core/kmermaid' + author = 'Olga Botvinnik' + homePage = 'https://github.com/nf-core/kmermaid' + description = 'k-mer similarity analysis pipeline' + mainScript = 'main.nf' + nextflowVersion = '>=19.10.0' + version = '1.0dev' +} + +// Function to ensure that resource requirements don't go beyond +// a maximum limit +def check_max(obj, type) { + if (type == 'memory') { + try { + if (obj.compareTo(params.max_memory as nextflow.util.MemoryUnit) == 1) + return params.max_memory as nextflow.util.MemoryUnit + else + return obj + } catch (all) { + println " ### ERROR ### Max memory '${params.max_memory}' is not valid! Using default value: $obj" + return obj + } + } else if (type == 'time') { + try { + if (obj.compareTo(params.max_time as nextflow.util.Duration) == 1) + return params.max_time as nextflow.util.Duration + else + return obj + } catch (all) { + println " ### ERROR ### Max time '${params.max_time}' is not valid! Using default value: $obj" + return obj + } + } else if (type == 'cpus') { + try { + return Math.min( obj, params.max_cpus as int ) + } catch (all) { + println " ### ERROR ### Max cpus '${params.max_cpus}' is not valid! Using default value: $obj" + return obj + } + } +} From ae0ae08b1f7a26d476623c7a282908772809b9c7 Mon Sep 17 00:00:00 2001 From: Pranathi Vemuri Date: Wed, 21 Oct 2020 01:15:22 -0700 Subject: [PATCH 2/3] Update test.config --- conf/test.config | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/conf/test.config b/conf/test.config index 289fc607..ce95e278 100644 --- a/conf/test.config +++ b/conf/test.config @@ -10,7 +10,6 @@ params { config_profile_name = 'Test profile' config_profile_description = 'Minimal test dataset to check pipeline function' -<<<<<<< HEAD // Limit resources so that this can run on Travis max_cpus = 2 max_memory = 6.GB @@ -30,19 +29,5 @@ params { 'https://github.com/nf-core/test-datasets/raw/kmermaid/testdata/SRR4050380_pass_2.fastq.gz']], ['SRR4238351', ['https://github.com/nf-core/test-datasets/raw/rnaseq/testdata/SRR4238351_subsamp.fastq.gz']], ['SRR4238355', ['https://github.com/nf-core/test-datasets/raw/rnaseq/testdata/SRR4238355_subsamp.fastq.gz']], -======= - // Limit resources so that this can run on GitHub Actions - max_cpus = 2 - max_memory = 6.GB - max_time = 48.h - - // Input data - // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets - // TODO nf-core: Give any required params for the test so that command line flags are not needed - single_end = false - readPaths = [ - ['Testdata', ['https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R1.tiny.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R2.tiny.fastq.gz']], - ['SRR389222', ['https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub1.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub2.fastq.gz']] ->>>>>>> origin/TEMPLATE ] } From b9094f16b79edb3bb4173d6bf8fe8fbcfbee3b85 Mon Sep 17 00:00:00 2001 From: pranathivemuri Date: Wed, 21 Oct 2020 01:17:27 -0700 Subject: [PATCH 3/3] lint md files --- CHANGELOG.md | 2 +- README.md | 2 +- docs/output.md | 2 +- docs/usage.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc11e580..2a2f13f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,4 +38,4 @@ barcode fastq ### `Dependencies` -### `Deprecated` \ No newline at end of file +### `Deprecated` diff --git a/README.md b/README.md index a85ba90d..b2a5d3f1 100644 --- a/README.md +++ b/README.md @@ -115,4 +115,4 @@ You can cite the `nf-core` publication as follows: > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. > > _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). -> ReadCube: [Full Access Link](https://rdcu.be/b1GjZ) \ No newline at end of file +> ReadCube: [Full Access Link](https://rdcu.be/b1GjZ) diff --git a/docs/output.md b/docs/output.md index 76c4b67c..a32191a4 100644 --- a/docs/output.md +++ b/docs/output.md @@ -75,4 +75,4 @@ similarities_molecule-protein_ksize-3_log2sketchsize-2.csv similarities_molecule-protein_ksize-3_log2sketchsize-4.csv similarities_molecule-protein_ksize-9_log2sketchsize-2.csv similarities_molecule-protein_ksize-9_log2sketchsize-4.csv -``` \ No newline at end of file +``` diff --git a/docs/usage.md b/docs/usage.md index 7436763d..9f114ede 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -600,4 +600,4 @@ Set to disable colourful command line output and live life in monochrome. ### `--multiqc_config` -Specify a path to a custom MultiQC configuration file. \ No newline at end of file +Specify a path to a custom MultiQC configuration file.