diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ea27a584..237c9ed0 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,27 +1,21 @@ { + "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.schema.json", "name": "nfcore", - "image": "nfcore/gitpod:latest", - "remoteUser": "gitpod", + "image": "nfcore/devcontainer:latest", - // Configure tool-specific properties. - "customizations": { - // Configure properties specific to VS Code. - "vscode": { - // Set *default* container specific settings.json values on container create. - "settings": { - "python.defaultInterpreterPath": "/opt/conda/bin/python", - "python.linting.enabled": true, - "python.linting.pylintEnabled": true, - "python.formatting.autopep8Path": "/opt/conda/bin/autopep8", - "python.formatting.yapfPath": "/opt/conda/bin/yapf", - "python.linting.flake8Path": "/opt/conda/bin/flake8", - "python.linting.pycodestylePath": "/opt/conda/bin/pycodestyle", - "python.linting.pydocstylePath": "/opt/conda/bin/pydocstyle", - "python.linting.pylintPath": "/opt/conda/bin/pylint" - }, + "remoteUser": "root", + "privileged": true, - // Add the IDs of extensions you want installed when the container is created. - "extensions": ["ms-python.python", "ms-python.vscode-pylance", "nf-core.nf-core-extensionpack"] - } + "remoteEnv": { + // Workspace path on the host for mounting with docker-outside-of-docker + "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}" + }, + + "onCreateCommand": "./.devcontainer/setup.sh", + + "hostRequirements": { + "cpus": 4, + "memory": "16gb", + "storage": "32gb" } } diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh new file mode 100755 index 00000000..0a190812 --- /dev/null +++ b/.devcontainer/setup.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +# Customise the terminal command prompt +echo "export PROMPT_DIRTRIM=2" >> $HOME/.bashrc +echo "export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] '" >> $HOME/.bashrc +export PROMPT_DIRTRIM=2 +export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] ' + +# Update Nextflow +nextflow self-update + +# Update welcome message +echo "Welcome to the nf-core/atacseq devcontainer!" > /usr/local/etc/vscode-dev-containers/first-run-notice.txt diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 588546de..00000000 --- a/.editorconfig +++ /dev/null @@ -1,27 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -indent_size = 4 -indent_style = space - -[*.{md,yml,yaml,html,css,scss,js}] -indent_size = 2 - -# These files are edited and tested upstream in nf-core/modules -[/modules/nf-core/**] -charset = unset -end_of_line = unset -insert_final_newline = unset -trim_trailing_whitespace = unset -indent_style = unset -indent_size = unset - -[/assets/email*] -indent_size = unset - -[/assets/blacklists/GRCh37-blacklist.bed] -trim_trailing_whitespace = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md deleted file mode 100644 index 2691b6ca..00000000 --- a/.github/CONTRIBUTING.md +++ /dev/null @@ -1,119 +0,0 @@ -# nf-core/atacseq: Contributing Guidelines - -Hi there! -Many thanks for taking an interest in improving nf-core/atacseq. - -We try to manage the required tasks for nf-core/atacseq 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/atacseq then the best place to ask is on the nf-core Slack [#atacseq](https://nfcore.slack.com/channels/atacseq) channel ([join our Slack here](https://nf-co.re/join/slack)). - -## Contribution workflow - -If you'd like to write some code for nf-core/atacseq, the standard workflow is as follows: - -1. Check that there isn't already an issue about your idea in the [nf-core/atacseq issues](https://github.com/nf-core/atacseq/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/atacseq repository](https://github.com/nf-core/atacseq) to your GitHub account -3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) -4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). -5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged - -If you're not used to this workflow with git, you can start with some [docs from GitHub](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or even their [excellent `git` resources](https://try.github.io/). - -## Tests - -When you create a pull request with changes, [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/atacseq documentation](https://nf-co.re/atacseq/usage) and don't hesitate to get in touch on the nf-core Slack [#atacseq](https://nfcore.slack.com/channels/atacseq) channel ([join our Slack here](https://nf-co.re/join/slack)). - -## Pipeline contribution conventions - -To make the nf-core/atacseq code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. - -### Adding a new step - -If you wish to contribute a new step, please use the following coding standards: - -1. Define the corresponding input channel into your new process from the expected previous process channel -2. Write the process block (see below). -3. Define the output channel if needed (see below). -4. Add any new parameters to `nextflow.config` with a default (see below). -5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core schema build` tool). -6. Add sanity checks and validation for all relevant parameters. -7. Perform local tests to validate that the new code works as expected. -8. If applicable, add a new test command in `.github/workflow/ci.yml`. -9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. -10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. - -### Default values - -Parameters should be initialised / defined with default values in `nextflow.config` under the `params` scope. - -Once there, use `nf-core schema build` to add to `nextflow_schema.json`. - -### Default processes resource requirements - -Sensible defaults for process resource requirements (CPUs / memory / time) for a process should be defined in `conf/base.config`. These should generally be specified generic with `withLabel:` selectors so they can be shared across multiple processes/steps of the pipeline. A nf-core standard set of labels that should be followed where possible can be seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/master/nf_core/pipeline-template/conf/base.config), which has the default process as a single core-process, and then different levels of multi-core configurations for increasingly large memory requirements defined with standardised labels. - -The process resources can be passed on to the tool dynamically within the process with the `${task.cpu}` and `${task.memory}` variables in the `script:` block. - -### Naming schemes - -Please use the following naming schemes, to make it easy to understand what is going where. - -- initial process channel: `ch_output_from_` -- intermediate and terminal channels: `ch__for_` - -### Nextflow version bumping - -If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` - -### Images and figures - -For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). - -## GitHub Codespaces - -This repo includes a devcontainer configuration which will create a GitHub Codespaces for Nextflow development! This is an online developer environment that runs in your browser, complete with VSCode and a terminal. - -To get started: - -- Open the repo in [Codespaces](https://github.com/nf-core/atacseq/codespaces) -- Tools installed - - nf-core - - Nextflow - -Devcontainer specs: - -- [DevContainer config](.devcontainer/devcontainer.json) -- [Dockerfile](.devcontainer/Dockerfile) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index b2031a3c..7c57ef9b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -9,7 +9,6 @@ body: - [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) - [nf-core/atacseq pipeline documentation](https://nf-co.re/atacseq/usage) - - type: textarea id: description attributes: @@ -42,7 +41,7 @@ body: attributes: label: System information description: | - * Nextflow version _(eg. 22.10.1)_ + * Nextflow version _(eg. 23.04.0)_ * Hardware _(eg. HPC, Desktop, Cloud)_ * Executor _(eg. slurm, local, awsbatch)_ * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter, Charliecloud, or Apptainer)_ diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 607aa029..ae19cb84 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -8,17 +8,18 @@ These are the most common things requested on pull requests (PRs). Remember that PRs should be made against the dev branch, unless you're preparing a pipeline release. -Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/atacseq/tree/master/.github/CONTRIBUTING.md) +Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/atacseq/tree/master/docs/CONTRIBUTING.md) --> ## 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 you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/atacseq/tree/master/.github/CONTRIBUTING.md) +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/atacseq/tree/master/docs/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/atacseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. -- [ ] Make sure your code lints (`nf-core lint`). +- [ ] Make sure your code lints (`nf-core pipelines lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). +- [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml new file mode 100644 index 00000000..e2833ee9 --- /dev/null +++ b/.github/actions/get-shards/action.yml @@ -0,0 +1,69 @@ +name: "Get number of shards" +description: "Get the number of nf-test shards for the current CI job" +inputs: + max_shards: + description: "Maximum number of shards allowed" + required: true + paths: + description: "Component paths to test" + required: false + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +outputs: + shard: + description: "Array of shard numbers" + value: ${{ steps.shards.outputs.shard }} + total_shards: + description: "Total number of shards" + value: ${{ steps.shards.outputs.total_shards }} +runs: + using: "composite" + steps: + - name: Install nf-test + uses: nf-core/setup-nf-test@4069fbbaabe94c08faba4ad261bfa88225ba133f # v2 + with: + version: ${{ env.NFT_VER }} + - name: Get number of shards + id: shards + shell: bash + run: | + # Run nf-test with dynamic parameter + nftest_output=$(nf-test test \ + --profile +docker \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --dry-run \ + --ci \ + --changed-since HEAD^) || { + echo "nf-test command failed with exit code $?" + echo "Full output: $nftest_output" + exit 1 + } + echo "nf-test dry-run output: $nftest_output" + + # Default values for shard and total_shards + shard="[]" + total_shards=0 + + # Check if there are related tests + if echo "$nftest_output" | grep -q 'No tests to execute'; then + echo "No related tests found." + else + # Extract the number of related tests + number_of_shards=$(echo "$nftest_output" | sed -n 's|.*Executed \([0-9]*\) tests.*|\1|p') + if [[ -n "$number_of_shards" && "$number_of_shards" -gt 0 ]]; then + shards_to_run=$(( $number_of_shards < ${{ inputs.max_shards }} ? $number_of_shards : ${{ inputs.max_shards }} )) + shard=$(seq 1 "$shards_to_run" | jq -R . | jq -c -s .) + total_shards="$shards_to_run" + else + echo "Unexpected output format. Falling back to default values." + fi + fi + + # Write to GitHub Actions outputs + echo "shard=$shard" >> $GITHUB_OUTPUT + echo "total_shards=$total_shards" >> $GITHUB_OUTPUT + + # Debugging output + echo "Final shard array: $shard" + echo "Total number of shards: $total_shards" diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml new file mode 100644 index 00000000..945c56f0 --- /dev/null +++ b/.github/actions/nf-test/action.yml @@ -0,0 +1,111 @@ +name: "nf-test Action" +description: "Runs nf-test with common setup steps" +inputs: + profile: + description: "Profile to use" + required: true + shard: + description: "Shard number for this CI job" + required: true + total_shards: + description: "Total number of test shards(NOT the total number of matrix jobs)" + required: true + paths: + description: "Test paths" + required: true + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +runs: + using: "composite" + steps: + - name: Setup Nextflow + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 + with: + version: "${{ env.NXF_VERSION }}" + + - name: Set up Python + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 + with: + python-version: "3.14" + + - name: Install nf-test + uses: nf-core/setup-nf-test@4069fbbaabe94c08faba4ad261bfa88225ba133f # v2 + with: + version: "${{ env.NFT_VER }}" + install-pdiff: true + + - name: Setup apptainer + if: contains(inputs.profile, 'singularity') + uses: eWaterCycle/setup-apptainer@4bb22c52d4f63406c49e94c804632975787312b3 # v2.0.0 + + - name: Set up Singularity + if: contains(inputs.profile, 'singularity') + shell: bash + run: | + mkdir -p $NXF_SINGULARITY_CACHEDIR + mkdir -p $NXF_SINGULARITY_LIBRARYDIR + + - name: Conda setup + if: contains(inputs.profile, 'conda') + uses: conda-incubator/setup-miniconda@8ee1f361103df19b6f8c8655fd3967a8ecb162d5 # v4 + with: + auto-update-conda: true + conda-solver: libmamba + channels: conda-forge + channel-priority: strict + conda-remove-defaults: true + + - name: Run nf-test + shell: bash + env: + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + run: | + nf-test test \ + --profile=+${{ inputs.profile }} \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --ci \ + --changed-since HEAD^ \ + --verbose \ + --tap=test.tap \ + --shard ${{ inputs.shard }}/${{ inputs.total_shards }} + + # Save the absolute path of the test.tap file to the output + echo "tap_file_path=$(realpath test.tap)" >> $GITHUB_OUTPUT + + - name: Generate test summary + if: always() + shell: bash + run: | + # Add header if it doesn't exist (using a token file to track this) + if [ ! -f ".summary_header" ]; then + echo "# 🚀 nf-test results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Status | Test Name | Profile | Shard |" >> $GITHUB_STEP_SUMMARY + echo "|:------:|-----------|---------|-------|" >> $GITHUB_STEP_SUMMARY + touch .summary_header + fi + + if [ -f test.tap ]; then + while IFS= read -r line; do + if [[ $line =~ ^ok ]]; then + test_name="${line#ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ✅ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + elif [[ $line =~ ^not\ ok ]]; then + test_name="${line#not ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ❌ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + done < test.tap + else + echo "| ⚠️ | No test results found | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + + - name: Clean up + if: always() + shell: bash + run: | + sudo rm -rf /home/ubuntu/tests/ diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index d0fb713c..17398d0f 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -1,35 +1,67 @@ name: nf-core AWS full size tests -# This workflow is triggered on published releases. +# This workflow is triggered on PRs opened against the main/master branch. # It can be additionally triggered manually with GitHub actions workflow dispatch button. # It runs the -profile 'test_full' on AWS batch on: + workflow_dispatch: + pull_request_review: + types: [submitted] release: types: [published] - workflow_dispatch: + jobs: - run-tower: + run-platform: name: Run AWS full tests - if: github.repository == 'nf-core/atacseq' + # run only if the PR is approved by at least 2 reviewers and against the master/main branch or manually triggered + if: github.repository == 'nf-core/atacseq' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' || github.event_name == 'release' runs-on: ubuntu-latest strategy: matrix: aligner: ["bwa", "bowtie2", "chromap", "star"] steps: - - name: Launch workflow via tower - uses: seqeralabs/action-tower-launch@v1 + - name: Set revision variable + id: revision + run: | + echo "revision=${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'release') && github.sha || 'dev' }}" >> "$GITHUB_OUTPUT" + + - name: Launch workflow via Seqera Platform + uses: seqeralabs/action-tower-launch@51565b514bff1827cf34620de25d0055759f1fc9 # v2 with: - workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/atacseq/work-${{ github.sha }} + compute_env: ${{ vars.TOWER_COMPUTE_ENV }} + revision: ${{ steps.revision.outputs.revision }} + workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/atacseq/work-${{ steps.revision.outputs.revision }} + nextflow_config: | + plugins { + id 'nf-slack@0.5.0' + } + slack { + enabled = true + bot { + token = '${{ secrets.NFSLACK_BOT_TOKEN }}' + channel = 'atacseq' + } + onStart { + enabled = false + } + onComplete { + message = ':white_check_mark: *atacseq/test_full* completed successfully! :tada:' + } + onError { + message = ':x: *atacseq/test_full* failed :crying_cat_face:' + } + } parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/atacseq/results-${{ github.sha }}" - "aligner": "${{ matrix.aligner }}" + "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/atacseq/results-${{ steps.revision.outputs.revision }}" } - profiles: test_full,aws_tower - - uses: actions/upload-artifact@v3 + profiles: test_full + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: Tower debug log file - path: tower_action_*.log + name: Seqera Platform debug log file + path: | + tower_action_*.log + tower_action_*.json diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 1920052c..8287e0d8 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -5,25 +5,29 @@ name: nf-core AWS test on: workflow_dispatch: jobs: - run-tower: + run-platform: name: Run AWS tests if: github.repository == 'nf-core/atacseq' runs-on: ubuntu-latest steps: - # Launch workflow using Tower CLI tool action - - name: Launch workflow via tower - uses: seqeralabs/action-tower-launch@v1 + # Launch workflow using Seqera Platform CLI tool action + - name: Launch workflow via Seqera Platform + uses: seqeralabs/action-tower-launch@51565b514bff1827cf34620de25d0055759f1fc9 # v2 with: - workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/atacseq/work-${{ github.sha }} + compute_env: ${{ vars.TOWER_COMPUTE_ENV }} + revision: ${{ github.sha }} + workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/atacseq/work-${{ github.sha }} parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/atacseq/results-test-${{ github.sha }}" + "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/atacseq/results-test-${{ github.sha }}" } - profiles: test,aws_tower - - uses: actions/upload-artifact@v3 + profiles: test + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: Tower debug log file - path: tower_action_*.log + name: Seqera Platform debug log file + path: | + tower_action_*.log + tower_action_*.json diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 2e983e54..83a7abc3 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -1,44 +1,62 @@ 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` +# This workflow is triggered on PRs to `main`/`master` branch on the repository +# It fails when someone tries to make a PR against the nf-core `main`/`master` branch instead of `dev` on: - pull_request_target: - branches: [master] + pull_request: + branches: + - main + - master + +permissions: {} jobs: test: runs-on: ubuntu-latest steps: - # PRs to the nf-core repo master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches + # PRs to the nf-core repo main/master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches - name: Check PRs if: github.repository == 'nf-core/atacseq' + env: + HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }} run: | - { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/atacseq ]] && [[ $GITHUB_HEAD_REF == "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + { [[ "$HEAD_REPO" == nf-core/atacseq ]] && [[ $GITHUB_HEAD_REF == "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] - # If the above check failed, post a comment on the PR explaining the failure - # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets - - name: Post PR comment + # If the above check failed, build a comment to be posted by the shared poster workflow + - name: Build PR comment if: failure() - uses: mshick/add-pr-comment@v1 - with: - message: | - ## This PR is against the `master` branch :x: + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + BASE_REF: ${{ github.event.pull_request.base.ref }} + HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }} + PR_USER: ${{ github.event.pull_request.user.login }} + run: | + mkdir -p pr-comment + echo "$PR_NUMBER" > pr-comment/pr_number.txt + echo "branch" > pr-comment/header.txt + cat > pr-comment/comment.md <> "$GITHUB_OUTPUT" + echo "REPOTITLE_LOWERCASE=$(basename ${GITHUB_REPOSITORY,,})" >> "$GITHUB_OUTPUT" + echo "REPO_BRANCH=${{ github.event.inputs.testbranch || 'dev' }}" >> "$GITHUB_OUTPUT" + + download: + runs-on: ubuntu-latest + needs: configure + steps: + - name: Check out pipeline code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + + - name: Install Nextflow + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 + + - name: Disk space cleanup + uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 + + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 + with: + python-version: "3.14" + architecture: "x64" + + - name: Setup Apptainer + uses: eWaterCycle/setup-apptainer@4bb22c52d4f63406c49e94c804632975787312b3 # v2.0.0 + with: + apptainer-version: 1.3.4 + + - name: Read .nf-core.yml + id: read_yml + run: | + echo "nf_core_version=$(yq '.nf_core_version' ${{ github.workspace }}/.nf-core.yml)" >> "$GITHUB_OUTPUT" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} + + - name: Make a cache directory for the container images + run: | + mkdir -p ./singularity_container_images + + - name: Download the pipeline + env: + NXF_SINGULARITY_CACHEDIR: ./singularity_container_images + run: | + nf-core pipelines download ${{ needs.configure.outputs.REPO_LOWERCASE }} \ + --revision ${{ needs.configure.outputs.REPO_BRANCH }} \ + --outdir ./${{ needs.configure.outputs.REPOTITLE_LOWERCASE }} \ + --compress "none" \ + --container-system 'singularity' \ + --container-library "quay.io" -l "docker.io" -l "community.wave.seqera.io/library/" \ + --container-cache-utilisation 'amend' \ + --download-configuration 'yes' + + - name: Inspect download + run: tree ./${{ needs.configure.outputs.REPOTITLE_LOWERCASE }} + + - name: Inspect container images + run: tree ./singularity_container_images | tee ./container_initial + + - name: Count the downloaded number of container images + id: count_initial + run: | + image_count=$(ls -1 ./singularity_container_images | wc -l | xargs) + echo "Initial container image count: $image_count" + echo "IMAGE_COUNT_INITIAL=$image_count" >> "$GITHUB_OUTPUT" + + - name: Run the downloaded pipeline (stub) + id: stub_run_pipeline + continue-on-error: true + env: + NXF_SINGULARITY_CACHEDIR: ./singularity_container_images + NXF_SINGULARITY_HOME_MOUNT: true + run: nextflow run ./${{needs.configure.outputs.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ needs.configure.outputs.REPO_BRANCH }}) -stub -profile test,singularity --outdir ./results + - name: Run the downloaded pipeline (stub run not supported) + id: run_pipeline + if: ${{ steps.stub_run_pipeline.outcome == 'failure' }} + env: + NXF_SINGULARITY_CACHEDIR: ./singularity_container_images + NXF_SINGULARITY_HOME_MOUNT: true + run: nextflow run ./${{ needs.configure.outputs.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ needs.configure.outputs.REPO_BRANCH }}) -profile test,singularity --outdir ./results + + - name: Count the downloaded number of container images + id: count_afterwards + run: | + image_count=$(ls -1 ./singularity_container_images | wc -l | xargs) + echo "Post-pipeline run container image count: $image_count" + echo "IMAGE_COUNT_AFTER=$image_count" >> "$GITHUB_OUTPUT" + + - name: Compare container image counts + id: count_comparison + run: | + if [ "${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }}" -ne "${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }}" ]; then + initial_count=${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }} + final_count=${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }} + difference=$((final_count - initial_count)) + echo "$difference additional container images were \n downloaded at runtime . The pipeline has no support for offline runs!" + tree ./singularity_container_images > ./container_afterwards + diff ./container_initial ./container_afterwards + exit 1 + else + echo "The pipeline can be downloaded successfully!" + fi + + - name: Upload Nextflow logfile for debugging purposes + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: nextflow_logfile.txt + path: .nextflow.log* + include-hidden-files: true diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml deleted file mode 100644 index d64801df..00000000 --- a/.github/workflows/fix-linting.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Fix linting from a comment -on: - issue_comment: - types: [created] - -jobs: - deploy: - # Only run if comment is on a PR with the main repo, and if it contains the magic keywords - if: > - contains(github.event.comment.html_url, '/pull/') && - contains(github.event.comment.body, '@nf-core-bot fix linting') && - github.repository == 'nf-core/atacseq' - runs-on: ubuntu-latest - steps: - # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@v3 - with: - token: ${{ secrets.nf_core_bot_auth_token }} - - # Action runs on the issue comment, so we don't get the PR by default - # Use the gh cli to check out the PR - - name: Checkout Pull Request - run: gh pr checkout ${{ github.event.issue.number }} - env: - GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} - - - uses: actions/setup-node@v3 - - - name: Install Prettier - run: npm install -g prettier @prettier/plugin-php - - # Check that we actually need to fix something - - name: Run 'prettier --check' - id: prettier_status - run: | - if prettier --check ${GITHUB_WORKSPACE}; then - echo "result=pass" >> $GITHUB_OUTPUT - else - echo "result=fail" >> $GITHUB_OUTPUT - fi - - - name: Run 'prettier --write' - if: steps.prettier_status.outputs.result == 'fail' - run: prettier --write ${GITHUB_WORKSPACE} - - - name: Commit & push changes - if: steps.prettier_status.outputs.result == 'fail' - run: | - git config user.email "core@nf-co.re" - git config user.name "nf-core-bot" - git config push.default upstream - git add . - git status - git commit -m "[automated] Fix linting with Prettier" - git push diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml new file mode 100644 index 00000000..cbda1454 --- /dev/null +++ b/.github/workflows/fix_linting.yml @@ -0,0 +1,85 @@ +name: Fix linting from a comment +on: + issue_comment: + types: [created] + +jobs: + fix-linting: + # Only run if comment is on a PR with the main repo, and if it contains the magic keywords + if: > + contains(github.event.comment.html_url, '/pull/') && + contains(github.event.comment.body, '@nf-core-bot fix linting') && + github.repository == 'nf-core/atacseq' + runs-on: ubuntu-latest + steps: + # Use the @nf-core-bot token to check out so we can push later + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + token: ${{ secrets.nf_core_bot_auth_token }} + + # indication that the linting is being fixed + - name: React on comment + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + with: + comment-id: ${{ github.event.comment.id }} + reactions: eyes + + # Action runs on the issue comment, so we don't get the PR by default + # Use the gh cli to check out the PR + - name: Checkout Pull Request + run: gh pr checkout ${{ github.event.issue.number }} + env: + GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} + + - name: Install Nextflow + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 + + # Install and run prek + - name: Run prek + id: prek + uses: j178/prek-action@6ad80277337ad479fe43bd70701c3f7f8aa74db3 # v2 + continue-on-error: true + + # indication that the linting has finished + - name: react if linting finished succesfully + if: steps.prek.outcome == 'success' + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + with: + comment-id: ${{ github.event.comment.id }} + reactions: "+1" + + - name: Commit & push changes + id: commit-and-push + if: steps.prek.outcome == 'failure' + run: | + git config user.email "core@nf-co.re" + git config user.name "nf-core-bot" + git config push.default upstream + git add . + git status + git commit -m "[automated] Fix code linting" + git push + + - name: react if linting errors were fixed + id: react-if-fixed + if: steps.commit-and-push.outcome == 'success' + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + with: + comment-id: ${{ github.event.comment.id }} + reactions: hooray + + - name: react if linting errors were not fixed + if: steps.commit-and-push.outcome == 'failure' + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + with: + comment-id: ${{ github.event.comment.id }} + reactions: confused + + - name: react if linting errors were not fixed + if: steps.commit-and-push.outcome == 'failure' + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + with: + issue-number: ${{ github.event.issue.number }} + body: | + @${{ github.actor }} I tried to fix the linting errors, but it didn't work. Please fix them manually. + See [CI log](https://github.com/nf-core/atacseq/actions/runs/${{ github.run_id }}) for more details. diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml old mode 100755 new mode 100644 index 888cb4bc..bc32219b --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -1,97 +1,65 @@ 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 +# It runs the `nf-core pipelines lint` and markdown lint tests to ensure # that the code meets the nf-core guidelines. on: - push: - branches: - - dev pull_request: release: types: [published] jobs: - EditorConfig: + pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - - uses: actions/setup-node@v3 - - - name: Install editorconfig-checker - run: npm install -g editorconfig-checker - - - name: Run ECLint check - run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.git\|.py\|.md\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') - - Prettier: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - - - name: Install Prettier - run: npm install -g prettier - - - name: Run Prettier --check - run: prettier --check ${GITHUB_WORKSPACE} - - PythonBlack: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Check code lints with Black - uses: psf/black@stable - - # If the above check failed, post a comment on the PR explaining the failure - - name: Post PR comment - if: failure() - uses: mshick/add-pr-comment@v1 - with: - message: | - ## Python linting (`black`) is failing - - To keep the code consistent with lots of contributors, we run automated code consistency checks. - To fix this CI test, please run: - - * Install [`black`](https://black.readthedocs.io/en/stable/): `pip install black` - * Fix formatting errors in your pipeline: `black .` - - Once you push these changes the test should pass, and you can hide this comment :+1: - - We highly recommend setting up Black in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + - name: Install Nextflow + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 - Thanks again for your contribution! - repo-token: ${{ secrets.GITHUB_TOKEN }} - allow-repeats: false + - name: Run prek + uses: j178/prek-action@6ad80277337ad479fe43bd70701c3f7f8aa74db3 # v2 nf-core: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@v3 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: - python-version: "3.8" + python-version: "3.14" architecture: "x64" + - name: Setup uv + uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + + - name: read .nf-core.yml + uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 + id: read_yml + with: + config: ${{ github.workspace }}/.nf-core.yml + - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install nf-core + run: uv tool install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} - - name: Run nf-core lint + - name: Run nf-core pipelines lint + if: ${{ github.base_ref != 'master' || github.base_ref != 'main' }} env: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} - run: nf-core -l lint_log.txt lint --dir ${GITHUB_WORKSPACE} --markdown lint_results.md + run: nf-core -l lint_log.txt pipelines lint --dir ${GITHUB_WORKSPACE} --markdown lint_results.md + + - name: Run nf-core pipelines lint --release + if: ${{ github.base_ref == 'master' || github.base_ref == 'main' }} + env: + GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} + run: nf-core -l lint_log.txt pipelines lint --release --dir ${GITHUB_WORKSPACE} --markdown lint_results.md - name: Save PR number if: ${{ always() }} @@ -99,10 +67,28 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: linting-logs path: | lint_log.txt lint_results.md PR_number.txt + + # Build a comment for the shared pr-comment.yml poster to publish on the PR + - name: Prepare PR comment + if: ${{ always() }} + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + mkdir -p pr-comment + echo "$PR_NUMBER" > pr-comment/pr_number.txt + echo "lint" > pr-comment/header.txt + [ -f lint_results.md ] && cp lint_results.md pr-comment/comment.md || true + + - name: Upload PR comment artifact + if: ${{ always() }} + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: pr-comment + path: pr-comment/ diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml deleted file mode 100644 index 0bbcd30f..00000000 --- a/.github/workflows/linting_comment.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: nf-core linting comment -# This workflow is triggered after the linting action is complete -# It posts an automated comment to the PR, even if the PR is coming from a fork - -on: - workflow_run: - workflows: ["nf-core linting"] - -jobs: - test: - runs-on: ubuntu-latest - steps: - - name: Download lint results - uses: dawidd6/action-download-artifact@v2 - with: - workflow: linting.yml - workflow_conclusion: completed - - - name: Get PR number - id: pr_number - run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - - - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@v2 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - number: ${{ steps.pr_number.outputs.pr_number }} - path: linting-logs/lint_results.md diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml new file mode 100644 index 00000000..c4d85e67 --- /dev/null +++ b/.github/workflows/nf-test.yml @@ -0,0 +1,202 @@ +name: Run nf-test +on: + pull_request: + paths-ignore: + - "docs/**" + - "**/meta.yml" + - "**/*.md" + - "**/*.png" + - "**/*.svg" + release: + types: [published] + workflow_dispatch: + +# Cancel if a newer run is started +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NFT_VER: "0.9.4" + NFT_WORKDIR: "~" + NXF_ANSI_LOG: false + NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity + NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity + +jobs: + nf-test-changes: + name: nf-test-changes + runs-on: # use self-hosted runners + - runs-on=${{ github.run_id }}-nf-test-changes + - runner=4cpu-linux-x64 + outputs: + shard: ${{ steps.set-shards.outputs.shard }} + total_shards: ${{ steps.set-shards.outputs.total_shards }} + steps: + - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner + run: | + ls -la ./ + rm -rf ./* || true + rm -rf ./.??* || true + ls -la ./ + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + fetch-depth: 0 + + - name: get number of shards + id: set-shards + uses: ./.github/actions/get-shards + env: + NFT_VER: ${{ env.NFT_VER }} + with: + max_shards: 7 + + - name: debug + run: | + echo ${{ steps.set-shards.outputs.shard }} + echo ${{ steps.set-shards.outputs.total_shards }} + + nf-test: + name: "${{ matrix.profile }} | ${{ matrix.NXF_VER }} | ${{ matrix.shard }}/${{ needs.nf-test-changes.outputs.total_shards }}" + needs: [nf-test-changes] + if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} + runs-on: # use self-hosted runners + - runs-on=${{ github.run_id }}-nf-test + - runner=4cpu-linux-x64 + - volume=40gb + strategy: + fail-fast: false + matrix: + shard: ${{ fromJson(needs.nf-test-changes.outputs.shard) }} + profile: [conda, docker, singularity] + isMain: + - ${{ github.base_ref == 'master' || github.base_ref == 'main' }} + # Exclude conda and singularity on dev + exclude: + - isMain: false + profile: "conda" + - isMain: false + profile: "singularity" + NXF_VER: + - "25.10.4" + - "latest-everything" + env: + NXF_ANSI_LOG: false + TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + fetch-depth: 0 + + - name: Run nf-test + id: run_nf_test + uses: ./.github/actions/nf-test + continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} + env: + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + NXF_VERSION: ${{ matrix.NXF_VER }} + with: + profile: ${{ matrix.profile }} + shard: ${{ matrix.shard }} + total_shards: ${{ env.TOTAL_SHARDS }} + + - name: Report test status + if: ${{ always() }} + run: | + if [[ "${{ steps.run_nf_test.outcome }}" == "failure" ]]; then + echo "::error::Test with ${{ matrix.NXF_VER }} failed" + # Add to workflow summary + echo "## ❌ Test failed: ${{ matrix.profile }} | ${{ matrix.NXF_VER }} | Shard ${{ matrix.shard }}/${{ env.TOTAL_SHARDS }}" >> $GITHUB_STEP_SUMMARY + if [[ "${{ matrix.NXF_VER }}" == "latest-everything" ]]; then + echo "::warning::Test with latest-everything failed but will not cause workflow failure. Please check if the error is expected or if it needs fixing." + fi + if [[ "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + exit 1 + fi + fi + + # continue-on-error keeps latest-everything from failing the job, so it never shows up in + # `needs.nf-test.result` downstream and CI stays green. Surface it via a PR comment instead; + # other NXF_VER failures already fail the job/CI directly, so no comment is needed for those. + - name: Prepare PR comment fragment + if: ${{ always() && steps.run_nf_test.outcome == 'failure' && matrix.NXF_VER == 'latest-everything' }} + run: | + mkdir -p pr-comment-fragment + echo "* ❌ \`${{ matrix.profile }}\` | \`${{ matrix.NXF_VER }}\` | Shard ${{ matrix.shard }}/${{ env.TOTAL_SHARDS }}" > pr-comment-fragment/fragment.md + + - name: Upload PR comment fragment + if: ${{ always() && steps.run_nf_test.outcome == 'failure' && matrix.NXF_VER == 'latest-everything' }} + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: pr-comment-fragment-${{ strategy.job-index }} + path: pr-comment-fragment/ + + confirm-pass: + needs: [nf-test] + if: always() + runs-on: # use self-hosted runners + - runs-on=${{ github.run_id }}-confirm-pass + - runner=2cpu-linux-x64 + steps: + - name: One or more tests failed (excluding latest-everything) + if: ${{ contains(needs.*.result, 'failure') }} + run: exit 1 + + - name: One or more tests cancelled + if: ${{ contains(needs.*.result, 'cancelled') }} + run: exit 1 + + - name: All tests ok + if: ${{ contains(needs.*.result, 'success') }} + run: exit 0 + + - name: debug-print + if: always() + run: | + echo "::group::DEBUG: `needs` Contents" + echo "DEBUG: toJSON(needs) = ${{ toJSON(needs) }}" + echo "DEBUG: toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" + echo "::endgroup::" + + - name: Download PR comment fragments + if: ${{ always() }} + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + continue-on-error: true + with: + pattern: pr-comment-fragment-* + path: pr-comment-fragments + merge-multiple: true + + # Build a comment for the shared pr-comment.yml poster to publish on the PR. + # Based on the fragments above (not needs.*.result) so non-blocking failures are still reported. + - name: Prepare PR comment + if: ${{ always() }} + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + run: | + mkdir -p pr-comment + echo "$PR_NUMBER" > pr-comment/pr_number.txt + echo "nf-test" > pr-comment/header.txt + if [ -d pr-comment-fragments ] && [ -n "$(ls -A pr-comment-fragments)" ]; then + { + echo "## ❌ nf-test failed with latest Nextflow version" + echo "" + echo "> [!NOTE]" + echo "> Tests with Nextflow's latest version failed but it will not cause a CI workflow failure." + echo "> Please check if the failure is expected with newer (edge-)releases of Nextflow or if it needs fixing." + echo "" + cat pr-comment-fragments/*.md + echo "" + echo "See the [full run](${RUN_URL}) for details." + } > pr-comment/comment.md + fi + + - name: Upload PR comment artifact + if: ${{ always() }} + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: pr-comment + path: pr-comment/ diff --git a/.github/workflows/pr-comment.yml b/.github/workflows/pr-comment.yml new file mode 100644 index 00000000..ab7b59dd --- /dev/null +++ b/.github/workflows/pr-comment.yml @@ -0,0 +1,82 @@ +name: Post PR comment +# Shared, privileged comment poster. +# +# This is the single workflow that runs with a write token. It is triggered +# after any of the listed "producer" workflows complete on a pull request. +# Each producer runs untrusted PR code (if any) with a read-only token and +# uploads a `pr-comment` artifact describing the comment to post; this workflow +# only ever reads that plain-text artifact, so no PR code is executed here. +# +# Artifact contract (uploaded by producers under the name `pr-comment`): +# pr_number.txt - the pull request number +# header.txt - sticky-comment identifier (keeps comment types separate) +# comment.md - the Markdown body (omit the file to post nothing) + +on: + workflow_run: + workflows: + - "nf-core linting" + - "nf-core template version comment" + - "nf-core branch protection" + - "Run nf-test" + +permissions: + actions: read + contents: read + pull-requests: write + +jobs: + post-comment: + runs-on: ubuntu-latest + if: github.event.workflow_run.event == 'pull_request' + steps: + - name: Download PR comment artifact + uses: dawidd6/action-download-artifact@b6e2e70617bc3265edd6dab6c906732b2f1ae151 # v21 + with: + run_id: ${{ github.event.workflow_run.id }} + name: pr-comment + path: pr-comment + if_no_artifact_found: ignore + + - name: Read comment metadata + id: meta + run: | + echo "::group::Downloaded pr-comment contents" + ls -la pr-comment 2>/dev/null || echo "No pr-comment/ directory was downloaded." + echo "::endgroup::" + + if [ ! -d pr-comment ]; then + echo "No pr-comment artifact found; nothing to post." + exit 0 + fi + + if [ ! -f pr-comment/comment.md ]; then + echo "Artifact present but no comment.md; nothing to post." + exit 0 + fi + + pr_number=$(cat pr-comment/pr_number.txt) + header=$(cat pr-comment/header.txt) + echo "Found comment.md (header='$header', pr_number='$pr_number')." + + # Guard against anything unexpected ending up in the PR number. + case "$pr_number" in + ''|*[!0-9]*) + echo "Invalid PR number: '$pr_number'" + exit 1 + ;; + esac + + echo "pr_number=$pr_number" >> "$GITHUB_OUTPUT" + echo "header=$header" >> "$GITHUB_OUTPUT" + echo "post=true" >> "$GITHUB_OUTPUT" + echo "Will post comment to PR #${pr_number}." + + - name: Post PR comment + if: steps.meta.outputs.post == 'true' + uses: marocchino/sticky-pull-request-comment@5770ad5eb8f42dd2c4f34da00c94c5381e49af88 # v3.0.5 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + number: ${{ steps.meta.outputs.pr_number }} + header: ${{ steps.meta.outputs.header }} + path: pr-comment/comment.md diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml new file mode 100644 index 00000000..4974f44f --- /dev/null +++ b/.github/workflows/release-announcements.yml @@ -0,0 +1,46 @@ +name: release-announcements +# Automatic release toot and tweet anouncements +on: + release: + types: [published] + workflow_dispatch: + +jobs: + toot: + runs-on: ubuntu-latest + steps: + - name: get topics and convert to hashtags + id: get_topics + run: | + echo "topics=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ')" | sed 's/-//g' >> $GITHUB_OUTPUT + + - name: get description + id: get_description + run: | + echo "description=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .description')" >> $GITHUB_OUTPUT + - uses: rzr/fediverse-action@66c2cbb5b1997666b0e28d597631b6a4f09a2719 # v0.0.6 + with: + access-token: ${{ secrets.MASTODON_ACCESS_TOKEN }} + host: "mstdn.science" # custom host if not "mastodon.social" (default) + # GitHub event payload + # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#release + message: | + Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! + ${{ steps.get_description.outputs.description }} + Please see the changelog: ${{ github.event.release.html_url }} + + ${{ steps.get_topics.outputs.topics }} #nfcore #openscience #nextflow #bioinformatics + + bsky-post: + runs-on: ubuntu-latest + steps: + - uses: zentered/bluesky-post-action@5a91cc2ad10a304a4e96c16182dbe4918710bcf6 # v0.4.0 + with: + post: | + Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! + + Please see the changelog: ${{ github.event.release.html_url }} + env: + BSKY_IDENTIFIER: ${{ secrets.BSKY_IDENTIFIER }} + BSKY_PASSWORD: ${{ secrets.BSKY_PASSWORD }} + # diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml new file mode 100644 index 00000000..ee102f71 --- /dev/null +++ b/.github/workflows/template-version-comment.yml @@ -0,0 +1,60 @@ +name: nf-core template version comment +# This workflow is triggered on PRs to check if the pipeline template version matches the latest nf-core version. +# It posts a comment to the PR, even if it comes from a fork. + +on: + pull_request: + +permissions: {} + +jobs: + check_template_version: + runs-on: ubuntu-latest + steps: + - name: Check out pipeline code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Read template version from .nf-core.yml + uses: nichmor/minimal-read-yaml@1f7205277e25e156e1f63815781db80a6d490b8f # v0.0.2 + id: read_yml + with: + config: ${{ github.workspace }}/.nf-core.yml + + - name: Install nf-core + run: | + python -m pip install --upgrade pip + pip install nf-core + + - name: Build PR comment if template is outdated + # The fork-controlled version is passed via the environment and only ever + # used as quoted shell data (never interpolated into a command), so it + # cannot be used for script injection. + env: + PR_VERSION: ${{ steps.read_yml.outputs['nf_core_version'] }} + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + mkdir -p pr-comment + echo "$PR_NUMBER" > pr-comment/pr_number.txt + echo "template-version" > pr-comment/header.txt + + latest_version=$(nf-core --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n1) + + if [ -n "$PR_VERSION" ] && [ -n "$latest_version" ] && [ "$PR_VERSION" != "$latest_version" ]; then + cat > pr-comment/comment.md < [!WARNING] + > Newer version of the nf-core template is available. + > + > Your pipeline is using an old version of the nf-core template: ${PR_VERSION}. + > Please update your pipeline to the latest version. + > + > For more documentation on how to update your pipeline, please see the [Synchronisation documentation](https://nf-co.re/docs/developing/template-syncs/overview). + EOF + fi + + - name: Upload PR comment artifact + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: pr-comment + path: pr-comment/ diff --git a/.gitignore b/.gitignore index 5124c9ac..80735758 100755 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ results/ testing/ testing* *.pyc +null/ +.nf-test* +.lineage/ diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 85d95ecc..00000000 --- a/.gitpod.yml +++ /dev/null @@ -1,14 +0,0 @@ -image: nfcore/gitpod:latest - -vscode: - extensions: # based on nf-core.nf-core-extensionpack - - codezombiech.gitignore # Language support for .gitignore files - # - cssho.vscode-svgviewer # SVG viewer - - esbenp.prettier-vscode # Markdown/CommonMark linting and style checking for Visual Studio Code - - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed - - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files - - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar - - mechatroner.rainbow-csv # Highlight columns in csv files in different colors - # - nextflow.nextflow # Nextflow syntax highlighting - - oderwat.indent-rainbow # Highlight indentation level - - streetsidesoftware.code-spell-checker # Spelling checker for source code diff --git a/.nf-core.yml b/.nf-core.yml index 3805dc81..2410206e 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1 +1,22 @@ +lint: + files_unchanged: + - .gitignore + merge_markers: + # False positive: SAM base-quality strings contain runs of '<' that trip the + # merge-marker check. Snapshot shipped by nf-core/modules bowtie2/align. + - modules/nf-core/bowtie2/align/tests/main.nf.test.snap + nextflow_config: + - config_defaults: + - params.bamtools_filter_se_config + - params.bamtools_filter_pe_config +nf_core_version: 4.0.3 repository_type: pipeline +template: + author: Patel H, Langer B, Espinosa-Carrasco J, Syme R + description: ATACSeq peak-calling and differential analysis pipeline. + force: false + is_nfcore: true + name: atacseq + org: nf-core + outdir: . + version: 2.2.0dev diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0c31cdb9..f51e1a28 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,33 @@ repos: - repo: https://github.com/pre-commit/mirrors-prettier - rev: "v2.7.1" + rev: "v3.1.0" hooks: - id: prettier + additional_dependencies: + - prettier@3.8.3 + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.0.0 + hooks: + - id: trailing-whitespace + args: [--markdown-linebreak-ext=md] + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/(?!local/).*| + subworkflows/(?!local/).*| + .*\.snap$ + )$ + - id: end-of-file-fixer + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/(?!local/).*| + subworkflows/(?!local/).*| + .*\.snap$ + )$ + - repo: https://github.com/seqeralabs/nf-lint-pre-commit + rev: v0.3.0 + hooks: + - id: nextflow-lint + files: '\.nf$|nextflow\.config$' + args: ["-output", "json"] diff --git a/.prettierignore b/.prettierignore index 437d763d..63cde500 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,6 +1,4 @@ email_template.html -adaptivecard.json -slackreport.json .nextflow* work/ data/ @@ -10,3 +8,7 @@ testing/ testing* *.pyc bin/ +.nf-test/ +ro-crate-metadata.json +modules/nf-core/ +subworkflows/nf-core/ diff --git a/.prettierrc.yml b/.prettierrc.yml index c81f9a76..07dbd8bb 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -1 +1,6 @@ printWidth: 120 +tabWidth: 4 +overrides: + - files: "*.{md,yml,yaml,html,css,scss,js,cff}" + options: + tabWidth: 2 diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..a33b527c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "markdown.styles": ["public/vscode_markdown.css"] +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a63e435..32b199a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,30 +3,136 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## v2.1dev - [date] +## v2.2.0dev - [date] ### Enhancements & fixes +- [[#466]](https://github.com/nf-core/atacseq/pull/466) - Run the `test_controls` profile in `tests/controls.nf.test` and set `with_control = true` in it, so CI exercises `--with_control`. +- [[#448]](https://github.com/nf-core/atacseq/pull/448) - Update nf-core modules and subworkflows to their latest versions and reconcile the resulting call-signature changes. +- [[#448]](https://github.com/nf-core/atacseq/pull/448) - Add read groups to Chromap alignments, which Picard 3.4.0 `MarkDuplicates` now requires. +- [[#448]](https://github.com/nf-core/atacseq/pull/448) - Quote `--seq_center` when building read-group arguments, so a sequencing-centre name containing whitespace no longer breaks Chromap (Picard) or Bowtie2 alignment. +- [[#448]](https://github.com/nf-core/atacseq/pull/448) - Pin `subread` to 2.0.1 so consensus peak counting keeps supporting mixed single-end/paired-end cohorts in a single `featureCounts` invocation. +- [[#448]](https://github.com/nf-core/atacseq/pull/448) - Sort the consensus `featureCounts` BAM inputs so the count matrix column order is deterministic. +- [[#448]](https://github.com/nf-core/atacseq/pull/448) - Consensus peak counts are now published as `*.featureCounts.tsv` (and `*.featureCounts.tsv.summary`) instead of `*.featureCounts.txt`, following the updated `subread/featurecounts` module. +- [[#446]](https://github.com/nf-core/atacseq/pull/446) - Make pipeline code compliant with strict Nextflow v2 syntax parser, with no behaviour change. +- [[#407]](https://github.com/nf-core/atacseq/pull/407) to add filtering reads according fragment size to help to focus on NFR, MNR, DNR, TNR +- [[#164]](https://github.com/nf-core/atacseq/issues/164) and partly [[#91]](https://github.com/nf-core/atacseq/issues/91) with code from [[#301]](https://github.com/nf-core/atacseq/pull/301) to address shifting of reads as an option that is turned off by default. +- [[#327](https://github.com/nf-core/atacseq/issues/327)] - Consistently support `.csi` indices as alternative to `.bai` to allow SAMTOOLS_INDEX to be used with the `-c` flag. +- [[#356](https://github.com/nf-core/atacseq/issues/356)] - Get rid of the `lib` folder and rearrange the pipeline accordingly. +- [[#379](https://github.com/nf-core/atacseq/pull/356)] - Use macs3 instead of macs2. +- Updated pipeline template to [nf-core/tools 2.14.1](https://github.com/nf-core/tools/releases/tag/2.14.1) +- [[#359](https://github.com/nf-core/atacseq/issues/359)] - Fix `--save_unaligned` description in schema. +- [[#344](https://github.com/nf-core/atacseq/issues/344)] - Fix memory issues when sorting merged replicates after `bedtools genomecov`. +- [[#338](https://github.com/nf-core/atacseq/issues/338)] - Check that samplesheet samples IDs do only have alphanumeric characters, dots, dashes or underscores. +- [[#370](https://github.com/nf-core/atacseq/issues/370)] - Adding line numbers to errors messages in `bin/check_samplesheet.py`. +- [[#381](https://github.com/nf-core/atacseq/issues/381)] - Set chromap to no shift reads by default and install `deeptools/alignmentsieve` from modules. +- Updated pipeline template to [nf-core/tools 3.1.1](https://github.com/nf-core/tools/releases/tag/3.1.1) +- Updated pipeline template to [nf-core/tools 3.4.1](https://github.com/nf-core/tools/releases/tag/3.4.1) +- [[#427](https://github.com/nf-core/atacseq/issues/427)] - Implements default nf-test at the pipeline level. +- [[#436]](https://github.com/nf-core/atacseq/pull/436) - Fix strict syntax. +- [[437](https://github.com/nf-core/atacseq/issues/437)] - Follow up to 436. +- [[#438](https://github.com/nf-core/atacseq/issues/438)] - Add `checkIfExists` to file inputs in `PREPARE_GENOME` and prevent S3 access errors during index validation. +- [[PR #443](https://github.com/nf-core/atacseq/pull/443)] - Updated pipeline template to [nf-core/tools 4.0.2](https://github.com/nf-core/tools/releases/tag/4.0.2) +- [[PR #453](https://github.com/nf-core/atacseq/pull/453)] - Updated pipeline template to [nf-core/tools 4.0.3](https://github.com/nf-core/tools/releases/tag/4.0.3) +- [[PR #454](https://github.com/nf-core/atacseq/pull/454)] - Sort the peak QC plot inputs by file name so that `PLOT_MACS3_QC` and `PLOT_HOMER_ANNOTATEPEAKS` outputs no longer depend on task completion order. + +### Parameters + +| Old parameter | New parameter | +| ------------- | -------------------------------- | +| | `--skip_merged_replicate_bigwig` | + +> **NB:** Parameter has been **updated** if both old and new parameter information is present. +> **NB:** Parameter has been **added** if just the new parameter information is present. +> **NB:** Parameter has been **removed** if parameter information isn't present. + +### Software dependencies + +Note, since the pipeline is now using Nextflow DSL2, each process will be run with its own [Biocontainer](https://biocontainers.pro/#/registry). This means that on occasion it is entirely possible for the pipeline to be using different versions of the same tool. However, the overall software dependency changes compared to the last release have been listed below for reference. + +| Dependency | Old version | New version | +| ----------------------- | ----------- | ----------- | +| `bowtie2` | 2.4.4 | 2.5.4 | +| `bwa` | 0.7.17 | 0.7.19 | +| `chromap` | 0.2.4 | 0.3.2 | +| `deeptools` | 3.5.1 | 3.5.6 | +| `gffread` | 0.12.1 | 0.12.7 | +| `macs2` | 2.2.7.1 | | +| `macs3` | | 3.0.4 | +| `picard` | 3.0.0 | 3.4.0 | +| `preseq` | 3.1.2 | 3.2.0 | +| `samtools` | 1.17 | 1.24 | +| `trim-galore` | 0.6.7 | 2.1.0 | +| `ucsc-bedgraphtobigwig` | 445 | 482 | + +## [[2.1.2](https://github.com/nf-core/atacseq/releases/tag/2.1.2)] - 2022-08-07 + +### Enhancements & fixes + +- [[#322](https://github.com/nf-core/atacseq/issues/322)]Remove fasta from required schema parameters so that when launching from tools it is not required. +- Updates `homer_annotatepeaks` module. + +## [[2.1.1](https://github.com/nf-core/atacseq/releases/tag/2.1.1)] - 2022-07-21 + +- Minor patch release to fix AWS full test. + +## [[2.1.0](https://github.com/nf-core/atacseq/releases/tag/2.1.0)] - 2022-07-21 + +### Credits + +Special thanks to the following for their contributions to the release: + +- [Adam Talbot](https://github.com/adamrtalbot) +- [Björn Langer](https://github.com/bjlang) +- [Harshil Patel](https://github.com/drpatelh) +- [Maxime Garcia](https://github.com/maxulysse) +- [Rob Syme](https://github.com/robsyme) + +Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. + +### Enhancements & fixes + +- [[#226](https://github.com/nf-core/atacseq/issues/262)] - Add `ataqv_mito_reference` parameter. - Optional support of control data analog to nf-core/chipseq. -- Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) -- Add public_aws_ecr profile for using containers hosted on ECR. - [[#277](https://github.com/nf-core/atacseq/issues/277)] - Fix error when using a gunziped fasta file. - [[#286](https://github.com/nf-core/atacseq/issues/286)] - Fix error when no `--mito_name parameter is provided. - [[#268](https://github.com/nf-core/atacseq/issues/268)] - Fix error when a bed file is provided using the `--blacklist` option. - [[#278](https://github.com/nf-core/atacseq/issues/278)] - Make genome fasta file available when `IGV` process is run. - [[#276](https://github.com/nf-core/atacseq/issues/276)] - Bump version 1.3.1 of ataqv to fix enrichment plots rendering. -- [[#290](https://github.com/nf-core/atacseq/issues/290)] - Fix case-sensitivity issue while sorting bedGraph +- [[#290](https://github.com/nf-core/atacseq/issues/290)] - Fix case-sensitivity issue while sorting bedGraph. +- [[#295](https://github.com/nf-core/atacseq/issues/295)] - Enable downstream steps for bam files produced from paired-end reads by `chromap` after its upgrade. +- Updated pipeline template to [nf-core/tools 2.9](https://github.com/nf-core/tools/releases/tag/2.9) +- Make fasta index available for IGV session. +- [[nf-core/chipseq#347](https://github.com/nf-core/chipseq/issues/347)] - Add read group tag to bam files processed by bowtie2 ### Parameters -| Old parameter | New parameter | -| ------------- | ---------------- | -| | `--with_control` | +| Old parameter | New parameter | +| ------------- | ------------------------ | +| | `--with_control` | +| | `--ataqv_mito_reference` | > **NB:** Parameter has been **updated** if both old and new parameter information is present. > **NB:** Parameter has been **added** if just the new parameter information is present. > **NB:** Parameter has been **removed** if parameter information isn't present. +### Software dependencies + +Note, since the pipeline is now using Nextflow DSL2, each process will be run with its own [Biocontainer](https://biocontainers.pro/#/registry). This means that on occasion it is entirely possible for the pipeline to be using different versions of the same tool. However, the overall software dependency changes compared to the last release have been listed below for reference. + +| Dependency | Old version | New version | +| ----------------------- | ----------- | ----------- | +| `ataqv` | 1.3.0 | 1.3.1 | +| `chromap` | 0.2.1 | 0.2.4 | +| `multiqc` | 1.13 | 1.14 | +| `picard` | 2.27.4 | 3.0.0 | +| `samtools` | 1.15.1 | 1.17 | +| `ucsc-bedgraphtobigwig` | 377 | 445 | + +> **NB:** Dependency has been **updated** if both old and new version information is present. +> **NB:** Dependency has been **added** if just the new version information is present. +> **NB:** Dependency has been **removed** if version information isn't present. + ## [[2.0](https://github.com/nf-core/atacseq/releases/tag/2.0)] - 2022-11-30 ### :warning: Major enhancements @@ -209,7 +315,7 @@ Note, since the pipeline is now using Nextflow DSL2, each process will be run wi ### `Fixed` -- **Change all parameters from `camelCase` to `snake_case` (see [Deprecated](#Deprecated))** +- **Change all parameters from `camelCase` to `snake_case` (see [Deprecated](#deprecated))** - [#41](https://github.com/nf-core/atacseq/issues/41) - Docs: Add example plot images - [#44](https://github.com/nf-core/atacseq/issues/44) - Output directory missing: macs2/consensus/deseq2 - [#45](https://github.com/nf-core/atacseq/issues/45) - Wrong x-axis scale for the HOMER: Peak annotation Counts tab plot? diff --git a/CITATIONS.md b/CITATIONS.md index e12945ff..dcb2fef3 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -28,6 +28,8 @@ - [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) +> Andrews, S. (2010). FastQC: A Quality Control Tool for High Throughput Sequence Data [Online]. + - [featureCounts](https://www.ncbi.nlm.nih.gov/pubmed/24227677/) > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677. @@ -36,13 +38,13 @@ > Heinz S, Benner C, Spann N, Bertolino E, Lin YC, Laslo P, Cheng JX, Murre C, Singh H, Glass CK. Simple combinations of lineage-determining transcription factors prime cis-regulatory elements required for macrophage and B cell identities. Mol Cell. 2010 May 28;38(4):576-89. doi: 10.1016/j.molcel.2010.05.004. PubMed PMID: 20513432; PubMed Central PMCID: PMC2898526. -- [MACS2](https://www.ncbi.nlm.nih.gov/pubmed/18798982/) +- [MACS3](https://www.ncbi.nlm.nih.gov/pubmed/18798982/) > Zhang Y, Liu T, Meyer CA, Eeckhoute J, Johnson DS, Bernstein BE, Nusbaum C, Myers RM, Brown M, Li W, Liu XS. Model-based analysis of ChIP-Seq (MACS). Genome Biol. 2008;9(9):R137. doi: 10.1186/gb-2008-9-9-r137. Epub 2008 Sep 17. PubMed PMID: 18798982; PubMed Central PMCID: PMC2592715. - [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) - > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. +> Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. - [picard-tools](http://broadinstitute.github.io/picard) @@ -118,5 +120,8 @@ - [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241) + > Merkel, D. (2014). Docker: lightweight linux containers for consistent development and deployment. Linux Journal, 2014(239), 2. doi: 10.5555/2600239.2600241. + - [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/) + > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f4fd052f..c089ec78 100755 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,18 +1,20 @@ -# Code of Conduct at nf-core (v1.0) +# Code of Conduct at nf-core (v1.4) ## Our Pledge -In the interest of fostering an open, collaborative, and welcoming environment, we as contributors and maintainers of nf-core, pledge to making participation in our projects and community a harassment-free experience for everyone, regardless of: +In the interest of fostering an open, collaborative, and welcoming environment, we as contributors and maintainers of nf-core pledge to making participation in our projects and community a harassment-free experience for everyone, regardless of: - Age +- Ability - Body size +- Caste - Familial status - Gender identity and expression - Geographical location - Level of experience - Nationality and national origins - Native language -- Physical and neurological ability +- Neurodiversity - Race or ethnicity - Religion - Sexual identity and orientation @@ -22,80 +24,133 @@ Please note that the list above is alphabetised and is therefore not ranked in a ## Preamble -> Note: This Code of Conduct (CoC) has been drafted by the nf-core Safety Officer and been edited after input from members of the nf-core team and others. "We", in this document, refers to the Safety Officer and members of the nf-core core team, both of whom are deemed to be members of the nf-core community and are therefore required to abide by this Code of Conduct. This document will amended periodically to keep it up-to-date, and in case of any dispute, the most current version will apply. +:::note +This Code of Conduct (CoC) has been drafted by Renuka Kudva, Cris Tuñí, and Michael Heuer, with input from the nf-core Core Team and Susanna Marquez from the nf-core community. "We", in this document, refers to the Safety Officers and members of the nf-core Core Team, both of whom are deemed to be members of the nf-core community and are therefore required to abide by this Code of Conduct. This document will be amended periodically to keep it up-to-date. In case of any dispute, the most current version will apply. +::: -An up-to-date list of members of the nf-core core team can be found [here](https://nf-co.re/about). Our current safety officer is Renuka Kudva. +An up-to-date list of members of the nf-core core team can be found [here](https://nf-co.re/about). + +Our Safety Officers are Saba Nafees, Cris Tuñí, and Michael Heuer. nf-core is a young and growing community that welcomes contributions from anyone with a shared vision for [Open Science Policies](https://www.fosteropenscience.eu/taxonomy/term/8). Open science policies encompass inclusive behaviours and we strive to build and maintain a safe and inclusive environment for all individuals. -We have therefore adopted this code of conduct (CoC), which we require all members of our community and attendees in nf-core events to adhere to in all our workspaces at all times. Workspaces include but are not limited to Slack, meetings on Zoom, Jitsi, YouTube live etc. +We have therefore adopted this CoC, which we require all members of our community and attendees of nf-core events to adhere to in all our workspaces at all times. Workspaces include, but are not limited to, Slack, meetings on Zoom, gather.town, YouTube live etc. -Our CoC will be strictly enforced and the nf-core team reserve the right to exclude participants who do not comply with our guidelines from our workspaces and future nf-core activities. +Our CoC will be strictly enforced and the nf-core team reserves the right to exclude participants who do not comply with our guidelines from our workspaces and future nf-core activities. -We ask all members of our community to help maintain a supportive and productive workspace and to avoid behaviours that can make individuals feel unsafe or unwelcome. Please help us maintain and uphold this CoC. +We ask all members of our community to help maintain supportive and productive workspaces and to avoid behaviours that can make individuals feel unsafe or unwelcome. Please help us maintain and uphold this CoC. -Questions, concerns or ideas on what we can include? Contact safety [at] nf-co [dot] re +Questions, concerns, or ideas on what we can include? Contact members of the Safety Team on Slack or email safety [at] nf-co [dot] re. ## Our Responsibilities -The safety officer is 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 behaviour. +Members of the Safety Team (the Safety Officers) 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 behaviour. -The safety officer in consultation with the nf-core core team 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. +The Safety Team, in consultation with the nf-core core team, 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 CoC, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. -Members of the core team or the safety officer who violate the CoC will be required to recuse themselves pending investigation. They will not have access to any reports of the violations and be subject to the same actions as others in violation of the CoC. +Members of the core team or the Safety Team who violate the CoC will be required to recuse themselves pending investigation. They will not have access to any reports of the violations and will be subject to the same actions as others in violation of the CoC. -## When are where does this Code of Conduct apply? +## When and where does this Code of Conduct apply? -Participation in the nf-core community is contingent on following these guidelines in all our workspaces and events. This includes but is not limited to the following listed alphabetically and therefore in no order of preference: +Participation in the nf-core community is contingent on following these guidelines in all our workspaces and events, such as hackathons, workshops, bytesize, and collaborative workspaces on gather.town. These guidelines include, but are not limited to, the following (listed alphabetically and therefore in no order of preference): - Communicating with an official project email address. - Communicating with community members within the nf-core Slack channel. - Participating in hackathons organised by nf-core (both online and in-person events). -- Participating in collaborative work on GitHub, Google Suite, community calls, mentorship meetings, email correspondence. -- Participating in workshops, training, and seminar series organised by nf-core (both online and in-person events). This applies to events hosted on web-based platforms such as Zoom, Jitsi, YouTube live etc. +- Participating in collaborative work on GitHub, Google Suite, community calls, mentorship meetings, email correspondence, and on the nf-core gather.town workspace. +- Participating in workshops, training, and seminar series organised by nf-core (both online and in-person events). This applies to events hosted on web-based platforms such as Zoom, gather.town, Jitsi, YouTube live etc. - Representing nf-core on social media. This includes both official and personal accounts. ## nf-core cares 😊 -nf-core's CoC and expectations of respectful behaviours for all participants (including organisers and the nf-core team) include but are not limited to the following (listed in alphabetical order): +nf-core's CoC and expectations of respectful behaviours for all participants (including organisers and the nf-core team) include, but are not limited to, the following (listed in alphabetical order): - Ask for consent before sharing another community member’s personal information (including photographs) on social media. - Be respectful of differing viewpoints and experiences. We are all here to learn from one another and a difference in opinion can present a good learning opportunity. -- Celebrate your accomplishments at events! (Get creative with your use of emojis 🎉 🥳 💯 🙌 !) +- Celebrate your accomplishments! (Get creative with your use of emojis 🎉 🥳 💯 🙌 !) - Demonstrate empathy towards other community members. (We don’t all have the same amount of time to dedicate to nf-core. If tasks are pending, don’t hesitate to gently remind members of your team. If you are leading a task, ask for help if you feel overwhelmed.) - Engage with and enquire after others. (This is especially important given the geographically remote nature of the nf-core community, so let’s do this the best we can) - Focus on what is best for the team and the community. (When in doubt, ask) -- Graciously accept constructive criticism, yet be unafraid to question, deliberate, and learn. +- Accept feedback, yet be unafraid to question, deliberate, and learn. - Introduce yourself to members of the community. (We’ve all been outsiders and we know that talking to strangers can be hard for some, but remember we’re interested in getting to know you and your visions for open science!) -- Show appreciation and **provide clear feedback**. (This is especially important because we don’t see each other in person and it can be harder to interpret subtleties. Also remember that not everyone understands a certain language to the same extent as you do, so **be clear in your communications to be kind.**) +- Show appreciation and **provide clear feedback**. (This is especially important because we don’t see each other in person and it can be harder to interpret subtleties. Also remember that not everyone understands a certain language to the same extent as you do, so **be clear in your communication to be kind.**) - Take breaks when you feel like you need them. -- Using welcoming and inclusive language. (Participants are encouraged to display their chosen pronouns on Zoom or in communication on Slack.) +- Use welcoming and inclusive language. (Participants are encouraged to display their chosen pronouns on Zoom or in communication on Slack) ## nf-core frowns on 😕 -The following behaviours from any participants within the nf-core community (including the organisers) will be considered unacceptable under this code of conduct. Engaging or advocating for any of the following could result in expulsion from nf-core workspaces. +The following behaviours from any participants within the nf-core community (including the organisers) will be considered unacceptable under this CoC. Engaging or advocating for any of the following could result in expulsion from nf-core workspaces: - Deliberate intimidation, stalking or following and sustained disruption of communication among participants of the community. This includes hijacking shared screens through actions such as using the annotate tool in conferencing software such as Zoom. - “Doxing” i.e. posting (or threatening to post) another person’s personal identifying information online. - Spamming or trolling of individuals on social media. -- Use of sexual or discriminatory imagery, comments, or jokes and unwelcome sexual attention. -- Verbal and text comments that reinforce social structures of domination related to gender, gender identity and expression, sexual orientation, ability, physical appearance, body size, race, age, religion or work experience. +- Use of sexual or discriminatory imagery, comments, jokes, or unwelcome sexual attention. +- Verbal and text comments that reinforce social structures of domination related to gender, gender identity and expression, sexual orientation, ability, physical appearance, body size, race, age, religion, or work experience. ### Online Trolling -The majority of nf-core interactions and events are held online. Unfortunately, holding events online comes with the added issue of online trolling. This is unacceptable, reports of such behaviour will be taken very seriously, and perpetrators will be excluded from activities immediately. +The majority of nf-core interactions and events are held online. Unfortunately, holding events online comes with the risk of online trolling. This is unacceptable — reports of such behaviour will be taken very seriously and perpetrators will be excluded from activities immediately. -All community members are required to ask members of the group they are working within for explicit consent prior to taking screenshots of individuals during video calls. +All community members are **required** to ask members of the group they are working with for explicit consent prior to taking screenshots of individuals during video calls. -## Procedures for Reporting CoC violations +## Procedures for reporting CoC violations If someone makes you feel uncomfortable through their behaviours or actions, report it as soon as possible. -You can reach out to members of the [nf-core core team](https://nf-co.re/about) and they will forward your concerns to the safety officer(s). +You can reach out to members of the Safety Team (Saba Nafees, Cris Tuñí, and Michael Heuer) on Slack. Alternatively, contact a member of the nf-core core team [nf-core core team](https://nf-co.re/about), and they will forward your concerns to the Safety Team. + +Issues directly concerning members of the Core Team or the Safety Team will be dealt with by other members of the core team and the safety manager — possible conflicts of interest will be taken into account. nf-core is also in discussions about having an ombudsperson and details will be shared in due course. + +All reports will be handled with the utmost discretion and confidentiality. + +You can also report any CoC violations to safety [at] nf-co [dot] re. In your email report, please do your best to include: + +- Your contact information. +- Identifying information (e.g. names, nicknames, pseudonyms) of the participant who has violated the Code of Conduct. +- The behaviour that was in violation and the circumstances surrounding the incident. +- The approximate time of the behaviour (if different than the time the report was made). +- Other people involved in the incident, if applicable. +- If you believe the incident is ongoing. +- If there is a publicly available record (e.g. mailing list record, a screenshot). +- Any additional information. + +After you file a report, one or more members of our Safety Team will contact you to follow up on your report. + +## Who will read and handle reports + +All reports will be read and handled by the members of the Safety Team at nf-core. + +If members of the Safety Team are deemed to have a conflict of interest with a report, they will be required to recuse themselves as per our Code of Conduct and will not have access to any follow-ups. + +To keep this first report confidential from any of the Safety Team members, please submit your first report by direct messaging on Slack/direct email to any of the nf-core members you are comfortable disclosing the information to, and be explicit about which member(s) you do not consent to sharing the information with. + +## Reviewing reports + +After receiving the report, members of the Safety Team will review the incident report to determine whether immediate action is required, for example, whether there is immediate threat to participants’ safety. + +The Safety Team, in consultation with members of the nf-core core team, will assess the information to determine whether the report constitutes a Code of Conduct violation, for them to decide on a course of action. + +In the case of insufficient information, one or more members of the Safety Team may contact the reporter, the reportee, or any other attendees to obtain more information. -Issues directly concerning members of the core team will be dealt with by other members of the core team and the safety manager, and possible conflicts of interest will be taken into account. nf-core is also in discussions about having an ombudsperson, and details will be shared in due course. +Once additional information is gathered, the Safety Team will collectively review and decide on the best course of action to take, if any. The Safety Team reserves the right to not act on a report. -All reports will be handled with utmost discretion and confidentially. +## Confidentiality + +All reports, and any additional information included, are only shared with the team of safety officers (and possibly members of the core team, in case the safety officer is in violation of the CoC). We will respect confidentiality requests for the purpose of protecting victims of abuse. + +We will not name harassment victims, beyond discussions between the safety officer and members of the nf-core team, without the explicit consent of the individuals involved. + +## Enforcement + +Actions taken by the nf-core’s Safety Team may include, but are not limited to: + +- Asking anyone to stop a behaviour. +- Asking anyone to leave the event and online spaces either temporarily, for the remainder of the event, or permanently. +- Removing access to the gather.town and Slack, either temporarily or permanently. +- Communicating to all participants to reinforce our expectations for conduct and remind what is unacceptable behaviour; this may be public for practical reasons. +- Communicating to all participants that an incident has taken place and how we will act or have acted — this may be for the purpose of letting event participants know we are aware of and dealing with the incident. +- Banning anyone from participating in nf-core-managed spaces, future events, and activities, either temporarily or permanently. +- No action. ## Attribution and Acknowledgements @@ -106,6 +161,22 @@ All reports will be handled with utmost discretion and confidentially. ## Changelog -### v1.0 - March 12th, 2021 +### v1.4 - February 8th, 2022 + +- Included a new member of the Safety Team. Corrected a typographical error in the text. + +### v1.3 - December 10th, 2021 + +- Added a statement that the CoC applies to nf-core gather.town workspaces. Corrected typographical errors in the text. + +### v1.2 - November 12th, 2021 + +- Removed information specific to reporting CoC violations at the Hackathon in October 2021. + +### v1.1 - October 14th, 2021 + +- Updated with names of new Safety Officers and specific information for the hackathon in October 2021. + +### v1.0 - March 15th, 2021 - Complete rewrite from original [Contributor Covenant](http://contributor-covenant.org/) CoC. diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 index 83523913..8edb3f70 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) Patel H, Langer B, Espinosa-Carrasco J, Syme R +Copyright (c) The nf-core/atacseq team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 2cc0a8b8..ee46a51d 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,27 @@ -# ![nf-core/atacseq](docs/images/nf-core-atacseq_logo_light.png#gh-light-mode-only) ![nf-core/atacseq](docs/images/nf-core-atacseq_logo_dark.png#gh-dark-mode-only) - -[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/atacseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.2634132-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.2634132) - -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A522.10.1-23aa62.svg)](https://www.nextflow.io/) +

+ + + nf-core/atacseq + +

+ +[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/atacseq) +[![GitHub Actions CI Status](https://github.com/nf-core/atacseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/atacseq/actions/workflows/nf-test.yml) +[![GitHub Actions Linting Status](https://github.com/nf-core/atacseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/atacseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/atacseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) +[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) + +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.10.4-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-4.0.3-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.0.3) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) -[![Launch on Nextflow Tower](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Nextflow%20Tower-%234256e7)](https://tower.nf/launch?pipeline=https://github.com/nf-core/atacseq) +[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/atacseq) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23atacseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/atacseq)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23atacseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/atacseq)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) ## Introduction -**nfcore/atacseq** is a bioinformatics analysis pipeline used for ATAC-seq data. +**nf-core/atacseq** is a bioinformatics analysis pipeline used for ATAC-seq data. 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 uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! @@ -49,7 +58,7 @@ On release, automated continuous integration tests run the pipeline on a full-si 4. Create normalised bigWig files scaled to 1 million mapped reads ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/)) 5. Generate gene-body meta-profile from bigWig files ([`deepTools`](https://deeptools.readthedocs.io/en/develop/content/tools/plotProfile.html)) 6. Calculate genome-wide enrichment (optionally relative to control) ([`deepTools`](https://deeptools.readthedocs.io/en/develop/content/tools/plotFingerprint.html)) - 7. Call broad/narrow peaks ([`MACS2`](https://github.com/macs3-project/MACS)) + 7. Call broad/narrow peaks ([`MACS3`](https://github.com/macs3-project/MACS)) 8. Annotate peaks relative to gene features ([`HOMER`](http://homer.ucsd.edu/homer/download.html)) 9. Create consensus peakset across all samples and create tabular file to aid in the filtering of the data ([`BEDTools`](https://github.com/arq5x/bedtools2/)) 10. Count reads in consensus peaks ([`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/)) @@ -59,7 +68,7 @@ On release, automated continuous integration tests run the pipeline on a full-si 1. Re-mark duplicates ([`picard`](https://broadinstitute.github.io/picard/)) 2. Remove duplicate reads ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) 3. Create normalised bigWig files scaled to 1 million mapped reads ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/)) - 4. Call broad/narrow peaks ([`MACS2`](https://github.com/macs3-project/MACS)) + 4. Call broad/narrow peaks ([`MACS3`](https://github.com/macs3-project/MACS)) 5. Annotate peaks relative to gene features ([`HOMER`](http://homer.ucsd.edu/homer/download.html)) 6. Create consensus peakset across all samples and create tabular file to aid in the filtering of the data ([`BEDTools`](https://github.com/arq5x/bedtools2/)) 7. Count reads in consensus peaks relative to merged library-level alignments ([`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/)) @@ -69,38 +78,34 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Usage -> **Note** -> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how -> to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) -> with `-profile test` before running the workflow on actual data. +> [!NOTE] +> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/get_started/environment_setup/overview) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/get_started/run-your-first-pipeline) with `-profile test` before running the workflow on actual data. To run on your data, prepare a tab-separated samplesheet with your input data. Please follow the [documentation on samplesheets](https://nf-co.re/atacseq/usage#samplesheet-input) for more details. An example samplesheet for running the pipeline looks as follows: ```csv sample,fastq_1,fastq_2,replicate -CONTROL,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1 -CONTROL,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz,2 -CONTROL,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz,3 +SAMPLE_A,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1 +SAMPLE_A,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz,2 +SAMPLE_A,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz,3 ``` Now, you can run the pipeline using: ```bash -nextflow run nf-core/atacseq --input samplesheet.csv --outdir --genome GRCh37 -profile +nextflow run nf-core/atacseq --input samplesheet.csv --outdir --genome GRCh37 --read_length <50|100|150|200> -profile ``` See [usage docs](https://nf-co.re/atacseq/usage) for all of the available options when running the pipeline. -> **Warning:** -> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those -> provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; -> see [docs](https://nf-co.re/usage/configuration#custom-configuration-files). +> [!WARNING] +> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/running/run-pipelines#using-parameter-files). -For more details, please refer to the [usage documentation](https://nf-co.re/atacseq/usage) and the [parameter documentation](https://nf-co.re/atacseq/parameters). +For more details and further functionality, please refer to the [usage documentation](https://nf-co.re/atacseq/usage) and the [parameter documentation](https://nf-co.re/atacseq/parameters). ## Pipeline output -To see the the results of a test run with a full size dataset refer to the [results](https://nf-co.re/atacseq/results) tab on the nf-core website pipeline page. +To see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/atacseq/results) tab on the nf-core website pipeline page. For more details about the output files and reports, please refer to the [output documentation](https://nf-co.re/atacseq/output). @@ -112,7 +117,7 @@ Many thanks to others who have helped out and contributed along the way too, inc ## Contributions and Support -If you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md). +If you would like to contribute to this pipeline, please see the [contributing guidelines](docs/CONTRIBUTING.md). For further information or help, don't hesitate to get in touch on the [Slack `#atacseq` channel](https://nfcore.slack.com/channels/atacseq) (you can join with [this invite](https://nf-co.re/join/slack)). diff --git a/assets/adaptivecard.json b/assets/adaptivecard.json deleted file mode 100644 index f0ce0a10..00000000 --- a/assets/adaptivecard.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "type": "message", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.adaptive", - "contentUrl": null, - "content": { - "\$schema": "http://adaptivecards.io/schemas/adaptive-card.json", - "msteams": { - "width": "Full" - }, - "type": "AdaptiveCard", - "version": "1.2", - "body": [ - { - "type": "TextBlock", - "size": "Large", - "weight": "Bolder", - "color": "<% if (success) { %>Good<% } else { %>Attention<%} %>", - "text": "nf-core/atacseq v${version} - ${runName}", - "wrap": true - }, - { - "type": "TextBlock", - "spacing": "None", - "text": "Completed at ${dateComplete} (duration: ${duration})", - "isSubtle": true, - "wrap": true - }, - { - "type": "TextBlock", - "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors. The full error message was: ${errorReport}.<% } %>", - "wrap": true - }, - { - "type": "TextBlock", - "text": "The command used to launch the workflow was as follows:", - "wrap": true - }, - { - "type": "TextBlock", - "text": "${commandLine}", - "isSubtle": true, - "wrap": true - } - ], - "actions": [ - { - "type": "Action.ShowCard", - "title": "Pipeline Configuration", - "card": { - "type": "AdaptiveCard", - "\$schema": "http://adaptivecards.io/schemas/adaptive-card.json", - "body": [ - { - "type": "FactSet", - "facts": [<% out << summary.collect{ k,v -> "{\"title\": \"$k\", \"value\" : \"$v\"}"}.join(",\n") %> - ] - } - ] - } - } - ] - } - } - ] -} diff --git a/assets/email_template.html b/assets/email_template.html index 35af3d34..edf788d0 100755 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -12,7 +12,7 @@ -

nf-core/atacseq v${version}

+

nf-core/atacseq ${version}

Run Name: $runName

<% if (!success){ diff --git a/assets/email_template.txt b/assets/email_template.txt index d3111931..c371f3be 100644 --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -4,7 +4,7 @@ |\\ | |__ __ / ` / \\ |__) |__ } { | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, `._,._,' - nf-core/atacseq v${version} + nf-core/atacseq ${version} ---------------------------------------------------- Run Name: $runName diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml index 4257efce..8789a829 100644 --- a/assets/methods_description_template.yml +++ b/assets/methods_description_template.yml @@ -3,17 +3,21 @@ description: "Suggested text and references to use when describing pipeline usag section_name: "nf-core/atacseq Methods Description" section_href: "https://github.com/nf-core/atacseq" plot_type: "html" -## TODO nf-core: Update the HTML below to your prefered methods description, e.g. add publication citation for this pipeline +## TODO nf-core: Update the HTML below to your preferred methods description, e.g. add publication citation for this pipeline ## You inject any metadata in the Nextflow '${workflow}' object data: |

Methods

-

Data was processed using nf-core/atacseq v${workflow.manifest.version} ${doi_text} of the nf-core collection of workflows (Ewels et al., 2020).

+

Data was processed using nf-core/atacseq v${workflow.manifest.version} ${doi_text} of the nf-core collection of workflows (Ewels et al., 2020), utilising reproducible software environments from the Bioconda (Grüning et al., 2018) and Biocontainers (da Veiga Leprevost et al., 2017) projects.

The pipeline was executed with Nextflow v${workflow.nextflow.version} (Di Tommaso et al., 2017) with the following command:

${workflow.commandLine}
+

${tool_citations}

References

    -
  • Di Tommaso, P., Chatzou, M., Floden, E. W., Barja, P. P., Palumbo, E., & Notredame, C. (2017). Nextflow enables reproducible computational workflows. Nature Biotechnology, 35(4), 316-319. https://doi.org/10.1038/nbt.3820
  • -
  • Ewels, P. A., Peltzer, A., Fillinger, S., Patel, H., Alneberg, J., Wilm, A., Garcia, M. U., Di Tommaso, P., & Nahnsen, S. (2020). The nf-core framework for community-curated bioinformatics pipelines. Nature Biotechnology, 38(3), 276-278. https://doi.org/10.1038/s41587-020-0439-x
  • +
  • Di Tommaso, P., Chatzou, M., Floden, E. W., Barja, P. P., Palumbo, E., & Notredame, C. (2017). Nextflow enables reproducible computational workflows. Nature Biotechnology, 35(4), 316-319. doi: 10.1038/nbt.3820
  • +
  • Ewels, P. A., Peltzer, A., Fillinger, S., Patel, H., Alneberg, J., Wilm, A., Garcia, M. U., Di Tommaso, P., & Nahnsen, S. (2020). The nf-core framework for community-curated bioinformatics pipelines. Nature Biotechnology, 38(3), 276-278. doi: 10.1038/s41587-020-0439-x
  • +
  • Grüning, B., Dale, R., Sjödin, A., Chapman, B. A., Rowe, J., Tomkins-Tinch, C. H., Valieris, R., Köster, J., & Bioconda Team. (2018). Bioconda: sustainable and comprehensive software distribution for the life sciences. Nature Methods, 15(7), 475–476. doi: 10.1038/s41592-018-0046-7
  • +
  • da Veiga Leprevost, F., Grüning, B. A., Alves Aflitos, S., Röst, H. L., Uszkoreit, J., Barsnes, H., Vaudel, M., Moreno, P., Gatto, L., Weber, J., Bai, M., Jimenez, R. C., Sachsenberg, T., Pfeuffer, J., Vera Alvarez, R., Griss, J., Nesvizhskii, A. I., & Perez-Riverol, Y. (2017). BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics (Oxford, England), 33(16), 2580–2582. doi: 10.1093/bioinformatics/btx192
  • + ${tool_bibliography}
Notes:
diff --git a/assets/multiqc/merged_library_frip_score_header.txt b/assets/multiqc/merged_library_frip_score_header.txt index d0edf803..f1100e0b 100644 --- a/assets/multiqc/merged_library_frip_score_header.txt +++ b/assets/multiqc/merged_library_frip_score_header.txt @@ -1,7 +1,7 @@ #id: 'mlib_frip_score' -#section_name: 'MERGED LIB: MACS2 peak FRiP score' +#section_name: 'MERGED LIB: MACS3 peak FRiP score' #description: "is generated by calculating the fraction of all mapped reads that fall -# into the MACS2 called peak regions. A read must overlap a peak by at least 20% to be counted. +# into the MACS3 called peak regions. A read must overlap a peak by at least 20% to be counted. # See FRiP score." #plot_type: 'bargraph' #anchor: 'mlib_frip_score' @@ -11,3 +11,4 @@ # ymax: 1 # ymin: 0 # tt_decimals: 2 +# cpswitch: False diff --git a/assets/multiqc/merged_library_peak_count_header.txt b/assets/multiqc/merged_library_peak_count_header.txt index 9fd8c830..ecf86d91 100644 --- a/assets/multiqc/merged_library_peak_count_header.txt +++ b/assets/multiqc/merged_library_peak_count_header.txt @@ -1,9 +1,10 @@ #id: 'mlib_peak_count' -#section_name: 'MERGED LIB: MACS2 peak count' +#section_name: 'MERGED LIB: MACS3 peak count' #description: "is calculated from total number of peaks called by -# MACS2" +# MACS3" #plot_type: 'bargraph' #anchor: 'mlib_peak_count' #pconfig: # title: 'Total peak count' # ylab: 'Peak count' +# cpswitch: False diff --git a/assets/multiqc/merged_replicate_frip_score_header.txt b/assets/multiqc/merged_replicate_frip_score_header.txt index 8a2c5ad1..d5b727a0 100644 --- a/assets/multiqc/merged_replicate_frip_score_header.txt +++ b/assets/multiqc/merged_replicate_frip_score_header.txt @@ -1,7 +1,7 @@ #id: 'mrep_frip_score' -#section_name: 'MERGED REP: MACS2 peak FRiP score' +#section_name: 'MERGED REP: MACS3 peak FRiP score' #description: "is generated by calculating the fraction of all mapped reads that fall -# into the MACS2 called peak regions. A read must overlap a peak by at least 20% to be counted. +# into the MACS3 called peak regions. A read must overlap a peak by at least 20% to be counted. # See FRiP score." #plot_type: 'bargraph' #anchor: 'mrep_frip_score' @@ -11,3 +11,4 @@ # ymax: 1 # ymin: 0 # tt_decimals: 2 +# cpswitch: False diff --git a/assets/multiqc/merged_replicate_peak_count_header.txt b/assets/multiqc/merged_replicate_peak_count_header.txt index 66796ffe..a18c7f8c 100644 --- a/assets/multiqc/merged_replicate_peak_count_header.txt +++ b/assets/multiqc/merged_replicate_peak_count_header.txt @@ -1,9 +1,10 @@ #id: 'mrep_peak_count' -#section_name: 'MERGED REP: MACS2 Peak count' +#section_name: 'MERGED REP: MACS3 Peak count' #description: "is calculated from total number of peaks called by -# MACS2" +# MACS3" #plot_type: 'bargraph' #anchor: 'mrep_peak_count' #pconfig: # title: 'Total peak count' # ylab: 'Peak count' +# cpswitch: False diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 7d72fb96..ca9a1423 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,7 @@ report_comment: > - This report has been generated by the nf-core/atacseq + This report has been generated by the nf-core/atacseq analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. data_format: "yaml" @@ -71,7 +71,7 @@ module_order: anchor: "mlib_featurecounts" info: "This section of the report shows featureCounts results for the number of reads assigned to merged library consensus peaks." path_filters: - - "./macs2/merged_library/featurecounts/*.summary" + - "./macs3/merged_library/featurecounts/*.summary" - samtools: name: "MERGED REP: SAMTools" info: "This section of the report shows SAMTools results after merging replicates and filtering." @@ -88,7 +88,7 @@ module_order: anchor: "mrep_featurecounts" info: "This section of the report shows featureCounts results for the number of reads assigned to merged replicate consensus peaks." path_filters: - - "./macs2/merged_replicate/featurecounts/*.summary" + - "./macs3/merged_replicate/featurecounts/*.summary" report_section_order: mlib_peak_count: @@ -160,3 +160,5 @@ sp: fn: "*plotFingerprint*" deeptools/plotProfile: fn: "*plotProfile*" + +disable_version_detection: true diff --git a/assets/nf-core-atacseq_logo_light.png b/assets/nf-core-atacseq_logo_light.png index 84c18bee..4b3cca8b 100644 Binary files a/assets/nf-core-atacseq_logo_light.png and b/assets/nf-core-atacseq_logo_light.png differ diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index 3f30073d..cb938f19 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,8 +1,8 @@ sample,fastq_1,fastq_2,replicate -CONTROL,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1 -CONTROL,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz,2 -CONTROL,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz,3 -TREATMENT,AEG588A4_S4_L003_R1_001.fastq.gz,,1 -TREATMENT,AEG588A5_S5_L003_R1_001.fastq.gz,,2 -TREATMENT,AEG588A6_S6_L003_R1_001.fastq.gz,,3 -TREATMENT,AEG588A6_S6_L004_R1_001.fastq.gz,,3 +UNTREATED_A,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1 +UNTREATED_A,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz,2 +UNTREATED_A,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz,3 +TREATED_A,AEG588A4_S4_L003_R1_001.fastq.gz,,1 +TREATED_A,AEG588A5_S5_L003_R1_001.fastq.gz,,2 +TREATED_A,AEG588A6_S6_L003_R1_001.fastq.gz,,3 +TREATED_A,AEG588A6_S6_L004_R1_001.fastq.gz,,3 diff --git a/assets/samplesheet_with_control.csv b/assets/samplesheet_with_control.csv new file mode 100644 index 00000000..82ba791d --- /dev/null +++ b/assets/samplesheet_with_control.csv @@ -0,0 +1,9 @@ +sample,fastq_1,fastq_2,replicate,control,control_replicate +INPUT_A,IEG577I1_S1_L001_R1_001.fastq.gz,IEG577I1_S1_L002_R2_001.fastq.gz,1,, +UNTREATED_A,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1,INPUT_A,1 +UNTREATED_A,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz,2,INPUT_A,1 +UNTREATED_A,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz,3,INPUT_A,1 +TREATED_A,AEG588A4_S4_L003_R1_001.fastq.gz,,1,INPUT_A,1 +TREATED_A,AEG588A5_S5_L003_R1_001.fastq.gz,,2,INPUT_A,1 +TREATED_A,AEG588A6_S6_L003_R1_001.fastq.gz,,3,INPUT_A,1 +TREATED_A,AEG588A6_S6_L004_R1_001.fastq.gz,,3,INPUT_A,1 diff --git a/assets/schema_input.json b/assets/schema_input.json index c8c1cf58..df6d2ecb 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/draft-07/schema", + "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/nf-core/atacseq/master/assets/schema_input.json", "title": "nf-core/atacseq pipeline - params.input schema", "description": "Schema for the file provided with params.input", @@ -10,11 +10,14 @@ "sample": { "type": "string", "pattern": "^\\S+$", - "errorMessage": "Sample name must be provided and cannot contain spaces" + "errorMessage": "Sample name must be provided and cannot contain spaces", + "meta": ["id"] }, "fastq_1": { "type": "string", - "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "format": "file-path", + "exists": true, + "pattern": "^([\\S\\s]*\\/)?[^\\s\\/]+\\.f(ast)?q\\.gz$", "errorMessage": "FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" }, "fastq_2": { diff --git a/assets/slackreport.json b/assets/slackreport.json deleted file mode 100644 index 043d02f2..00000000 --- a/assets/slackreport.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "attachments": [ - { - "fallback": "Plain-text summary of the attachment.", - "color": "<% if (success) { %>good<% } else { %>danger<%} %>", - "author_name": "sanger-tol/readmapping v${version} - ${runName}", - "author_icon": "https://www.nextflow.io/docs/latest/_static/favicon.ico", - "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors<% } %>", - "fields": [ - { - "title": "Command used to launch the workflow", - "value": "```${commandLine}```", - "short": false - } - <% - if (!success) { %> - , - { - "title": "Full error message", - "value": "```${errorReport}```", - "short": false - }, - { - "title": "Pipeline configuration", - "value": "<% out << summary.collect{ k,v -> k == "hook_url" ? "_${k}_: (_hidden_)" : ( ( v.class.toString().contains('Path') || ( v.class.toString().contains('String') && v.contains('/') ) ) ? "_${k}_: `${v}`" : (v.class.toString().contains('DateTime') ? ("_${k}_: " + v.format(java.time.format.DateTimeFormatter.ofLocalizedDateTime(java.time.format.FormatStyle.MEDIUM))) : "_${k}_: ${v}") ) }.join(",\n") %>", - "short": false - } - <% } - %> - ], - "footer": "Completed at <% out << dateComplete.format(java.time.format.DateTimeFormatter.ofLocalizedDateTime(java.time.format.FormatStyle.MEDIUM)) %> (duration: ${duration})" - } - ] -} diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 7df7a82f..e85fefe9 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -3,7 +3,7 @@ import os import sys import argparse - +import re def parse_args(args=None): Description = "Reformat nf-core/atacseq samplesheet file and check its contents." @@ -45,7 +45,7 @@ def check_samplesheet(file_in, file_out, with_control=False): OSMOTIC_STRESS_T15,s3://nf-core-awsmegatests/atacseq/input_data/minimal/GSE66386/SRR1822158_1.fastq.gz,s3://nf-core-awsmegatests/atacseq/input_data/minimal/GSE66386/SRR1822158_2.fastq.gz,1 For an example see: - https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/samplesheet/v2.0/samplesheet_test.csv + https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/samplesheet/v2.1/samplesheet_test.csv """ sample_mapping_dict = {} @@ -62,22 +62,22 @@ def check_samplesheet(file_in, file_out, with_control=False): sys.exit(1) ## Check sample entries - for line in fin: + for line_number, line in enumerate(fin, start=1): if line.strip(): lspl = [x.strip().strip('"') for x in line.strip().split(",")] # Check valid number of columns per row if len(lspl) < len(HEADER): print_error( - "Invalid number of columns (minimum = {})!".format(len(HEADER)), - "Line", + "Invalid number of columns (found = {}, minimum = {})!".format(len(lspl),len(HEADER)), + "Line {}".format(line_number), line, ) num_cols = len([x for x in lspl[: len(HEADER)] if x]) if num_cols < MIN_COLS: print_error( - "Invalid number of populated columns (minimum = {})!".format(MIN_COLS), - "Line", + "Invalid number of populated columns (found = {}, minimum = {})!".format(num_cols,MIN_COLS), + "Line {}".format(line_number), line, ) @@ -85,27 +85,34 @@ def check_samplesheet(file_in, file_out, with_control=False): sample, fastq_1, fastq_2, replicate = lspl[: len(HEADER) - 2 if with_control else len(HEADER)] control = lspl[len(HEADER) - 2] if with_control else "" control_replicate = lspl[len(HEADER) - 1] if with_control else "" + if sample.find(" ") != -1: print(f"WARNING: Spaces have been replaced by underscores for sample: {sample}") sample = sample.replace(" ", "_") if not sample: - print_error("Sample entry has not been specified!", "Line", line) + print_error("Sample entry has not been specified!", "Line {}".format(line_number), line) + if not re.match(r"^[a-zA-Z0-9_.-]+$", sample): + print_error( + "Sample name contains invalid characters! Only alphanumeric characters, underscores, dots and dashes are allowed.", + "Line {}".format(line_number), + line, + ) ## Check FastQ file extension for fastq in [fastq_1, fastq_2]: if fastq: if fastq.find(" ") != -1: - print_error("FastQ file contains spaces!", "Line", line) + print_error("FastQ file contains spaces!", "Line {}".format(line_number), line) if not fastq.endswith(".fastq.gz") and not fastq.endswith(".fq.gz"): print_error( "FastQ file does not have extension '.fastq.gz' or '.fq.gz'!", - "Line", + "Line {}".format(line_number), line, ) ## Check replicate column is integer if not replicate.isdecimal(): - print_error("Replicate id not an integer!", "Line", line) + print_error("Replicate id not an integer!", "Line {}".format(line_number), line) sys.exit(1) if with_control and control: @@ -113,7 +120,7 @@ def check_samplesheet(file_in, file_out, with_control=False): print(f"WARNING: Spaces have been replaced by underscores for control: {control}") control = control.replace(" ", "_") if not control_replicate.isdecimal(): - print_error("Control replicate id not an integer!", "Line", line) + print_error("Replicate id not an integer!", "Line {}".format(line_number), line) sys.exit(1) control = "{}_REP{}".format(control, control_replicate) @@ -126,7 +133,7 @@ def check_samplesheet(file_in, file_out, with_control=False): elif sample and fastq_1 and not fastq_2: sample_info = [fastq_1, fastq_2, replicate, "1", control] else: - print_error("Invalid combination of columns provided!", "Line", line) + print_error("Invalid combination of columns provided!", "Line {}".format(line_number), line) ## Create sample mapping dictionary = {sample: {replicate: [[ fastq_1, fastq_2, replicate, control, single_end ]]}} replicate = int(replicate) @@ -137,7 +144,7 @@ def check_samplesheet(file_in, file_out, with_control=False): sample_mapping_dict[sample][replicate] = [sample_info] else: if sample_info in sample_mapping_dict[sample][replicate]: - print_error("Samplesheet contains duplicate rows!", "Line", line) + print_error("Samplesheet contains duplicate rows!", "Line {}".format(line_number), line) else: sample_mapping_dict[sample][replicate].append(sample_info) diff --git a/bin/macs2_merged_expand.py b/bin/macs3_merged_expand.py similarity index 96% rename from bin/macs2_merged_expand.py rename to bin/macs3_merged_expand.py index 28ffb087..64dc7770 100755 --- a/bin/macs2_merged_expand.py +++ b/bin/macs3_merged_expand.py @@ -17,15 +17,15 @@ ############################################ Description = "Add sample boolean files and aggregate columns from merged MACS narrow or broad peak file." -Epilog = """Example usage: python macs2_merged_expand.py --is_narrow_peak --min_replicates 1""" +Epilog = """Example usage: python macs3_merged_expand.py --is_narrow_peak --min_replicates 1""" argParser = argparse.ArgumentParser(description=Description, epilog=Epilog) ## REQUIRED PARAMETERS -argParser.add_argument("MERGED_INTERVAL_FILE", help="Merged MACS2 interval file created using linux sort and mergeBed.") +argParser.add_argument("MERGED_INTERVAL_FILE", help="Merged MACS3 interval file created using linux sort and mergeBed.") argParser.add_argument( "SAMPLE_NAME_LIST", - help="Comma-separated list of sample names as named in individual MACS2 broadPeak/narrowPeak output file e.g. SAMPLE_R1 for SAMPLE_R1_peak_1.", + help="Comma-separated list of sample names as named in individual MACS3 broadPeak/narrowPeak output file e.g. SAMPLE_R1 for SAMPLE_R1_peak_1.", ) argParser.add_argument("OUTFILE", help="Full path to output directory.") @@ -76,7 +76,7 @@ def makedir(path): ## sort -k1,1 -k2,2n | mergeBed -c 2,3,4,5,6,7,8,9,10 -o collapse,collapse,collapse,collapse,collapse,collapse,collapse,collapse,collapse > merged_peaks.txt -def macs2_merged_expand(MergedIntervalTxtFile, SampleNameList, OutFile, isNarrow=False, minReplicates=1): +def macs3_merged_expand(MergedIntervalTxtFile, SampleNameList, OutFile, isNarrow=False, minReplicates=1): makedir(os.path.dirname(OutFile)) combFreqDict = {} @@ -208,7 +208,7 @@ def macs2_merged_expand(MergedIntervalTxtFile, SampleNameList, OutFile, isNarrow ############################################ ############################################ -macs2_merged_expand( +macs3_merged_expand( MergedIntervalTxtFile=args.MERGED_INTERVAL_FILE, SampleNameList=args.SAMPLE_NAME_LIST.split(","), OutFile=args.OUTFILE, diff --git a/bin/plot_macs2_qc.r b/bin/plot_macs3_qc.r similarity index 99% rename from bin/plot_macs2_qc.r rename to bin/plot_macs3_qc.r index 5cf074de..e40a6837 100755 --- a/bin/plot_macs2_qc.r +++ b/bin/plot_macs3_qc.r @@ -20,7 +20,7 @@ library(scales) option_list <- list(make_option(c("-i", "--peak_files"), type="character", default=NULL, help="Comma-separated list of peak files.", metavar="path"), make_option(c("-s", "--sample_ids"), type="character", default=NULL, help="Comma-separated list of sample ids associated with peak files. Must be unique and in same order as peaks files input.", metavar="string"), make_option(c("-o", "--outdir"), type="character", default='./', help="Output directory", metavar="path"), - make_option(c("-p", "--outprefix"), type="character", default='macs2_peakqc', help="Output prefix", metavar="string")) + make_option(c("-p", "--outprefix"), type="character", default='macs3_peakqc', help="Output prefix", metavar="string")) opt_parser <- OptionParser(option_list=option_list) opt <- parse_args(opt_parser) diff --git a/conf/base.config b/conf/base.config index f2ac8d7a..ae0f22d4 100755 --- a/conf/base.config +++ b/conf/base.config @@ -10,45 +10,46 @@ process { - cpus = { check_max( 1 * task.attempt, 'cpus' ) } - memory = { check_max( 6.GB * task.attempt, 'memory' ) } - time = { check_max( 4.h * task.attempt, 'time' ) } + // TODO nf-core: Check the defaults for all processes + cpus = { 1 * task.attempt } + memory = { 6.GB * task.attempt } + time = { 4.h * task.attempt } - errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } + errorStrategy = { task.exitStatus in ((130..145) + 104 + (175..177)) ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' // Process-specific resource requirements - // NOTE - Please try and re-use the labels below as much as possible. + // NOTE - Please try and reuse the labels below as much as possible. // These labels are used and recognised by default in DSL2 files hosted on nf-core/modules. // If possible, it would be nice to keep the same label naming convention when // adding in your local modules too. // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors withLabel:process_single { - cpus = { check_max( 1 , 'cpus' ) } - memory = { check_max( 6.GB * task.attempt, 'memory' ) } - time = { check_max( 4.h * task.attempt, 'time' ) } + cpus = { 1 } + memory = { 6.GB * task.attempt } + time = { 4.h * task.attempt } } withLabel:process_low { - cpus = { check_max( 2 * task.attempt, 'cpus' ) } - memory = { check_max( 12.GB * task.attempt, 'memory' ) } - time = { check_max( 4.h * task.attempt, 'time' ) } + cpus = { 2 * task.attempt } + memory = { 12.GB * task.attempt } + time = { 4.h * task.attempt } } withLabel:process_medium { - cpus = { check_max( 6 * task.attempt, 'cpus' ) } - memory = { check_max( 36.GB * task.attempt, 'memory' ) } - time = { check_max( 8.h * task.attempt, 'time' ) } + cpus = { 6 * task.attempt } + memory = { 36.GB * task.attempt } + time = { 8.h * task.attempt } } withLabel:process_high { - cpus = { check_max( 12 * task.attempt, 'cpus' ) } - memory = { check_max( 72.GB * task.attempt, 'memory' ) } - time = { check_max( 16.h * task.attempt, 'time' ) } + cpus = { 12 * task.attempt } + memory = { 72.GB * task.attempt } + time = { 16.h * task.attempt } } withLabel:process_long { - time = { check_max( 20.h * task.attempt, 'time' ) } + time = { 20.h * task.attempt } } withLabel:process_high_memory { - memory = { check_max( 200.GB * task.attempt, 'memory' ) } + memory = { 200.GB * task.attempt } } withLabel:error_ignore { errorStrategy = 'ignore' @@ -57,7 +58,11 @@ process { errorStrategy = 'retry' maxRetries = 2 } - withName:CUSTOM_DUMPSOFTWAREVERSIONS { - cache = false + withName: '.*:MERGED_REPLICATE_BAM_TO_BIGWIG:BEDTOOLS_GENOMECOV' { + memory = { 72.GB * task.attempt } + } + withLabel: process_gpu { + ext.use_gpu = { workflow.profile.contains('gpu') } + accelerator = { workflow.profile.contains('gpu') ? 1 : null } } } diff --git a/conf/containers_conda_lock_files_amd64.config b/conf/containers_conda_lock_files_amd64.config new file mode 100644 index 00000000..4e138a66 --- /dev/null +++ b/conf/containers_conda_lock_files_amd64.config @@ -0,0 +1 @@ +process { withName: 'FASTQC' { container = 'modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt' } } diff --git a/conf/containers_conda_lock_files_arm64.config b/conf/containers_conda_lock_files_arm64.config new file mode 100644 index 00000000..ab0f3cff --- /dev/null +++ b/conf/containers_conda_lock_files_arm64.config @@ -0,0 +1 @@ +process { withName: 'FASTQC' { container = 'modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt' } } diff --git a/conf/containers_docker_amd64.config b/conf/containers_docker_amd64.config new file mode 100644 index 00000000..803e0504 --- /dev/null +++ b/conf/containers_docker_amd64.config @@ -0,0 +1 @@ +process { withName: 'FASTQC' { container = 'community.wave.seqera.io/library/fastqc:0.12.1--5cb1a2fa2f18c7c2' } } diff --git a/conf/containers_docker_arm64.config b/conf/containers_docker_arm64.config new file mode 100644 index 00000000..b0dd70c8 --- /dev/null +++ b/conf/containers_docker_arm64.config @@ -0,0 +1 @@ +process { withName: 'FASTQC' { container = 'community.wave.seqera.io/library/fastqc:0.12.1--e455e32f745abe68' } } diff --git a/conf/containers_singularity_https_amd64.config b/conf/containers_singularity_https_amd64.config new file mode 100644 index 00000000..390d5d7f --- /dev/null +++ b/conf/containers_singularity_https_amd64.config @@ -0,0 +1 @@ +process { withName: 'FASTQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f2/f20b021476d1d87658820f971ebecc1e8cdbde0f338eb0d9cea2b0a8fc54a54b/data' } } diff --git a/conf/containers_singularity_https_arm64.config b/conf/containers_singularity_https_arm64.config new file mode 100644 index 00000000..a3d806f0 --- /dev/null +++ b/conf/containers_singularity_https_arm64.config @@ -0,0 +1 @@ +process { withName: 'FASTQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/46/46daf2dad0169afd2ae047c3e50ed3776259f664bf07e5e06b045dc23449e994/data' } } diff --git a/conf/containers_singularity_oras_amd64.config b/conf/containers_singularity_oras_amd64.config new file mode 100644 index 00000000..754d5aa0 --- /dev/null +++ b/conf/containers_singularity_oras_amd64.config @@ -0,0 +1 @@ +process { withName: 'FASTQC' { container = 'oras://community.wave.seqera.io/library/fastqc:0.12.1--5c4bd442468d75dd' } } diff --git a/conf/containers_singularity_oras_arm64.config b/conf/containers_singularity_oras_arm64.config new file mode 100644 index 00000000..1714d9d9 --- /dev/null +++ b/conf/containers_singularity_oras_arm64.config @@ -0,0 +1 @@ +process { withName: 'FASTQC' { container = 'oras://community.wave.seqera.io/library/fastqc:0.12.1--127a87fc06499035' } } diff --git a/conf/igenomes.config b/conf/igenomes.config index 63f7b9e0..84f38729 100755 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -663,11 +663,11 @@ params { readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" mito_name = "chrM" macs_gsize = [ - "50" : "11624332", - "75" : "11693438", - "100" : "11777680", - "150" : "11783749", - "200" : "11825681" + "50" : 11624332, + "75" : 11693438, + "100" : 11777680, + "150" : 11783749, + "200" : 11825681 ] } 'susScr3' { diff --git a/conf/igenomes_ignored.config b/conf/igenomes_ignored.config new file mode 100644 index 00000000..b4034d82 --- /dev/null +++ b/conf/igenomes_ignored.config @@ -0,0 +1,9 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for iGenomes paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Empty genomes dictionary to use when igenomes is ignored. +---------------------------------------------------------------------------------------- +*/ + +params.genomes = [:] diff --git a/conf/modules.config b/conf/modules.config index 639137a1..ca0e5c47 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -34,14 +34,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - - withName: 'CUSTOM_DUMPSOFTWAREVERSIONS' { - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - pattern: '*_versions.yml' - ] - } } // @@ -96,7 +88,7 @@ process { ] } - withName: 'CUSTOM_GETCHROMSIZES' { + withName: 'SAMTOOLS_FAIDX' { publishDir = [ path: { "${params.outdir}/genome" }, mode: params.publish_dir_mode, @@ -141,7 +133,6 @@ process { // Read QC and trimming options // -if (!(params.skip_fastqc || params.skip_qc)) { process { withName: 'FASTQC' { ext.args = '--quiet' @@ -159,9 +150,7 @@ if (!(params.skip_fastqc || params.skip_qc)) { ] } } -} -if (!params.skip_trimming) { process { withName: 'TRIMGALORE' { ext.args = { @@ -199,7 +188,6 @@ if (!params.skip_trimming) { ] } } -} process { withName: 'NFCORE_ATACSEQ:ATACSEQ:.*:BAM_SORT_STATS_SAMTOOLS:SAMTOOLS_SORT' { @@ -233,7 +221,6 @@ process { } } -if (params.aligner == 'bwa') { process { withName: 'BWA_MEM' { ext.args = { @@ -253,11 +240,15 @@ if (params.aligner == 'bwa') { ] } } -} -if (params.aligner == 'bowtie2') { process { withName: 'BOWTIE2_ALIGN' { + ext.args = { + [ + meta.read_group ? "--rg-id ${meta.id} --rg SM:${meta.id - ~/_T\d+$/} --rg PL:ILLUMINA --rg LB:${meta.id} --rg PU:1" : '', + params.seq_center ? "--rg 'CN:${params.seq_center}'" : '' + ].join(' ').trim() + } ext.prefix = { "${meta.id}.Lb" } publishDir = [ [ @@ -275,9 +266,7 @@ if (params.aligner == 'bowtie2') { ] } } -} -if (params.aligner == 'chromap') { process { withName: 'CHROMAP_INDEX' { publishDir = [ @@ -288,7 +277,12 @@ if (params.aligner == 'chromap') { } withName: 'CHROMAP_CHROMAP' { - ext.args = '-l 2000 --Tn5-shift --low-mem --SAM' + ext.args = [ + '-l 2000', + '--low-mem', + '--SAM', + params.shift_reads ? '--Tn5-shift' : '' + ].join(' ').trim() ext.prefix = { "${meta.id}.Lb" } publishDir = [ path: { "${params.outdir}/${params.aligner}/library" }, @@ -298,9 +292,29 @@ if (params.aligner == 'chromap') { ] } } -} -if (params.aligner == 'star') { + process { + withName: '.*:FASTQ_ALIGN_CHROMAP:PICARD_ADDORREPLACEREADGROUPS' { + ext.args = { + [ + "--RGID ${meta.id}", + "--RGSM ${meta.id - ~/_T\d+$/}", + "--RGPL ILLUMINA", + "--RGLB ${meta.id}", + "--RGPU 1", + params.seq_center ? "--RGCN '${params.seq_center}'" : '' + ].join(' ').trim() + } + ext.prefix = { "${meta.id}.Lb.rg" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}/library" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: false + ] + } + } + process { withName: 'STAR_ALIGN' { ext.args = [ @@ -334,7 +348,6 @@ if (params.aligner == 'star') { ] } } -} process { withName: 'PICARD_MERGESAMFILES_LIBRARY' { @@ -397,7 +410,7 @@ process { path: { "${params.outdir}/${params.aligner}/merged_library" }, mode: params.publish_dir_mode, pattern: '*.bam', - saveAs: { (meta.single_end || params.save_align_intermeds) ? "${it}" : null } + saveAs: { item -> (meta.single_end || params.save_align_intermeds) ? "${item}" : null } ] } @@ -460,7 +473,11 @@ process { } withName: '.*:MERGED_LIBRARY_BAM_SHIFT_READS:DEEPTOOLS_ALIGNMENTSIEVE' { - ext.args = '--ATACshift' + ext.args = [ + '--ATACshift', + "--minFragmentLength ${params.minFragmentLength}", + "--maxFragmentLength ${params.maxFragmentLength}" + ].join(' ').trim() ext.prefix = { "${meta.id}.mLb.clN.shifted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/merged_library/shifted_reads" }, @@ -491,11 +508,7 @@ process { } withName: '.*:MERGED_LIBRARY_BAM_TO_BIGWIG:BEDTOOLS_GENOMECOV' { - ext.args = { - [ - (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' - ].join(' ').trim() - } + ext.args = { (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' } ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ [ @@ -521,7 +534,6 @@ process { } } -if (!params.skip_picard_metrics) { process { withName: 'MERGED_LIBRARY_PICARD_COLLECTMULTIPLEMETRICS' { ext.args = '--VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp' @@ -540,9 +552,7 @@ if (!params.skip_picard_metrics) { ] } } -} -if (!params.skip_preseq) { process { withName: 'MERGED_LIBRARY_PRESEQ_LCEXTRAP' { ext.args = '-verbose -bam -seed 1' @@ -554,9 +564,7 @@ if (!params.skip_preseq) { ] } } -} -if (!params.skip_plot_profile) { process { withName: 'DEEPTOOLS_COMPUTEMATRIX_SCALE_REGIONS' { ext.args = 'scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --missingDataAsZero --skipZeros --smartLabels' @@ -596,9 +604,7 @@ if (!params.skip_plot_profile) { ] } } -} -if (!params.skip_plot_fingerprint) { process { withName: 'MERGED_LIBRARY_DEEPTOOLS_PLOTFINGERPRINT' { ext.args = { @@ -616,24 +622,20 @@ if (!params.skip_plot_fingerprint) { ] } } -} process { - withName: '.*:MERGED_LIBRARY_CALL_ANNOTATE_PEAKS:MACS2_CALLPEAK' { + withName: '.*:MERGED_LIBRARY_CALL_ANNOTATE_PEAKS:MACS3_CALLPEAK' { ext.args = [ - '--format BED', '--keep-dup all', '--nomodel', - '--shift -75', - '--extsize 150', - params.narrow_peak ? '--call-summits' : "--broad --broad-cutoff ${params.broad_cutoff}", + params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}", params.save_macs_pileup ? '--bdg --SPMR' : '', params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '', params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' ].join(' ').trim() ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_library/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}" }, + path: { "${params.outdir}/${params.aligner}/merged_library/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -642,7 +644,7 @@ process { withName: '.*:MERGED_LIBRARY_CALL_ANNOTATE_PEAKS:FRIP_SCORE' { ext.args = '-bed -c -f 0.20' publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_library/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/qc" }, + path: { "${params.outdir}/${params.aligner}/merged_library/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/qc" }, enabled: false ] } @@ -650,32 +652,30 @@ process { withName: '.*:MERGED_LIBRARY_CALL_ANNOTATE_PEAKS:MULTIQC_CUSTOM_PEAKS' { ext.prefix = { "${meta.id}.mLb.clN_peaks" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_library/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/qc" }, + path: { "${params.outdir}/${params.aligner}/merged_library/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/qc" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } -if (!params.skip_peak_annotation) { process { withName: '.*:MERGED_LIBRARY_CALL_ANNOTATE_PEAKS:HOMER_ANNOTATEPEAKS' { ext.args = '-gid' ext.prefix = { "${meta.id}.mLb.clN_peaks" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_library/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}" }, + path: { "${params.outdir}/${params.aligner}/merged_library/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } - if (!params.skip_peak_qc) { process { - withName: '.*:MERGED_LIBRARY_CALL_ANNOTATE_PEAKS:PLOT_MACS2_QC' { - ext.args = '-o ./ -p macs2_peak.mLb.clN' + withName: '.*:MERGED_LIBRARY_CALL_ANNOTATE_PEAKS:PLOT_MACS3_QC' { + ext.args = '-o ./ -p macs3_peak.mLb.clN' publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_library/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/qc" }, + path: { "${params.outdir}/${params.aligner}/merged_library/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/qc" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -683,24 +683,21 @@ if (!params.skip_peak_annotation) { withName: '.*:MERGED_LIBRARY_CALL_ANNOTATE_PEAKS:PLOT_HOMER_ANNOTATEPEAKS' { ext.args = '-o ./' - ext.prefix = 'macs2_annotatePeaks.mLb.clN' + ext.prefix = 'macs3_annotatePeaks.mLb.clN' publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_library/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/qc" }, + path: { "${params.outdir}/${params.aligner}/merged_library/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/qc" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } - } -} -if (!params.skip_consensus_peaks) { process { - withName: '.*:MERGED_LIBRARY_CONSENSUS_PEAKS:MACS2_CONSENSUS' { + withName: '.*:MERGED_LIBRARY_CONSENSUS_PEAKS:MACS3_CONSENSUS' { ext.args = "--min_replicates ${params.min_reps_consensus}" ext.prefix = "consensus_peaks.mLb.clN" publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_library/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/consensus" }, + path: { "${params.outdir}/${params.aligner}/merged_library/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/consensus" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -710,14 +707,13 @@ if (!params.skip_consensus_peaks) { ext.args = '-F SAF -O --fracOverlap 0.2' ext.prefix = "consensus_peaks.mLb.clN" publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_library/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/consensus" }, + path: { "${params.outdir}/${params.aligner}/merged_library/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/consensus" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } - if (!params.skip_deseq2_qc) { process { withName: '.*:MERGED_LIBRARY_CONSENSUS_PEAKS:DESEQ2_QC' { ext.args = [ @@ -728,50 +724,43 @@ if (!params.skip_consensus_peaks) { ].join(' ').trim() ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_library/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/consensus/deseq2" }, + path: { "${params.outdir}/${params.aligner}/merged_library/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/consensus/deseq2" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } - } -} -if (!params.skip_peak_annotation) { process { withName: '.*:MERGED_LIBRARY_CONSENSUS_PEAKS:HOMER_ANNOTATEPEAKS' { ext.args = '-gid' ext.prefix = "consensus_peaks.mLb.clN" publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_library/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/consensus" }, + path: { "${params.outdir}/${params.aligner}/merged_library/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/consensus" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } -} -if (!params.skip_ataqv) { process { withName: 'MERGED_LIBRARY_ATAQV_ATAQV' { ext.args = '--ignore-read-groups' publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_library/ataqv/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}" }, + path: { "${params.outdir}/${params.aligner}/merged_library/ataqv/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } withName: 'MERGED_LIBRARY_ATAQV_MKARV' { publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_library/ataqv/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}" }, + path: { "${params.outdir}/${params.aligner}/merged_library/ataqv/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } -} -if (!params.skip_merge_replicates) { process { withName: 'PICARD_MERGESAMFILES_REPLICATE' { ext.args = '--SORT_ORDER coordinate --VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp' @@ -850,11 +839,7 @@ if (!params.skip_merge_replicates) { } withName: '.*:MERGED_REPLICATE_BAM_TO_BIGWIG:BEDTOOLS_GENOMECOV' { - ext.args = { - [ - (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' - ].join(' ').trim() - } + ext.args = { (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' } ext.prefix = { "${meta.id}.mRp.clN" } publishDir = [ [ @@ -883,9 +868,8 @@ if (!params.skip_merge_replicates) { } process { - withName: '.*:MERGED_REPLICATE_CALL_ANNOTATE_PEAKS:MACS2_CALLPEAK' { + withName: '.*:MERGED_REPLICATE_CALL_ANNOTATE_PEAKS:MACS3_CALLPEAK' { ext.args = [ - '--format BED', '--keep-dup all', '--nomodel', params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}", @@ -893,7 +877,7 @@ if (!params.skip_merge_replicates) { ].join(' ').trim() ext.prefix = { "${meta.id}.mRp.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_replicate/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}" }, + path: { "${params.outdir}/${params.aligner}/merged_replicate/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -902,7 +886,7 @@ if (!params.skip_merge_replicates) { withName: '.*:MERGED_REPLICATE_CALL_ANNOTATE_PEAKS:FRIP_SCORE' { ext.args = '-bed -c -f 0.20' publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_replicate/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/qc" }, + path: { "${params.outdir}/${params.aligner}/merged_replicate/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/qc" }, enabled: false ] } @@ -910,32 +894,30 @@ if (!params.skip_merge_replicates) { withName: '.*:MERGED_REPLICATE_CALL_ANNOTATE_PEAKS:MULTIQC_CUSTOM_PEAKS' { ext.prefix = { "${meta.id}.mRp.clN_peaks" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_replicate/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/qc" }, + path: { "${params.outdir}/${params.aligner}/merged_replicate/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/qc" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } - if (!params.skip_peak_annotation ) { process { withName: '.*:MERGED_REPLICATE_CALL_ANNOTATE_PEAKS:HOMER_ANNOTATEPEAKS' { ext.args = '-gid' ext.prefix = { "${meta.id}.mRp.clN_peaks" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_replicate/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}" }, + path: { "${params.outdir}/${params.aligner}/merged_replicate/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } - if (!params.skip_peak_qc) { process { - withName: '.*:MERGED_REPLICATE_CALL_ANNOTATE_PEAKS:PLOT_MACS2_QC' { - ext.args = '-o ./ -p macs2_peak.mRp.clN' + withName: '.*:MERGED_REPLICATE_CALL_ANNOTATE_PEAKS:PLOT_MACS3_QC' { + ext.args = '-o ./ -p macs3_peak.mRp.clN' publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_replicate/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/qc" }, + path: { "${params.outdir}/${params.aligner}/merged_replicate/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/qc" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -943,23 +925,20 @@ if (!params.skip_merge_replicates) { withName: '.*:MERGED_REPLICATE_CALL_ANNOTATE_PEAKS:PLOT_HOMER_ANNOTATEPEAKS' { ext.args = '-o ./' - ext.prefix = 'macs2_annotatePeaks.mRp.clN' + ext.prefix = 'macs3_annotatePeaks.mRp.clN' publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_replicate/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/qc" }, + path: { "${params.outdir}/${params.aligner}/merged_replicate/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/qc" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } - } - } - if (!params.skip_consensus_peaks) { process { - withName: '.*:MERGED_REPLICATE_CONSENSUS_PEAKS:MACS2_CONSENSUS' { + withName: '.*:MERGED_REPLICATE_CONSENSUS_PEAKS:MACS3_CONSENSUS' { ext.prefix = "consensus_peaks.mRp.clN" publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_replicate/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/consensus" }, + path: { "${params.outdir}/${params.aligner}/merged_replicate/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/consensus" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -969,14 +948,13 @@ if (!params.skip_merge_replicates) { ext.args = '-F SAF -O --fracOverlap 0.2' ext.prefix = "consensus_peaks.mRp.clN" publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_replicate/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/consensus" }, + path: { "${params.outdir}/${params.aligner}/merged_replicate/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/consensus" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } - if (!params.skip_deseq2_qc) { process { withName: '.*:MERGED_REPLICATE_CONSENSUS_PEAKS:DESEQ2_QC' { ext.args = [ @@ -987,36 +965,30 @@ if (!params.skip_merge_replicates) { ].join(' ').trim() ext.prefix = { "${meta.id}.mRp.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_replicate/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/consensus/deseq2" }, + path: { "${params.outdir}/${params.aligner}/merged_replicate/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/consensus/deseq2" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } - } - } - if (!params.skip_peak_annotation) { process { withName: '.*:MERGED_REPLICATE_CONSENSUS_PEAKS:HOMER_ANNOTATEPEAKS' { ext.args = '-gid' ext.prefix = "consensus_peaks.mRp.clN" publishDir = [ - path: { "${params.outdir}/${params.aligner}/merged_replicate/macs2/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}/consensus" }, + path: { "${params.outdir}/${params.aligner}/merged_replicate/macs3/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}/consensus" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } - } -} -if (!params.skip_igv) { process { withName: 'IGV' { publishDir = [ [ - path: { "${params.outdir}/igv/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}" }, + path: { "${params.outdir}/igv/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}" }, mode: params.publish_dir_mode, pattern: '*.{txt,xml}' ], @@ -1028,17 +1000,14 @@ if (!params.skip_igv) { ] } } -} -if (!params.skip_multiqc) { process { withName: 'MULTIQC' { ext.args = params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' publishDir = [ - path: { "${params.outdir}/multiqc/${params.narrow_peak ? '/narrow_peak' : '/broad_peak'}" }, + path: { "${params.outdir}/multiqc/${params.narrow_peak ? 'narrow_peak' : 'broad_peak'}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } -} diff --git a/conf/public_aws_ecr.config b/conf/public_aws_ecr.config deleted file mode 100644 index d308789c..00000000 --- a/conf/public_aws_ecr.config +++ /dev/null @@ -1,72 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - AWS ECR Config -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Config to set public AWS ECR images wherever possible - This improves speed when running on AWS infrastructure. - Use this as an example template when using your own private registry. ----------------------------------------------------------------------------------------- -*/ - -docker.registry = 'public.ecr.aws' -podman.registry = 'public.ecr.aws' - -process { - withName: 'BAMTOOLS_FILTER' { - container = 'quay.io/biocontainers/mulled-v2-0560a8046fc82aa4338588eca29ff18edab2c5aa:5687a7da26983502d0a8a9a6b05ed727c740ddc4-0' - } - withName: 'BAM_REMOVE_ORPHANS' { - container = 'quay.io/biocontainers/mulled-v2-57736af1eb98c01010848572c9fec9fff6ffaafd:402e865b8f6af2f3e58c6fc8d57127ff0144b2c7-0' - } - withName: 'BOWTIE2_ALIGN' { - container = 'quay.io/biocontainers/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:a0ffedb52808e102887f6ce600d092675bf3528a-0' - } - withName: 'BWA_MEM' { - container = 'quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:219b6c272b25e7e642ae3ff0bf0c5c81a5135ab4-0' - } - withName: 'CHROMAP_CHROMAP' { - container = 'quay.io/biocontainers/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:5b2e433ab8b3d1ef098fc944b567fd98caa23f56-0' - } - withName: 'DESEQ2_QC' { - container = 'quay.io/biocontainers/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0' - } - withName: 'FRIP_SCORE' { - container = 'quay.io/biocontainers/mulled-v2-8186960447c5cb2faa697666dc1e6d919ad23f3e:3127fcae6b6bdaf8181e21a26ae61231030a9fcb-0' - } - withName: 'GET_AUTOSOMES' { - container = 'quay.io/biocontainers/python:3.8.3' - } - withName: 'GTF2BED' { - container = 'quay.io/biocontainers/perl:5.26.2' - } - withName: 'GUNZIP' { - container = 'quay.io/nf-core/ubuntu:20.04' - } - withName: 'IGV' { - container = 'quay.io/biocontainers/python:3.8.3' - } - withName: 'MACS2_CONSENSUS' { - container = 'quay.io/biocontainers/mulled-v2-2f48cc59b03027e31ead6d383fe1b8057785dd24:5d182f583f4696f4c4d9f3be93052811b383341f-0' - } - withName: 'MULTIQC_CUSTOM_PEAKS' { - container = 'quay.io/nf-core/ubuntu:20.04' - } - withName: 'PLOT_HOMER_ANNOTATEPEAKS' { - container = 'quay.io/biocontainers/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0' - } - withName: 'PLOT_MACS2_QC' { - container = 'quay.io/biocontainers/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0' - } - withName: 'SAMPLESHEET_CHECK' { - container = 'quay.io/biocontainers/python:3.8.3' - } - withName: 'STAR_GENOMEGENERATE' { - container = 'quay.io/biocontainers/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:59cdd445419f14abac76b31dd0d71217994cbcc9-0' - } - withName: 'TSS_EXTRACT' { - container = 'quay.io/nf-core/ubuntu:20.04' - } - withName: 'UNTAR' { - container = 'quay.io/nf-core/ubuntu:20.04' - } -} diff --git a/conf/test.config b/conf/test.config index c6282dd3..4e9188da 100755 --- a/conf/test.config +++ b/conf/test.config @@ -10,23 +10,26 @@ ---------------------------------------------------------------------------------------- */ +process { + resourceLimits = [ + cpus: 4, + memory: '15.GB', + time: '1.h' + ] +} + 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 = '6.h' - // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/samplesheet/v2.0/samplesheet_test.csv' + input = params.pipelines_testdata_base_path + 'atacseq/samplesheet/v2.0/samplesheet_test.csv' read_length = 50 // Genome references mito_name = 'MT' - fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genome.fa' - gtf = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genes.gtf' + fasta = params.pipelines_testdata_base_path + 'atacseq/reference/genome.fa' + gtf = params.pipelines_testdata_base_path + 'atacseq/reference/genes.gtf' // For speed to avoid CI time-out fingerprint_bins = 100 diff --git a/conf/test_controls.config b/conf/test_controls.config index a9483e7f..398fdadd 100644 --- a/conf/test_controls.config +++ b/conf/test_controls.config @@ -10,17 +10,21 @@ ---------------------------------------------------------------------------------------- */ +process { + resourceLimits = [ + cpus: 4, + memory: '15.GB', + time: '1.h' + ] +} + params { config_profile_name = 'Test profile with controls' 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 = '6.h' - // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/samplesheet/v2.1/samplesheet_test_controls.csv' + with_control = true read_length = 50 // Genome references diff --git a/conf/test_full.config b/conf/test_full.config index 66089ad6..416c6eb4 100755 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -10,14 +10,12 @@ ---------------------------------------------------------------------------------------- */ -cleanup = true - params { config_profile_name = 'Full test profile' config_profile_description = 'Full test dataset to check pipeline function' // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/samplesheet/v2.0/samplesheet_full.csv' + input = params.pipelines_testdata_base_path + 'atacseq/samplesheet/v2.0/samplesheet_full.csv' // Used to calculate --macs_gsize read_length = 50 diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 00000000..517a21a3 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,185 @@ +--- +title: Contributing +markdownPlugin: checklist +--- + +# `nf-core/atacseq`: Contributing guidelines + +Hi there! +Thanks for taking an interest in improving nf-core/atacseq. + +This page describes the recommended nf-core way to contribute to both nf-core/atacseq and nf-core pipelines in general, including: + +- [General contribution guidelines](#general-contribution-guidelines): common procedures or guides across all nf-core pipelines. +- [Pipeline-specific contribution guidelines](#pipeline-specific-contribution-guidelines): procedures or guides specific to the development conventions of nf-core/atacseq. + +> [!NOTE] +> If you need help using or modifying nf-core/atacseq, ask on the nf-core Slack [#atacseq](https://nfcore.slack.com/channels/atacseq) channel ([join our Slack here](https://nf-co.re/join/slack)). + +## General contribution guidelines + +### Contribution quick start + +To contribute code to any nf-core pipeline: + +- [ ] Ensure you have Nextflow, nf-core tools, and nf-test installed. See the [nf-core/tools repository](https://github.com/nf-core/tools) for instructions. +- [ ] Check whether a GitHub [issue](https://github.com/nf-core/atacseq/issues) about your idea already exists. If an issue does not exist, create one so that others are aware you are working on it. +- [ ] [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/atacseq repository](https://github.com/nf-core/atacseq) to your GitHub account. +- [ ] Create a branch on your forked repository and make your changes following [pipeline conventions](#pipeline-contribution-conventions) (if applicable). +- [ ] To fix major bugs, name your branch `patch` and follow the [patch release](#patch-release) process. +- [ ] Update relevant documentation within the `docs/` folder, use nf-core/tools to update `nextflow_schema.json`, and update `CITATIONS.md`. +- [ ] Run and/or update tests. See [Testing](#testing) for more information. +- [ ] [Lint](#lint-tests) your code with nf-core/tools. +- [ ] Submit a pull request (PR) against the `dev` branch and request a review. + +If you are not used to this workflow with Git, see the [GitHub documentation](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or [Git resources](https://try.github.io/) for more information. + +## Use of AI and LLMs + +The nf-core stance on the use of AI and LLMs is that humans are still ultimately responsible for their submitted code, regardless of the tools they use. + +If you’re using AI tools, try to stick by these guidelines: + +- Keep PRs as small and focussed as possible +- Avoid any unnecessary changes, such as moving or refactoring code (unless that is the explicit intention of the PR) +- Review all generated code yourself before opening a PR, and ensure that you understand it +- Engage with the community review process and expect to make revisions + +For more detail, see the the [blog post](https://nf-co.re/blog/2026/statement-on-ai) for a statement from the nf-core/core team. + +### Getting help + +For further information and help, see the [nf-core/atacseq documentation](https://nf-co.re/atacseq/usage) or ask on the nf-core [#atacseq](https://nfcore.slack.com/channels/atacseq) Slack channel ([join our Slack here](https://nf-co.re/join/slack)). + +### GitHub Codespaces + +You can contribute to nf-core/atacseq without installing a local development environment on your machine by using [GitHub Codespaces](https://github.com/codespaces). + +[GitHub Codespaces](https://github.com/codespaces) is an online developer environment that runs in your browser, complete with VS Code and a terminal. +Most nf-core repositories include a devcontainer configuration, which creates a GitHub Codespaces environment specifically for Nextflow development. +The environment includes pre-installed nf-core tools, Nextflow, and a few other helpful utilities via a Docker container. + +To get started, open the repository in [Codespaces](https://github.com/nf-core/atacseq/codespaces). + +### Testing + +Once you have made your changes, run the pipeline with nf-test to test them locally. +For additional information, use the `--verbose` flag to view the Nextflow console log output. + +```bash +nf-test test --tag test --profile +docker --verbose +``` + +If you have added new functionality, ensure you update the test assertions in the `.nf.test` files in the `tests/` directory. +Update the snapshots with the following command: + +```bash +nf-test test --tag test --profile +docker --verbose --update-snapshots +``` + +When you create a pull request with changes, GitHub Actions will run automatic tests. +Pull requests are typically reviewed when these tests are passing. + +Two types of tests are typically run: + +#### Lint tests + +nf-core has a [set of guidelines](https://nf-co.re/docs/specifications/overview) which all pipelines must follow. +To enforce these, run linting with nf-core/tools: + +```bash +nf-core pipelines lint +``` + +If you encounter failures or warnings, follow the linked documentation printed to screen. +For more information about linting tests, see [nf-core/tools API documentation](https://nf-co.re/docs/nf-core-tools/api_reference/latest/pipeline_lint_tests/actions_awsfulltest). + +#### Pipeline tests + +Each nf-core pipeline should be set up with a minimal set of test data. +GitHub Actions runs the pipeline on this data to ensure it runs through and exits successfully. +If there are any failures then the automated tests fail. +These tests are run with the latest available version of Nextflow and the minimum required version specified in the pipeline code. + +### Patch release + +> [!WARNING] +> Only in the unlikely event of a release that contains a critical bug. + +- [ ] Create a new branch `patch` on your fork based on `upstream/main` or `upstream/master`. +- [ ] Fix the bug and use nf-core/tools to bump the version to the next semantic version, for example, `1.2.3` → `1.2.4`. +- [ ] Open a Pull Request from `patch` directly to `main`/`master` with the changes. + +### Pipeline contribution conventions + +nf-core semi-standardises how you write code and other contributions to make the nf-core/atacseq code and processing logic more understandable for new contributors and to ensure quality. + +#### Add a new pipeline step + +To contribute a new step to the pipeline, follow the general nf-core coding procedure. +Please also refer to the [pipeline-specific contribution guidelines](#pipeline-specific-contribution-guidelines): + +- [ ] Define the corresponding [input channel](#channel-naming-schemes) into your new process from the expected previous process channel. +- [ ] Install a module with nf-core/tools, or write a local module (see [default processes resource requirements](#default-processes-resource-requirements)), and add it to the target `.nf`. +- [ ] Define the output channel if needed. Emit software versions to the `versions` topic channel (`topic: versions`) from the module's `output:` block — they are collated automatically in `workflows/atacseq.nf`. Add relevant report files to the MultiQC inputs. +- [ ] Add new or updated parameters to `nextflow.config` with a [default value](#default-parameter-values). +- [ ] Add new or updated parameters and relevant help text to `nextflow_schema.json` with [nf-core/tools](#default-parameter-values). +- [ ] Add validation for relevant parameters to the pipeline utilisation section of `utils_nfcore_atacseq_pipeline/main.nf` subworkflow. +- [ ] Perform local tests to validate that the new code works as expected. + - [ ] If applicable, add a new test in the `tests` directory. +- [ ] Update `usage.md`, `output.md`, and `citation.md` as appropriate. +- [ ] [Lint](lint) the code with nf-core/tools. +- [ ] Update any diagrams or pipeline images as necessary. +- [ ] Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name cleanup, and module plots are in the appropriate order. +- [ ] If applicable, create a [MultiQC](https://seqera.io/multiqc/) module. +- [ ] Add a description of the output files and, if relevant, images from the MultiQC report to `docs/output.md`. + +To update the minimum required Nextflow version, see the [Nextflow version bumping](#nextflow-version-bumping) section below. For more information about pipeline contributions, see [pipeline-specific contribution guidelines](#pipeline-specific-contribution-guidelines). + +#### Channel naming schemes + +Use the following naming schemes for channels to make the channel flow easier to understand: + +- Initial process channel: `ch_output_from_` +- Intermediate and terminal channels: `ch__for_` + +#### Default parameter values + +Parameters should be initialised and defined with default values within the `params` scope in `nextflow.config`. +They should also be documented in the pipeline JSON schema. + +To update `nextflow_schema.json`, run: + +```bash +nf-core pipelines schema build +``` + +The schema builder interface that loads in your browser should automatically update the defaults in the parameter documentation. + +#### Default processes resource requirements + +If you write a local module, specify a default set of resource requirements for the process. + +Sensible defaults for process resource requirements (CPUs, memory, time) should be defined in `conf/base.config`. +Specify these with generic `withLabel:` selectors, so they can be shared across multiple processes and steps of the pipeline. + +nf-core provides a set of standard labels that you should follow where possible, as seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/main/nf_core/pipeline-template/conf/base.config). +These labels define resource defaults for single-core processes, modules that require a GPU, and different levels of multi-core configurations with increasing memory requirements. + +Values assigned within these labels can be dynamically passed to a tool using the the `${task.cpus}` and `${task.memory}` Nextflow variables in the `script:` block of a module (see an example in the [modules repository](https://github.com/nf-core/modules/blob/bd1b6a40f55933d94b8c9ca94ec8c1ea0eaf4b82/modules/nf-core/samtools/bam2fq/main.nf#L30)). + +#### Nextflow version bumping + +If you use a new feature from core Nextflow, bump the minimum required Nextflow version in the pipeline with: + +```bash +nf-core pipelines bump-version --nextflow . +``` + +#### Images and figures guidelines + +If you update images or graphics, follow the nf-core [style guidelines](https://nf-co.re/docs/community/brand/workflow-schematics). + +## Pipeline specific contribution guidelines + + diff --git a/docs/images/mqc_fastqc_adapter.png b/docs/images/mqc_fastqc_adapter.png deleted file mode 100755 index 361d0e47..00000000 Binary files a/docs/images/mqc_fastqc_adapter.png and /dev/null differ diff --git a/docs/images/mqc_fastqc_counts.png b/docs/images/mqc_fastqc_counts.png deleted file mode 100755 index cb39ebb8..00000000 Binary files a/docs/images/mqc_fastqc_counts.png and /dev/null differ diff --git a/docs/images/mqc_fastqc_quality.png b/docs/images/mqc_fastqc_quality.png deleted file mode 100755 index a4b89bf5..00000000 Binary files a/docs/images/mqc_fastqc_quality.png and /dev/null differ diff --git a/docs/images/mqc_macs2_peak_count_plot.png b/docs/images/mqc_macs3_peak_count_plot.png similarity index 100% rename from docs/images/mqc_macs2_peak_count_plot.png rename to docs/images/mqc_macs3_peak_count_plot.png diff --git a/docs/images/nf-core-atacseq_logo_dark.png b/docs/images/nf-core-atacseq_logo_dark.png index 1f6bffca..a64be2f7 100644 Binary files a/docs/images/nf-core-atacseq_logo_dark.png and b/docs/images/nf-core-atacseq_logo_dark.png differ diff --git a/docs/images/nf-core-atacseq_logo_light.png b/docs/images/nf-core-atacseq_logo_light.png index e1689615..6bb6b1d1 100644 Binary files a/docs/images/nf-core-atacseq_logo_light.png and b/docs/images/nf-core-atacseq_logo_light.png differ diff --git a/docs/images/nf-core-atacseq_metro_map_grey.svg b/docs/images/nf-core-atacseq_metro_map_grey.svg index f5fc9078..264450bc 100644 --- a/docs/images/nf-core-atacseq_metro_map_grey.svg +++ b/docs/images/nf-core-atacseq_metro_map_grey.svg @@ -1037,7 +1037,7 @@ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Maven Pro';-inkscape-font-specification:'Maven Pro, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;stroke-width:0.264583" x="408.43576" y="29.288076" - id="tspan2289-4-4">MACS2MACS3 -[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/) gives general quality metrics about your reads. It provides information about the quality score distribution across your reads, the per base sequence content (%A/C/G/T). You get information about adapter contamination and other overrepresented sequences. For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). +[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). ### Adapter trimming @@ -177,21 +177,21 @@ The results from deepTools plotProfile gives you a quick visualisation for the g
Output files -- `/merged_library/macs2//` - - `*.xls`, `*.broadPeak` or `*.narrowPeak`, `*.gappedPeak`, `*summits.bed`: MACS2 output files - the files generated will depend on whether MACS2 has been run in _narrowPeak_ or _broadPeak_ mode. +- `/merged_library/macs3//` + - `*.xls`, `*.broadPeak` or `*.narrowPeak`, `*.gappedPeak`, `*summits.bed`: MACS3 output files - the files generated will depend on whether MACS3 has been run in _narrowPeak_ or _broadPeak_ mode. - `*.annotatePeaks.txt`: HOMER peak-to-gene annotation file. -- `/merged_library/macs2//qc/` - - `macs_peak.plots.pdf`: QC plots for MACS2 peaks. +- `/merged_library/macs3//qc/` + - `macs_peak.plots.pdf`: QC plots for MACS3 peaks. - `macs_annotatePeaks.plots.pdf`: QC plots for peak-to-gene feature annotation. - `*.FRiP_mqc.tsv`, `*.count_mqc.tsv`, `macs_annotatePeaks.summary_mqc.tsv`: MultiQC custom-content files for FRiP score, peak count and peak-to-gene ratios. -> **NB:** `` in the directory structure above corresponds to the type of peak that you have specified to call with MACS2 i.e. `broad_peak` or `narrow_peak`. If you so wish, you can call both narrow and broad peaks without redoing the preceding steps in the pipeline such as the alignment and filtering. For example, if you already have broad peaks then just add `--narrow_peak -resume` to the command you used to run the pipeline, and these will be called too! However, resuming the pipeline will only be possible if you have not deleted the `work/` directory generated by the pipeline. +> **NB:** `` in the directory structure above corresponds to the type of peak that you have specified to call with MACS3 i.e. `broad_peak` or `narrow_peak`. If you so wish, you can call both narrow and broad peaks without redoing the preceding steps in the pipeline such as the alignment and filtering. For example, if you already have broad peaks then just add `--narrow_peak -resume` to the command you used to run the pipeline, and these will be called too! However, resuming the pipeline will only be possible if you have not deleted the `work/` directory generated by the pipeline.
-[MACS2](https://github.com/taoliu/MACS) is one of the most popular peak-calling algorithms for ChIP-seq data. For ATAC-seq data we are also looking for genome-wide regions of enrichment but in this case without comparison to a standard control sample (e.g. input DNA). By default, the peaks are called with the MACS2 `--broad` parameter. If, however, you would like to call narrow peaks then please provide the `--narrow_peak` parameter when running the pipeline. See [MACS2 outputs](https://github.com/taoliu/MACS#output-files) for a description of the output files generated by MACS2. +[MACS3](https://github.com/taoliu/MACS) is one of the most popular peak-calling algorithms for ChIP-seq data. For ATAC-seq data we are also looking for genome-wide regions of enrichment but in this case without comparison to a standard control sample (e.g. input DNA). By default, the peaks are called with the MACS3 `--broad` parameter. If, however, you would like to call narrow peaks then please provide the `--narrow_peak` parameter when running the pipeline. See [MACS3 outputs](https://github.com/taoliu/MACS#output-files) for a description of the output files generated by MACS3. -![MultiQC - MACS2 total peak count plot](images/mqc_macs2_peak_count_plot.png) +![MultiQC - MACS3 total peak count plot](images/mqc_macs3_peak_count_plot.png) [HOMER annotatePeaks.pl](http://homer.ucsd.edu/homer/ngs/annotation.html) is used to annotate the peaks relative to known genomic features. HOMER is able to use the `--gtf` annotation file which is provided to the pipeline. Please note that some of the output columns will be blank because the annotation is not provided using HOMER's in-built database format. However, the more important fields required for downstream analysis will be populated i.e. _Annotation_, _Distance to TSS_ and _Nearest Promoter ID_. @@ -199,17 +199,18 @@ The results from deepTools plotProfile gives you a quick visualisation for the g Various QC plots per sample including number of peaks, fold-change distribution, [FRiP score](https://genome.cshlp.org/content/22/9/1813.full.pdf+html) and peak-to-gene feature annotation are also generated by the pipeline. Where possible these have been integrated into the MultiQC report. -![MultiQC - MACS2 peaks FRiP score plot](images/mqc_frip_score_plot.png) +![MultiQC - MACS3 peaks FRiP score plot](images/mqc_frip_score_plot.png) ### Create and quantify consensus set of peaks
Output files -- `/merged_library/macs2//consensus/` +- `/merged_library/macs3//consensus/` - `*.bed`: Consensus peak-set across all samples in BED format. - `*.saf`: Consensus peak-set across all samples in SAF format. Required by featureCounts for read quantification. - - `*.featureCounts.txt`: Read counts across all samples relative to consensus peak-set. + - `*.featureCounts.tsv`: Read counts across all samples relative to consensus peak-set. + - `*.featureCounts.tsv.summary`: featureCounts assignment summary, used by MultiQC. - `*.annotatePeaks.txt`: HOMER peak-to-gene annotation file for consensus peaks. - `*.boolean.annotatePeaks.txt`: Spreadsheet representation of consensus peak-set across samples **with** gene annotation columns. The columns from individual peak files are included in this file along with the ability to filter peaks based on their presence or absence in multiple replicates/conditions. - `*.boolean.txt`: Spreadsheet representation of consensus peak-set across samples **without** gene annotation columns. Same as file above but without annotation columns. @@ -234,7 +235,7 @@ The [featureCounts](http://bioinf.wehi.edu.au/featureCounts/) tool is used to co
Output files -- `/merged_library/macs2//consensus/deseq2/` +- `/merged_library/macs3//consensus/deseq2/` - `*.plots.pdf`: File containing PCA and hierarchical clustering plots. - `*.dds.RData`: File containing R `DESeqDataSet` object generated by DESeq2, with either an rlog or vst `assay` storing the variance-stabilised data. @@ -243,7 +244,7 @@ The [featureCounts](http://bioinf.wehi.edu.au/featureCounts/) tool is used to co - `*pca.vals.txt`: Matrix of values for the first 2 principal components. - `*.sample.dists.txt`: Sample distance matrix. - `R_sessionInfo.log`: File containing information about R, the OS and attached or loaded packages. -- `/merged_library/macs2//consensus/sizeFactors/` +- `/merged_library/macs3//consensus/sizeFactors/` - `*.txt`, `*.RData`: Files containing DESeq2 sizeFactors per sample.
@@ -337,7 +338,6 @@ Once installed, open IGV, go to `File > Open Session` and select the `igv_sessio - `genome/` - A number of genome-specific files are generated by the pipeline in order to aid in the filtering of the data, and because they are required by standard tools such as BEDTools. These can be found in this directory along with the genome fasta file which is required by IGV. If using a genome from AWS iGenomes and if it exists a `README.txt` file containing information about the annotation version will also be saved in this directory. - `genome/index/` - - `bwa/`: Directory containing BWA indices. - `bowtie2/`: Directory containing BOWTIE2 indices. - `chromap/`: Directory containing Chromap indices. @@ -358,6 +358,7 @@ Reference genome-specific files can be useful to keep for the downstream process - Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. + - Parameters used by the pipeline run: `params.json`.
diff --git a/docs/usage.md b/docs/usage.md index 5be0ba15..1f420626 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -6,7 +6,7 @@ ## Samplesheet input -You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 4 columns, and a header row as shown in the examples below. +Before running the pipeline, create a samplesheet with information about the samples you would like to analyse. This samplesheet contains the files that will be passed as inputs to the pipeline. The --input parameter is used to specify the samplesheet location. It has to be a comma-separated file with 4 columns, and a header row as shown in the examples below. ```bash --input '[path to samplesheet file]' @@ -14,49 +14,56 @@ You will need to create a samplesheet with information about the samples you wou ### Multiple replicates -The `sample` identifier is the same when you have multiple biological replicates from the same experimental group, just increment the `replicate` identifier appropriately. The first replicate value for any given experimental group must be 1. Below is an example for a single experimental group in triplicate: +The `sample` identifier is the same when you have multiple biological replicates from the same experimental group, just increment the `replicate` identifier appropriately. The first replicate value for any given experimental group must be 1. Below is an example for the analysis of paired-end sequencing of ATAC-seq experiment performed in triplicate for the cell line "A" : ```console sample,fastq_1,fastq_2,replicate -CONTROL,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1 -CONTROL,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz,2 -CONTROL,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz,3 +SAMPLE_A,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1 +SAMPLE_A,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz,2 +SAMPLE_A,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz,3 ``` -The pipeline will automatically append the `&_REP` suffix to the sample name within the pipeline e.g. `CONTROL_REP1`, `CONTROL_REP2` and `CONTROL_REP3` using the example above. If you don't have replicates you can set the `replicate` value to 1 for all of your samples. +The pipeline will automatically append the `&_REP` suffix to the sample name within the pipeline e.g. `SAMPLE_A_REP1`, `SAMPLE_A_REP2` and `SAMPLE_A_REP3` using the example above. If you don't have replicates you can set the `replicate` value to 1 for all of your samples. Below an example for the analysis of of paired-end sequencing of ATAC-seq experiment performed without replicates for the cell line "A" and for the tissue "B": + +```console +sample,fastq_1,fastq_2,replicate +SAMPLE_A,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1 +SAMPLE_B,BEG599B2_S1_L003_R1_001.fastq.gz,BEG599B2_S1_L003_R2_001.fastq.gz,1 +``` ### Multiple runs of the same sample -The `sample` and `replicate` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will perform the alignments in parallel, and subsequently merge them before further analysis. Below is an example a sample sequenced across 3 lanes: +The `sample` and `replicate` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will perform the alignments in parallel, and subsequently merge them before further analysis. Below is an example of how the samplesheet for SAMPLE_A would look like if sequenced across 3 lanes: -```console +```csv title="samplesheet.csv" sample,fastq_1,fastq_2,replicate -CONTROL,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1 -CONTROL,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz,1 -CONTROL,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz,1 +SAMPLE_A,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1 +SAMPLE_A,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz,1 +SAMPLE_A,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz,1 ``` -The pipeline will automatically append the `*_T` suffix to the sample name within the pipeline e.g. `CONTROL_REP1_T1`, `CONTROL_REP1_T2` and `CONTROL_REP1_T3` using the example above. +The pipeline will automatically append the `*_T` suffix to the sample name within the pipeline e.g. `SAMPLE_A_REP1_T1`, `SAMPLE_A_REP1_T2` and `SAMPLE_A_REP1_T3` using the example above. -### Control data +### INPUT control data -If controls are to be used for peak calling use the parameter `--with_control`. In this case, the samplesheet file needs the additional columns `control` and `control_replicate`. These should be the sample identifier and sample replicate for the controls. +An input control is a file that can be used during peak calling to estimate the background of the experiment. If input controls sequencing information is available, it can be used for peak calling using the parameter `--with_control`. In this case, the samplesheet file needs the additional columns `control` and `control_replicate`. These should be the sample identifier and sample replicate for the input controls, as in the example below. ### Full samplesheet The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 4 columns to match those defined in the table below. -A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 7 samples, where we have biological triplicates for both the `CONTROL` and `TREATMENT` groups, and the third replicate in the `TREATMENT` group has been a technical replicate as a result of being sequenced twice. +A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 7 samples, where we have biological triplicates for both the control condition, such as cell line "A" untreated, `UNTREATED_A` and the treatment condition, such as cell line "A" treated with a compound, `TREATED_A` groups, and the third replicate in the `TREATED_A` group has been a technical replicate as a result of being sequenced twice. In this example, INPUT control is available `INPUT_A` with no replicates. -```console +```csv title="samplesheet.csv" sample,fastq_1,fastq_2,replicate,control,control_replicate -CONTROL,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1,, -CONTROL,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz,2,, -CONTROL,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz,3,, -TREATMENT,AEG588A4_S4_L003_R1_001.fastq.gz,,1,CONTROL,1 -TREATMENT,AEG588A5_S5_L003_R1_001.fastq.gz,,2,CONTROL,2 -TREATMENT,AEG588A6_S6_L003_R1_001.fastq.gz,,3,CONTROL,3 -TREATMENT,AEG588A6_S6_L004_R1_001.fastq.gz,,3,CONTROL,3 +INPUT_A,IEG577I1_S1_L001_R1_001.fastq.gz,IEG577I1_S1_L002_R2_001.fastq.gz,1,, +UNTREATED_A,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1,INPUT_A,1 +UNTREATED_A,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz,2,INPUT_A,1 +UNTREATED_A,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz,3,INPUT_A,1 +TREATED_A,AEG588A4_S4_L003_R1_001.fastq.gz,,1,INPUT_A,1 +TREATED_A,AEG588A5_S5_L003_R1_001.fastq.gz,,2,INPUT_A,1 +TREATED_A,AEG588A6_S6_L003_R1_001.fastq.gz,,3,INPUT_A,1 +TREATED_A,AEG588A6_S6_L004_R1_001.fastq.gz,,3,INPUT_A,1 ``` | Column | Description | @@ -64,9 +71,9 @@ TREATMENT,AEG588A6_S6_L004_R1_001.fastq.gz,,3,CONTROL,3 | `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | | `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | | `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `replicate` | Integer representing replicate number. Must start from `1..`. | +| `replicate` | Integer representing replicate number. This will be identical for re-sequenced libraries. Must start from `1..`. | | `control` | Sample name for control sample. | -| `control_replicate` | Sample replicate for control replicate. | +| `control_replicate` | Integer representing replicate number of the control sample | Example sheets [without controls](../assets/samplesheet.csv) and [with controls](../assets/samplesheet_with_control.csv) have been provided with the pipeline. @@ -107,12 +114,29 @@ wget -L https://www.encodeproject.org/files/ENCFF356LFX/@@download/ENCFF356LFX.b > **NB:** A detailed description of the different versions of the files can be found [here](https://sites.google.com/site/anshulkundaje/projects/blacklists). Also, to to see which blacklist bed files are assigned by default to the respective reference genome check the [igenomes.config](https://github.com/nf-core/chipseq/blob/master/conf/igenomes.config). +## Aligned reads filtering + +After the alignment using specified aligner, we would like to further clean up and filter the alignments by posing thresholds upon fragment sizes with the `deepTools-alignmentSieve`. You could specify below parameters in your `-params-file`: + +- minFragmentLength (default 0) +- maxFragmentLength (default 120) + +for filtering fragments based on its size. + +The suggested default length range is meant to select **nucleosome-free regions**, because the length of DNA wrapping around a nucleosome is mostly assumed around 147bp. + +If different user cases are considered for your research, we suggest the following settings: + +- Mononucleosome regions: minFragmentLength,maxFragmentLength (180, 247) +- Dinucleosome regions: minFragmentLength,maxFragmentLength (315, 473) +- Trinucleosome regions: minFragmentLength,maxFragmentLength (558, 615) + ## Running the pipeline The typical command for running the pipeline is as follows: ```bash -nextflow run nf-core/atacseq --input samplesheet.csv --outdir --genome GRCh37 -profile docker +nextflow run nf-core/atacseq --input ./samplesheet.csv --outdir ./results --genome GRCh37 --read_length 150 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -130,20 +154,22 @@ If you wish to repeatedly use the same parameters for multiple runs, rather than Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. -> ⚠️ Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). -> The above pipeline run specified with a params file in yaml format: +> [!WARNING] +> Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/running/run-pipelines#configuring-pipelines), other infrastructural tweaks (such as output directories), or module arguments (args). + +The above pipeline run specified with a params file in yaml format: ```bash nextflow run nf-core/atacseq -profile docker -params-file params.yaml ``` -with `params.yaml` containing: +with: -```yaml +```yaml title="params.yaml" input: './samplesheet.csv' outdir: './results/' genome: 'GRCh37' -input: 'data' +read_length: 150 <...> ``` @@ -159,19 +185,21 @@ nextflow pull nf-core/atacseq ### Reproducibility -It is 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. +It is a good idea to specify the 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/atacseq releases page](https://github.com/nf-core/atacseq/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. 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. For example, at the bottom of the MultiQC reports. -To further assist in reproducbility, you can use share and re-use [parameter files](#running-the-pipeline) to repeat pipeline runs with the same settings without having to write out a command with every single parameter. +To further assist in reproducibility, you can use share and reuse [parameter files](#running-the-pipeline) to repeat pipeline runs with the same settings without having to write out a command with every single parameter. -> 💡 If you wish to share such profile (such as upload as supplementary material for academic publications), make sure to NOT include cluster specific paths to files, nor institutional specific profiles. +> [!TIP] +> If you wish to share such profile (such as upload as supplementary material for academic publications), make sure to NOT include cluster specific paths to files, nor institutional specific profiles. ## Core Nextflow arguments -> **NB:** These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen). +> [!NOTE] +> These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen) ### `-profile` @@ -179,14 +207,15 @@ Use this parameter to choose a configuration profile. Profiles can give configur Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Apptainer, Conda) - see below. +> [!IMPORTANT] > 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). +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 check if your system is supported, 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, since it can lead to different results on different machines dependent on the computer enviroment. +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, since it can lead to different results on different machines dependent on the computer environment. - `test` - A profile with a complete configuration for automated testing @@ -200,9 +229,11 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - `shifter` - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) - `charliecloud` - - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) + - A generic configuration profile to be used with [Charliecloud](https://charliecloud.io/) - `apptainer` - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) +- `wave` + - A generic configuration profile to enable [Wave](https://seqera.io/wave/) containers. Use together with one of the above (requires Nextflow ` 24.03.0-edge` or later). - `conda` - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter, Charliecloud, or Apptainer. @@ -220,21 +251,21 @@ Specify the path to a specific config file (this is a core Nextflow command). Se ### Resource requests -Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. 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 any of the error codes specified [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L18) it will automatically be resubmitted with higher requests (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. +Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the pipeline steps, if the job exits with any of the error codes specified [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L18) it will automatically be resubmitted with higher resources request (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. -To change the resource requests, please see the [max resources](https://nf-co.re/docs/usage/configuration#max-resources) and [tuning workflow resources](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources) section of the nf-core website. +To change the resource requests, please see the [max resources](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#set-max-resources) and [customise process resources](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#customize-process-resources) section of the nf-core website. ### Custom Containers -In some cases you may wish to change which container or conda environment a step of the pipeline uses for a particular tool. By default nf-core pipelines use containers and software from the [biocontainers](https://biocontainers.pro/) or [bioconda](https://bioconda.github.io/) projects. However in some cases the pipeline specified version maybe out of date. +In some cases, you may wish to change the container or conda environment used by a pipeline steps for a particular tool. By default, nf-core pipelines use containers and software from the [biocontainers](https://biocontainers.pro/) or [bioconda](https://bioconda.github.io/) projects. However, in some cases the pipeline specified version maybe out of date. -To use a different container from the default container or conda environment specified in a pipeline, please see the [updating tool versions](https://nf-co.re/docs/usage/configuration#updating-tool-versions) section of the nf-core website. +To use a different container from the default container or conda environment specified in a pipeline, please see the [updating tool versions](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#update-tool-versions) section of the nf-core website. ### Custom Tool Arguments A pipeline might not always support every possible argument or option of a particular tool used in pipeline. Fortunately, nf-core pipelines provide some freedom to users to insert additional parameters that the pipeline does not include by default. -To learn how to provide additional arguments to a particular tool of the pipeline, please see the [customising tool arguments](https://nf-co.re/docs/usage/configuration#customising-tool-arguments) section of the nf-core website. +To learn how to provide additional arguments to a particular tool of the pipeline, please see the [customising tool arguments](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#modifying-tool-arguments) section of the nf-core website. ### nf-core/configs @@ -244,14 +275,6 @@ See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). -## Azure Resource Requests - -To be used with the `azurebatch` profile by specifying the `-profile azurebatch`. -We recommend providing a compute `params.vm_type` of `Standard_D16_v3` VMs by default but these options can be changed if required. - -Note that the choice of VM size depends on your quota and the overall workload during the analysis. -For a thorough list, please refer the [Azure Sizes for virtual machines in Azure](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes). - ## Running in the background Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. @@ -261,6 +284,8 @@ The Nextflow `-bg` flag launches Nextflow in the background, detached from your Alternatively, you can use `screen` / `tmux` or similar tool to create a detached session which you can log back into at a later time. Some HPC setups also allow you to run nextflow within a cluster job submitted your job scheduler (from where it submits more jobs). +## Custom parameters + ## Nextflow memory requirements In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy deleted file mode 100755 index 9b34804d..00000000 --- a/lib/NfcoreSchema.groovy +++ /dev/null @@ -1,530 +0,0 @@ -// -// This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. -// - -import nextflow.Nextflow -import org.everit.json.schema.Schema -import org.everit.json.schema.loader.SchemaLoader -import org.everit.json.schema.ValidationException -import org.json.JSONObject -import org.json.JSONTokener -import org.json.JSONArray -import groovy.json.JsonSlurper -import groovy.json.JsonBuilder - -class NfcoreSchema { - - // - // Resolve Schema path relative to main workflow directory - // - public static String getSchemaPath(workflow, schema_filename='nextflow_schema.json') { - return "${workflow.projectDir}/${schema_filename}" - } - - // - // Function to loop over all parameters defined in schema and check - // whether the given parameters adhere to the specifications - // - /* groovylint-disable-next-line UnusedPrivateMethodParameter */ - public static void validateParameters(workflow, params, log, schema_filename='nextflow_schema.json') { - def has_error = false - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// - // Check for nextflow core params and unexpected params - def json = new File(getSchemaPath(workflow, schema_filename=schema_filename)).text - def Map schemaParams = (Map) new JsonSlurper().parseText(json).get('definitions') - def nf_params = [ - // Options for base `nextflow` command - 'bg', - 'c', - 'C', - 'config', - 'd', - 'D', - 'dockerize', - 'h', - 'log', - 'q', - 'quiet', - 'syslog', - 'v', - - // Options for `nextflow run` command - 'ansi', - 'ansi-log', - 'bg', - 'bucket-dir', - 'c', - 'cache', - 'config', - 'dsl2', - 'dump-channels', - 'dump-hashes', - 'E', - 'entry', - 'latest', - 'lib', - 'main-script', - 'N', - 'name', - 'offline', - 'params-file', - 'pi', - 'plugins', - 'poll-interval', - 'pool-size', - 'profile', - 'ps', - 'qs', - 'queue-size', - 'r', - 'resume', - 'revision', - 'stdin', - 'stub', - 'stub-run', - 'test', - 'w', - 'with-apptainer', - 'with-charliecloud', - 'with-conda', - 'with-dag', - 'with-docker', - 'with-mpi', - 'with-notification', - 'with-podman', - 'with-report', - 'with-singularity', - 'with-timeline', - 'with-tower', - 'with-trace', - 'with-weblog', - 'without-docker', - 'without-podman', - 'work-dir' - ] - def unexpectedParams = [] - - // Collect expected parameters from the schema - def expectedParams = [] - def enums = [:] - for (group in schemaParams) { - for (p in group.value['properties']) { - expectedParams.push(p.key) - if (group.value['properties'][p.key].containsKey('enum')) { - enums[p.key] = group.value['properties'][p.key]['enum'] - } - } - } - - for (specifiedParam in params.keySet()) { - // nextflow params - if (nf_params.contains(specifiedParam)) { - log.error "ERROR: You used a core Nextflow option with two hyphens: '--${specifiedParam}'. Please resubmit with '-${specifiedParam}'" - has_error = true - } - // unexpected params - def params_ignore = params.schema_ignore_params.split(',') + 'schema_ignore_params' - def expectedParamsLowerCase = expectedParams.collect{ it.replace("-", "").toLowerCase() } - def specifiedParamLowerCase = specifiedParam.replace("-", "").toLowerCase() - def isCamelCaseBug = (specifiedParam.contains("-") && !expectedParams.contains(specifiedParam) && expectedParamsLowerCase.contains(specifiedParamLowerCase)) - if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam) && !isCamelCaseBug) { - // Temporarily remove camelCase/camel-case params #1035 - def unexpectedParamsLowerCase = unexpectedParams.collect{ it.replace("-", "").toLowerCase()} - if (!unexpectedParamsLowerCase.contains(specifiedParamLowerCase)){ - unexpectedParams.push(specifiedParam) - } - } - } - - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// - // Validate parameters against the schema - InputStream input_stream = new File(getSchemaPath(workflow, schema_filename=schema_filename)).newInputStream() - JSONObject raw_schema = new JSONObject(new JSONTokener(input_stream)) - - // Remove anything that's in params.schema_ignore_params - raw_schema = removeIgnoredParams(raw_schema, params) - - Schema schema = SchemaLoader.load(raw_schema) - - // Clean the parameters - def cleanedParams = cleanParameters(params) - - // Convert to JSONObject - def jsonParams = new JsonBuilder(cleanedParams) - JSONObject params_json = new JSONObject(jsonParams.toString()) - - // Validate - try { - schema.validate(params_json) - } catch (ValidationException e) { - println '' - log.error 'ERROR: Validation of pipeline parameters failed!' - JSONObject exceptionJSON = e.toJSON() - printExceptions(exceptionJSON, params_json, log, enums) - println '' - has_error = true - } - - // Check for unexpected parameters - if (unexpectedParams.size() > 0) { - Map colors = NfcoreTemplate.logColours(params.monochrome_logs) - println '' - def warn_msg = 'Found unexpected parameters:' - for (unexpectedParam in unexpectedParams) { - warn_msg = warn_msg + "\n* --${unexpectedParam}: ${params[unexpectedParam].toString()}" - } - log.warn warn_msg - log.info "- ${colors.dim}Ignore this warning: params.schema_ignore_params = \"${unexpectedParams.join(',')}\" ${colors.reset}" - println '' - } - - if (has_error) { - Nextflow.error('Exiting!') - } - } - - // - // Beautify parameters for --help - // - public static String paramsHelp(workflow, params, command, schema_filename='nextflow_schema.json') { - Map colors = NfcoreTemplate.logColours(params.monochrome_logs) - Integer num_hidden = 0 - String output = '' - output += 'Typical pipeline command:\n\n' - output += " ${colors.cyan}${command}${colors.reset}\n\n" - Map params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) - Integer max_chars = paramsMaxChars(params_map) + 1 - Integer desc_indent = max_chars + 14 - Integer dec_linewidth = 160 - desc_indent - for (group in params_map.keySet()) { - Integer num_params = 0 - String group_output = colors.underlined + colors.bold + group + colors.reset + '\n' - def group_params = params_map.get(group) // This gets the parameters of that particular group - for (param in group_params.keySet()) { - if (group_params.get(param).hidden && !params.show_hidden_params) { - num_hidden += 1 - continue; - } - def type = '[' + group_params.get(param).type + ']' - def description = group_params.get(param).description - def defaultValue = group_params.get(param).default != null ? " [default: " + group_params.get(param).default.toString() + "]" : '' - def description_default = description + colors.dim + defaultValue + colors.reset - // Wrap long description texts - // Loosely based on https://dzone.com/articles/groovy-plain-text-word-wrap - if (description_default.length() > dec_linewidth){ - List olines = [] - String oline = "" // " " * indent - description_default.split(" ").each() { wrd -> - if ((oline.size() + wrd.size()) <= dec_linewidth) { - oline += wrd + " " - } else { - olines += oline - oline = wrd + " " - } - } - olines += oline - description_default = olines.join("\n" + " " * desc_indent) - } - group_output += " --" + param.padRight(max_chars) + colors.dim + type.padRight(10) + colors.reset + description_default + '\n' - num_params += 1 - } - group_output += '\n' - if (num_params > 0){ - output += group_output - } - } - if (num_hidden > 0){ - output += colors.dim + "!! Hiding $num_hidden params, use --show_hidden_params to show them !!\n" + colors.reset - } - output += NfcoreTemplate.dashedLine(params.monochrome_logs) - return output - } - - // - // Groovy Map summarising parameters/workflow options used by the pipeline - // - public static LinkedHashMap paramsSummaryMap(workflow, params, schema_filename='nextflow_schema.json') { - // Get a selection of core Nextflow workflow options - def Map workflow_summary = [:] - if (workflow.revision) { - workflow_summary['revision'] = workflow.revision - } - workflow_summary['runName'] = workflow.runName - if (workflow.containerEngine) { - workflow_summary['containerEngine'] = workflow.containerEngine - } - if (workflow.container) { - workflow_summary['container'] = workflow.container - } - workflow_summary['launchDir'] = workflow.launchDir - workflow_summary['workDir'] = workflow.workDir - workflow_summary['projectDir'] = workflow.projectDir - workflow_summary['userName'] = workflow.userName - workflow_summary['profile'] = workflow.profile - workflow_summary['configFiles'] = workflow.configFiles.join(', ') - - // Get pipeline parameters defined in JSON Schema - def Map params_summary = [:] - def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) - for (group in params_map.keySet()) { - def sub_params = new LinkedHashMap() - def group_params = params_map.get(group) // This gets the parameters of that particular group - for (param in group_params.keySet()) { - if (params.containsKey(param)) { - def params_value = params.get(param) - def schema_value = group_params.get(param).default - def param_type = group_params.get(param).type - if (schema_value != null) { - if (param_type == 'string') { - if (schema_value.contains('$projectDir') || schema_value.contains('${projectDir}')) { - def sub_string = schema_value.replace('\$projectDir', '') - sub_string = sub_string.replace('\${projectDir}', '') - if (params_value.contains(sub_string)) { - schema_value = params_value - } - } - if (schema_value.contains('$params.outdir') || schema_value.contains('${params.outdir}')) { - def sub_string = schema_value.replace('\$params.outdir', '') - sub_string = sub_string.replace('\${params.outdir}', '') - if ("${params.outdir}${sub_string}" == params_value) { - schema_value = params_value - } - } - } - } - - // We have a default in the schema, and this isn't it - if (schema_value != null && params_value != schema_value) { - sub_params.put(param, params_value) - } - // No default in the schema, and this isn't empty - else if (schema_value == null && params_value != "" && params_value != null && params_value != false) { - sub_params.put(param, params_value) - } - } - } - params_summary.put(group, sub_params) - } - return [ 'Core Nextflow options' : workflow_summary ] << params_summary - } - - // - // Beautify parameters for summary and return as string - // - public static String paramsSummaryLog(workflow, params) { - Map colors = NfcoreTemplate.logColours(params.monochrome_logs) - String output = '' - def params_map = paramsSummaryMap(workflow, params) - def max_chars = paramsMaxChars(params_map) - for (group in params_map.keySet()) { - def group_params = params_map.get(group) // This gets the parameters of that particular group - if (group_params) { - output += colors.bold + group + colors.reset + '\n' - for (param in group_params.keySet()) { - output += " " + colors.blue + param.padRight(max_chars) + ": " + colors.green + group_params.get(param) + colors.reset + '\n' - } - output += '\n' - } - } - output += "!! Only displaying parameters that differ from the pipeline defaults !!\n" - output += NfcoreTemplate.dashedLine(params.monochrome_logs) - return output - } - - // - // Loop over nested exceptions and print the causingException - // - private static void printExceptions(ex_json, params_json, log, enums, limit=5) { - def causingExceptions = ex_json['causingExceptions'] - if (causingExceptions.length() == 0) { - def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ - // Missing required param - if (m.matches()) { - log.error "* Missing required parameter: --${m[0][1]}" - } - // Other base-level error - else if (ex_json['pointerToViolation'] == '#') { - log.error "* ${ex_json['message']}" - } - // Error with specific param - else { - def param = ex_json['pointerToViolation'] - ~/^#\// - def param_val = params_json[param].toString() - if (enums.containsKey(param)) { - def error_msg = "* --${param}: '${param_val}' is not a valid choice (Available choices" - if (enums[param].size() > limit) { - log.error "${error_msg} (${limit} of ${enums[param].size()}): ${enums[param][0..limit-1].join(', ')}, ... )" - } else { - log.error "${error_msg}: ${enums[param].join(', ')})" - } - } else { - log.error "* --${param}: ${ex_json['message']} (${param_val})" - } - } - } - for (ex in causingExceptions) { - printExceptions(ex, params_json, log, enums) - } - } - - // - // Remove an element from a JSONArray - // - private static JSONArray removeElement(json_array, element) { - def list = [] - int len = json_array.length() - for (int i=0;i - if(raw_schema.keySet().contains('definitions')){ - raw_schema.definitions.each { definition -> - for (key in definition.keySet()){ - if (definition[key].get("properties").keySet().contains(ignore_param)){ - // Remove the param to ignore - definition[key].get("properties").remove(ignore_param) - // If the param was required, change this - if (definition[key].has("required")) { - def cleaned_required = removeElement(definition[key].required, ignore_param) - definition[key].put("required", cleaned_required) - } - } - } - } - } - if(raw_schema.keySet().contains('properties') && raw_schema.get('properties').keySet().contains(ignore_param)) { - raw_schema.get("properties").remove(ignore_param) - } - if(raw_schema.keySet().contains('required') && raw_schema.required.contains(ignore_param)) { - def cleaned_required = removeElement(raw_schema.required, ignore_param) - raw_schema.put("required", cleaned_required) - } - } - return raw_schema - } - - // - // Clean and check parameters relative to Nextflow native classes - // - private static Map cleanParameters(params) { - def new_params = params.getClass().newInstance(params) - for (p in params) { - // remove anything evaluating to false - if (!p['value']) { - new_params.remove(p.key) - } - // Cast MemoryUnit to String - if (p['value'].getClass() == nextflow.util.MemoryUnit) { - new_params.replace(p.key, p['value'].toString()) - } - // Cast Duration to String - if (p['value'].getClass() == nextflow.util.Duration) { - new_params.replace(p.key, p['value'].toString().replaceFirst(/d(?!\S)/, "day")) - } - // Cast LinkedHashMap to String - if (p['value'].getClass() == LinkedHashMap) { - new_params.replace(p.key, p['value'].toString()) - } - } - return new_params - } - - // - // This function tries to read a JSON params file - // - private static LinkedHashMap paramsLoad(String json_schema) { - def params_map = new LinkedHashMap() - try { - params_map = paramsRead(json_schema) - } catch (Exception e) { - println "Could not read parameters settings from JSON. $e" - params_map = new LinkedHashMap() - } - return params_map - } - - // - // Method to actually read in JSON file using Groovy. - // Group (as Key), values are all parameters - // - Parameter1 as Key, Description as Value - // - Parameter2 as Key, Description as Value - // .... - // Group - // - - private static LinkedHashMap paramsRead(String json_schema) throws Exception { - def json = new File(json_schema).text - def Map schema_definitions = (Map) new JsonSlurper().parseText(json).get('definitions') - def Map schema_properties = (Map) new JsonSlurper().parseText(json).get('properties') - /* Tree looks like this in nf-core schema - * definitions <- this is what the first get('definitions') gets us - group 1 - title - description - properties - parameter 1 - type - description - parameter 2 - type - description - group 2 - title - description - properties - parameter 1 - type - description - * properties <- parameters can also be ungrouped, outside of definitions - parameter 1 - type - description - */ - - // Grouped params - def params_map = new LinkedHashMap() - schema_definitions.each { key, val -> - def Map group = schema_definitions."$key".properties // Gets the property object of the group - def title = schema_definitions."$key".title - def sub_params = new LinkedHashMap() - group.each { innerkey, value -> - sub_params.put(innerkey, value) - } - params_map.put(title, sub_params) - } - - // Ungrouped params - def ungrouped_params = new LinkedHashMap() - schema_properties.each { innerkey, value -> - ungrouped_params.put(innerkey, value) - } - params_map.put("Other parameters", ungrouped_params) - - return params_map - } - - // - // Get maximum number of characters across all parameter names - // - private static Integer paramsMaxChars(params_map) { - Integer max_chars = 0 - for (group in params_map.keySet()) { - def group_params = params_map.get(group) // This gets the parameters of that particular group - for (param in group_params.keySet()) { - if (param.size() > max_chars) { - max_chars = param.size() - } - } - } - return max_chars - } -} diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy deleted file mode 100755 index 25a0a74a..00000000 --- a/lib/NfcoreTemplate.groovy +++ /dev/null @@ -1,336 +0,0 @@ -// -// This file holds several functions used within the nf-core pipeline template. -// - -import org.yaml.snakeyaml.Yaml - -class NfcoreTemplate { - - // - // Check AWS Batch related parameters have been specified correctly - // - public static void awsBatch(workflow, params) { - if (workflow.profile.contains('awsbatch')) { - // Check params.awsqueue and params.awsregion have been set if running on AWSBatch - assert (params.awsqueue && params.awsregion) : "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" - // Check outdir paths to be S3 buckets if running on AWSBatch - assert params.outdir.startsWith('s3:') : "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" - } - } - - // - // Warn if a -profile or Nextflow config has not been provided to run the pipeline - // - public static void checkConfigProvided(workflow, log) { - if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { - log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + - "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + - " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + - " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + - " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + - "Please refer to the quick start section and usage docs for the pipeline.\n " - } - } - - // - // Generate version string - // - public static String version(workflow) { - String version_string = "" - - if (workflow.manifest.version) { - def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' - version_string += "${prefix_v}${workflow.manifest.version}" - } - - if (workflow.commitId) { - def git_shortsha = workflow.commitId.substring(0, 7) - version_string += "-g${git_shortsha}" - } - - return version_string - } - - // - // Construct and send completion email - // - public static void email(workflow, params, summary_params, projectDir, log, multiqc_report=[]) { - - // Set up the e-mail variables - def subject = "[$workflow.manifest.name] Successful: $workflow.runName" - if (!workflow.success) { - subject = "[$workflow.manifest.name] FAILED: $workflow.runName" - } - - def summary = [:] - for (group in summary_params.keySet()) { - summary << summary_params[group] - } - - def misc_fields = [:] - misc_fields['Date Started'] = workflow.start - misc_fields['Date Completed'] = workflow.complete - misc_fields['Pipeline script file path'] = workflow.scriptFile - misc_fields['Pipeline script hash ID'] = workflow.scriptId - if (workflow.repository) misc_fields['Pipeline repository Git URL'] = workflow.repository - if (workflow.commitId) misc_fields['Pipeline repository Git Commit'] = workflow.commitId - if (workflow.revision) misc_fields['Pipeline Git branch/tag'] = workflow.revision - misc_fields['Nextflow Version'] = workflow.nextflow.version - misc_fields['Nextflow Build'] = workflow.nextflow.build - misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp - - def email_fields = [:] - email_fields['version'] = NfcoreTemplate.version(workflow) - email_fields['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 << misc_fields - - // On success try attach the multiqc report - def mqc_report = null - try { - if (workflow.success) { - mqc_report = multiqc_report.getVal() - if (mqc_report.getClass() == ArrayList && mqc_report.size() >= 1) { - if (mqc_report.size() > 1) { - log.warn "[$workflow.manifest.name] Found multiple reports from process 'MULTIQC', will use only one" - } - mqc_report = mqc_report[0] - } - } - } catch (all) { - if (multiqc_report) { - log.warn "[$workflow.manifest.name] Could not attach MultiQC report to summary email" - } - } - - // Check if we are only sending emails on failure - def 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("$projectDir/assets/email_template.txt") - def txt_template = engine.createTemplate(tf).make(email_fields) - def email_txt = txt_template.toString() - - // Render the HTML template - def hf = new File("$projectDir/assets/email_template.html") - def html_template = engine.createTemplate(hf).make(email_fields) - def email_html = html_template.toString() - - // Render the sendmail template - def max_multiqc_email_size = params.max_multiqc_email_size as nextflow.util.MemoryUnit - def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes() ] - def sf = new File("$projectDir/assets/sendmail_template.txt") - def sendmail_template = engine.createTemplate(sf).make(smail_fields) - def sendmail_html = sendmail_template.toString() - - // Send the HTML e-mail - Map colors = logColours(params.monochrome_logs) - 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 "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-" - } catch (all) { - // Catch failures and try with plaintext - def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] - if ( mqc_report.size() <= max_multiqc_email_size.toBytes() ) { - mail_cmd += [ '-A', mqc_report ] - } - mail_cmd.execute() << email_html - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} 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 } - } - - // - // Construct and send a notification to a web server as JSON - // e.g. Microsoft Teams and Slack - // - public static void IM_notification(workflow, params, summary_params, projectDir, log) { - def hook_url = params.hook_url - - def summary = [:] - for (group in summary_params.keySet()) { - summary << summary_params[group] - } - - def misc_fields = [:] - misc_fields['start'] = workflow.start - misc_fields['complete'] = workflow.complete - misc_fields['scriptfile'] = workflow.scriptFile - misc_fields['scriptid'] = workflow.scriptId - if (workflow.repository) misc_fields['repository'] = workflow.repository - if (workflow.commitId) misc_fields['commitid'] = workflow.commitId - if (workflow.revision) misc_fields['revision'] = workflow.revision - misc_fields['nxf_version'] = workflow.nextflow.version - misc_fields['nxf_build'] = workflow.nextflow.build - misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp - - def msg_fields = [:] - msg_fields['version'] = NfcoreTemplate.version(workflow) - msg_fields['runName'] = workflow.runName - msg_fields['success'] = workflow.success - msg_fields['dateComplete'] = workflow.complete - msg_fields['duration'] = workflow.duration - msg_fields['exitStatus'] = workflow.exitStatus - msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') - msg_fields['errorReport'] = (workflow.errorReport ?: 'None') - msg_fields['commandLine'] = workflow.commandLine.replaceFirst(/ +--hook_url +[^ ]+/, "") - msg_fields['projectDir'] = workflow.projectDir - msg_fields['summary'] = summary << misc_fields - - // Render the JSON template - def engine = new groovy.text.GStringTemplateEngine() - // Different JSON depending on the service provider - // Defaults to "Adaptive Cards" (https://adaptivecards.io), except Slack which has its own format - def json_path = hook_url.contains("hooks.slack.com") ? "slackreport.json" : "adaptivecard.json" - def hf = new File("$projectDir/assets/${json_path}") - def json_template = engine.createTemplate(hf).make(msg_fields) - def json_message = json_template.toString() - - // POST - def post = new URL(hook_url).openConnection(); - post.setRequestMethod("POST") - post.setDoOutput(true) - post.setRequestProperty("Content-Type", "application/json") - post.getOutputStream().write(json_message.getBytes("UTF-8")); - def postRC = post.getResponseCode(); - if (! postRC.equals(200)) { - log.warn(post.getErrorStream().getText()); - } - } - - // - // Print pipeline summary on completion - // - public static void summary(workflow, params, log) { - Map colors = logColours(params.monochrome_logs) - if (workflow.success) { - if (workflow.stats.ignoredCount == 0) { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" - } else { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" - } - } else { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" - } - } - - // - // ANSII Colours used for terminal logging - // - public static Map logColours(Boolean monochrome_logs) { - Map colorcodes = [:] - - // Reset / Meta - colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" - colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" - colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" - colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" - colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" - colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" - colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" - - // Regular Colors - colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" - colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" - colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" - colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" - colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" - colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" - colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" - colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" - - // Bold - colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" - colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" - colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" - colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" - colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" - colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" - colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" - colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" - - // Underline - colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" - colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" - colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" - colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" - colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" - colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" - colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" - colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" - - // High Intensity - colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" - colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" - colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" - colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" - colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" - colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" - colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" - colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" - - // Bold High Intensity - colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" - colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" - colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" - colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" - colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" - colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" - colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" - colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" - - return colorcodes - } - - // - // Does what is says on the tin - // - public static String dashedLine(monochrome_logs) { - Map colors = logColours(monochrome_logs) - return "-${colors.dim}----------------------------------------------------${colors.reset}-" - } - - // - // nf-core logo - // - public static String logo(workflow, monochrome_logs) { - Map colors = logColours(monochrome_logs) - String workflow_version = NfcoreTemplate.version(workflow) - String.format( - """\n - ${dashedLine(monochrome_logs)} - ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} - ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} - ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} - ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} - ${colors.green}`._,._,\'${colors.reset} - ${colors.purple} ${workflow.manifest.name} ${workflow_version}${colors.reset} - ${dashedLine(monochrome_logs)} - """.stripIndent() - ) - } -} diff --git a/lib/Utils.groovy b/lib/Utils.groovy deleted file mode 100644 index 8d030f4e..00000000 --- a/lib/Utils.groovy +++ /dev/null @@ -1,47 +0,0 @@ -// -// This file holds several Groovy functions that could be useful for any Nextflow pipeline -// - -import org.yaml.snakeyaml.Yaml - -class Utils { - - // - // When running with -profile conda, warn if channels have not been set-up appropriately - // - public static void checkCondaChannels(log) { - Yaml parser = new Yaml() - def channels = [] - try { - def config = parser.load("conda config --show channels".execute().text) - channels = config.channels - } catch(NullPointerException | IOException e) { - log.warn "Could not verify conda channel configuration." - return - } - - // Check that all channels are present - // This channel list is ordered by required channel priority. - def required_channels_in_order = ['conda-forge', 'bioconda', 'defaults'] - def channels_missing = ((required_channels_in_order as Set) - (channels as Set)) as Boolean - - // Check that they are in the right order - def channel_priority_violation = false - def n = required_channels_in_order.size() - for (int i = 0; i < n - 1; i++) { - channel_priority_violation |= !(channels.indexOf(required_channels_in_order[i]) < channels.indexOf(required_channels_in_order[i+1])) - } - - if (channels_missing | channel_priority_violation) { - log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " There is a problem with your Conda configuration!\n\n" + - " You will need to set-up the conda-forge and bioconda channels correctly.\n" + - " Please refer to https://bioconda.github.io/\n" + - " The observed channel order is \n" + - " ${channels}\n" + - " but the following channel order is required:\n" + - " ${required_channels_in_order}\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - } - } -} diff --git a/lib/WorkflowAtacseq.groovy b/lib/WorkflowAtacseq.groovy deleted file mode 100755 index ee8048bd..00000000 --- a/lib/WorkflowAtacseq.groovy +++ /dev/null @@ -1,125 +0,0 @@ -// -// This file holds several functions specific to the workflow/atacseq.nf in the nf-core/atacseq pipeline -// - -import nextflow.Nextflow -import groovy.text.SimpleTemplateEngine - -class WorkflowAtacseq { - - // - // Check and validate parameters - // - public static void initialise(params, log, valid_params) { - genomeExistsError(params, log) - - - if (!params.fasta) { - Nextflow.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." - } - - if (!params.gtf && !params.gff) { - log.error "No GTF or GFF3 annotation specified! The pipeline requires at least one of these files." - System.exit(1) - } - - if (params.gtf && params.gff) { - gtfGffWarn(log) - } - - if (!params.macs_gsize) { - macsGsizeWarn(log) - } - - if (!params.read_length && !params.macs_gsize) { - log.error "Both '--read_length' and '--macs_gsize' not specified! Please specify either to infer MACS2 genome size for peak calling." - System.exit(1) - } - if (params.aligner) { - if (!valid_params['aligners'].contains(params.aligner)) { - log.error "Invalid option: '${params.aligner}'. Valid options for '--aligner': ${valid_params['aligners'].join(', ')}." - System.exit(1) - } - } - } - - // - // Get workflow summary for MultiQC - // - public static String paramsSummaryMultiqc(workflow, summary) { - String summary_section = '' - for (group in summary.keySet()) { - def group_params = summary.get(group) // This gets the parameters of that particular group - if (group_params) { - summary_section += "

$group

\n" - summary_section += "
\n" - for (param in group_params.keySet()) { - summary_section += "
$param
${group_params.get(param) ?: 'N/A'}
\n" - } - summary_section += "
\n" - } - } - - String yaml_file_text = "id: '${workflow.manifest.name.replace('/','-')}-summary'\n" - yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n" - yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n" - yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n" - yaml_file_text += "plot_type: 'html'\n" - yaml_file_text += "data: |\n" - yaml_file_text += "${summary_section}" - return yaml_file_text - } - - public static String methodsDescriptionText(run_workflow, mqc_methods_yaml) { - // Convert to a named map so can be used as with familar NXF ${workflow} variable syntax in the MultiQC YML file - def meta = [:] - meta.workflow = run_workflow.toMap() - meta["manifest_map"] = run_workflow.manifest.toMap() - - meta["doi_text"] = meta.manifest_map.doi ? "(doi: ${meta.manifest_map.doi})" : "" - meta["nodoi_text"] = meta.manifest_map.doi ? "": "
  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " - - def methods_text = mqc_methods_yaml.text - - def engine = new SimpleTemplateEngine() - def description_html = engine.createTemplate(methods_text).make(meta) - - return description_html - } - - // - // Exit pipeline if incorrect --genome key provided - // - private static void genomeExistsError(params, log) { - if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - def error_string = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + - " Currently, the available genome keys are:\n" + - " ${params.genomes.keySet().join(", ")}\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - Nextflow.error(error_string) - } - } - - // - // Print a warning if both GTF and GFF have been provided - // - private static void gtfGffWarn(log) { - log.warn "=============================================================================\n" + - " Both '--gtf' and '--gff' parameters have been provided.\n" + - " Using GTF file as priority.\n" + - "===================================================================================" - } - - // - // Print a warning if macs_gsize parameter has not been provided - // - private static void macsGsizeWarn(log) { - log.warn "=============================================================================\n" + - " --macs_gsize parameter has not been provided.\n" + - " It will be auto-calculated by 'khmer unique-kmers.py' using the '--read_length' parameter.\n" + - " Explicitly provide '--macs_gsize macs2_genome_size' to change this behaviour.\n" + - "===================================================================================" - } - -} diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy deleted file mode 100755 index 1cce2f0d..00000000 --- a/lib/WorkflowMain.groovy +++ /dev/null @@ -1,114 +0,0 @@ -// -// This file holds several functions specific to the main.nf workflow in the nf-core/atacseq pipeline -// - -import nextflow.Nextflow - -class WorkflowMain { - - // - // Citation string for pipeline - // - public static String citation(workflow) { - return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + - "* The pipeline\n" + - " https://doi.org/10.5281/zenodo.2634132\n\n" + - "* The nf-core framework\n" + - " https://doi.org/10.1038/s41587-020-0439-x\n\n" + - "* Software dependencies\n" + - " https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md" - } - - // - // Generate help string - // - public static String help(workflow, params) { - def command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --outdir --genome GRCh37 -profile docker" - def help_string = '' - help_string += NfcoreTemplate.logo(workflow, params.monochrome_logs) - help_string += NfcoreSchema.paramsHelp(workflow, params, command) - help_string += '\n' + citation(workflow) + '\n' - help_string += NfcoreTemplate.dashedLine(params.monochrome_logs) - return help_string - } - - // - // Generate parameter summary log string - // - public static String paramsSummaryLog(workflow, params) { - def summary_log = '' - summary_log += NfcoreTemplate.logo(workflow, params.monochrome_logs) - summary_log += NfcoreSchema.paramsSummaryLog(workflow, params) - summary_log += '\n' + citation(workflow) + '\n' - summary_log += NfcoreTemplate.dashedLine(params.monochrome_logs) - return summary_log - } - - // - // Validate parameters and print summary to screen - // - public static void initialise(workflow, params, log) { - // Print help to screen if required - if (params.help) { - log.info help(workflow, params) - System.exit(0) - } - - // Print workflow version and exit on --version - if (params.version) { - String workflow_version = NfcoreTemplate.version(workflow) - log.info "${workflow.manifest.name} ${workflow_version}" - System.exit(0) - } - - // Print parameter summary log to screen - log.info paramsSummaryLog(workflow, params) - - // Validate workflow parameters via the JSON schema - if (params.validate_params) { - NfcoreSchema.validateParameters(workflow, params, log) - } - - // Check that a -profile or Nextflow config has been provided to run the pipeline - NfcoreTemplate.checkConfigProvided(workflow, log) - - // Check that conda channels are set-up correctly - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - Utils.checkCondaChannels(log) - } - - // Check AWS batch settings - NfcoreTemplate.awsBatch(workflow, params) - - // Check input has been provided - if (!params.input) { - Nextflow.error("Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'") - } - } - // - // Get attribute from genome config file e.g. fasta - // - public static Object getGenomeAttribute(params, attribute) { - if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { - if (params.genomes[ params.genome ].containsKey(attribute)) { - return params.genomes[ params.genome ][ attribute ] - } - } - return null - } - - // - // Get macs genome size (macs_gsize) - // - public static Long getMacsGsize(params) { - def val = null - if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { - if (params.genomes[ params.genome ].containsKey('macs_gsize')) { - if (params.genomes[ params.genome ][ 'macs_gsize' ].containsKey(params.read_length.toString())) { - val = params.genomes[ params.genome ][ 'macs_gsize' ][ params.read_length.toString() ] - } - } - } - return val - } -} diff --git a/lib/nfcore_external_java_deps.jar b/lib/nfcore_external_java_deps.jar deleted file mode 100644 index 805c8bb5..00000000 Binary files a/lib/nfcore_external_java_deps.jar and /dev/null differ diff --git a/main.nf b/main.nf index 54aad22c..dbbc8b6f 100644 --- a/main.nf +++ b/main.nf @@ -9,62 +9,170 @@ ---------------------------------------------------------------------------------------- */ -nextflow.enable.dsl = 2 - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GENOME PARAMETER VALUES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') -params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') -params.bowtie2_index = WorkflowMain.getGenomeAttribute(params, 'bowtie2') -params.chromap_index = WorkflowMain.getGenomeAttribute(params, 'chromap') -params.star_index = WorkflowMain.getGenomeAttribute(params, 'star') -params.gtf = WorkflowMain.getGenomeAttribute(params, 'gtf') -params.gff = WorkflowMain.getGenomeAttribute(params, 'gff') -params.gene_bed = WorkflowMain.getGenomeAttribute(params, 'gene_bed') -params.tss_bed = WorkflowMain.getGenomeAttribute(params, 'tss_bed') -params.blacklist = WorkflowMain.getGenomeAttribute(params, 'blacklist') -params.mito_name = WorkflowMain.getGenomeAttribute(params, 'mito_name') -params.macs_gsize = WorkflowMain.getMacsGsize(params) +params.fasta = getGenomeAttribute('fasta') +params.bwa_index = getGenomeAttribute('bwa') +params.bowtie2_index = getGenomeAttribute('bowtie2') +params.chromap_index = getGenomeAttribute('chromap') +params.star_index = getGenomeAttribute('star') +params.gtf = getGenomeAttribute('gtf') +params.gff = getGenomeAttribute('gff') +params.gene_bed = getGenomeAttribute('gene_bed') +params.tss_bed = getGenomeAttribute('tss_bed') +params.blacklist = getGenomeAttribute('blacklist') +params.mito_name = getGenomeAttribute('mito_name') +params.macs_gsize = getMacsGsize(params) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - VALIDATE & PRINT PARAMETER SUMMARY + IMPORT FUNCTIONS / MODULES / SUBWORKFLOWS / WORKFLOWS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -WorkflowMain.initialise(workflow, params, log) +include { ATACSEQ } from './workflows/atacseq' +include { PREPARE_GENOME } from './subworkflows/local/prepare_genome' +include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_atacseq_pipeline' +include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_atacseq_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - NAMED WORKFLOW FOR PIPELINE + NAMED WORKFLOWS FOR PIPELINE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { ATACSEQ } from './workflows/atacseq' - // -// WORKFLOW: Run main nf-core/atacseq analysis pipeline +// WORKFLOW: Run main analysis pipeline // workflow NFCORE_ATACSEQ { - ATACSEQ () + + main: + // SUBWORKFLOW: Prepare genome files + PREPARE_GENOME ( + params.genome, + params.genomes, + params.aligner, + params.fasta, + params.gtf, + params.gff, + params.blacklist, + params.gene_bed, + params.tss_bed, + params.mito_name, + params.keep_mito, + params.bwa_index, + params.bowtie2_index, + params.chromap_index, + params.star_index, + params.macs_gsize, + params.read_length + ) + + // + // WORKFLOW: Run nf-core/atacseq workflow + // + ch_samplesheet = channel.value(file(params.input, checkIfExists: true)) + + ATACSEQ ( + ch_samplesheet, + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.fai, + PREPARE_GENOME.out.gtf, + PREPARE_GENOME.out.gene_bed, + PREPARE_GENOME.out.tss_bed, + PREPARE_GENOME.out.chrom_sizes, + PREPARE_GENOME.out.filtered_bed, + PREPARE_GENOME.out.bwa_index, + PREPARE_GENOME.out.bowtie2_index, + PREPARE_GENOME.out.chromap_index, + PREPARE_GENOME.out.star_index, + PREPARE_GENOME.out.autosomes, + PREPARE_GENOME.out.macs_gsize, + params.multiqc_config, + params.multiqc_logo, + params.multiqc_methods_description, + params.outdir + ) + + emit: + ATACSEQ.out // channel: /path/to/multiqc_report.html } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - RUN ALL WORKFLOWS + RUN MAIN WORKFLOW ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -// -// WORKFLOW: Execute a single named workflow for the pipeline -// See: https://github.com/nf-core/rnaseq/issues/619 -// workflow { + + main: + // + // SUBWORKFLOW: Run initialisation tasks + // + PIPELINE_INITIALISATION ( + params.version, + params.validate_params, + params.monochrome_logs, + args, + params.outdir, + params.input, + params.help, + params.help_full, + params.show_hidden + ) + + // + // WORKFLOW: Run main workflow + // NFCORE_ATACSEQ () + + // + // SUBWORKFLOW: Run completion tasks + // + PIPELINE_COMPLETION ( + params.email, + params.email_on_fail, + params.plaintext_email, + params.outdir, + params.monochrome_logs, + NFCORE_ATACSEQ.out + ) +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + FUNCTIONS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +// +// Get attribute from genome config file e.g. fasta +// + +def getGenomeAttribute(attribute) { + if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { + if (params.genomes[ params.genome ].containsKey(attribute)) { + return params.genomes[ params.genome ][ attribute ] + } + } + return null +} + +def getMacsGsize(params) { + def val = null + if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { + if (params.genomes[ params.genome ].containsKey('macs_gsize')) { + if (params.genomes[ params.genome ][ 'macs_gsize' ].containsKey(params.read_length.toString())) { + val = params.genomes[ params.genome ][ 'macs_gsize' ][ params.read_length.toString() ] + } + } + } + return val } /* diff --git a/modules.json b/modules.json index bab8f05f..717b50ac 100644 --- a/modules.json +++ b/modules.json @@ -7,260 +7,185 @@ "nf-core": { "ataqv/ataqv": { "branch": "master", - "git_sha": "56421e1a812bc2f9e77dbe9f297e9d9c580cb8a5", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] }, "ataqv/mkarv": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] - }, - "bedtools/bamtobed": { - "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] }, "bowtie2/align": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "fastq_align_bowtie2" - ] + "git_sha": "a0961c41021561ac7cf139f86bd7812a2f99e994", + "installed_by": ["fastq_align_bowtie2"] }, "bowtie2/build": { "branch": "master", - "git_sha": "e797efb47b0d3b2124753beb55dc83ab9512bceb", - "installed_by": [ - "modules" - ] + "git_sha": "a0961c41021561ac7cf139f86bd7812a2f99e994", + "installed_by": ["modules"] }, "bwa/index": { "branch": "master", - "git_sha": "9518fa4f65f3fb8cde24fde7d40333b39ec8fd65", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"], + "patch": "modules/nf-core/bwa/index/bwa-index.diff" }, "bwa/mem": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "fastq_align_bwa" - ] + "git_sha": "2fb127c8fd13de0adaa676df7169131e45c0b114", + "installed_by": ["fastq_align_bwa"] }, "chromap/chromap": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "fastq_align_chromap" - ] + "git_sha": "f2f969a4ee32243c7fab75f341f9be1dd3ce1a23", + "installed_by": ["fastq_align_chromap"] }, "chromap/index": { "branch": "master", - "git_sha": "3a8e3ca607132a468c07c69aaa3bccd55eb983b8", - "installed_by": [ - "modules" - ] - }, - "custom/dumpsoftwareversions": { - "branch": "master", - "git_sha": "8022c68e7403eecbd8ba9c49496f69f8c49d50f0", - "installed_by": [ - "modules" - ] + "git_sha": "f2f969a4ee32243c7fab75f341f9be1dd3ce1a23", + "installed_by": ["modules"] }, - "custom/getchromsizes": { + "deeptools/alignmentsieve": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] }, "deeptools/computematrix": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] }, "deeptools/plotfingerprint": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] }, "deeptools/plotheatmap": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] }, "deeptools/plotprofile": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] }, "fastqc": { "branch": "master", - "git_sha": "810e8f2603ec38401d49a4aaed06f6d058745552", - "installed_by": [ - "modules", - "fastq_fastqc_umitools_trimgalore" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["fastq_fastqc_umitools_trimgalore", "modules"] }, "gffread": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "c9ad4d691aa339e478a77847e3ef854ccd21778b", + "installed_by": ["modules"] }, "gunzip": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "0902eac3012baaf4f9ab6513c8c55acc9353c96c", + "installed_by": ["modules"] }, "homer/annotatepeaks": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "9ed7f157dd96f83b852da7ea4d3a217907f50f36", + "installed_by": ["modules"] }, "khmer/uniquekmers": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "995d1b7d65d5a841220304d088161d8bff07378a", + "installed_by": ["modules"] + }, + "macs3/callpeak": { + "branch": "master", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] + }, + "multiqc": { + "branch": "master", + "git_sha": "98403d15b0e50edae1f3fec5eae5e24982f1fade", + "installed_by": ["modules"] }, - "macs2/callpeak": { + "picard/addorreplacereadgroups": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["fastq_align_chromap"] }, "picard/collectmultiplemetrics": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] }, "picard/markduplicates": { "branch": "master", - "git_sha": "eca65aa4a5e2e192ac44d6962c8f9260f314ffb8", - "installed_by": [ - "modules", - "bam_markduplicates_picard" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["bam_markduplicates_picard"] }, "picard/mergesamfiles": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] }, "preseq/lcextrap": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] + }, + "samtools/faidx": { + "branch": "master", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "bam_stats_samtools" - ] + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "bam_stats_samtools" - ] + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "bam_markduplicates_picard", - "bam_sort_stats_samtools" - ] + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", + "installed_by": ["bam_markduplicates_picard", "bam_sort_stats_samtools"] }, "samtools/sort": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "bam_sort_stats_samtools" - ] + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", + "installed_by": ["bam_sort_stats_samtools"] }, "samtools/stats": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "bam_stats_samtools" - ] + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", + "installed_by": ["bam_stats_samtools"] }, "subread/featurecounts": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"], + "patch": "modules/nf-core/subread/featurecounts/subread-featurecounts.diff" }, "trimgalore": { "branch": "master", - "git_sha": "b51a69e30973c71950225c817ad07a3337d22c40", - "installed_by": [ - "modules", - "fastq_fastqc_umitools_trimgalore" - ] + "git_sha": "0991b1032cccfcd9245ef59c6e56d6092ac0b3e7", + "installed_by": ["fastq_fastqc_umitools_trimgalore"] }, "ucsc/bedgraphtobigwig": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] }, "umitools/extract": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "fastq_fastqc_umitools_trimgalore" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["fastq_fastqc_umitools_trimgalore"] }, "untar": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] } } }, @@ -268,60 +193,56 @@ "nf-core": { "bam_markduplicates_picard": { "branch": "master", - "git_sha": "6daac2bc63f4847e0c7cc661f4f5b043ac13faaf", - "installed_by": [ - "subworkflows" - ] + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", + "installed_by": ["subworkflows"] }, "bam_sort_stats_samtools": { "branch": "master", - "git_sha": "3911652a6b24249358f79e8b8466338d63efb2a2", - "installed_by": [ - "subworkflows", - "fastq_align_bwa", - "fastq_align_bowtie2", - "fastq_align_chromap" - ] + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", + "installed_by": ["fastq_align_bowtie2", "fastq_align_bwa", "fastq_align_chromap"] }, "bam_stats_samtools": { "branch": "master", - "git_sha": "92eb5091ae5368a60cda58b3a0ced8b36d715b0f", - "installed_by": [ - "bam_markduplicates_picard", - "bam_sort_stats_samtools", - "subworkflows" - ] + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", + "installed_by": ["bam_markduplicates_picard", "bam_sort_stats_samtools"] }, "fastq_align_bowtie2": { "branch": "master", - "git_sha": "ac75f79157ecc64283a2b3a559f1ba90bc0f2259", - "installed_by": [ - "subworkflows" - ] + "git_sha": "a0961c41021561ac7cf139f86bd7812a2f99e994", + "installed_by": ["subworkflows"] }, "fastq_align_bwa": { "branch": "master", - "git_sha": "ac75f79157ecc64283a2b3a559f1ba90bc0f2259", - "installed_by": [ - "subworkflows" - ] + "git_sha": "cbb7a6362981f07d2c26e43f8186025320569ffd", + "installed_by": ["subworkflows"] }, "fastq_align_chromap": { "branch": "master", - "git_sha": "ac75f79157ecc64283a2b3a559f1ba90bc0f2259", - "installed_by": [ - "subworkflows" - ] + "git_sha": "d92e0f8276a79d316fd324eae0edefeaf680804c", + "installed_by": ["subworkflows"] }, "fastq_fastqc_umitools_trimgalore": { "branch": "master", - "git_sha": "b51a69e30973c71950225c817ad07a3337d22c40", - "installed_by": [ - "subworkflows" - ] + "git_sha": "e5777ea46cc591b519b9bb931e952e4a149cb47d", + "installed_by": ["subworkflows"] + }, + "utils_nextflow_pipeline": { + "branch": "master", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "installed_by": ["subworkflows"] + }, + "utils_nfcore_pipeline": { + "branch": "master", + "git_sha": "a3fb7351b1fdb2b1de282b765816bbea190e86a8", + "installed_by": ["subworkflows"] + }, + "utils_nfschema_plugin": { + "branch": "master", + "git_sha": "fdc08b8b1ae74f56686ce21f7ea11ad11990ce57", + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} diff --git a/modules/local/bam_remove_orphans.nf b/modules/local/bam_remove_orphans.nf index 26230ba8..0ba91407 100644 --- a/modules/local/bam_remove_orphans.nf +++ b/modules/local/bam_remove_orphans.nf @@ -12,8 +12,7 @@ process BAM_REMOVE_ORPHANS { output: tuple val(meta), path("*.bam"), emit: bam - path "versions.yml" , emit: versions - + tuple val("${task.process}"), val('samtools'), eval("samtools --version | sed '1!d;s/.* //'"), topic: versions when: task.ext.when == null || task.ext.when @@ -27,19 +26,17 @@ process BAM_REMOVE_ORPHANS { ${prefix}.bam \\ $args - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } else { """ ln -s $bam ${prefix}.bam - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + """ } diff --git a/modules/local/bamtools_filter.nf b/modules/local/bamtools_filter.nf index a1e8feed..8dbb1b15 100644 --- a/modules/local/bamtools_filter.nf +++ b/modules/local/bamtools_filter.nf @@ -15,8 +15,8 @@ process BAMTOOLS_FILTER { output: tuple val(meta), path("*.bam"), emit: bam - path "versions.yml" , emit: versions - + tuple val("${task.process}"), val('samtools'), eval("samtools --version | sed '1!d;s/.* //'"), topic: versions + tuple val("${task.process}"), val('bamtools'), eval("bamtools --version | grep bamtools | sed 's/.*bamtools //'"), topic: versions when: task.ext.when == null || task.ext.when @@ -34,10 +34,11 @@ process BAMTOOLS_FILTER { -out ${prefix}.bam \\ -script $config - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - bamtools: \$(echo \$(bamtools --version 2>&1) | sed 's/^.*bamtools //; s/Part .*\$//') - END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam """ } diff --git a/modules/local/bedtools_genomecov.nf b/modules/local/bedtools_genomecov.nf index 92c94b99..6fea7228 100644 --- a/modules/local/bedtools_genomecov.nf +++ b/modules/local/bedtools_genomecov.nf @@ -2,10 +2,10 @@ process BEDTOOLS_GENOMECOV { tag "$meta.id" label 'process_medium' - conda "bioconda::bedtools=2.30.0" + conda "bioconda::bedtools=2.31.1 conda-forge::coreutils=9.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0': - 'biocontainers/bedtools:2.30.0--hc088bd4_0' }" + 'oras://community.wave.seqera.io/library/bedtools_coreutils:ba273c06a3909a15': + 'community.wave.seqera.io/library/bedtools_coreutils:a623c13f66d5262b' }" input: tuple val(meta), path(bam), path(flagstat) @@ -13,14 +13,17 @@ process BEDTOOLS_GENOMECOV { output: tuple val(meta), path("*.bedGraph"), emit: bedgraph tuple val(meta), path("*.txt") , emit: scale_factor - path "versions.yml" , emit: versions - + tuple val("${task.process}"), val('bedtools'), eval("bedtools --version | sed -e \"s/bedtools v//g\""), topic: versions + tuple val("${task.process}"), val('sort'), eval("sort --version | head -n 1 | awk '{print \$4;}'"), topic: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def pe = meta.single_end ? '' : '-pc' + def buffer = task.memory.toGiga().intdiv(2) """ SCALE_FACTOR=\$(grep '[0-9] mapped (' $flagstat | awk '{print 1000000/\$1}') echo \$SCALE_FACTOR > ${prefix}.scale_factor.txt @@ -30,12 +33,28 @@ process BEDTOOLS_GENOMECOV { -ibam $bam \\ -bg \\ -scale \$SCALE_FACTOR \\ + $pe \\ $args \\ - | LC_COLLATE=C sort -T '.' -k1,1 -k2,2n > ${prefix}.bedGraph + > tmp.bg + + ## ref: https://www.biostars.org/p/66927/ + ## ref in nf-core: https://github.com/nf-core/hicar/blob/d2d17a924e42d6f88640b79d48d8b332f33a953f/modules/local/atacreads/bedsort.nf#L23-L29 + LC_ALL=C sort \\ + --parallel=$task.cpus \\ + --buffer-size=${buffer}G \\ + -k1,1 -k2,2n \\ + $args2 \\ + tmp.bg \\ + > ${prefix}.bedGraph - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") - END_VERSIONS + rm tmp.bg + + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bedGraph + touch ${prefix}.scale_factor.txt """ } diff --git a/modules/local/deeptools_alignmentsieve.nf b/modules/local/deeptools_alignmentsieve.nf deleted file mode 100644 index 5148030a..00000000 --- a/modules/local/deeptools_alignmentsieve.nf +++ /dev/null @@ -1,36 +0,0 @@ -process DEEPTOOLS_ALIGNMENTSIEVE { - tag "$meta.id" - label 'process_medium' - - conda "bioconda::deeptools=3.5.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/deeptools:3.5.1--py_0' : - 'biocontainers/deeptools:3.5.1--py_0' }" - - input: - tuple val(meta), path(bam), path(bai) - - output: - tuple val(meta), path("*.bam"), emit: bam - path "versions.yml", emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - - """ - alignmentSieve \\ - $args \\ - -b $bam \\ - -o ${prefix}.bam \\ - --numberOfProcessors $task.cpus - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - deeptools: \$(alignmentSieve --version | sed -e "s/alignmentSieve //g") - END_VERSIONS - """ -} diff --git a/modules/local/deseq2_qc.nf b/modules/local/deseq2_qc.nf index 14b57f69..695c239c 100644 --- a/modules/local/deseq2_qc.nf +++ b/modules/local/deseq2_qc.nf @@ -24,8 +24,8 @@ process DESEQ2_QC { path "*sample.dists_mqc.tsv", optional:true, emit: dists_multiqc path "*.log" , optional:true, emit: log path "size_factors" , optional:true, emit: size_factors - path "versions.yml" , emit: versions - + tuple val("${task.process}"), val('r-base'), eval("R --version | sed '1!d;s/.*version //;s/ .*//'"), topic: versions + tuple val("${task.process}"), val('bioconductor-deseq2'), eval("Rscript -e \"library(DESeq2); cat(as.character(packageVersion('DESeq2')))\""), topic: versions when: task.ext.when == null || task.ext.when @@ -44,14 +44,11 @@ process DESEQ2_QC { sed -i -e 's/DESeq2 /${meta.id} DESeq2 /g' tmp.txt cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv + set +C + sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt sed -i -e 's/DESeq2 /${meta.id} DESeq2 /g' tmp.txt cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv - cat <<-END_VERSIONS > versions.yml - "${task.process}": - r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') - bioconductor-deseq2: \$(Rscript -e "library(DESeq2); cat(as.character(packageVersion('DESeq2')))") - END_VERSIONS """ } diff --git a/modules/local/frip_score.nf b/modules/local/frip_score.nf index 77f856bc..5968d4db 100644 --- a/modules/local/frip_score.nf +++ b/modules/local/frip_score.nf @@ -12,8 +12,8 @@ process FRIP_SCORE { output: tuple val(meta), path("*.txt"), emit: txt - path "versions.yml" , emit: versions - + tuple val("${task.process}"), val('bedtools'), eval("bedtools --version | sed -e \"s/bedtools v//g\""), topic: versions + tuple val("${task.process}"), val('samtools'), eval("samtools --version | sed '1!d;s/.* //'"), topic: versions when: task.ext.when == null || task.ext.when @@ -25,10 +25,11 @@ process FRIP_SCORE { samtools flagstat $bam > ${bam}.flagstat grep 'mapped (' ${bam}.flagstat | grep -v "primary" | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${prefix}", a/\$1}' > ${prefix}.FRiP.txt - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.FRiP.txt """ } diff --git a/modules/local/genome_blacklist_regions.nf b/modules/local/genome_blacklist_regions.nf index 74a7936f..73daaa36 100644 --- a/modules/local/genome_blacklist_regions.nf +++ b/modules/local/genome_blacklist_regions.nf @@ -14,8 +14,7 @@ process GENOME_BLACKLIST_REGIONS { output: path '*.bed' , emit: bed - path "versions.yml", emit: versions - + tuple val("${task.process}"), val('bedtools'), eval("bedtools --version | sed -e \"s/bedtools v//g\""), topic: versions when: task.ext.when == null || task.ext.when @@ -27,19 +26,19 @@ process GENOME_BLACKLIST_REGIONS { """ sortBed -i $blacklist -g $sizes | complementBed -i stdin -g $sizes $mito_filter > $file_out - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") - END_VERSIONS """ } else { """ awk '{print \$1, '0' , \$2}' OFS='\t' $sizes $mito_filter > $file_out - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") - END_VERSIONS """ } + + stub: + def file_out = "${sizes.simpleName}.include_regions.bed" + """ + touch $file_out + """ + + } diff --git a/modules/local/get_autosomes.nf b/modules/local/get_autosomes.nf index ee40ecd1..f2228886 100644 --- a/modules/local/get_autosomes.nf +++ b/modules/local/get_autosomes.nf @@ -11,8 +11,7 @@ process GET_AUTOSOMES { output: path '*.txt' , emit: txt - path "versions.yml", emit: versions - + tuple val("${task.process}"), val('python'), eval("python --version | sed 's/Python //g'"), topic: versions when: task.ext.when == null || task.ext.when @@ -22,9 +21,5 @@ process GET_AUTOSOMES { $fai \\ ${fai.baseName}.autosomes.txt - cat <<-END_VERSIONS > versions.yml - "${task.process}": - python: \$(python --version | sed 's/Python //g') - END_VERSIONS """ } diff --git a/modules/local/gtf2bed.nf b/modules/local/gtf2bed.nf index 059b5d1c..09ebfff1 100644 --- a/modules/local/gtf2bed.nf +++ b/modules/local/gtf2bed.nf @@ -12,8 +12,7 @@ process GTF2BED { output: path '*.bed' , emit: bed - path "versions.yml", emit: versions - + tuple val("${task.process}"), val('perl'), eval("perl -e 'print \$^V' | sed 's/^v//'"), topic: versions when: task.ext.when == null || task.ext.when @@ -23,9 +22,5 @@ process GTF2BED { $gtf \\ > ${gtf.baseName}.bed - cat <<-END_VERSIONS > versions.yml - "${task.process}": - perl: \$(echo \$(perl --version 2>&1) | sed 's/.*v\\(.*\\)) built.*/\\1/') - END_VERSIONS """ } diff --git a/modules/local/igv.nf b/modules/local/igv.nf index d060d0e7..90d0c723 100644 --- a/modules/local/igv.nf +++ b/modules/local/igv.nf @@ -27,8 +27,7 @@ process IGV { path "*.xml" , emit: xml path fasta , emit: fasta path fai , emit: fai - path "versions.yml", emit: versions - + tuple val("${task.process}"), val('python'), eval("python --version | sed 's/Python //g'"), topic: versions when: task.ext.when == null || task.ext.when @@ -44,9 +43,5 @@ process IGV { cat *.txt > igv_files.txt igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' - cat <<-END_VERSIONS > versions.yml - "${task.process}": - python: \$(python --version | sed 's/Python //g') - END_VERSIONS """ } diff --git a/modules/local/macs2_consensus.nf b/modules/local/macs3_consensus.nf similarity index 64% rename from modules/local/macs2_consensus.nf rename to modules/local/macs3_consensus.nf index 1f8ad55f..39630a3b 100644 --- a/modules/local/macs2_consensus.nf +++ b/modules/local/macs3_consensus.nf @@ -1,4 +1,4 @@ -process MACS2_CONSENSUS { +process MACS3_CONSENSUS { tag "$meta.id" label 'process_long' @@ -17,25 +17,25 @@ process MACS2_CONSENSUS { tuple val(meta), path("*.pdf") , emit: pdf tuple val(meta), path("*.boolean.txt") , emit: boolean_txt tuple val(meta), path("*.intersect.txt"), emit: intersect_txt - path "versions.yml" , emit: versions - + tuple val("${task.process}"), val('python'), eval("python --version | sed 's/Python //g'"), topic: versions + tuple val("${task.process}"), val('r-base'), eval("R --version | sed '1!d;s/.*version //;s/ .*//'"), topic: versions when: task.ext.when == null || task.ext.when script: // This script is bundled with the pipeline, in nf-core/atacseq/bin/ - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def peak_type = is_narrow_peak ? 'narrowPeak' : 'broadPeak' - def mergecols = is_narrow_peak ? (2..10).join(',') : (2..9).join(',') - def collapsecols = is_narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') - def expandparam = is_narrow_peak ? '--is_narrow_peak' : '' + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def peak_type = is_narrow_peak ? 'narrowPeak' : 'broadPeak' + def mergecols = is_narrow_peak ? (2..10).join(',') : (2..9).join(',') + def collapsecols = is_narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') + def expandparam = is_narrow_peak ? '--is_narrow_peak' : '' """ - sort -T '.' -k1,1 -k2,2n ${peaks.collect{it.toString()}.sort().join(' ')} \\ + sort -T '.' -k1,1 -k2,2n ${peaks.collect { item -> item.toString() }.sort().join(' ')} \\ | mergeBed -c $mergecols -o $collapsecols > ${prefix}.txt - macs2_merged_expand.py \\ + macs3_merged_expand.py \\ ${prefix}.txt \\ - ${peaks.collect{it.toString()}.sort().join(',').replaceAll("_peaks.${peak_type}","")} \\ + ${peaks.collect { item -> item.toString() }.sort().join(',').replaceAll("_peaks.${peak_type}","")} \\ ${prefix}.boolean.txt \\ $args \\ $expandparam @@ -47,10 +47,5 @@ process MACS2_CONSENSUS { plot_peak_intersect.r -i ${prefix}.boolean.intersect.txt -o ${prefix}.boolean.intersect.plot.pdf - cat <<-END_VERSIONS > versions.yml - "${task.process}": - python: \$(python --version | sed 's/Python //g') - r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf index 6064fd7d..672a7874 100644 --- a/modules/local/multiqc.nf +++ b/modules/local/multiqc.nf @@ -35,20 +35,20 @@ process MULTIQC { path ('deeptools/*') path ('deeptools/*') - path ('macs2/merged_library/peaks/*') - path ('macs2/merged_library/peaks/*') - path ('macs2/merged_library/annotation/*') - path ('macs2/merged_library/featurecounts/*') + path ('macs3/merged_library/peaks/*') + path ('macs3/merged_library/peaks/*') + path ('macs3/merged_library/annotation/*') + path ('macs3/merged_library/featurecounts/*') path ('alignment/merged_replicate/*') path ('alignment/merged_replicate/*') path ('alignment/merged_replicate/*') path ('alignment/merged_replicate/picard_metrics/*') - path ('macs2/merged_replicate/peaks/*') - path ('macs2/merged_replicate/peaks/*') - path ('macs2/merged_replicate/annotation/*') - path ('macs2/merged_replicate/featurecounts/*') + path ('macs3/merged_replicate/peaks/*') + path ('macs3/merged_replicate/peaks/*') + path ('macs3/merged_replicate/annotation/*') + path ('macs3/merged_replicate/featurecounts/*') path ('deseq2_library/*') path ('deseq2_library/*') @@ -59,8 +59,9 @@ process MULTIQC { path "*multiqc_report.html", emit: report path "*_data" , emit: data path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: versions - + // MultiQC must NOT push its version to the `versions` topic: its own input depends on + // that topic being resolved, so publishing to it creates a cycle that hangs the run. + tuple val("${task.process}"), val('multiqc'), eval("multiqc --version | sed -e \"s/multiqc, version //g\""), emit: versions when: task.ext.when == null || task.ext.when @@ -74,9 +75,12 @@ process MULTIQC { $custom_config \\ . - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS + """ + + stub: + """ + mkdir -p multiqc_data + touch multiqc_report.html + touch multiqc_data/multiqc.log """ } diff --git a/modules/local/multiqc_custom_peaks.nf b/modules/local/multiqc_custom_peaks.nf index 7972af76..acddb7df 100644 --- a/modules/local/multiqc_custom_peaks.nf +++ b/modules/local/multiqc_custom_peaks.nf @@ -14,8 +14,7 @@ process MULTIQC_CUSTOM_PEAKS { output: tuple val(meta), path("*.count_mqc.tsv"), emit: count tuple val(meta), path("*.FRiP_mqc.tsv") , emit: frip - path "versions.yml" , emit: versions - + tuple val("${task.process}"), val('sed'), eval("sed --version | sed '1!d;s/.*GNU sed) //'"), topic: versions when: task.ext.when == null || task.ext.when @@ -25,9 +24,13 @@ process MULTIQC_CUSTOM_PEAKS { cat $peak | wc -l | awk -v OFS='\t' '{ print "${prefix}", \$1 }' | cat $peak_count_header - > ${prefix}.count_mqc.tsv cat $frip_score_header $frip > ${prefix}.FRiP_mqc.tsv - cat <<-END_VERSIONS > versions.yml - "${task.process}": - sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') - END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.count_mqc.tsv + touch ${prefix}.FRiP_mqc.tsv + """ } diff --git a/modules/local/plot_homer_annotatepeaks.nf b/modules/local/plot_homer_annotatepeaks.nf index ef4b1ce6..1f2c7687 100644 --- a/modules/local/plot_homer_annotatepeaks.nf +++ b/modules/local/plot_homer_annotatepeaks.nf @@ -15,26 +15,23 @@ process PLOT_HOMER_ANNOTATEPEAKS { path '*.txt' , emit: txt path '*.pdf' , emit: pdf path '*.tsv' , emit: tsv - path "versions.yml", emit: versions - + tuple val("${task.process}"), val('r-base'), eval("R --version | sed '1!d;s/.*version //;s/ .*//'"), topic: versions when: task.ext.when == null || task.ext.when script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "annotatepeaks" + // Files arrive in task-completion order; sort so sample order in the outputs is reproducible. + def anno_list = annos.toSorted { anno -> anno.name }.join(',') """ plot_homer_annotatepeaks.r \\ - -i ${annos.join(',')} \\ - -s ${annos.join(',').replaceAll("${suffix}","")} \\ + -i ${anno_list} \\ + -s ${anno_list.replaceAll("${suffix}","")} \\ -p $prefix \\ $args find ./ -type f -name "*summary.txt" -exec cat {} \\; | cat $mqc_header - > ${prefix}.summary_mqc.tsv - cat <<-END_VERSIONS > versions.yml - "${task.process}": - r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/plot_macs2_qc.nf b/modules/local/plot_macs3_qc.nf similarity index 72% rename from modules/local/plot_macs2_qc.nf rename to modules/local/plot_macs3_qc.nf index a2c39b02..47a5a660 100644 --- a/modules/local/plot_macs2_qc.nf +++ b/modules/local/plot_macs3_qc.nf @@ -1,4 +1,4 @@ -process PLOT_MACS2_QC { +process PLOT_MACS3_QC { label 'process_medium' conda "conda-forge::r-base=4.0.3 conda-forge::r-reshape2=1.4.4 conda-forge::r-optparse=1.6.6 conda-forge::r-ggplot2=3.3.3 conda-forge::r-scales=1.1.1 conda-forge::r-viridis=0.5.1 conda-forge::r-tidyverse=1.3.0 bioconda::bioconductor-biostrings=2.58.0 bioconda::bioconductor-complexheatmap=2.6.2" @@ -13,23 +13,20 @@ process PLOT_MACS2_QC { output: path '*.txt' , emit: txt path '*.pdf' , emit: pdf - path "versions.yml", emit: versions - + tuple val("${task.process}"), val('r-base'), eval("R --version | sed '1!d;s/.*version //;s/ .*//'"), topic: versions when: task.ext.when == null || task.ext.when script: // This script is bundled with the pipeline, in nf-core/atacseq/bin/ def args = task.ext.args ?: '' def peak_type = is_narrow_peak ? 'narrowPeak' : 'broadPeak' + // Files arrive in task-completion order; sort so sample order in the outputs is reproducible. + def peak_list = peaks.toSorted { peak -> peak.name }.join(',') """ - plot_macs2_qc.r \\ - -i ${peaks.join(',')} \\ - -s ${peaks.join(',').replaceAll("_peaks.${peak_type}","")} \\ + plot_macs3_qc.r \\ + -i ${peak_list} \\ + -s ${peak_list.replaceAll("_peaks.${peak_type}","")} \\ $args - cat <<-END_VERSIONS > versions.yml - "${task.process}": - r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index fb76d767..33541112 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -12,8 +12,7 @@ process SAMPLESHEET_CHECK { output: path '*.csv' , emit: csv - path "versions.yml", emit: versions - + tuple val("${task.process}"), val('python'), eval("python --version | sed 's/Python //g'"), topic: versions when: task.ext.when == null || task.ext.when @@ -24,9 +23,5 @@ process SAMPLESHEET_CHECK { $samplesheet \\ $args - cat <<-END_VERSIONS > versions.yml - "${task.process}": - python: \$(python --version | sed 's/Python //g') - END_VERSIONS """ } diff --git a/modules/local/star_align.nf b/modules/local/star_align.nf index bd39cd07..f201ce3f 100644 --- a/modules/local/star_align.nf +++ b/modules/local/star_align.nf @@ -18,8 +18,7 @@ process STAR_ALIGN { tuple val(meta), path('*Log.final.out') , emit: log_final tuple val(meta), path('*Log.out') , emit: log_out tuple val(meta), path('*Log.progress.out'), emit: log_progress - path "versions.yml" , emit: versions - + tuple val("${task.process}"), val('star'), eval("STAR --version | sed -e \"s/STAR_//g\""), topic: versions tuple val(meta), path('*sortedByCoord.out.bam') , optional:true, emit: bam_sorted tuple val(meta), path('*toTranscriptome.out.bam'), optional:true, emit: bam_transcript tuple val(meta), path('*Aligned.unsort.out.bam') , optional:true, emit: bam_unsorted @@ -53,9 +52,5 @@ process STAR_ALIGN { mv ${prefix}.Unmapped.out.mate2 ${prefix}.unmapped_2.fastq gzip ${prefix}.unmapped_2.fastq fi - cat <<-END_VERSIONS > versions.yml - "${task.process}": - star: \$(STAR --version | sed -e "s/STAR_//g") - END_VERSIONS """ } diff --git a/modules/local/star_genomegenerate.nf b/modules/local/star_genomegenerate.nf index a36af0a8..b3de4205 100644 --- a/modules/local/star_genomegenerate.nf +++ b/modules/local/star_genomegenerate.nf @@ -14,8 +14,7 @@ process STAR_GENOMEGENERATE { output: path "star" , emit: index - path "versions.yml", emit: versions - + tuple val("${task.process}"), val('star'), eval("STAR --version | sed -e \"s/STAR_//g\""), topic: versions when: task.ext.when == null || task.ext.when @@ -33,10 +32,6 @@ process STAR_GENOMEGENERATE { --runThreadN $task.cpus \\ $memory \\ ${args.join(' ')} - cat <<-END_VERSIONS > versions.yml - "${task.process}": - star: \$(STAR --version | sed -e "s/STAR_//g") - END_VERSIONS """ } else { """ @@ -52,10 +47,6 @@ process STAR_GENOMEGENERATE { --genomeSAindexNbases \$NUM_BASES \\ $memory \\ ${args.join(' ')} - cat <<-END_VERSIONS > versions.yml - "${task.process}": - star: \$(STAR --version | sed -e "s/STAR_//g") - END_VERSIONS """ } } diff --git a/modules/local/tss_extract.nf b/modules/local/tss_extract.nf index e685256c..0c65774c 100644 --- a/modules/local/tss_extract.nf +++ b/modules/local/tss_extract.nf @@ -10,8 +10,7 @@ process TSS_EXTRACT { output: path "*.bed" , emit: tss - path "versions.yml", emit: versions - + tuple val("${task.process}"), val('sed'), eval("sed --version | sed '1!d;s/.*GNU sed) //'"), topic: versions when: task.ext.when == null || task.ext.when @@ -19,9 +18,5 @@ process TSS_EXTRACT { """ cat $bed | awk -v FS='\t' -v OFS='\t' '{ if(\$6=="+") \$3=\$2+1; else \$2=\$3-1; print \$1, \$2, \$3, \$4, \$5, \$6;}' > ${bed.baseName}.tss.bed - cat <<-END_VERSIONS > versions.yml - "${task.process}": - sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/ataqv/ataqv/environment.yml b/modules/nf-core/ataqv/ataqv/environment.yml new file mode 100644 index 00000000..0023d894 --- /dev/null +++ b/modules/nf-core/ataqv/ataqv/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::ataqv=1.3.1 diff --git a/modules/nf-core/ataqv/ataqv/main.nf b/modules/nf-core/ataqv/ataqv/main.nf index 3a35b14d..2dbb95ea 100644 --- a/modules/nf-core/ataqv/ataqv/main.nf +++ b/modules/nf-core/ataqv/ataqv/main.nf @@ -2,10 +2,10 @@ process ATAQV_ATAQV { tag "$meta.id" label 'process_medium' - conda 'bioconda::ataqv=1.3.1' - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ataqv:1.3.1--py310ha155cf9_1' : - 'biocontainers/ataqv:1.3.1--py310ha155cf9_1' }" + 'quay.io/biocontainers/ataqv:1.3.1--py310ha155cf9_1' }" input: tuple val(meta), path(bam), path(bai), path(peak_file) @@ -18,36 +18,43 @@ process ATAQV_ATAQV { output: tuple val(meta), path("*.ataqv.json"), emit: json tuple val(meta), path("*.problems") , emit: problems, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('ataqv'), eval("echo \$(ataqv --version)"), emit: versions_ataqv, topic: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def mito = mito_name ? "--mitochondrial-reference-name ${mito_name}" : '' + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def peak = peak_file ? "--peak-file $peak_file" : '' - def tss = tss_file ? "--tss-file $tss_file" : '' - def excl_regs = excl_regs_file ? "--excluded-region-file $excl_regs_file" : '' - def autosom_ref = autosom_ref_file ? "--autosomal-reference-file $autosom_ref_file" : '' + def mito = mito_name ? "--mitochondrial-reference-name ${mito_name}" : '' + + def peak = peak_file ? "--peak-file ${peak_file}" : '' + def tss = tss_file ? "--tss-file ${tss_file}" : '' + def excl_regs = excl_regs_file ? "--excluded-region-file ${excl_regs_file}" : '' + def autosom_ref = autosom_ref_file ? "--autosomal-reference-file ${autosom_ref_file}" : '' """ ataqv \\ - $args \\ - $mito \\ - $peak \\ - $tss \\ - $excl_regs \\ - $autosom_ref \\ + ${args} \\ + ${mito} \\ + ${peak} \\ + ${tss} \\ + ${excl_regs} \\ + ${autosom_ref} \\ --metrics-file "${prefix}.ataqv.json" \\ - --threads $task.cpus \\ - --name $prefix \\ - $organism \\ - $bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - ataqv: \$( ataqv --version ) - END_VERSIONS + --threads ${task.cpus} \\ + --name ${prefix} \\ + ${organism} \\ + ${bam} + + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def problems_cmd = args.contains("--log-problematic-reads") ? "touch 1.problems" : "" + """ + touch ${prefix}.ataqv.json + ${problems_cmd} + """ } diff --git a/modules/nf-core/ataqv/ataqv/meta.yml b/modules/nf-core/ataqv/ataqv/meta.yml index 86f7d845..71ca36dc 100644 --- a/modules/nf-core/ataqv/ataqv/meta.yml +++ b/modules/nf-core/ataqv/ataqv/meta.yml @@ -6,66 +6,113 @@ keywords: - ataqv tools: - ataqv: - description: ataqv is a toolkit for measuring and comparing ATAC-seq results. It was written to help understand how well ATAC-seq assays have worked, and to make it easier to spot differences that might be caused by library prep or sequencing. + description: ataqv is a toolkit for measuring and comparing ATAC-seq results. + It was written to help understand how well ATAC-seq assays have worked, and + to make it easier to spot differences that might be caused by library prep or + sequencing. homepage: https://github.com/ParkerLab/ataqv/blob/master/README.rst documentation: https://github.com/ParkerLab/ataqv/blob/master/README.rst tool_dev_url: https://github.com/ParkerLab/ataqv doi: "10.1016/j.cels.2020.02.009" - licence: ["GPL v3"] - + licence: + - "GPL v3" + identifier: biotools:ataqv input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM file - pattern: "*.bam" - - bai: - type: file - description: BAM index file with the same prefix as bam file. Required if tss_file input is provided. - pattern: "*.bam.bai" - - peak_file: - type: file - description: A BED file of peaks called for alignments in the BAM file - pattern: "*.bed" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file + pattern: "*.bam" + ontologies: [] + - bai: + type: file + description: BAM index file with the same prefix as bam file. Required if tss_file + input is provided. + pattern: "*.bam.bai" + ontologies: [] + - peak_file: + type: file + description: A BED file of peaks called for alignments in the BAM file + pattern: "*.bed" + ontologies: [] - organism: type: string - description: The subject of the experiment, which determines the list of autosomes (see "Reference Genome Configuration" section at https://github.com/ParkerLab/ataqv). + description: The subject of the experiment, which determines the list of autosomes + (see "Reference Genome Configuration" section at https://github.com/ParkerLab/ataqv). - mito_name: type: string description: Name of the mitochondrial sequence. - tss_file: type: file - description: A BED file of transcription start sites for the experiment organism. If supplied, a TSS enrichment score will be calculated according to the ENCODE data standards. This calculation requires that the BAM file of alignments be indexed. + description: A BED file of transcription start sites for the experiment organism. + If supplied, a TSS enrichment score will be calculated according to the ENCODE + data standards. This calculation requires that the BAM file of alignments be + indexed. pattern: "*.bed" + ontologies: [] - excl_regs_file: type: file - description: A BED file containing excluded regions. Peaks or TSS overlapping these will be ignored. + description: A BED file containing excluded regions. Peaks or TSS overlapping + these will be ignored. pattern: "*.bed" + ontologies: [] - autosom_ref_file: type: file - description: A file containing autosomal reference names, one per line. The names must match the reference names in the alignment file exactly, or the metrics based on counts of autosomal alignments will be wrong. - + description: A file containing autosomal reference names, one per line. The names + must match the reference names in the alignment file exactly, or the metrics + based on counts of autosomal alignments will be wrong. + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - json: - type: file - description: The JSON file to which metrics will be written. - - problems: - type: file - description: If given, problematic reads will be logged to a file per read group, with names derived from the read group IDs, with ".problems" appended. If no read groups are found, the reads will be written to one file named after the BAM file. - pattern: "*.problems" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - + json: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.ataqv.json": + type: file + description: The JSON file to which metrics will be written. + ontologies: [] + problems: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.problems": + type: file + description: If given, problematic reads will be logged to a file per read + group, with names derived from the read group IDs, with ".problems" appended. + If no read groups are found, the reads will be written to one file named + after the BAM file. + pattern: "*.problems" + ontologies: [] + versions_ataqv: + - - ${task.process}: + type: string + description: The name of the process + - ataqv: + type: string + description: The name of the tool + - echo \$(ataqv --version): + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - ataqv: + type: string + description: The name of the tool + - echo \$(ataqv --version): + type: eval + description: The expression to obtain the version of the tool authors: - "@i-pletenev" +maintainers: + - "@i-pletenev" diff --git a/modules/nf-core/ataqv/ataqv/tests/main.nf.test b/modules/nf-core/ataqv/ataqv/tests/main.nf.test new file mode 100644 index 00000000..6bb70746 --- /dev/null +++ b/modules/nf-core/ataqv/ataqv/tests/main.nf.test @@ -0,0 +1,264 @@ +nextflow_process { + + name "Test Process ATAQV_ATAQV" + config "./nextflow.config" + script "../main.nf" + process "ATAQV_ATAQV" + + tag "modules" + tag "modules_nfcore" + tag "ataqv" + tag "ataqv/ataqv" + + test("test_ataqv_ataqv") { + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [id:'test',single_end:false], + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.bam",checkIfExists:true), + [], + [] + ] + input[1] = 'human' + input[2] = '' + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.json.collect{[ + file(it[1]).name, + path(it[1]).json[0].findAll{it.key != "timestamp"}.toString().md5() + ]}, + process.out.problems, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("test_ataqv_ataqv_problem_reads") { + + when { + params { + module_args = '--log-problematic-reads' + } + process { + """ + input[0] = [ + [id:'test',single_end:false], + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.bam",checkIfExists:true), + [], + [] + ] + input[1] = 'human' + input[2] = '' + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.json.collect{[ + file(it[1]).name, + path(it[1]).json[0].findAll{it.key != "timestamp"}.toString().md5() + ]}, + process.out.problems.collect{ file(it[1]).name }, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("test_ataqv_ataqv_peak") { + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [id:'test',single_end:false], + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam",checkIfExists:true), + [], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/test.bed",checkIfExists:true) + ] + input[1] = 'human' + input[2] = '' + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.json.collect{[ + file(it[1]).name, + path(it[1]).json[0].findAll{it.key != "timestamp"}.toString().md5() + ]}, + process.out.problems, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("test_ataqv_ataqv_tss") { + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [id:'test',single_end:false], + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam",checkIfExists:true), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai",checkIfExists:true), + [] + ] + input[1] = 'human' + input[2] = '' + input[3] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/test.bed",checkIfExists:true) + input[4] = [] + input[5] = [] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.json.collect{[ + file(it[1]).name, + path(it[1]).json[0].findAll{it.key != "timestamp"}.toString().md5() + ]}, + process.out.problems, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("test_ataqv_ataqv_excluded_regs") { + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [id:'test',single_end:false], + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam",checkIfExists:true), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai",checkIfExists:true), + [] + ] + input[1] = 'human' + input[2] = '' + input[3] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/test.bed",checkIfExists:true) + input[4] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/test2.bed",checkIfExists:true) + input[5] = [] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.json.collect{[ + file(it[1]).name, + path(it[1]).json[0].findAll{it.key != "timestamp"}.toString().md5() + ]}, + process.out.problems, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("ataqv - stub") { + + options "-stub" + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [id:'test',single_end:false], + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.bam",checkIfExists:true), + [], + [] + ] + input[1] = 'human' + input[2] = '' + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("ataqv - problems - stub") { + + options "-stub" + + when { + params { + module_args = '--log-problematic-reads' + } + process { + """ + input[0] = [ + [id:'test',single_end:false], + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.bam",checkIfExists:true), + [], + [] + ] + input[1] = 'human' + input[2] = '' + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/ataqv/ataqv/tests/main.nf.test.snap b/modules/nf-core/ataqv/ataqv/tests/main.nf.test.snap new file mode 100644 index 00000000..b8f55a10 --- /dev/null +++ b/modules/nf-core/ataqv/ataqv/tests/main.nf.test.snap @@ -0,0 +1,256 @@ +{ + "test_ataqv_ataqv_tss": { + "content": [ + [ + [ + "test.ataqv.json", + "4fb5f3438d800d24f5019d232aef082d" + ] + ], + [ + + ], + { + "versions_ataqv": [ + [ + "ATAQV_ATAQV", + "ataqv", + "1.3.1" + ] + ] + } + ], + "timestamp": "2026-03-11T18:47:59.717001", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "ataqv - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.ataqv.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + [ + "ATAQV_ATAQV", + "ataqv", + "1.3.1" + ] + ], + "json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.ataqv.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "problems": [ + + ], + "versions_ataqv": [ + [ + "ATAQV_ATAQV", + "ataqv", + "1.3.1" + ] + ] + }, + { + "versions_ataqv": [ + [ + "ATAQV_ATAQV", + "ataqv", + "1.3.1" + ] + ] + } + ], + "timestamp": "2026-03-11T18:48:24.234486", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "test_ataqv_ataqv_problem_reads": { + "content": [ + [ + [ + "test.ataqv.json", + "4d418b039281d274b1440c9e73267143" + ] + ], + [ + "1.problems" + ], + { + "versions_ataqv": [ + [ + "ATAQV_ATAQV", + "ataqv", + "1.3.1" + ] + ] + } + ], + "timestamp": "2026-03-11T18:47:34.322713", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "test_ataqv_ataqv": { + "content": [ + [ + [ + "test.ataqv.json", + "4d418b039281d274b1440c9e73267143" + ] + ], + [ + + ], + { + "versions_ataqv": [ + [ + "ATAQV_ATAQV", + "ataqv", + "1.3.1" + ] + ] + } + ], + "timestamp": "2026-03-11T18:47:22.148513", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "test_ataqv_ataqv_excluded_regs": { + "content": [ + [ + [ + "test.ataqv.json", + "4fb5f3438d800d24f5019d232aef082d" + ] + ], + [ + + ], + { + "versions_ataqv": [ + [ + "ATAQV_ATAQV", + "ataqv", + "1.3.1" + ] + ] + } + ], + "timestamp": "2026-03-11T18:48:12.237499", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "test_ataqv_ataqv_peak": { + "content": [ + [ + [ + "test.ataqv.json", + "4d418b039281d274b1440c9e73267143" + ] + ], + [ + + ], + { + "versions_ataqv": [ + [ + "ATAQV_ATAQV", + "ataqv", + "1.3.1" + ] + ] + } + ], + "timestamp": "2026-03-11T18:47:47.060191", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "ataqv - problems - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.ataqv.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "1.problems:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "ATAQV_ATAQV", + "ataqv", + "1.3.1" + ] + ], + "json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.ataqv.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "problems": [ + [ + { + "id": "test", + "single_end": false + }, + "1.problems:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_ataqv": [ + [ + "ATAQV_ATAQV", + "ataqv", + "1.3.1" + ] + ] + } + ], + "timestamp": "2026-03-11T18:48:36.201719", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/ataqv/ataqv/tests/nextflow.config b/modules/nf-core/ataqv/ataqv/tests/nextflow.config new file mode 100644 index 00000000..78dd25df --- /dev/null +++ b/modules/nf-core/ataqv/ataqv/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: "ATAQV_ATAQV" { + ext.args = params.module_args + } +} diff --git a/modules/nf-core/ataqv/mkarv/environment.yml b/modules/nf-core/ataqv/mkarv/environment.yml new file mode 100644 index 00000000..0023d894 --- /dev/null +++ b/modules/nf-core/ataqv/mkarv/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::ataqv=1.3.1 diff --git a/modules/nf-core/ataqv/mkarv/main.nf b/modules/nf-core/ataqv/mkarv/main.nf index 8722be5d..a26c111e 100644 --- a/modules/nf-core/ataqv/mkarv/main.nf +++ b/modules/nf-core/ataqv/mkarv/main.nf @@ -1,18 +1,18 @@ process ATAQV_MKARV { label 'process_medium' - conda 'bioconda::ataqv=1.3.1' - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ataqv:1.3.1--py310ha155cf9_1': - 'biocontainers/ataqv:1.3.1--py310ha155cf9_1' }" + 'quay.io/biocontainers/ataqv:1.3.1--py310ha155cf9_1' }" input: path "jsons/*" output: path "html" , emit: html - path "versions.yml", emit: versions - + tuple val("${task.process}"), val('ataqv'), eval('echo \$(ataqv --version)'), emit: versions_ataqv, topic: versions + // tuple val("${task.process}"), val('mkarv'), eval('mkarv --version'), emit: versions_mkarv, topic: versions //Use this when version string has been fixed when: task.ext.when == null || task.ext.when @@ -20,16 +20,16 @@ process ATAQV_MKARV { def args = task.ext.args ?: '' """ mkarv \\ - $args \\ - --concurrency $task.cpus \\ + ${args} \\ + --concurrency ${task.cpus} \\ --force \\ ./html/ \\ jsons/* + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - # mkarv: \$( mkarv --version ) # Use this when version string has been fixed - ataqv: \$( ataqv --version ) - END_VERSIONS + stub: + """ + mkdir -p html + touch html/index.html """ } diff --git a/modules/nf-core/ataqv/mkarv/meta.yml b/modules/nf-core/ataqv/mkarv/meta.yml index 6ad6d69e..8027f1a6 100644 --- a/modules/nf-core/ataqv/mkarv/meta.yml +++ b/modules/nf-core/ataqv/mkarv/meta.yml @@ -4,33 +4,73 @@ keywords: - ataqv - ATAC-seq - qc - - ataqv - mkarv - tools: - "ataqv": - description: "ataqv is a toolkit for measuring and comparing ATAC-seq results. It was written to help understand how well ATAC-seq assays have worked, and to make it easier to spot differences that might be caused by library prep or sequencing." + description: "ataqv is a toolkit for measuring and comparing ATAC-seq results.\ + \ It was written to help understand how well ATAC-seq assays have worked, and\ + \ to make it easier to spot differences that might be caused by library prep\ + \ or sequencing." homepage: "https://github.com/ParkerLab/ataqv/blob/master/README.rst" documentation: "https://github.com/ParkerLab/ataqv/blob/master/README.rst" tool_dev_url: "https://github.com/ParkerLab/ataqv" - - licence: "['GPL v3']" - + licence: + - "GPL v3" + identifier: biotools:ataqv input: - - json: + - jsons/*: type: file - description: The JSON file with ataqv metrics + description: JSON files pattern: "*.json" - + ontologies: + - edam: http://edamontology.org/format_3464 output: - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - html: - type: directory - description: Web application to visualize results in HTML format - pattern: "*.html" - + html: + - html: + type: directory + description: Web application to visualize results in HTML format + pattern: "*.html" + versions_ataqv: + - - ${task.process}: + type: string + description: The name of the process + - ataqv: + type: string + description: The name of the tool + - echo \$(ataqv --version): + type: eval + description: The expression to obtain the version of the tool + versions_mkarv: + - - ${task.process}: + type: string + description: The name of the process + - mkarv: + type: string + description: The name of the tool + - mkarv --version: + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - ataqv: + type: string + description: The name of the tool + - echo \$(ataqv --version): + type: eval + description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - mkarv: + type: string + description: The name of the tool + - mkarv --version: + type: eval + description: The expression to obtain the version of the tool authors: - "@bjlang" +maintainers: + - "@bjlang" diff --git a/modules/nf-core/ataqv/mkarv/tests/main.nf.test b/modules/nf-core/ataqv/mkarv/tests/main.nf.test new file mode 100644 index 00000000..5fa6593e --- /dev/null +++ b/modules/nf-core/ataqv/mkarv/tests/main.nf.test @@ -0,0 +1,79 @@ +nextflow_process { + + name "Test Process ATAQV_MKARV" + + script "../main.nf" + process "ATAQV_MKARV" + + tag "modules" + tag "modules_nfcore" + tag "ataqv" + tag "ataqv/ataqv" + tag "ataqv/mkarv" + + setup { + run("ATAQV_ATAQV") { + script "../../ataqv/main.nf" + + process { + """ + input[0] = [ + [id:'test',single_end:false], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam',checkIfExists:true), + [], + [] + ] + input[1] = 'human' + input[2] = '' + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + } + + test("test_ataqv_mkarv") { + when { + params { + module_args = '' + } + process { + """ + input[0] = ATAQV_ATAQV.out.json.collect{it[1]} + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_ataqv_mkarv - stub") { + + options '-stub' + + when { + params { + module_args = '' + } + process { + """ + input[0] = ATAQV_ATAQV.out.json.collect{it[1]} + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } +} diff --git a/modules/nf-core/ataqv/mkarv/tests/main.nf.test.snap b/modules/nf-core/ataqv/mkarv/tests/main.nf.test.snap new file mode 100644 index 00000000..f8063319 --- /dev/null +++ b/modules/nf-core/ataqv/mkarv/tests/main.nf.test.snap @@ -0,0 +1,141 @@ +{ + "test_ataqv_mkarv - stub": { + "content": [ + { + "0": [ + [ + "index.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + "ATAQV_MKARV", + "ataqv", + "1.3.1" + ] + ], + "html": [ + [ + "index.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_ataqv": [ + [ + "ATAQV_MKARV", + "ataqv", + "1.3.1" + ] + ] + }, + { + "versions_ataqv": [ + [ + "ATAQV_MKARV", + "ataqv", + "1.3.1" + ] + ] + } + ], + "timestamp": "2026-03-12T10:55:28.076994", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "test_ataqv_mkarv": { + "content": [ + { + "0": [ + [ + [ + "ataqv.css:md5,7bb9e18974018dd29bdc12a46a6d6d65", + "datatables.buttons.min.css:md5,675306abc9d3239314f2c66c0e22ef7a", + "datatables.fontawesome.css:md5,716d7a3edd2c75e712b1ffe26f12a861", + "datatables.min.css:md5,00ef3e39d9302618395ab189ec8bcd9f", + "font-awesome.min.css:md5,89916fa773ce96569604016ef25cab50", + "normalize.css:md5,40d20cc85100840580df4346bb99d7ed" + ], + [ + "1.json.gz:md5,7c01e4f0136404e6db2328485d68d154" + ], + [ + "FontAwesome.otf:md5,9ccfa32dd4cd1b8e83f68899d85bd5e6", + "fontawesome-webfont.eot:md5,404a525502f8e5ba7e93b9f02d9e83a9", + "fontawesome-webfont.svg:md5,bae4a87c1e5dff40baa3f49d52f5347a", + "fontawesome-webfont.ttf:md5,fb650aaf10736ffb9c4173079616bf01", + "fontawesome-webfont.woff:md5,891e3f340c1126b4c7c142e5f6e86816", + "fontawesome-webfont.woff2:md5,926c93d201fe51c8f351e858468980c3", + "sourcesanspro-regular.woff:md5,f7bd788f18b8c4bb93dd37d140348e1e", + "sourcesanspro-regularit.woff:md5,c3638b17f4fd76dae12fe2ae14571e57", + "sourcesanspro-semibold.woff:md5,e7fc8925d9364e9d177d9e1d08bb1855", + "sourcesanspro-semiboldit.woff:md5,f1d255aa459786dfc6aa2e488ac01245" + ], + "index.html:md5,bf7747be761e56ad7c54c842ac88461a", + [ + "ataqv.js:md5,feb291b7839e9e43ed304565e3a605d9", + "configuration.js:md5,073bc07f1371e28a97098f8b10469ae4", + "d3.min.js:md5,db69fb2626a71a286ee772d673138aca", + "datatables.min.js:md5,e369b872620dadb05e4eb555b81f9112", + "jszip.min.js:md5,09e492cb492ffa75484bbe10f1f721d1" + ] + ] + ], + "1": [ + [ + "ATAQV_MKARV", + "ataqv", + "1.3.1" + ] + ], + "html": [ + [ + [ + "ataqv.css:md5,7bb9e18974018dd29bdc12a46a6d6d65", + "datatables.buttons.min.css:md5,675306abc9d3239314f2c66c0e22ef7a", + "datatables.fontawesome.css:md5,716d7a3edd2c75e712b1ffe26f12a861", + "datatables.min.css:md5,00ef3e39d9302618395ab189ec8bcd9f", + "font-awesome.min.css:md5,89916fa773ce96569604016ef25cab50", + "normalize.css:md5,40d20cc85100840580df4346bb99d7ed" + ], + [ + "1.json.gz:md5,7c01e4f0136404e6db2328485d68d154" + ], + [ + "FontAwesome.otf:md5,9ccfa32dd4cd1b8e83f68899d85bd5e6", + "fontawesome-webfont.eot:md5,404a525502f8e5ba7e93b9f02d9e83a9", + "fontawesome-webfont.svg:md5,bae4a87c1e5dff40baa3f49d52f5347a", + "fontawesome-webfont.ttf:md5,fb650aaf10736ffb9c4173079616bf01", + "fontawesome-webfont.woff:md5,891e3f340c1126b4c7c142e5f6e86816", + "fontawesome-webfont.woff2:md5,926c93d201fe51c8f351e858468980c3", + "sourcesanspro-regular.woff:md5,f7bd788f18b8c4bb93dd37d140348e1e", + "sourcesanspro-regularit.woff:md5,c3638b17f4fd76dae12fe2ae14571e57", + "sourcesanspro-semibold.woff:md5,e7fc8925d9364e9d177d9e1d08bb1855", + "sourcesanspro-semiboldit.woff:md5,f1d255aa459786dfc6aa2e488ac01245" + ], + "index.html:md5,bf7747be761e56ad7c54c842ac88461a", + [ + "ataqv.js:md5,feb291b7839e9e43ed304565e3a605d9", + "configuration.js:md5,073bc07f1371e28a97098f8b10469ae4", + "d3.min.js:md5,db69fb2626a71a286ee772d673138aca", + "datatables.min.js:md5,e369b872620dadb05e4eb555b81f9112", + "jszip.min.js:md5,09e492cb492ffa75484bbe10f1f721d1" + ] + ] + ], + "versions_ataqv": [ + [ + "ATAQV_MKARV", + "ataqv", + "1.3.1" + ] + ] + } + ], + "timestamp": "2026-03-12T10:55:14.121611", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/bedtools/bamtobed/main.nf b/modules/nf-core/bedtools/bamtobed/main.nf deleted file mode 100644 index 29f5a62f..00000000 --- a/modules/nf-core/bedtools/bamtobed/main.nf +++ /dev/null @@ -1,35 +0,0 @@ -process BEDTOOLS_BAMTOBED { - tag "$meta.id" - label 'process_medium' - - conda "bioconda::bedtools=2.30.0" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0' : - 'biocontainers/bedtools:2.30.0--hc088bd4_0' }" - - input: - tuple val(meta), path(bam) - - output: - tuple val(meta), path("*.bed"), emit: bed - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - """ - bedtools \\ - bamtobed \\ - $args \\ - -i $bam \\ - > ${prefix}.bed - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") - END_VERSIONS - """ -} diff --git a/modules/nf-core/bedtools/bamtobed/meta.yml b/modules/nf-core/bedtools/bamtobed/meta.yml deleted file mode 100644 index 5a4ff73a..00000000 --- a/modules/nf-core/bedtools/bamtobed/meta.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: bedtools_bamtobed -description: Converts a bam file to a bed12 file. -keywords: - - bam - - bed -tools: - - bedtools: - description: | - A set of tools for genomic analysis tasks, specifically enabling genome arithmetic (merge, count, complement) on various file types. - documentation: https://bedtools.readthedocs.io/en/latest/content/tools/complement.html - licence: ["MIT"] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: Input BAM file - pattern: "*.{bam}" -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bed: - type: file - description: Bed file containing genomic intervals. - pattern: "*.{bed}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@yuukiiwa" - - "@drpatelh" diff --git a/modules/nf-core/bowtie2/align/environment.yml b/modules/nf-core/bowtie2/align/environment.yml new file mode 100644 index 00000000..066ff52e --- /dev/null +++ b/modules/nf-core/bowtie2/align/environment.yml @@ -0,0 +1,13 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/bowtie2 + - bioconda::bowtie2=2.5.4 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.21 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.21 + - conda-forge::pigz=2.8 diff --git a/modules/nf-core/bowtie2/align/main.nf b/modules/nf-core/bowtie2/align/main.nf index a77114d2..9be0dfee 100644 --- a/modules/nf-core/bowtie2/align/main.nf +++ b/modules/nf-core/bowtie2/align/main.nf @@ -1,23 +1,30 @@ process BOWTIE2_ALIGN { tag "$meta.id" - label "process_high" + label 'process_high' - conda "bioconda::bowtie2=2.4.4 bioconda::samtools=1.16.1 conda-forge::pigz=2.6" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:a0ffedb52808e102887f6ce600d092675bf3528a-0' : - 'biocontainers/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:a0ffedb52808e102887f6ce600d092675bf3528a-0' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b4/b41b403e81883126c3227fc45840015538e8e2212f13abc9ae84e4b98891d51c/data' : + 'community.wave.seqera.io/library/bowtie2_htslib_samtools_pigz:edeb13799090a2a6' }" input: tuple val(meta) , path(reads) tuple val(meta2), path(index) + tuple val(meta3), path(fasta) val save_unaligned val sort_bam output: - tuple val(meta), path("*.{bam,sam}"), emit: aligned + tuple val(meta), path("*.sam") , emit: sam , optional:true + tuple val(meta), path("*.bam") , emit: bam , optional:true + tuple val(meta), path("*.cram") , emit: cram , optional:true + tuple val(meta), path("*.csi") , emit: csi , optional:true + tuple val(meta), path("*.crai") , emit: crai , optional:true tuple val(meta), path("*.log") , emit: log - tuple val(meta), path("*fastq.gz") , emit: fastq, optional:true - path "versions.yml" , emit: versions + tuple val(meta), path("*fastq.gz") , emit: fastq , optional:true + tuple val("${task.process}"), val('bowtie2'), eval("bowtie2 --version 2>&1 | sed -n 's/.*bowtie2-align-s version //p'"), emit: versions_bowtie2, topic: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), emit: versions_samtools, topic: versions + tuple val("${task.process}"), val('pigz'), eval("pigz --version 2>&1 | sed 's/pigz //'"), emit: versions_pigz, topic: versions when: task.ext.when == null || task.ext.when @@ -26,6 +33,7 @@ process BOWTIE2_ALIGN { def args = task.ext.args ?: "" def args2 = task.ext.args2 ?: "" def prefix = task.ext.prefix ?: "${meta.id}" + def rg = args.contains("--rg-id") ? "" : "--rg-id ${prefix} --rg SM:${prefix}" def unaligned = "" def reads_args = "" @@ -39,7 +47,10 @@ process BOWTIE2_ALIGN { def samtools_command = sort_bam ? 'sort' : 'view' def extension_pattern = /(--output-fmt|-O)+\s+(\S+)/ - def extension = (args2 ==~ extension_pattern) ? (args2 =~ extension_pattern)[0][2].toLowerCase() : "bam" + def extension_matcher = (args2 =~ extension_pattern) + def extension = extension_matcher.getCount() > 0 ? extension_matcher[0][2].toLowerCase() : "bam" + def reference = fasta && extension=="cram" ? "--reference ${fasta}" : "" + if (!fasta && extension=="cram") error "Fasta reference is required for CRAM output" """ INDEX=`find -L ./ -name "*.rev.1.bt2" | sed "s/\\.rev.1.bt2\$//"` @@ -51,9 +62,10 @@ process BOWTIE2_ALIGN { $reads_args \\ --threads $task.cpus \\ $unaligned \\ + $rg \\ $args \\ - 2> ${prefix}.bowtie2.log \\ - | samtools $samtools_command $args2 --threads $task.cpus -o ${prefix}.${extension} - + 2>| >(tee ${prefix}.bowtie2.log >&2) \\ + | samtools $samtools_command $args2 --threads $task.cpus ${reference} -o ${prefix}.${extension} - if [ -f ${prefix}.unmapped.fastq.1.gz ]; then mv ${prefix}.unmapped.fastq.1.gz ${prefix}.unmapped_1.fastq.gz @@ -62,13 +74,6 @@ process BOWTIE2_ALIGN { if [ -f ${prefix}.unmapped.fastq.2.gz ]; then mv ${prefix}.unmapped.fastq.2.gz ${prefix}.unmapped_2.fastq.gz fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bowtie2: \$(echo \$(bowtie2 --version 2>&1) | sed 's/^.*bowtie2-align-s version //; s/ .*\$//') - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) - END_VERSIONS """ stub: @@ -76,19 +81,26 @@ process BOWTIE2_ALIGN { def prefix = task.ext.prefix ?: "${meta.id}" def extension_pattern = /(--output-fmt|-O)+\s+(\S+)/ def extension = (args2 ==~ extension_pattern) ? (args2 =~ extension_pattern)[0][2].toLowerCase() : "bam" + def create_unmapped = "" + if (meta.single_end) { + create_unmapped = save_unaligned ? "echo | gzip > ${prefix}.unmapped.fastq.gz" : "" + } else { + create_unmapped = save_unaligned ? "echo | gzip > ${prefix}.unmapped_1.fastq.gz && echo | gzip > ${prefix}.unmapped_2.fastq.gz" : "" + } + if (!fasta && extension=="cram") error "Fasta reference is required for CRAM output" + + def create_index = "" + if (extension == "cram") { + create_index = "touch ${prefix}.crai" + } else if (extension == "bam") { + create_index = "touch ${prefix}.csi" + } """ touch ${prefix}.${extension} + ${create_index} touch ${prefix}.bowtie2.log - touch ${prefix}.unmapped_1.fastq.gz - touch ${prefix}.unmapped_2.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bowtie2: \$(echo \$(bowtie2 --version 2>&1) | sed 's/^.*bowtie2-align-s version //; s/ .*\$//') - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) - END_VERSIONS + ${create_unmapped} """ } diff --git a/modules/nf-core/bowtie2/align/meta.yml b/modules/nf-core/bowtie2/align/meta.yml index 60d04c12..83e1487c 100644 --- a/modules/nf-core/bowtie2/align/meta.yml +++ b/modules/nf-core/bowtie2/align/meta.yml @@ -14,28 +14,42 @@ tools: sequencing reads to long reference sequences. homepage: http://bowtie-bio.sourceforge.net/bowtie2/index.shtml documentation: http://bowtie-bio.sourceforge.net/bowtie2/manual.shtml - doi: 10.1038/nmeth.1923 + doi: 10.1186/gb-2009-10-3-r25 licence: ["GPL-3.0-or-later"] + identifier: "" input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. - - meta2: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'test', single_end:false ] - - index: - type: file - description: Bowtie2 genome index files - pattern: "*.ebwt" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test', single_end:false ] + - index: + type: file + description: Bowtie2 genome index files + pattern: "*.ebwt" + ontologies: [] + - - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: Reference genome FASTA file + pattern: "*.{fa,fasta,fna}" + ontologies: + - edam: "http://edamontology.org/format_1929" - save_unaligned: type: boolean description: | @@ -46,22 +60,134 @@ input: description: use samtools sort (true) or samtools view (false) pattern: "true or false" output: - - aligned: - type: file - description: Output BAM/SAM file containing read alignments - pattern: "*.{bam,sam}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - fastq: - type: file - description: Unaligned FastQ files - pattern: "*.fastq.gz" - - log: - type: file - description: Aligment log - pattern: "*.log" + sam: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.sam": + type: file + description: Output SAM file containing read alignments + pattern: "*.sam" + ontologies: [] + bam: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.bam": + type: file + description: Output BAM file containing read alignments + pattern: "*.bam" + ontologies: [] + cram: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.cram": + type: file + description: Output CRAM file containing read alignments + pattern: "*.cram" + ontologies: [] + csi: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.csi": + type: file + description: Output SAM/BAM index for large inputs + pattern: "*.csi" + ontologies: [] + crai: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.crai": + type: file + description: Output CRAM index + pattern: "*.crai" + ontologies: [] + log: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.log": + type: file + description: Alignment log + pattern: "*.log" + ontologies: [] + fastq: + - - meta: + type: map + description: Groovy Map containing sample information + - "*fastq.gz": + type: file + description: Unaligned FastQ files + pattern: "*.fastq.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + versions_bowtie2: + - - ${task.process}: + type: string + description: The name of the process + - bowtie2: + type: string + description: The name of the tool + - "bowtie2 --version 2>&1 | sed -n 's/.*bowtie2-align-s version //p'": + type: eval + description: The expression to obtain the version of bowtie2 + versions_samtools: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - "samtools version | sed '1!d;s/.* //'": + type: eval + description: The expression to obtain the version of samtools + versions_pigz: + - - ${task.process}: + type: string + description: The name of the process + - pigz: + type: string + description: The name of the tool + - "pigz --version 2>&1 | sed 's/pigz //'": + type: eval + description: The expression to obtain the version of pigz + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - bowtie2: + type: string + description: The name of the tool + - "bowtie2 --version 2>&1 | sed -n 's/.*bowtie2-align-s version //p'": + type: eval + description: The expression to obtain the version of bowtie2 + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - "samtools version | sed '1!d;s/.* //'": + type: eval + description: The expression to obtain the version of samtools + - - ${task.process}: + type: string + description: The name of the process + - pigz: + type: string + description: The name of the tool + - "pigz --version 2>&1 | sed 's/pigz //'": + type: eval + description: The expression to obtain the version of pigz + authors: - "@joseespinosa" - "@drpatelh" +maintainers: + - "@joseespinosa" + - "@drpatelh" diff --git a/modules/nf-core/bowtie2/align/tests/cram_crai.config b/modules/nf-core/bowtie2/align/tests/cram_crai.config new file mode 100644 index 00000000..03f1d5e5 --- /dev/null +++ b/modules/nf-core/bowtie2/align/tests/cram_crai.config @@ -0,0 +1,5 @@ +process { + withName: BOWTIE2_ALIGN { + ext.args2 = '--output-fmt cram --write-index' + } +} diff --git a/modules/nf-core/bowtie2/align/tests/large_index.config b/modules/nf-core/bowtie2/align/tests/large_index.config new file mode 100644 index 00000000..b2f0c405 --- /dev/null +++ b/modules/nf-core/bowtie2/align/tests/large_index.config @@ -0,0 +1,5 @@ +process { + withName: BOWTIE2_BUILD { + ext.args = '--large-index' + } +} diff --git a/modules/nf-core/bowtie2/align/tests/main.nf.test b/modules/nf-core/bowtie2/align/tests/main.nf.test new file mode 100644 index 00000000..214c97cc --- /dev/null +++ b/modules/nf-core/bowtie2/align/tests/main.nf.test @@ -0,0 +1,662 @@ +nextflow_process { + + name "Test Process BOWTIE2_ALIGN" + script "../main.nf" + process "BOWTIE2_ALIGN" + tag "modules" + tag "modules_nfcore" + tag "bowtie2" + tag "bowtie2/build" + tag "bowtie2/align" + + test("sarscov2 - fastq, index, fasta_fai, false, false - bam") { + + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[3] = false //save_unaligned + input[4] = true //sort + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getSamLines(5), + process.out.log, + process.out.fastq, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("sarscov2 - fastq, index, fasta_fai, false, false - sam") { + + config "./sam.config" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[3] = false //save_unaligned + input[4] = true //sort + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + bam(process.out.sam[0][1]).getSamLines(5), + process.out.log, + process.out.fastq, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("sarscov2 - fastq, index, fasta_fai, false, false - sam2") { + + config "./sam2.config" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[3] = false //save_unaligned + input[4] = true //sort + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + bam(process.out.sam[0][1]).getSamLines(5), + process.out.log, + process.out.fastq, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("sarscov2 - fastq, index, fasta_fai, false, true - bam") { + + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[3] = false //save_unaligned + input[4] = true //sort + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getSamLines(5), + process.out.log, + process.out.fastq, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("sarscov2 - [fastq1, fastq2], index, fasta_fai, false, false - bam") { + + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[3] = false //save_unaligned + input[4] = true //sort + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getSamLines(5), + process.out.log, + process.out.fastq, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("sarscov2 - [fastq1, fastq2], index, fasta_fai, false, true - bam") { + + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[3] = false //save_unaligned + input[4] = true //sort + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getSamLines(5), + process.out.log, + process.out.fastq, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("sarscov2 - fastq, large_index, fasta_fai, false, false - bam") { + + config "./large_index.config" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[3] = false //save_unaligned + input[4] = true //sort + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getSamLines(5), + process.out.log, + process.out.fastq, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("sarscov2 - [fastq1, fastq2], large_index, fasta_fai, false, false - bam") { + + config "./large_index.config" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[3] = false //save_unaligned + input[4] = true //sort + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getSamLines(5), + process.out.log, + process.out.fastq, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("sarscov2 - [fastq1, fastq2], index, fasta_fai, true, false - bam") { + + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[3] = false //save_unaligned + input[4] = true //sort + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getSamLines(5), + process.out.log, + process.out.fastq, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("sarscov2 - fastq, index, fasta_fai, true, false - bam") { + + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[3] = false //save_unaligned + input[4] = true //sort + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getSamLines(5), + process.out.log, + process.out.fastq, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + + ) + } + + } + + test("sarscov2 - [fastq1, fastq2], index, fasta_fai, true, true - cram") { + + config "./cram_crai.config" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[3] = false //save_unaligned + input[4] = true //sort + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + file(process.out.cram[0][1]).name, + file(process.out.crai[0][1]).name + ).match() } + ) + } + + } + + test("sarscov2 - [fastq1, fastq2], index, fasta_fai, false, false - stub") { + + options "-stub" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[3] = false //save_unaligned + input[4] = false //sort + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + file(process.out.bam[0][1]).name, + file(process.out.csi[0][1]).name, + file(process.out.log[0][1]).name, + process.out.fastq, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("sarscov2 - fastq, index, fasta_fai, true, false - stub") { + + options "-stub" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[3] = false //save_unaligned + input[4] = false //sort + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + file(process.out.bam[0][1]).name, + file(process.out.csi[0][1]).name, + file(process.out.log[0][1]).name, + process.out.fastq, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + +} diff --git a/modules/nf-core/bowtie2/align/tests/main.nf.test.snap b/modules/nf-core/bowtie2/align/tests/main.nf.test.snap new file mode 100644 index 00000000..cebe58ee --- /dev/null +++ b/modules/nf-core/bowtie2/align/tests/main.nf.test.snap @@ -0,0 +1,599 @@ +{ + "sarscov2 - fastq, index, fasta_fai, false, false - sam": { + "content": [ + [ + "ERR5069949.29668\t16\tMT192765.1\t267\t42\t89M\t*\t0\t0\tCCTTGTCCCTGGTTACAACTAGAAACCACACGTCCAACTCAGTTTGCCTGTTTTACAGGTTCGCGACGTGCTCGTACGTGGCTTTGGAG\tE////6/E/EE/EE/<&1 | sed -n 's/.*bowtie2-align-s version //p'"), emit: versions_bowtie2, topic: versions when: task.ext.when == null || task.ext.when @@ -22,10 +22,6 @@ process BOWTIE2_BUILD { """ mkdir bowtie2 bowtie2-build $args --threads $task.cpus $fasta bowtie2/${fasta.baseName} - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bowtie2: \$(echo \$(bowtie2 --version 2>&1) | sed 's/^.*bowtie2-align-s version //; s/ .*\$//') - END_VERSIONS """ stub: @@ -33,10 +29,5 @@ process BOWTIE2_BUILD { mkdir bowtie2 touch bowtie2/${fasta.baseName}.{1..4}.bt2 touch bowtie2/${fasta.baseName}.rev.{1,2}.bt2 - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bowtie2: \$(echo \$(bowtie2 --version 2>&1) | sed 's/^.*bowtie2-align-s version //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bowtie2/build/meta.yml b/modules/nf-core/bowtie2/build/meta.yml index 0240224d..e2a4367c 100644 --- a/modules/nf-core/bowtie2/build/meta.yml +++ b/modules/nf-core/bowtie2/build/meta.yml @@ -15,29 +15,57 @@ tools: documentation: http://bowtie-bio.sourceforge.net/bowtie2/manual.shtml doi: 10.1038/nmeth.1923 licence: ["GPL-3.0-or-later"] + identifier: "" input: - - meta: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'test', single_end:false ] - - fasta: - type: file - description: Input genome fasta file + - - meta: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: Reference genome FASTA file + pattern: "*.{fa,fasta,fna}" + ontologies: + - edam: "http://edamontology.org/format_1929" output: - - meta: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'test', single_end:false ] - - index: - type: file - description: Bowtie2 genome index files - pattern: "*.bt2" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + index: + - - meta: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test', single_end:false ] + - bowtie2: + type: directory + description: Bowtie2 genome index files + pattern: "*.bt2" + ontologies: [] + versions_bowtie2: + - - ${task.process}: + type: string + description: The name of the process + - bowtie2: + type: string + description: The name of the tool + - "bowtie2 --version 2>&1 | sed -n 's/.*bowtie2-align-s version //p'": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - bowtie2: + type: string + description: The name of the tool + - "bowtie2 --version 2>&1 | sed -n 's/.*bowtie2-align-s version //p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@joseespinosa" - "@drpatelh" +maintainers: + - "@joseespinosa" + - "@drpatelh" diff --git a/modules/nf-core/bowtie2/build/tests/main.nf.test b/modules/nf-core/bowtie2/build/tests/main.nf.test new file mode 100644 index 00000000..a4bad2a1 --- /dev/null +++ b/modules/nf-core/bowtie2/build/tests/main.nf.test @@ -0,0 +1,36 @@ +nextflow_process { + + name "Test Process BOWTIE2_BUILD" + script "../main.nf" + process "BOWTIE2_BUILD" + tag "modules" + tag "modules_nfcore" + tag "bowtie2" + tag "bowtie2/build" + + test("Should run without failures") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.index, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + +} diff --git a/modules/nf-core/bowtie2/build/tests/main.nf.test.snap b/modules/nf-core/bowtie2/build/tests/main.nf.test.snap new file mode 100644 index 00000000..9f1bf080 --- /dev/null +++ b/modules/nf-core/bowtie2/build/tests/main.nf.test.snap @@ -0,0 +1,35 @@ +{ + "Should run without failures": { + "content": [ + [ + [ + { + "id": "test" + }, + [ + "genome.1.bt2:md5,cbe3d0bbea55bc57c99b4bfa25b5fbdf", + "genome.2.bt2:md5,47b153cd1319abc88dda532462651fcf", + "genome.3.bt2:md5,4ed93abba181d8dfab2e303e33114777", + "genome.4.bt2:md5,c25be5f8b0378abf7a58c8a880b87626", + "genome.rev.1.bt2:md5,52be6950579598a990570fbcf5372184", + "genome.rev.2.bt2:md5,e3b4ef343dea4dd571642010a7d09597" + ] + ] + ], + { + "versions_bowtie2": [ + [ + "BOWTIE2_BUILD", + "bowtie2", + "2.5.4" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-28T17:52:30.165111" + } +} \ No newline at end of file diff --git a/modules/nf-core/bwa/index/bwa-index.diff b/modules/nf-core/bwa/index/bwa-index.diff new file mode 100644 index 00000000..90991bd7 --- /dev/null +++ b/modules/nf-core/bwa/index/bwa-index.diff @@ -0,0 +1,21 @@ +Changes in component 'nf-core/bwa/index' +'modules/nf-core/bwa/index/environment.yml' is unchanged +'modules/nf-core/bwa/index/meta.yml' is unchanged +Changes in 'bwa/index/main.nf': +--- modules/nf-core/bwa/index/main.nf ++++ modules/nf-core/bwa/index/main.nf +@@ -2,7 +2,9 @@ + tag "$fasta" + // NOTE requires 5.37N memory where N is the size of the database + // source: https://bio-bwa.sourceforge.net/bwa.shtml#8 +- memory { 7.B * fasta.size() } ++ // Floor at 1.GB: the proportional formula under-provisions small (e.g. test) ++ // genomes below bwa+runtime overhead, causing OOM kills. ++ memory { [ 7.B * fasta.size(), 1.GB ].max() } + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + +'modules/nf-core/bwa/index/tests/main.nf.test.snap' is unchanged +'modules/nf-core/bwa/index/tests/main.nf.test' is unchanged +************************************************************ diff --git a/modules/nf-core/bwa/index/environment.yml b/modules/nf-core/bwa/index/environment.yml new file mode 100644 index 00000000..54e67949 --- /dev/null +++ b/modules/nf-core/bwa/index/environment.yml @@ -0,0 +1,13 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda + +dependencies: + # renovate: datasource=conda depName=bioconda/bwa + - bioconda::bwa=0.7.19 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.22.1 diff --git a/modules/nf-core/bwa/index/main.nf b/modules/nf-core/bwa/index/main.nf index 8d2e56d9..215a6f93 100644 --- a/modules/nf-core/bwa/index/main.nf +++ b/modules/nf-core/bwa/index/main.nf @@ -1,51 +1,46 @@ process BWA_INDEX { tag "$fasta" - label 'process_single' + // NOTE requires 5.37N memory where N is the size of the database + // source: https://bio-bwa.sourceforge.net/bwa.shtml#8 + // Floor at 1.GB: the proportional formula under-provisions small (e.g. test) + // genomes below bwa+runtime overhead, causing OOM kills. + memory { [ 7.B * fasta.size(), 1.GB ].max() } - conda "bioconda::bwa=0.7.17" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7' : - 'biocontainers/bwa:0.7.17--hed695b0_7' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/d7/d7e24dc1e4d93ca4d3a76a78d4c834a7be3985b0e1e56fddd61662e047863a8a/data' : + 'community.wave.seqera.io/library/bwa_htslib_samtools:83b50ff84ead50d0' }" input: tuple val(meta), path(fasta) output: - tuple val(meta), path(bwa) , emit: index - path "versions.yml" , emit: versions + tuple val(meta), path("bwa"), emit: index + tuple val("${task.process}"), val('bwa'), eval('bwa 2>&1 | sed -n "s/^Version: //p"'), topic: versions, emit: versions_bwa when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${fasta.baseName}" + def args = task.ext.args ?: '' """ mkdir bwa bwa \\ index \\ $args \\ - -p bwa/${fasta.baseName} \\ + -p bwa/${prefix} \\ $fasta - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') - END_VERSIONS """ stub: + def prefix = task.ext.prefix ?: "${fasta.baseName}" """ mkdir bwa - - touch bwa/genome.amb - touch bwa/genome.ann - touch bwa/genome.bwt - touch bwa/genome.pac - touch bwa/genome.sa - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') - END_VERSIONS + touch bwa/${prefix}.amb + touch bwa/${prefix}.ann + touch bwa/${prefix}.bwt + touch bwa/${prefix}.pac + touch bwa/${prefix}.sa """ } diff --git a/modules/nf-core/bwa/index/meta.yml b/modules/nf-core/bwa/index/meta.yml index 2c6cfcd7..f5bf7f52 100644 --- a/modules/nf-core/bwa/index/meta.yml +++ b/modules/nf-core/bwa/index/meta.yml @@ -11,32 +11,61 @@ tools: BWA is a software package for mapping DNA sequences against a large reference genome, such as the human genome. homepage: http://bio-bwa.sourceforge.net/ - documentation: http://www.htslib.org/doc/samtools.html + documentation: https://bio-bwa.sourceforge.net/bwa.shtml arxiv: arXiv:1303.3997 licence: ["GPL-3.0-or-later"] + identifier: "biotools:bwa" input: - - meta: - type: map - description: | - Groovy Map containing reference information. - e.g. [ id:'test', single_end:false ] - - fasta: - type: file - description: Input genome fasta file + - - meta: + type: map + description: | + Groovy Map containing reference information. + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: Input genome fasta file + ontologies: + - edam: "http://edamontology.org/data_2044" # Sequence + - edam: "http://edamontology.org/format_1929" # FASTA output: - - meta: - type: map - description: | - Groovy Map containing reference information. - e.g. [ id:'test', single_end:false ] - - index: - type: file - description: BWA genome index files - pattern: "*.{amb,ann,bwt,pac,sa}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + index: + - - meta: + type: map + description: | + Groovy Map containing reference information. + e.g. [ id:'test', single_end:false ] + - bwa: + type: map + description: | + Groovy Map containing reference information. + e.g. [ id:'test', single_end:false ] + pattern: "*.{amb,ann,bwt,pac,sa}" + ontologies: + - edam: "http://edamontology.org/data_3210" # Genome index + versions_bwa: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bwa: + type: string + description: The tool name + - 'bwa 2>&1 | sed -n "s/^Version: //p"': + type: string + description: The command used to generate the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bwa: + type: string + description: The tool name + - 'bwa 2>&1 | sed -n "s/^Version: //p"': + type: string + description: The command used to generate the version of the tool authors: - "@drpatelh" - "@maxulysse" +maintainers: + - "@maxulysse" + - "@gallvp" diff --git a/modules/nf-core/bwa/index/tests/main.nf.test b/modules/nf-core/bwa/index/tests/main.nf.test new file mode 100644 index 00000000..f0fba82a --- /dev/null +++ b/modules/nf-core/bwa/index/tests/main.nf.test @@ -0,0 +1,57 @@ +nextflow_process { + + name "Test Process BWA_INDEX" + tag "modules_nfcore" + tag "modules" + tag "bwa" + tag "bwa/index" + script "../main.nf" + process "BWA_INDEX" + + test("BWA index") { + + when { + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match() } + ) + } + + } + + test("BWA index - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/bwa/index/tests/main.nf.test.snap b/modules/nf-core/bwa/index/tests/main.nf.test.snap new file mode 100644 index 00000000..21a6f73c --- /dev/null +++ b/modules/nf-core/bwa/index/tests/main.nf.test.snap @@ -0,0 +1,108 @@ +{ + "BWA index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + [ + "genome.amb:md5,d41d8cd98f00b204e9800998ecf8427e", + "genome.ann:md5,d41d8cd98f00b204e9800998ecf8427e", + "genome.bwt:md5,d41d8cd98f00b204e9800998ecf8427e", + "genome.pac:md5,d41d8cd98f00b204e9800998ecf8427e", + "genome.sa:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + [ + "BWA_INDEX", + "bwa", + "0.7.19-r1273" + ] + ], + "index": [ + [ + { + "id": "test" + }, + [ + "genome.amb:md5,d41d8cd98f00b204e9800998ecf8427e", + "genome.ann:md5,d41d8cd98f00b204e9800998ecf8427e", + "genome.bwt:md5,d41d8cd98f00b204e9800998ecf8427e", + "genome.pac:md5,d41d8cd98f00b204e9800998ecf8427e", + "genome.sa:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions_bwa": [ + [ + "BWA_INDEX", + "bwa", + "0.7.19-r1273" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-23T16:58:59.966558606" + }, + "BWA index": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + [ + "genome.amb:md5,3a68b8b2287e07dd3f5f95f4344ba76e", + "genome.ann:md5,c32e11f6c859f166c7525a9c1d583567", + "genome.bwt:md5,0469c30a1e239dd08f68afe66fde99da", + "genome.pac:md5,983e3d2cd6f36e2546e6d25a0da78d66", + "genome.sa:md5,ab3952cabf026b48cd3eb5bccbb636d1" + ] + ] + ], + "1": [ + [ + "BWA_INDEX", + "bwa", + "0.7.19-r1273" + ] + ], + "index": [ + [ + { + "id": "test" + }, + [ + "genome.amb:md5,3a68b8b2287e07dd3f5f95f4344ba76e", + "genome.ann:md5,c32e11f6c859f166c7525a9c1d583567", + "genome.bwt:md5,0469c30a1e239dd08f68afe66fde99da", + "genome.pac:md5,983e3d2cd6f36e2546e6d25a0da78d66", + "genome.sa:md5,ab3952cabf026b48cd3eb5bccbb636d1" + ] + ] + ], + "versions_bwa": [ + [ + "BWA_INDEX", + "bwa", + "0.7.19-r1273" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-23T16:58:53.330725134" + } +} \ No newline at end of file diff --git a/modules/nf-core/bwa/mem/environment.yml b/modules/nf-core/bwa/mem/environment.yml new file mode 100644 index 00000000..54e67949 --- /dev/null +++ b/modules/nf-core/bwa/mem/environment.yml @@ -0,0 +1,13 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda + +dependencies: + # renovate: datasource=conda depName=bioconda/bwa + - bioconda::bwa=0.7.19 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.22.1 diff --git a/modules/nf-core/bwa/mem/main.nf b/modules/nf-core/bwa/mem/main.nf index d2f85daf..bde6a9a3 100644 --- a/modules/nf-core/bwa/mem/main.nf +++ b/modules/nf-core/bwa/mem/main.nf @@ -2,19 +2,25 @@ process BWA_MEM { tag "$meta.id" label 'process_high' - conda "bioconda::bwa=0.7.17 bioconda::samtools=1.16.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:219b6c272b25e7e642ae3ff0bf0c5c81a5135ab4-0' : - 'biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:219b6c272b25e7e642ae3ff0bf0c5c81a5135ab4-0' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/d7/d7e24dc1e4d93ca4d3a76a78d4c834a7be3985b0e1e56fddd61662e047863a8a/data' : + 'community.wave.seqera.io/library/bwa_htslib_samtools:83b50ff84ead50d0' }" input: - tuple val(meta), path(reads) + tuple val(meta) , path(reads) tuple val(meta2), path(index) + tuple val(meta3), path(fasta) val sort_bam output: - tuple val(meta), path("*.bam"), emit: bam - path "versions.yml" , emit: versions + tuple val(meta), path("*.bam") , emit: bam, optional: true + tuple val(meta), path("*.cram") , emit: cram, optional: true + tuple val(meta), path("*.sam") , emit: sam, optional: true + tuple val(meta), path("*.csi") , emit: csi, optional: true + tuple val(meta), path("*.crai") , emit: crai, optional: true + tuple val("${task.process}"), val('bwa'), eval('bwa 2>&1 | sed -n "s/^Version: //p"'), topic: versions, emit: versions_bwa + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), topic: versions, emit: versions_samtools when: task.ext.when == null || task.ext.when @@ -24,6 +30,22 @@ process BWA_MEM { def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def samtools_command = sort_bam ? 'sort' : 'view' + def extension = args2.contains("--output-fmt sam") ? "sam" : + args2.contains("--output-fmt cram") ? "cram": + sort_bam && args2.contains("-O cram")? "cram": + !sort_bam && args2.contains("-C") ? "cram": + "bam" + def reference = fasta && extension=="cram" ? "--reference ${fasta}" : "" + if (!fasta && extension=="cram") error "Fasta reference is required for CRAM output" + // + // For SAM output we can skip samtools view + // + def pipe_command = "" + if (extension == "sam") { + pipe_command = "> ${prefix}.${extension}" + } else { + pipe_command = "| samtools $samtools_command $args2 ${reference} --threads $task.cpus -o ${prefix}.${extension} -" + } """ INDEX=`find -L ./ -name "*.amb" | sed 's/\\.amb\$//'` @@ -32,12 +54,20 @@ process BWA_MEM { -t $task.cpus \\ \$INDEX \\ $reads \\ - | samtools $samtools_command $args2 --threads $task.cpus -o ${prefix}.bam - + $pipe_command + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + stub: + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args2.contains("--output-fmt sam") ? "sam" : + args2.contains("--output-fmt cram") ? "cram": + sort_bam && args2.contains("-O cram")? "cram": + !sort_bam && args2.contains("-C") ? "cram": + "bam" + """ + touch ${prefix}.${extension} + touch ${prefix}.csi + touch ${prefix}.crai """ } diff --git a/modules/nf-core/bwa/mem/meta.yml b/modules/nf-core/bwa/mem/meta.yml index 62357bf8..1c4ee883 100644 --- a/modules/nf-core/bwa/mem/meta.yml +++ b/modules/nf-core/bwa/mem/meta.yml @@ -14,42 +14,146 @@ tools: BWA is a software package for mapping DNA sequences against a large reference genome, such as the human genome. homepage: http://bio-bwa.sourceforge.net/ - documentation: http://www.htslib.org/doc/samtools.html + documentation: https://bio-bwa.sourceforge.net/bwa.shtml arxiv: arXiv:1303.3997 - licence: ["GPL-3.0-or-later"] + licence: + - "GPL-3.0-or-later" + identifier: "biotools:bwa" input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. - - meta2: - type: map - description: | - Groovy Map containing reference information. - e.g. [ id:'test', single_end:false ] - - index: - type: file - description: BWA genome index files - pattern: "Directory containing BWA index *.{amb,ann,bwt,pac,sa}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + ontologies: + - edam: "http://edamontology.org/data_2044" + - edam: "http://edamontology.org/format_1930" + - - meta2: + type: map + description: | + Groovy Map containing reference information. + e.g. [ id:'test', single_end:false ] + - index: + type: file + description: BWA genome index files + pattern: "Directory containing BWA index *.{amb,ann,bwt,pac,sa}" + ontologies: + - edam: "http://edamontology.org/data_3210" + - - meta3: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: Reference genome in FASTA format + pattern: "*.{fasta,fa}" + ontologies: + - edam: "http://edamontology.org/data_2044" + - edam: "http://edamontology.org/format_1929" - sort_bam: type: boolean description: use samtools sort (true) or samtools view (false) pattern: "true or false" output: - - bam: - type: file - description: Output BAM file containing read alignments - pattern: "*.{bam}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + bam: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.bam": + type: file + description: Output BAM file containing read alignments + pattern: "*.{bam}" + ontologies: + - edam: "http://edamontology.org/format_2572" + cram: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.cram": + type: file + description: Output CRAM file containing read alignments + pattern: "*.{cram}" + ontologies: + - edam: "http://edamontology.org/format_3462" + sam: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.sam": + type: file + description: Output SAM file containing read alignments + pattern: "*.{sam}" + ontologies: + - edam: "http://edamontology.org/format_2573" + csi: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.csi": + type: file + description: Optional index file for BAM file + pattern: "*.{csi}" + ontologies: [] + crai: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.crai": + type: file + description: Optional index file for CRAM file + pattern: "*.{crai}" + ontologies: [] + versions_bwa: + - - ${task.process}: + type: string + description: The name of the process + - bwa: + type: string + description: The name of the tool + - 'bwa 2>&1 | sed -n "s/^Version: //p"': + type: eval + description: The expression to obtain the version of the tool + versions_samtools: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - bwa: + type: string + description: The name of the tool + - 'bwa 2>&1 | sed -n "s/^Version: //p"': + type: eval + description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" - "@jeremy1805" + - "@matthdsm" +maintainers: + - "@drpatelh" + - "@jeremy1805" + - "@matthdsm" diff --git a/modules/nf-core/bwa/mem/tests/main.nf.test b/modules/nf-core/bwa/mem/tests/main.nf.test new file mode 100644 index 00000000..e284e2ea --- /dev/null +++ b/modules/nf-core/bwa/mem/tests/main.nf.test @@ -0,0 +1,343 @@ +nextflow_process { + + name "Test Process BWA_MEM" + tag "modules_nfcore" + tag "modules" + tag "bwa" + tag "bwa/mem" + tag "bwa/index" + script "../main.nf" + process "BWA_MEM" + + setup { + run("BWA_INDEX") { + script "../../index/main.nf" + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + test("Single-End") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BWA_INDEX.out.index + input[2] = [[id: 'test'],file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)] + input[3] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.cram, + process.out.sam, + process.out.csi, + process.out.crai, + process.out.findAll { key, val -> key.startsWith("versions") }, + bam(process.out.bam[0][1]).getReadsMD5() + ).match() + } + ) + } + + } + + test("Single-End Sort") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BWA_INDEX.out.index + input[2] = [[id: 'test'],file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)] + input[3] = true + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.cram, + process.out.sam, + process.out.csi, + process.out.crai, + process.out.findAll { key, val -> key.startsWith("versions") }, + bam(process.out.bam[0][1]).getReadsMD5() + ).match() + } + ) + } + + } + + test("Single-End - SAM output") { + + config "./nextflow_sam.config" + + when { + params { + module_args2 = "--output-fmt sam" + } + + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BWA_INDEX.out.index + input[2] = [[id: 'test'],file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)] + input[3] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.bam, + process.out.cram, + process.out.csi, + process.out.crai, + process.out.findAll { key, val -> key.startsWith("versions") }, + bam(process.out.sam[0][1]).getReadsMD5() + ).match() + } + ) + } + + } + + test("Paired-End") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BWA_INDEX.out.index + input[2] = [[id: 'test'],file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)] + input[3] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.cram, + process.out.sam, + process.out.csi, + process.out.crai, + process.out.findAll { key, val -> key.startsWith("versions") }, + bam(process.out.bam[0][1]).getReadsMD5() + ).match() + } + ) + } + + } + + test("Paired-End Sort") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BWA_INDEX.out.index + input[2] = [[id: 'test'],file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)] + input[3] = true + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.cram, + process.out.sam, + process.out.csi, + process.out.crai, + process.out.findAll { key, val -> key.startsWith("versions") }, + bam(process.out.bam[0][1]).getReadsMD5() + ).match() + } + ) + } + + } + + test("Paired-End - no fasta") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BWA_INDEX.out.index + input[2] = [[:],[]] + input[3] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.cram, + process.out.sam, + process.out.csi, + process.out.crai, + process.out.findAll { key, val -> key.startsWith("versions") }, + bam(process.out.bam[0][1]).getReadsMD5() + ).match() + } + ) + } + + } + + test ("Paired-end - SAM output") { + + config "./nextflow_sam.config" + + when { + params { + module_args2 = "--output-fmt sam" + } + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BWA_INDEX.out.index + input[2] = [[:],[]] + input[3] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.bam, + process.out.cram, + process.out.csi, + process.out.crai, + process.out.findAll { key, val -> key.startsWith("versions") }, + bam(process.out.sam[0][1]).getReadsMD5() + ).match() + } + ) + } + + } + + test("Single-end - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BWA_INDEX.out.index + input[2] = [[id: 'test'],file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)] + input[3] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("Paired-end - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = BWA_INDEX.out.index + input[2] = [[id: 'test'],file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)] + input[3] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/bwa/mem/tests/main.nf.test.snap b/modules/nf-core/bwa/mem/tests/main.nf.test.snap new file mode 100644 index 00000000..c3f74d37 --- /dev/null +++ b/modules/nf-core/bwa/mem/tests/main.nf.test.snap @@ -0,0 +1,478 @@ +{ + "Single-End - SAM output": { + "content": [ + [ + + ], + [ + + ], + [ + + ], + [ + + ], + { + "versions_bwa": [ + [ + "BWA_MEM", + "bwa", + "0.7.19-r1273" + ] + ], + "versions_samtools": [ + [ + "BWA_MEM", + "samtools", + "1.22.1" + ] + ] + }, + "798439cbd7fd81cbcc5078022dc5479d" + ], + "timestamp": "2026-05-11T12:09:32.334359515", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "Single-End": { + "content": [ + [ + + ], + [ + + ], + [ + + ], + [ + + ], + { + "versions_bwa": [ + [ + "BWA_MEM", + "bwa", + "0.7.19-r1273" + ] + ], + "versions_samtools": [ + [ + "BWA_MEM", + "samtools", + "1.22.1" + ] + ] + }, + "798439cbd7fd81cbcc5078022dc5479d" + ], + "timestamp": "2026-05-11T12:07:21.233636979", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "Single-End Sort": { + "content": [ + [ + + ], + [ + + ], + [ + + ], + [ + + ], + { + "versions_bwa": [ + [ + "BWA_MEM", + "bwa", + "0.7.19-r1273" + ] + ], + "versions_samtools": [ + [ + "BWA_MEM", + "samtools", + "1.22.1" + ] + ] + }, + "94fcf617f5b994584c4e8d4044e16b4f" + ], + "timestamp": "2026-05-11T12:07:28.74614221", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "Paired-End": { + "content": [ + [ + + ], + [ + + ], + [ + + ], + [ + + ], + { + "versions_bwa": [ + [ + "BWA_MEM", + "bwa", + "0.7.19-r1273" + ] + ], + "versions_samtools": [ + [ + "BWA_MEM", + "samtools", + "1.22.1" + ] + ] + }, + "57aeef88ed701a8ebc8e2f0a381b2a6" + ], + "timestamp": "2026-05-11T12:07:42.612131595", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "Paired-End Sort": { + "content": [ + [ + + ], + [ + + ], + [ + + ], + [ + + ], + { + "versions_bwa": [ + [ + "BWA_MEM", + "bwa", + "0.7.19-r1273" + ] + ], + "versions_samtools": [ + [ + "BWA_MEM", + "samtools", + "1.22.1" + ] + ] + }, + "af8628d9df18b2d3d4f6fd47ef2bb872" + ], + "timestamp": "2026-05-11T12:09:45.938323098", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "Single-end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "single_end": true + }, + "test.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + "BWA_MEM", + "bwa", + "0.7.19-r1273" + ] + ], + "6": [ + [ + "BWA_MEM", + "samtools", + "1.22.1" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "crai": [ + [ + { + "id": "test", + "single_end": true + }, + "test.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + + ], + "csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sam": [ + + ], + "versions_bwa": [ + [ + "BWA_MEM", + "bwa", + "0.7.19-r1273" + ] + ], + "versions_samtools": [ + [ + "BWA_MEM", + "samtools", + "1.22.1" + ] + ] + } + ], + "timestamp": "2026-05-11T12:10:09.92486753", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "Paired-End - no fasta": { + "content": [ + [ + + ], + [ + + ], + [ + + ], + [ + + ], + { + "versions_bwa": [ + [ + "BWA_MEM", + "bwa", + "0.7.19-r1273" + ] + ], + "versions_samtools": [ + [ + "BWA_MEM", + "samtools", + "1.22.1" + ] + ] + }, + "57aeef88ed701a8ebc8e2f0a381b2a6" + ], + "timestamp": "2026-05-11T12:09:52.820539909", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "Paired-end - SAM output": { + "content": [ + [ + + ], + [ + + ], + [ + + ], + [ + + ], + { + "versions_bwa": [ + [ + "BWA_MEM", + "bwa", + "0.7.19-r1273" + ] + ], + "versions_samtools": [ + [ + "BWA_MEM", + "samtools", + "1.22.1" + ] + ] + }, + "57aeef88ed701a8ebc8e2f0a381b2a6" + ], + "timestamp": "2026-05-11T12:10:00.199968933", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "Paired-end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + "BWA_MEM", + "bwa", + "0.7.19-r1273" + ] + ], + "6": [ + [ + "BWA_MEM", + "samtools", + "1.22.1" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "crai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + + ], + "csi": [ + [ + { + "id": "test", + "single_end": false + }, + "test.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sam": [ + + ], + "versions_bwa": [ + [ + "BWA_MEM", + "bwa", + "0.7.19-r1273" + ] + ], + "versions_samtools": [ + [ + "BWA_MEM", + "samtools", + "1.22.1" + ] + ] + } + ], + "timestamp": "2026-05-11T12:10:16.940291647", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/bwa/mem/tests/nextflow_sam.config b/modules/nf-core/bwa/mem/tests/nextflow_sam.config new file mode 100644 index 00000000..831332e7 --- /dev/null +++ b/modules/nf-core/bwa/mem/tests/nextflow_sam.config @@ -0,0 +1,5 @@ +process { + withName: BWA_MEM { + ext.args2 = params.module_args2 + } +} diff --git a/modules/nf-core/chromap/chromap/environment.yml b/modules/nf-core/chromap/chromap/environment.yml new file mode 100644 index 00000000..4447b170 --- /dev/null +++ b/modules/nf-core/chromap/chromap/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::chromap=0.3.2 + - bioconda::samtools=1.23.1 diff --git a/modules/nf-core/chromap/chromap/main.nf b/modules/nf-core/chromap/chromap/main.nf index a39302e3..ec3b8eec 100644 --- a/modules/nf-core/chromap/chromap/main.nf +++ b/modules/nf-core/chromap/chromap/main.nf @@ -2,10 +2,10 @@ process CHROMAP_CHROMAP { tag "$meta.id" label 'process_medium' - conda "bioconda::chromap=0.2.4 bioconda::samtools=1.16.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:5b2e433ab8b3d1ef098fc944b567fd98caa23f56-0' : - 'biocontainers/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:5b2e433ab8b3d1ef098fc944b567fd98caa23f56-0' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/5d/5d39e0b3f00c5469ffc2ceef4bd76959fba6313064ed2408dd4ccac498022ad6/data' : + 'community.wave.seqera.io/library/chromap_samtools:b975c17adf0096ba' }" input: tuple val(meta), path(reads) @@ -21,7 +21,8 @@ process CHROMAP_CHROMAP { tuple val(meta), path("*.bam") , optional:true, emit: bam tuple val(meta), path("*.tagAlign.gz"), optional:true, emit: tagAlign tuple val(meta), path("*.pairs.gz") , optional:true, emit: pairs - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('chromap'), eval("chromap --version 2>&1"), topic: versions, emit: versions_chromap + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), topic: versions, emit: versions_samtools when: task.ext.when == null || task.ext.when @@ -65,12 +66,6 @@ process CHROMAP_CHROMAP { -o ${prefix}.${file_extension} $compression_cmds - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - chromap: \$(echo \$(chromap --version 2>&1)) - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } else { """ @@ -84,12 +79,15 @@ process CHROMAP_CHROMAP { -o ${prefix}.${file_extension} $compression_cmds - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - chromap: \$(echo \$(chromap --version 2>&1)) - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | gzip > ${prefix}.bed.gz + touch ${prefix}.bam + echo "" | gzip > ${prefix}.tagAlign.gz + echo "" | gzip > ${prefix}.pairs.gz + """ } diff --git a/modules/nf-core/chromap/chromap/meta.yml b/modules/nf-core/chromap/chromap/meta.yml index 05f70cf0..5e024f17 100644 --- a/modules/nf-core/chromap/chromap/meta.yml +++ b/modules/nf-core/chromap/chromap/meta.yml @@ -1,7 +1,6 @@ name: chromap_chromap description: | - Performs preprocessing and alignment of chromatin fastq files to - fasta reference files using chromap. + Performs preprocessing and alignment of chromatin fastq files to fasta reference files using chromap. keywords: - chromap - alignment @@ -16,84 +15,157 @@ keywords: - duplicate removal tools: - chromap: - description: Fast alignment and preprocessing of chromatin profiles + description: | + Fast alignment and preprocessing of chromatin profiles homepage: https://github.com/haowenz/chromap documentation: https://github.com/haowenz/chromap tool_dev_url: https://github.com/haowenz/chromap - licence: ["GPL v3"] + identifier: "" input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. - - meta2: - type: map - description: | - Groovy Map containing information for the fasta - e.g. [ id:'test' ] - - fasta: - type: file - description: | - The fasta reference file. - - meta3: - type: map - description: | - Groovy Map containing information for the index - e.g. [ id:'test' ] - - index: - type: file - description: | - Chromap genome index files (*.index) + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing information for the fasta + e.g. [ id:'test' ] + - fasta: + type: file + description: Reference genome FASTA file + pattern: "*.{fa,fasta,fna}" + ontologies: + - edam: "http://edamontology.org/format_1929" + - - meta3: + type: map + description: | + Groovy Map containing information for the index + e.g. [ id:'test' ] + - index: + type: file + description: | + Chromap genome index files (*.index) + ontologies: [] - barcodes: type: file description: | Cell barcode files + ontologies: [] - whitelist: type: file description: | Cell barcode whitelist file + ontologies: [] - chr_order: type: file description: | Custom chromosome order + ontologies: [] - pairs_chr_order: type: file description: | Natural chromosome order for pairs flipping + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - bed: - type: file - description: BED file - pattern: "*.bed.gz" - - bam: - type: file - description: BAM file - pattern: "*.bam" - - tagAlign: - type: file - description: tagAlign file - pattern: "*.tagAlign.gz" - - pairs: - type: file - description: pairs file - pattern: "*.pairs.gz" - + bed: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bed.gz": + type: file + description: BED file + pattern: "*.bed.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bam": + type: file + description: BAM file + pattern: "*.bam" + ontologies: [] + tagAlign: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.tagAlign.gz": + type: file + description: tagAlign file + pattern: "*.tagAlign.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + pairs: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.pairs.gz": + type: file + description: pairs file + pattern: "*.pairs.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + versions_chromap: + - - ${task.process}: + type: string + description: The name of the process + - chromap: + type: string + description: The name of the tool + - chromap --version 2>&1: + type: eval + description: The expression to obtain the version of the tool + versions_samtools: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - chromap: + type: string + description: The name of the tool + - chromap --version 2>&1: + type: eval + description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool authors: - "@mahesh-panchal" - "@joseespinosa" +maintainers: + - "@mahesh-panchal" + - "@joseespinosa" diff --git a/modules/nf-core/chromap/chromap/tests/main.nf.test b/modules/nf-core/chromap/chromap/tests/main.nf.test new file mode 100644 index 00000000..913b5a4b --- /dev/null +++ b/modules/nf-core/chromap/chromap/tests/main.nf.test @@ -0,0 +1,168 @@ +nextflow_process { + + name "Test Process CHROMAP_CHROMAP" + script "../main.nf" + process "CHROMAP_CHROMAP" + + tag "modules" + tag "modules_nfcore" + tag "chromap" + tag "chromap/chromap" + tag "chromap/index" + + setup { + + run("CHROMAP_INDEX") { + + script "../../index/main.nf" + + process { + """ + input[0] = [ + [:], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + } + + test("sarscov2 - single_end") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = [ + [:], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = CHROMAP_INDEX.out.index + input[3] = [] + input[4] = [] + input[5] = [] + input[6] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - paired_end") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = [ + [:], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = CHROMAP_INDEX.out.index + input[3] = [] + input[4] = [] + input[5] = [] + input[6] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + + test("sarscov2 - paired_end - bam") { + + when { + + config "./nextflow.config" + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = [ + [:], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = CHROMAP_INDEX.out.index + input[3] = [] + input[4] = [] + input[5] = [] + input[6] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { + assert snapshot( + bam(process.out.bam[0][1]).getHeaderMD5(), + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.versions + ) + } + ) + } + + } + + test("sarscov2 - single_end - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = [ + [:], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = CHROMAP_INDEX.out.index + input[3] = [] + input[4] = [] + input[5] = [] + input[6] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/chromap/chromap/tests/main.nf.test.snap b/modules/nf-core/chromap/chromap/tests/main.nf.test.snap new file mode 100644 index 00000000..99738ec7 --- /dev/null +++ b/modules/nf-core/chromap/chromap/tests/main.nf.test.snap @@ -0,0 +1,338 @@ +{ + "sarscov2 - single_end": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bed.gz:md5,b23aa9dae812fe84c308df6e18d850be" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + "CHROMAP_CHROMAP", + "chromap", + "0.3.2-r518" + ] + ], + "5": [ + [ + "CHROMAP_CHROMAP", + "samtools", + "1.23.1" + ] + ], + "bam": [ + + ], + "bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bed.gz:md5,b23aa9dae812fe84c308df6e18d850be" + ] + ], + "pairs": [ + + ], + "tagAlign": [ + + ], + "versions_chromap": [ + [ + "CHROMAP_CHROMAP", + "chromap", + "0.3.2-r518" + ] + ], + "versions_samtools": [ + [ + "CHROMAP_CHROMAP", + "samtools", + "1.23.1" + ] + ] + } + ], + "timestamp": "2026-03-27T17:32:15.943898", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "sarscov2 - paired_end ": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bed.gz:md5,f658c1e94adef751ad08e132aac92712" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + "CHROMAP_CHROMAP", + "chromap", + "0.3.2-r518" + ] + ], + "5": [ + [ + "CHROMAP_CHROMAP", + "samtools", + "1.23.1" + ] + ], + "bam": [ + + ], + "bed": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bed.gz:md5,f658c1e94adef751ad08e132aac92712" + ] + ], + "pairs": [ + + ], + "tagAlign": [ + + ], + "versions_chromap": [ + [ + "CHROMAP_CHROMAP", + "chromap", + "0.3.2-r518" + ] + ], + "versions_samtools": [ + [ + "CHROMAP_CHROMAP", + "samtools", + "1.23.1" + ] + ] + } + ], + "timestamp": "2026-03-27T17:32:51.441586", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "sarscov2 - single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.tagAlign.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": true + }, + "test.pairs.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "4": [ + [ + "CHROMAP_CHROMAP", + "chromap", + "0.3.2-r518" + ] + ], + "5": [ + [ + "CHROMAP_CHROMAP", + "samtools", + "1.23.1" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "pairs": [ + [ + { + "id": "test", + "single_end": true + }, + "test.pairs.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "tagAlign": [ + [ + { + "id": "test", + "single_end": true + }, + "test.tagAlign.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_chromap": [ + [ + "CHROMAP_CHROMAP", + "chromap", + "0.3.2-r518" + ] + ], + "versions_samtools": [ + [ + "CHROMAP_CHROMAP", + "samtools", + "1.23.1" + ] + ] + } + ], + "timestamp": "2026-03-27T17:33:28.468564", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "sarscov2 - paired_end": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bed.gz:md5,f658c1e94adef751ad08e132aac92712" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + "CHROMAP_CHROMAP", + "chromap", + "0.3.2-r518" + ] + ], + "5": [ + [ + "CHROMAP_CHROMAP", + "samtools", + "1.23.1" + ] + ], + "bam": [ + + ], + "bed": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bed.gz:md5,f658c1e94adef751ad08e132aac92712" + ] + ], + "pairs": [ + + ], + "tagAlign": [ + + ], + "versions_chromap": [ + [ + "CHROMAP_CHROMAP", + "chromap", + "0.3.2-r518" + ] + ], + "versions_samtools": [ + [ + "CHROMAP_CHROMAP", + "samtools", + "1.23.1" + ] + ] + } + ], + "timestamp": "2026-04-01T22:26:29.768814", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/chromap/chromap/tests/nextflow.config b/modules/nf-core/chromap/chromap/tests/nextflow.config new file mode 100644 index 00000000..51b96a98 --- /dev/null +++ b/modules/nf-core/chromap/chromap/tests/nextflow.config @@ -0,0 +1,7 @@ +process { + + withName: CHROMAP_CHROMAP { + ext.args = '--SAM' + } + +} diff --git a/modules/nf-core/chromap/index/environment.yml b/modules/nf-core/chromap/index/environment.yml new file mode 100644 index 00000000..9b65ef36 --- /dev/null +++ b/modules/nf-core/chromap/index/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::chromap=0.3.2 diff --git a/modules/nf-core/chromap/index/main.nf b/modules/nf-core/chromap/index/main.nf index fb3773f8..666f8f11 100644 --- a/modules/nf-core/chromap/index/main.nf +++ b/modules/nf-core/chromap/index/main.nf @@ -2,24 +2,24 @@ process CHROMAP_INDEX { tag "$fasta" label 'process_medium' - conda "bioconda::chromap=0.2.4" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/chromap:0.2.4--hd03093a_0' : - 'biocontainers/chromap:0.2.4--hd03093a_0' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/80/809e5a0166357804ca10097100e96844100019a11a3aaebf14e2cceb2ee98c0a/data' : + 'community.wave.seqera.io/library/chromap:0.3.2--4ec4bca51cd82195' }" input: tuple val(meta), path(fasta) output: tuple val(meta), path ("*.index"), emit: index - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('chromap'), eval("chromap --version 2>&1"), topic: versions, emit: versions_chromap when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' - def prefix = fasta.baseName + def prefix = task.ext.prefix ?: "${fasta.baseName}" """ chromap \\ -i \\ @@ -27,10 +27,11 @@ process CHROMAP_INDEX { -t $task.cpus \\ -r $fasta \\ -o ${prefix}.index + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - chromap: \$(echo \$(chromap --version 2>&1)) - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${fasta.baseName}" + """ + touch ${prefix}.index """ } diff --git a/modules/nf-core/chromap/index/meta.yml b/modules/nf-core/chromap/index/meta.yml index 39c5459b..84c39705 100644 --- a/modules/nf-core/chromap/index/meta.yml +++ b/modules/nf-core/chromap/index/meta.yml @@ -11,34 +11,57 @@ tools: homepage: https://github.com/haowenz/chromap documentation: https://github.com/haowenz/chromap tool_dev_url: https://github.com/haowenz/chromap - - licence: ["GPL v3"] - + licence: + - "GPL v3" + identifier: "" input: - - meta: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'test' ] - - fasta: - type: file - description: Fasta reference file. - + - - meta: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test' ] + - fasta: + type: file + description: Reference genome FASTA file + pattern: "*.{fa,fasta,fna}" + ontologies: + - edam: "http://edamontology.org/format_1929" output: - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - meta: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'test' ] - - index: - type: file - description: Index file of the reference genome - pattern: "*.{index}" - + index: + - - meta: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test' ] + - "*.index": + type: file + description: Index file of the reference genome + pattern: "*.{index}" + ontologies: [] + versions_chromap: + - - ${task.process}: + type: string + description: The name of the process + - chromap: + type: string + description: The name of the tool + - chromap --version 2>&1: + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - chromap: + type: string + description: The name of the tool + - chromap --version 2>&1: + type: eval + description: The expression to obtain the version of the tool authors: - "@mahesh-panchal" - "@joseespinosa" +maintainers: + - "@mahesh-panchal" + - "@joseespinosa" diff --git a/modules/nf-core/chromap/index/tests/main.nf.test b/modules/nf-core/chromap/index/tests/main.nf.test new file mode 100644 index 00000000..c173d3e8 --- /dev/null +++ b/modules/nf-core/chromap/index/tests/main.nf.test @@ -0,0 +1,58 @@ +nextflow_process { + + name "Test Process CHROMAP_INDEX" + script "../main.nf" + process "CHROMAP_INDEX" + + tag "modules" + tag "modules_nfcore" + tag "chromap" + tag "chromap/index" + + test("sarscov2 - fasta") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.index[0][1]).name, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match()} + ) + } + } + + test("sarscov2 - fasta - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } +} diff --git a/modules/nf-core/chromap/index/tests/main.nf.test.snap b/modules/nf-core/chromap/index/tests/main.nf.test.snap new file mode 100644 index 00000000..fc0d8b63 --- /dev/null +++ b/modules/nf-core/chromap/index/tests/main.nf.test.snap @@ -0,0 +1,47 @@ +{ + "sarscov2 - fasta - stub": { + "content": [ + { + "index": [ + [ + { + "id": "test" + }, + "genome.index:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_chromap": [ + [ + "CHROMAP_INDEX", + "chromap", + "0.3.2-r518" + ] + ] + } + ], + "timestamp": "2026-04-01T22:06:50.82213", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 - fasta": { + "content": [ + "genome.index", + { + "versions_chromap": [ + [ + "CHROMAP_INDEX", + "chromap", + "0.3.2-r518" + ] + ] + } + ], + "timestamp": "2026-03-31T23:38:19.664926", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf deleted file mode 100644 index ebc87273..00000000 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ /dev/null @@ -1,24 +0,0 @@ -process CUSTOM_DUMPSOFTWAREVERSIONS { - label 'process_single' - - // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.14" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'biocontainers/multiqc:1.14--pyhdfd78af_0' }" - - input: - path versions - - output: - path "software_versions.yml" , emit: yml - path "software_versions_mqc.yml", emit: mqc_yml - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - template 'dumpsoftwareversions.py' -} diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml deleted file mode 100644 index c32657de..00000000 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ /dev/null @@ -1,36 +0,0 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json -name: custom_dumpsoftwareversions -description: Custom module used to dump software versions within the nf-core pipeline template -keywords: - - custom - - dump - - version -tools: - - custom: - description: Custom module used to dump software versions within the nf-core pipeline template - homepage: https://github.com/nf-core/tools - documentation: https://github.com/nf-core/tools - licence: ["MIT"] -input: - - versions: - type: file - description: YML file containing software versions - pattern: "*.yml" - -output: - - yml: - type: file - description: Standard YML file containing software versions - pattern: "software_versions.yml" - - mqc_yml: - type: file - description: MultiQC custom content YML file containing software versions - pattern: "software_versions_mqc.yml" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@drpatelh" - - "@grst" diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py deleted file mode 100755 index da033408..00000000 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python - - -"""Provide functions to merge multiple versions.yml files.""" - - -import yaml -import platform -from textwrap import dedent - - -def _make_versions_html(versions): - """Generate a tabular HTML output of all versions for MultiQC.""" - html = [ - dedent( - """\\ - - - - - - - - - - """ - ) - ] - for process, tmp_versions in sorted(versions.items()): - html.append("") - for i, (tool, version) in enumerate(sorted(tmp_versions.items())): - html.append( - dedent( - f"""\\ - - - - - - """ - ) - ) - html.append("") - html.append("
    Process Name Software Version
    {process if (i == 0) else ''}{tool}{version}
    ") - return "\\n".join(html) - - -def main(): - """Load all version files and generate merged output.""" - versions_this_module = {} - versions_this_module["${task.process}"] = { - "python": platform.python_version(), - "yaml": yaml.__version__, - } - - with open("$versions") as f: - versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module - - # aggregate versions by the module name (derived from fully-qualified process name) - versions_by_module = {} - for process, process_versions in versions_by_process.items(): - module = process.split(":")[-1] - try: - if versions_by_module[module] != process_versions: - raise AssertionError( - "We assume that software versions are the same between all modules. " - "If you see this error-message it means you discovered an edge-case " - "and should open an issue in nf-core/tools. " - ) - except KeyError: - versions_by_module[module] = process_versions - - versions_by_module["Workflow"] = { - "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version", - } - - versions_mqc = { - "id": "software_versions", - "section_name": "${workflow.manifest.name} Software Versions", - "section_href": "https://github.com/${workflow.manifest.name}", - "plot_type": "html", - "description": "are collected at run time from the software output.", - "data": _make_versions_html(versions_by_module), - } - - with open("software_versions.yml", "w") as f: - yaml.dump(versions_by_module, f, default_flow_style=False) - with open("software_versions_mqc.yml", "w") as f: - yaml.dump(versions_mqc, f, default_flow_style=False) - - with open("versions.yml", "w") as f: - yaml.dump(versions_this_module, f, default_flow_style=False) - - -if __name__ == "__main__": - main() diff --git a/modules/nf-core/custom/getchromsizes/main.nf b/modules/nf-core/custom/getchromsizes/main.nf deleted file mode 100644 index 060a2e88..00000000 --- a/modules/nf-core/custom/getchromsizes/main.nf +++ /dev/null @@ -1,44 +0,0 @@ -process CUSTOM_GETCHROMSIZES { - tag "$fasta" - label 'process_single' - - conda "bioconda::samtools=1.16.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : - 'biocontainers/samtools:1.16.1--h6899075_1' }" - - input: - tuple val(meta), path(fasta) - - output: - tuple val(meta), path ("*.sizes"), emit: sizes - tuple val(meta), path ("*.fai") , emit: fai - tuple val(meta), path ("*.gzi") , emit: gzi, optional: true - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - """ - samtools faidx $fasta - cut -f 1,2 ${fasta}.fai > ${fasta}.sizes - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - getchromsizes: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ - - stub: - """ - touch ${fasta}.fai - touch ${fasta}.sizes - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - getchromsizes: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/custom/getchromsizes/meta.yml b/modules/nf-core/custom/getchromsizes/meta.yml deleted file mode 100644 index 219ca1d8..00000000 --- a/modules/nf-core/custom/getchromsizes/meta.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: custom_getchromsizes -description: Generates a FASTA file of chromosome sizes and a fasta index file -keywords: - - fasta - - chromosome - - indexing -tools: - - samtools: - description: Tools for dealing with SAM, BAM and CRAM files - homepage: http://www.htslib.org/ - documentation: http://www.htslib.org/doc/samtools.html - tool_dev_url: https://github.com/samtools/samtools - doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - fasta: - type: file - description: FASTA file - pattern: "*.{fa,fasta,fna,fas}" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - sizes: - type: file - description: File containing chromosome lengths - pattern: "*.{sizes}" - - fai: - type: file - description: FASTA index file - pattern: "*.{fai}" - - gzi: - type: file - description: Optional gzip index file for compressed inputs - pattern: "*.gzi" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@tamara-hodgetts" - - "@chris-cheshire" - - "@muffato" diff --git a/modules/nf-core/deeptools/alignmentsieve/environment.yml b/modules/nf-core/deeptools/alignmentsieve/environment.yml new file mode 100644 index 00000000..c2d2fb3a --- /dev/null +++ b/modules/nf-core/deeptools/alignmentsieve/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::deeptools=3.5.6 + - bioconda::samtools=1.20 diff --git a/modules/nf-core/deeptools/alignmentsieve/main.nf b/modules/nf-core/deeptools/alignmentsieve/main.nf new file mode 100644 index 00000000..e536f29d --- /dev/null +++ b/modules/nf-core/deeptools/alignmentsieve/main.nf @@ -0,0 +1,40 @@ +process DEEPTOOLS_ALIGNMENTSIEVE { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-eb9e7907c7a753917c1e4d7a64384c047429618a:28424fe3aec58d2b3e4e4390025d886207657d25-0': + 'quay.io/biocontainers/mulled-v2-eb9e7907c7a753917c1e4d7a64384c047429618a:28424fe3aec58d2b3e4e4390025d886207657d25-0' }" + + input: + tuple val(meta), path(input), path(input_index) + + output: + tuple val(meta), path("*_as.bam") , emit: bam + tuple val("${task.process}"), val('deeptools'), eval('alignmentSieve --version | sed "s/alignmentSieve //g"') , emit: versions_deeptools, topic: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'") , emit: versions_samtools, topic: versions + path "*_log.txt" , emit: logs + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + alignmentSieve \\ + $args \\ + -b $input \\ + -o ${prefix}_as.bam \\ + --filterMetrics ${prefix}_log.txt \\ + --numberOfProcessors $task.cpus + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_as.bam + touch ${prefix}_log.txt + """ +} diff --git a/modules/nf-core/deeptools/alignmentsieve/meta.yml b/modules/nf-core/deeptools/alignmentsieve/meta.yml new file mode 100644 index 00000000..0defa878 --- /dev/null +++ b/modules/nf-core/deeptools/alignmentsieve/meta.yml @@ -0,0 +1,97 @@ +name: deeptools_alignmentSieve +description: This tool filters alignments in a BAM/CRAM file according the the + specified parameters. +keywords: + - ATACseq + - filter + - shift + - ATACshift +tools: + - deeptools: + description: A set of user-friendly tools for normalization and + visualization of deep-sequencing data + homepage: https://deeptools.readthedocs.io/en/develop/content/tools/alignmentSieve.html + documentation: https://deeptools.readthedocs.io/en/develop/content/tools/alignmentSieve.html + tool_dev_url: https://github.com/deeptools/deepTools/ + doi: "10.1093/nar/gkw257" + licence: + - "GPL v3" + identifier: biotools:deeptools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM file + pattern: "*.{bam}" + ontologies: [] + - input_index: + type: file + description: BAM index file + pattern: "*.{bai}" + ontologies: [] +output: + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*_as.bam": + type: file + description: BAM file + pattern: "*.bam" + ontologies: [] + logs: + - "*_log.txt": + type: file + description: TXT file + pattern: "*.txt" + ontologies: [] + versions_deeptools: + - - ${task.process}: + type: string + description: The name of the process + - deeptools: + type: string + description: The name of the tool + - alignmentSieve --version | sed "s/alignmentSieve //g": + type: eval + description: The expression to obtain the version of the tool + versions_samtools: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - deeptools: + type: string + description: The name of the tool + - alignmentSieve --version | sed "s/alignmentSieve //g": + type: eval + description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool +authors: + - "@lpantano" +maintainers: + - "@lpantano" diff --git a/modules/nf-core/deeptools/alignmentsieve/tests/main.nf.test b/modules/nf-core/deeptools/alignmentsieve/tests/main.nf.test new file mode 100644 index 00000000..ee882ddb --- /dev/null +++ b/modules/nf-core/deeptools/alignmentsieve/tests/main.nf.test @@ -0,0 +1,60 @@ +nextflow_process { + + name "Test Process DEEPTOOLS_ALIGNMENTSIEVE" + script "../main.nf" + process "DEEPTOOLS_ALIGNMENTSIEVE" + + tag "modules" + tag "modules_nfcore" + tag "deeptools" + tag "deeptools/alignmentsieve" + + test("homo_sampiens - bam") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.logs, + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.findAll { key, val -> key.startsWith('version') }) + .match() + } + ) + } + } + test("homo_sampiens - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/deeptools/alignmentsieve/tests/main.nf.test.snap b/modules/nf-core/deeptools/alignmentsieve/tests/main.nf.test.snap new file mode 100644 index 00000000..d24f85b8 --- /dev/null +++ b/modules/nf-core/deeptools/alignmentsieve/tests/main.nf.test.snap @@ -0,0 +1,94 @@ +{ + "homo_sampiens - bam": { + "content": [ + [ + "test_log.txt:md5,39f97a6a2ff83330d5c93411113df63a" + ], + "463ac3b905fbf4ddf113a94dbfa8d69f", + { + "versions_deeptools": [ + [ + "DEEPTOOLS_ALIGNMENTSIEVE", + "deeptools", + "3.5.6" + ] + ], + "versions_samtools": [ + [ + "DEEPTOOLS_ALIGNMENTSIEVE", + "samtools", + "1.20" + ] + ] + } + ], + "timestamp": "2026-02-17T08:51:37.051958", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "homo_sampiens - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test_as.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + "DEEPTOOLS_ALIGNMENTSIEVE", + "deeptools", + "3.5.6" + ] + ], + "2": [ + [ + "DEEPTOOLS_ALIGNMENTSIEVE", + "samtools", + "1.20" + ] + ], + "3": [ + "test_log.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test_as.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "logs": [ + "test_log.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "versions_deeptools": [ + [ + "DEEPTOOLS_ALIGNMENTSIEVE", + "deeptools", + "3.5.6" + ] + ], + "versions_samtools": [ + [ + "DEEPTOOLS_ALIGNMENTSIEVE", + "samtools", + "1.20" + ] + ] + } + ], + "timestamp": "2026-02-17T08:51:46.655621", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/deeptools/computematrix/environment.yml b/modules/nf-core/deeptools/computematrix/environment.yml new file mode 100644 index 00000000..9d079059 --- /dev/null +++ b/modules/nf-core/deeptools/computematrix/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::deeptools=3.5.6 diff --git a/modules/nf-core/deeptools/computematrix/main.nf b/modules/nf-core/deeptools/computematrix/main.nf index e77e2839..6007c793 100644 --- a/modules/nf-core/deeptools/computematrix/main.nf +++ b/modules/nf-core/deeptools/computematrix/main.nf @@ -2,10 +2,10 @@ process DEEPTOOLS_COMPUTEMATRIX { tag "$meta.id" label 'process_high' - conda "bioconda::deeptools=3.5.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/deeptools:3.5.1--py_0' : - 'biocontainers/deeptools:3.5.1--py_0' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/deeptools:3.5.6--pyhdfd78af_0': + 'quay.io/biocontainers/deeptools:3.5.6--pyhdfd78af_0' }" input: tuple val(meta), path(bigwig) @@ -14,7 +14,7 @@ process DEEPTOOLS_COMPUTEMATRIX { output: tuple val(meta), path("*.mat.gz") , emit: matrix tuple val(meta), path("*.mat.tab"), emit: table - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('deeptools'), eval('computeMatrix --version | sed "s/computeMatrix //g"') , emit: versions_deeptools, topic: versions when: task.ext.when == null || task.ext.when @@ -30,10 +30,12 @@ process DEEPTOOLS_COMPUTEMATRIX { --outFileName ${prefix}.computeMatrix.mat.gz \\ --outFileNameMatrix ${prefix}.computeMatrix.vals.mat.tab \\ --numberOfProcessors $task.cpus + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - deeptools: \$(computeMatrix --version | sed -e "s/computeMatrix //g") - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | gzip > ${prefix}.computeMatrix.mat.gz + touch ${prefix}.computeMatrix.vals.mat.tab """ } diff --git a/modules/nf-core/deeptools/computematrix/meta.yml b/modules/nf-core/deeptools/computematrix/meta.yml index 8a148f5d..1b6fe9c4 100644 --- a/modules/nf-core/deeptools/computematrix/meta.yml +++ b/modules/nf-core/deeptools/computematrix/meta.yml @@ -1,5 +1,6 @@ name: deeptools_computematrix -description: calculates scores per genome regions for other deeptools plotting utilities +description: calculates scores per genome regions for other deeptools plotting + utilities keywords: - genome - regions @@ -7,51 +8,84 @@ keywords: - matrix tools: - deeptools: - description: A set of user-friendly tools for normalization and visualization of deep-sequencing data + description: A set of user-friendly tools for normalization and + visualization of deep-sequencing data documentation: https://deeptools.readthedocs.io/en/develop/index.html tool_dev_url: https://github.com/deeptools/deepTools doi: "10.1093/nar/gku365" - licence: ["GPL v3"] - + licence: + - "GPL v3" + identifier: biotools:deeptools input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test' ] - - bigwig: - type: file - description: bigwig file containing genomic scores - pattern: "*.{bw,bigwig}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - bigwig: + type: file + description: bigwig file containing genomic scores + pattern: "*.{bw,bigwig}" + ontologies: [] - bed: type: file description: bed file containing genomic regions pattern: "*.{bed}" - + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - matrix: - type: file - description: | - gzipped matrix file needed by the plotHeatmap and plotProfile - deeptools utilities - pattern: "*.{computeMatrix.mat.gz}" - - table: - type: file - description: | - tabular file containing the scores of the generated matrix - pattern: "*.{computeMatrix.vals.mat.tab}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - + matrix: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.mat.gz": + type: file + description: | + gzipped matrix file needed by the plotHeatmap and plotProfile + deeptools utilities + pattern: "*.{computeMatrix.mat.gz}" + ontologies: [] + table: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.mat.tab": + type: file + description: | + tabular file containing the scores of the generated matrix + pattern: "*.{computeMatrix.vals.mat.tab}" + ontologies: [] + versions_deeptools: + - - ${task.process}: + type: string + description: The name of the process + - deeptools: + type: string + description: The name of the tool + - computeMatrix --version | sed "s/computeMatrix //g": + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - deeptools: + type: string + description: The name of the tool + - computeMatrix --version | sed "s/computeMatrix //g": + type: eval + description: The expression to obtain the version of the tool authors: - "@jeremy1805" - - "@emiller88" + - "@edmundmiller" + - "@drpatelh" + - "@joseespinosa" +maintainers: + - "@jeremy1805" + - "@edmundmiller" - "@drpatelh" - "@joseespinosa" diff --git a/modules/nf-core/deeptools/computematrix/tests/main.nf.test b/modules/nf-core/deeptools/computematrix/tests/main.nf.test new file mode 100644 index 00000000..1a34a853 --- /dev/null +++ b/modules/nf-core/deeptools/computematrix/tests/main.nf.test @@ -0,0 +1,67 @@ +nextflow_process { + + name "Test Process DEEPTOOLS_COMPUTEMATRIX" + script "../main.nf" + process "DEEPTOOLS_COMPUTEMATRIX" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "deeptools" + tag "deeptools/computematrix" + + test("sarscov2 - bigwig - bed") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina//bigwig/test.bigwig', checkIfExists: true) + ] + input[1] = [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.matrix.get(0).get(1)).name, + process.out.table, + process.out.findAll { key, val -> key.startsWith('version') }) + .match() + } + ) + } + + } + + test("sarscov2 - mat - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina//bigwig/test.bigwig', checkIfExists: true) + ] + input[1] = [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/deeptools/computematrix/tests/main.nf.test.snap b/modules/nf-core/deeptools/computematrix/tests/main.nf.test.snap new file mode 100644 index 00000000..c1d7b27c --- /dev/null +++ b/modules/nf-core/deeptools/computematrix/tests/main.nf.test.snap @@ -0,0 +1,86 @@ +{ + "sarscov2 - mat - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.computeMatrix.mat.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.computeMatrix.vals.mat.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "DEEPTOOLS_COMPUTEMATRIX", + "deeptools", + "3.5.6" + ] + ], + "matrix": [ + [ + { + "id": "test" + }, + "test.computeMatrix.mat.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "table": [ + [ + { + "id": "test" + }, + "test.computeMatrix.vals.mat.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_deeptools": [ + [ + "DEEPTOOLS_COMPUTEMATRIX", + "deeptools", + "3.5.6" + ] + ] + } + ], + "timestamp": "2026-02-17T09:15:39.755493", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 - bigwig - bed": { + "content": [ + "test.computeMatrix.mat.gz", + [ + [ + { + "id": "test" + }, + "test.computeMatrix.vals.mat.tab:md5,19e22051cc44edb7db3e0f8345330d90" + ] + ], + { + "versions_deeptools": [ + [ + "DEEPTOOLS_COMPUTEMATRIX", + "deeptools", + "3.5.6" + ] + ] + } + ], + "timestamp": "2026-02-17T09:15:32.56899", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/deeptools/computematrix/tests/nextflow.config b/modules/nf-core/deeptools/computematrix/tests/nextflow.config new file mode 100644 index 00000000..4b12c391 --- /dev/null +++ b/modules/nf-core/deeptools/computematrix/tests/nextflow.config @@ -0,0 +1,7 @@ +process { + + withName: DEEPTOOLS_COMPUTEMATRIX { + ext.args = 'scale-regions -b 1000' + } + +} diff --git a/modules/nf-core/deeptools/plotfingerprint/environment.yml b/modules/nf-core/deeptools/plotfingerprint/environment.yml new file mode 100644 index 00000000..9d079059 --- /dev/null +++ b/modules/nf-core/deeptools/plotfingerprint/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::deeptools=3.5.6 diff --git a/modules/nf-core/deeptools/plotfingerprint/main.nf b/modules/nf-core/deeptools/plotfingerprint/main.nf index 3159e941..b89bee1b 100644 --- a/modules/nf-core/deeptools/plotfingerprint/main.nf +++ b/modules/nf-core/deeptools/plotfingerprint/main.nf @@ -2,10 +2,10 @@ process DEEPTOOLS_PLOTFINGERPRINT { tag "$meta.id" label 'process_high' - conda "bioconda::deeptools=3.5.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/deeptools:3.5.1--py_0' : - 'biocontainers/deeptools:3.5.1--py_0' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/deeptools:3.5.6--pyhdfd78af_0': + 'quay.io/biocontainers/deeptools:3.5.6--pyhdfd78af_0' }" input: tuple val(meta), path(bams), path(bais) @@ -14,7 +14,7 @@ process DEEPTOOLS_PLOTFINGERPRINT { tuple val(meta), path("*.pdf") , emit: pdf tuple val(meta), path("*.raw.txt") , emit: matrix tuple val(meta), path("*.qcmetrics.txt"), emit: metrics - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('deeptools'), eval('plotFingerprint --version | sed "s/plotFingerprint //g"') , emit: versions_deeptools, topic: versions when: task.ext.when == null || task.ext.when @@ -32,10 +32,13 @@ process DEEPTOOLS_PLOTFINGERPRINT { --outRawCounts ${prefix}.plotFingerprint.raw.txt \\ --outQualityMetrics ${prefix}.plotFingerprint.qcmetrics.txt \\ --numberOfProcessors $task.cpus + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - deeptools: \$(plotFingerprint --version | sed -e "s/plotFingerprint //g") - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.plotFingerprint.pdf + touch ${prefix}.plotFingerprint.raw.txt + touch ${prefix}.plotFingerprint.qcmetrics.txt """ } diff --git a/modules/nf-core/deeptools/plotfingerprint/meta.yml b/modules/nf-core/deeptools/plotfingerprint/meta.yml index 29ddf893..6ee24c3d 100644 --- a/modules/nf-core/deeptools/plotfingerprint/meta.yml +++ b/modules/nf-core/deeptools/plotfingerprint/meta.yml @@ -7,54 +7,93 @@ keywords: - bam tools: - deeptools: - description: A set of user-friendly tools for normalization and visualization of deep-sequencing data + description: A set of user-friendly tools for normalization and + visualization of deep-sequencing data documentation: https://deeptools.readthedocs.io/en/develop/index.html tool_dev_url: https://github.com/deeptools/deepTools doi: "10.1093/nar/gku365" - licence: ["GPL v3"] - + licence: + - "GPL v3" + identifier: biotools:deeptools input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test' ] - - bam: - type: file - description: One or more BAM files - pattern: "*.{bam}" - - bais: - type: file - description: Corresponding BAM file indexes - pattern: "*.bam.bai" - + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - bams: + type: file + description: BAM files + pattern: "*.bam" + ontologies: [] + - bais: + type: file + description: Corresponding BAM file indexes + pattern: "*.bam.bai" + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - pdf: - type: file - description: | - Output figure containing resulting plot - pattern: "*.{plotFingerprint.pdf}" - - matrix: - type: file - description: | - Output file summarizing the read counts per bin - pattern: "*.{plotFingerprint.raw.txt}" - - metrics: - type: file - description: | - file containing BAM file quality metrics - pattern: "*.{qcmetrics.txt}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - + pdf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.pdf": + type: file + description: | + Output figure containing resulting plot + pattern: "*.{plotFingerprint.pdf}" + ontologies: [] + matrix: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.raw.txt": + type: file + description: | + Output file summarizing the read counts per bin + pattern: "*.{plotFingerprint.raw.txt}" + ontologies: [] + metrics: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.qcmetrics.txt": + type: file + description: | + file containing BAM file quality metrics + pattern: "*.{qcmetrics.txt}" + ontologies: [] + versions_deeptools: + - - ${task.process}: + type: string + description: The name of the process + - deeptools: + type: string + description: The name of the tool + - plotFingerprint --version | sed "s/plotFingerprint //g": + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - deeptools: + type: string + description: The name of the tool + - plotFingerprint --version | sed "s/plotFingerprint //g": + type: eval + description: The expression to obtain the version of the tool authors: - - "@emiller88" + - "@edmundmiller" + - "@drpatelh" + - "@joseespinosa" +maintainers: + - "@edmundmiller" - "@drpatelh" - "@joseespinosa" diff --git a/modules/nf-core/deeptools/plotfingerprint/tests/main.nf.test b/modules/nf-core/deeptools/plotfingerprint/tests/main.nf.test new file mode 100644 index 00000000..5c4edadf --- /dev/null +++ b/modules/nf-core/deeptools/plotfingerprint/tests/main.nf.test @@ -0,0 +1,62 @@ +nextflow_process { + + name "Test Process DEEPTOOLS_PLOTFINGERPRINT" + script "../main.nf" + process "DEEPTOOLS_PLOTFINGERPRINT" + + tag "modules" + tag "modules_nfcore" + tag "deeptools" + tag "deeptools/plotfingerprint" + + test("homo_sampiens - bam") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.pdf.get(0).get(1)).name, + file(process.out.matrix.get(0).get(1)).name, + process.out.metrics.collect { file(it[1]).readLines().contains("0.24184576629880325") }, + process.out.findAll { key, val -> key.startsWith('version') }) + .match() + } + ) + } + } + + test("homo_sampiens - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/deeptools/plotfingerprint/tests/main.nf.test.snap b/modules/nf-core/deeptools/plotfingerprint/tests/main.nf.test.snap new file mode 100644 index 00000000..1f7bb383 --- /dev/null +++ b/modules/nf-core/deeptools/plotfingerprint/tests/main.nf.test.snap @@ -0,0 +1,104 @@ +{ + "homo_sampiens - bam": { + "content": [ + "test.plotFingerprint.pdf", + "test.plotFingerprint.raw.txt", + [ + false + ], + { + "versions_deeptools": [ + [ + "DEEPTOOLS_PLOTFINGERPRINT", + "deeptools", + "3.5.6" + ] + ] + } + ], + "timestamp": "2026-02-17T09:51:08.91017", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "homo_sampiens - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotFingerprint.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotFingerprint.raw.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotFingerprint.qcmetrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + "DEEPTOOLS_PLOTFINGERPRINT", + "deeptools", + "3.5.6" + ] + ], + "matrix": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotFingerprint.raw.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotFingerprint.qcmetrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotFingerprint.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_deeptools": [ + [ + "DEEPTOOLS_PLOTFINGERPRINT", + "deeptools", + "3.5.6" + ] + ] + } + ], + "timestamp": "2026-02-17T09:42:56.510167", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/deeptools/plotheatmap/environment.yml b/modules/nf-core/deeptools/plotheatmap/environment.yml new file mode 100644 index 00000000..9d079059 --- /dev/null +++ b/modules/nf-core/deeptools/plotheatmap/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::deeptools=3.5.6 diff --git a/modules/nf-core/deeptools/plotheatmap/main.nf b/modules/nf-core/deeptools/plotheatmap/main.nf index 58309eea..21b53523 100644 --- a/modules/nf-core/deeptools/plotheatmap/main.nf +++ b/modules/nf-core/deeptools/plotheatmap/main.nf @@ -2,10 +2,10 @@ process DEEPTOOLS_PLOTHEATMAP { tag "$meta.id" label 'process_low' - conda "bioconda::deeptools=3.5.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/deeptools:3.5.1--py_0' : - 'biocontainers/deeptools:3.5.1--py_0' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/deeptools:3.5.6--pyhdfd78af_0': + 'quay.io/biocontainers/deeptools:3.5.6--pyhdfd78af_0' }" input: tuple val(meta), path(matrix) @@ -13,7 +13,7 @@ process DEEPTOOLS_PLOTHEATMAP { output: tuple val(meta), path("*.pdf"), emit: pdf tuple val(meta), path("*.tab"), emit: table - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('deeptools'), eval('plotHeatmap --version | sed "s/plotHeatmap //g"') , emit: versions_deeptools, topic: versions when: task.ext.when == null || task.ext.when @@ -27,10 +27,12 @@ process DEEPTOOLS_PLOTHEATMAP { --matrixFile $matrix \\ --outFileName ${prefix}.plotHeatmap.pdf \\ --outFileNameMatrix ${prefix}.plotHeatmap.mat.tab + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - deeptools: \$(plotHeatmap --version | sed -e "s/plotHeatmap //g") - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.plotHeatmap.pdf + touch ${prefix}.plotHeatmap.mat.tab """ } diff --git a/modules/nf-core/deeptools/plotheatmap/meta.yml b/modules/nf-core/deeptools/plotheatmap/meta.yml index 9296f503..1dd10ad1 100644 --- a/modules/nf-core/deeptools/plotheatmap/meta.yml +++ b/modules/nf-core/deeptools/plotheatmap/meta.yml @@ -7,48 +7,76 @@ keywords: - matrix tools: - deeptools: - description: A set of user-friendly tools for normalization and visualization of deep-sequencing data + description: A set of user-friendly tools for normalization and + visualization of deep-sequencing data documentation: https://deeptools.readthedocs.io/en/develop/index.html tool_dev_url: https://github.com/deeptools/deepTools doi: "10.1093/nar/gku365" - licence: ["GPL v3"] - + licence: + - "GPL v3" + identifier: biotools:deeptools input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test' ] - - matrix: - type: file - description: | - gzipped matrix file produced by deeptools_ - computematrix deeptools utility - pattern: "*.{mat.gz}" - + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - matrix: + type: file + description: | + gzipped matrix file produced by deeptools_ + computematrix deeptools utility + pattern: "*.{mat.gz}" + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - pdf: - type: file - description: | - Output figure containing resulting plot - pattern: "*.{plotHeatmap.pdf}" - - matrix: - type: file - description: | - File containing the matrix of values - used to generate the heatmap - pattern: "*.{plotHeatmap.mat.tab}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - + pdf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.pdf": + type: file + description: | + Output figure containing resulting plot + pattern: "*.{plotHeatmap.pdf}" + ontologies: [] + table: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.tab": + type: file + description: Output table + ontologies: [] + versions_deeptools: + - - ${task.process}: + type: string + description: The name of the process + - deeptools: + type: string + description: The name of the tool + - plotHeatmap --version | sed "s/plotHeatmap //g": + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - deeptools: + type: string + description: The name of the tool + - plotHeatmap --version | sed "s/plotHeatmap //g": + type: eval + description: The expression to obtain the version of the tool authors: - - "@emiller88" + - "@edmundmiller" + - "@drpatelh" + - "@joseespinosa" +maintainers: + - "@edmundmiller" - "@drpatelh" - "@joseespinosa" diff --git a/modules/nf-core/deeptools/plotheatmap/tests/main.nf.test b/modules/nf-core/deeptools/plotheatmap/tests/main.nf.test new file mode 100644 index 00000000..e03186e2 --- /dev/null +++ b/modules/nf-core/deeptools/plotheatmap/tests/main.nf.test @@ -0,0 +1,60 @@ +nextflow_process { + + name "Test Process DEEPTOOLS_PLOTHEATMAP" + script "../main.nf" + process "DEEPTOOLS_PLOTHEATMAP" + + tag "modules" + tag "modules_nfcore" + tag "deeptools" + tag "deeptools/plotheatmap" + + test("sarscov2 - mat") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/deeptools/test.computeMatrix.mat.gz', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.pdf.get(0).get(1)).name, + file(process.out.table.get(0).get(1)).name, + process.out.findAll { key, val -> key.startsWith('version') }) + .match() + } + ) + } + + } + + test("sarscov2 - mat - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/deeptools/test.computeMatrix.mat.gz', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/deeptools/plotheatmap/tests/main.nf.test.snap b/modules/nf-core/deeptools/plotheatmap/tests/main.nf.test.snap new file mode 100644 index 00000000..726ed4cf --- /dev/null +++ b/modules/nf-core/deeptools/plotheatmap/tests/main.nf.test.snap @@ -0,0 +1,83 @@ +{ + "sarscov2 - mat - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotHeatmap.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotHeatmap.mat.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "DEEPTOOLS_PLOTHEATMAP", + "deeptools", + "3.5.6" + ] + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotHeatmap.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "table": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotHeatmap.mat.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_deeptools": [ + [ + "DEEPTOOLS_PLOTHEATMAP", + "deeptools", + "3.5.6" + ] + ] + } + ], + "timestamp": "2026-02-17T09:56:26.321822", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 - mat": { + "content": [ + "test.plotHeatmap.pdf", + "test.plotHeatmap.mat.tab", + { + "versions_deeptools": [ + [ + "DEEPTOOLS_PLOTHEATMAP", + "deeptools", + "3.5.6" + ] + ] + } + ], + "timestamp": "2026-02-17T09:56:17.569358", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/deeptools/plotprofile/environment.yml b/modules/nf-core/deeptools/plotprofile/environment.yml new file mode 100644 index 00000000..9d079059 --- /dev/null +++ b/modules/nf-core/deeptools/plotprofile/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::deeptools=3.5.6 diff --git a/modules/nf-core/deeptools/plotprofile/main.nf b/modules/nf-core/deeptools/plotprofile/main.nf index b1ab454d..6bd0cbce 100644 --- a/modules/nf-core/deeptools/plotprofile/main.nf +++ b/modules/nf-core/deeptools/plotprofile/main.nf @@ -2,10 +2,10 @@ process DEEPTOOLS_PLOTPROFILE { tag "$meta.id" label 'process_low' - conda "bioconda::deeptools=3.5.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/deeptools:3.5.1--py_0' : - 'biocontainers/deeptools:3.5.1--py_0' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/deeptools:3.5.6--pyhdfd78af_0': + 'quay.io/biocontainers/deeptools:3.5.6--pyhdfd78af_0' }" input: tuple val(meta), path(matrix) @@ -13,7 +13,7 @@ process DEEPTOOLS_PLOTPROFILE { output: tuple val(meta), path("*.pdf"), emit: pdf tuple val(meta), path("*.tab"), emit: table - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('deeptools'), eval('plotProfile --version | sed "s/plotProfile //g"') , emit: versions_deeptools, topic: versions when: task.ext.when == null || task.ext.when @@ -27,10 +27,12 @@ process DEEPTOOLS_PLOTPROFILE { --matrixFile $matrix \\ --outFileName ${prefix}.plotProfile.pdf \\ --outFileNameData ${prefix}.plotProfile.tab + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - deeptools: \$(plotProfile --version | sed -e "s/plotProfile //g") - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.plotProfile.pdf + touch ${prefix}.plotProfile.tab """ } diff --git a/modules/nf-core/deeptools/plotprofile/meta.yml b/modules/nf-core/deeptools/plotprofile/meta.yml index 44612ea9..d0ad0a33 100644 --- a/modules/nf-core/deeptools/plotprofile/meta.yml +++ b/modules/nf-core/deeptools/plotprofile/meta.yml @@ -7,48 +7,78 @@ keywords: - matrix tools: - deeptools: - description: A set of user-friendly tools for normalization and visualization of deep-sequencing data + description: A set of user-friendly tools for normalization and + visualization of deep-sequencing data documentation: https://deeptools.readthedocs.io/en/develop/index.html tool_dev_url: https://github.com/deeptools/deepTools doi: "10.1093/nar/gku365" - licence: ["GPL v3"] - + licence: + - "GPL v3" + identifier: biotools:deeptools input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test' ] - - matrix: - type: file - description: | - gzipped matrix file produced by deeptools_ - computematrix deeptools utility - pattern: "*.{mat.gz}" - + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - matrix: + type: file + description: | + gzipped matrix file produced by deeptools_ + computematrix deeptools utility + pattern: "*.{mat.gz}" + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - pdf: - type: file - description: | - Output figure containing resulting plot - pattern: "*.{plotProfile.pdf}" - - matrix: - type: file - description: | - File containing the matrix of values - used to generate the profile - pattern: "*.{plotProfile.mat.tab}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - + pdf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.pdf": + type: file + description: | + Output figure containing resulting plot + pattern: "*.{plotProfile.pdf}" + ontologies: [] + table: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.tab": + type: file + description: Output table + pattern: "*.tab" + ontologies: + - edam: http://edamontology.org/format_3475 + versions_deeptools: + - - ${task.process}: + type: string + description: The name of the process + - deeptools: + type: string + description: The name of the tool + - plotProfile --version | sed "s/plotProfile //g": + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - deeptools: + type: string + description: The name of the tool + - plotProfile --version | sed "s/plotProfile //g": + type: eval + description: The expression to obtain the version of the tool authors: - - "@emiller88" + - "@edmundmiller" + - "@drpatelh" + - "@joseespinosa" +maintainers: + - "@edmundmiller" - "@drpatelh" - "@joseespinosa" diff --git a/modules/nf-core/deeptools/plotprofile/tests/main.nf.test b/modules/nf-core/deeptools/plotprofile/tests/main.nf.test new file mode 100644 index 00000000..58556a0e --- /dev/null +++ b/modules/nf-core/deeptools/plotprofile/tests/main.nf.test @@ -0,0 +1,60 @@ +nextflow_process { + + name "Test Process DEEPTOOLS_PLOTPROFILE" + script "../main.nf" + process "DEEPTOOLS_PLOTPROFILE" + + tag "modules" + tag "modules_nfcore" + tag "deeptools" + tag "deeptools/plotprofile" + + test("sarscov2 - mat") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/deeptools/test.computeMatrix.mat.gz', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.pdf.get(0).get(1)).name, + file(process.out.table.get(0).get(1)).name, + process.out.findAll { key, val -> key.startsWith('version') }) + .match() + } + ) + } + + } + + test("sarscov2 - mat - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/deeptools/test.computeMatrix.mat.gz', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/deeptools/plotprofile/tests/main.nf.test.snap b/modules/nf-core/deeptools/plotprofile/tests/main.nf.test.snap new file mode 100644 index 00000000..b09bb5e8 --- /dev/null +++ b/modules/nf-core/deeptools/plotprofile/tests/main.nf.test.snap @@ -0,0 +1,83 @@ +{ + "sarscov2 - mat - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotProfile.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotProfile.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "DEEPTOOLS_PLOTPROFILE", + "deeptools", + "3.5.6" + ] + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotProfile.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "table": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotProfile.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_deeptools": [ + [ + "DEEPTOOLS_PLOTPROFILE", + "deeptools", + "3.5.6" + ] + ] + } + ], + "timestamp": "2026-02-17T10:12:42.249884", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 - mat": { + "content": [ + "test.plotProfile.pdf", + "test.plotProfile.tab", + { + "versions_deeptools": [ + [ + "DEEPTOOLS_PLOTPROFILE", + "deeptools", + "3.5.6" + ] + ] + } + ], + "timestamp": "2026-02-17T10:12:32.770162", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt b/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt new file mode 100644 index 00000000..7770ccd5 --- /dev/null +++ b/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt @@ -0,0 +1,822 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-64: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.2-ha668962_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 +md5: a9f577daf3de00bca7c3c76c0ecbd1de +depends: +- __glibc >=2.17,<3.0.a0 +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28948 +timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda +sha256: d88aa7ae766cf584e180996e92fef2aa7d8e0a0a5ab1d4d49c32390c1b5fff31 +md5: dcdc58c15961dbf17a0621312b01f5cb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: LGPL-2.1-or-later +license_family: GPL +size: 584660 +timestamp: 1768327524772 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 +md5: d2ffd7602c02f2b316fd921d39876885 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 260182 +timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc +md5: 4492fd26db29495f0ba23f146cd5638d +depends: +- __unix +license: ISC +size: 147413 +timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda +sha256: 06525fa0c4e4f56e771a3b986d0fdf0f0fc5a3270830ee47e127a5105bde1b9a +md5: bb6c4808bfa69d6f7f6b07e5846ced37 +depends: +- __glibc >=2.17,<3.0.a0 +- fontconfig >=2.15.0,<3.0a0 +- fonts-conda-ecosystem +- icu >=78.1,<79.0a0 +- libexpat >=2.7.3,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libglib >=2.86.3,<3.0a0 +- libpng >=1.6.53,<1.7.0a0 +- libstdcxx >=14 +- libxcb >=1.17.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pixman >=0.46.4,<1.0a0 +- xorg-libice >=1.1.2,<2.0a0 +- xorg-libsm >=1.2.6,<2.0a0 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: LGPL-2.1-only or MPL-1.1 +size: 989514 +timestamp: 1766415934926 +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +sha256: 7cc26225d590540ae95cd24940ff42f2da7479dd4cd22ae9ab9298665d06790c +md5: c9f6a4b12229f7331f79c9a00dd6e240 +depends: +- font-ttf-dejavu-sans-mono +- fontconfig +- openjdk >=8.0.144 +- perl +license: GPL >=3 +size: 11664291 +timestamp: 1677946722445 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c +md5: 867127763fbe935bab59815b6e0b7b5c +depends: +- __glibc >=2.17,<3.0.a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +license: MIT +license_family: MIT +size: 270705 +timestamp: 1771382710863 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 +md5: fee5683a3f04bd15cbd8318b096a27ab +depends: +- fonts-conda-forge +license: BSD-3-Clause +license_family: BSD +size: 3667 +timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda +sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff +md5: 3bf7b9fd5a7136126e0234db4b87c8b6 +depends: +- libgcc-ng >=12 +license: MIT +license_family: MIT +size: 77248 +timestamp: 1712692454246 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda +sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c +md5: 2cd94587f3a401ae05e03a6caf09539d +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: LGPL-2.0-or-later +license_family: LGPL +size: 99596 +timestamp: 1755102025473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda +sha256: 477f2c553f72165020d3c56740ba354be916c2f0b76fd9f535e83d698277d5ec +md5: 14470902326beee192e33719a2e8bb7f +depends: +- __glibc >=2.17,<3.0.a0 +- cairo >=1.18.4,<2.0a0 +- graphite2 >=1.3.14,<2.0a0 +- icu >=78.3,<79.0a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.2 +- libfreetype6 >=2.14.2 +- libgcc >=14 +- libglib >=2.86.4,<3.0a0 +- libstdcxx >=14 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +size: 2384060 +timestamp: 1774276284520 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda +sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a +md5: c80d8a3b84358cb967fa81e7075fbc8a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: MIT +license_family: MIT +size: 12723451 +timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda +sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 +md5: b38117a3c920364aff79f870c984b4a3 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: LGPL-2.1-or-later +size: 134088 +timestamp: 1754905959823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda +sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 +md5: fb53fb07ce46a575c5d004bbc96032c2 +depends: +- __glibc >=2.17,<3.0.a0 +- keyutils >=1.6.3,<2.0a0 +- libedit >=3.1.20250104,<3.2.0a0 +- libedit >=3.1.20250104,<4.0a0 +- libgcc >=14 +- libstdcxx >=14 +- openssl >=3.5.5,<4.0a0 +license: MIT +license_family: MIT +size: 1386730 +timestamp: 1769769569681 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda +sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a +md5: 6f2e2c8f58160147c4d1c6f4c14cbac4 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 249959 +timestamp: 1768184673131 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 +md5: a752488c68f2e7c456bcbd8f16eec275 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 261513 +timestamp: 1773113328888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda +sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c +md5: 49c553b47ff679a6a1e9fc80b9c5a2d4 +depends: +- __glibc >=2.17,<3.0.a0 +- krb5 >=1.22.2,<1.23.0a0 +- libgcc >=14 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +license: Apache-2.0 +license_family: Apache +size: 4518030 +timestamp: 1770902209173 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 +md5: 6c77a605a7a689d17d4819c0f8ac9a00 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 73490 +timestamp: 1761979956660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda +sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 +md5: c277e0a4d549b03ac1e9d6cbbe3d017b +depends: +- ncurses +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- ncurses >=6.5,<7.0a0 +license: BSD-2-Clause +license_family: BSD +size: 134676 +timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda +sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 +md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- expat 2.7.4.* +license: MIT +license_family: MIT +size: 76798 +timestamp: 1771259418166 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 +md5: a360c33a5abe61c07959e449fa1453eb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 58592 +timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 +md5: e289f3d17880e44b633ba911d57a321b +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8049 +timestamp: 1774298163029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d +md5: fb16b4b69e3f1dcfe79d80db8fd0c55d +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 384575 +timestamp: 1774298162622 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda +sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 +md5: 0aa00f03f9e39fb9876085dee11a85d4 +depends: +- __glibc >=2.17,<3.0.a0 +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_18 +- libgomp 15.2.0 he0feb66_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 1041788 +timestamp: 1771378212382 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda +sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 +md5: d5e96b1ed75ca01906b3d2469b4ce493 +depends: +- libgcc 15.2.0 he0feb66_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27526 +timestamp: 1771378224552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda +sha256: a27e44168a1240b15659888ce0d9b938ed4bdb49e9ea68a7c1ff27bcea8b55ce +md5: bb26456332b07f68bf3b7622ed71c0da +depends: +- __glibc >=2.17,<3.0.a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- libiconv >=1.18,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pcre2 >=10.47,<10.48.0a0 +constrains: +- glib 2.86.4 *_1 +license: LGPL-2.1-or-later +size: 4398701 +timestamp: 1771863239578 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda +sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 +md5: 239c5e9546c38a1e884d69effcf4c882 +depends: +- __glibc >=2.17,<3.0.a0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 603262 +timestamp: 1771378117851 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda +sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f +md5: 915f5995e94f60e9a4826e0b0920ee88 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: LGPL-2.1-only +size: 790176 +timestamp: 1754908768807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda +sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 +md5: 8397539e3a0bbd1695584fb4f927485a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 633710 +timestamp: 1762094827865 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda +sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb +md5: c7c83eecbb72d88b940c249af56c8b17 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- xz 5.8.2.* +license: 0BSD +size: 113207 +timestamp: 1768752626120 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda +sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c +md5: 5f13ffc7d30ffec87864e678df9957b4 +depends: +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libzlib >=1.3.1,<2.0a0 +license: zlib-acknowledgement +size: 317669 +timestamp: 1770691470744 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda +sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e +md5: 1b08cd684f34175e4514474793d44bcb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc 15.2.0 he0feb66_18 +constrains: +- libstdcxx-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5852330 +timestamp: 1771378262446 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 +md5: cd5a90476766d53e901500df9215e927 +depends: +- __glibc >=2.17,<3.0.a0 +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 435273 +timestamp: 1762022005702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda +sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee +md5: db409b7c1720428638e7c0d509d3e1b5 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 40311 +timestamp: 1766271528534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b +md5: aea31d2e5b1091feca96fcfe945c3cf9 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 429011 +timestamp: 1752159441324 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa +md5: 92ed62436b625154323d40d5f2f11dd7 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 395888 +timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda +sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c +md5: 5aa797f8787fe7a17d1b0821485b5adc +depends: +- libgcc-ng >=12 +license: LGPL-2.1-or-later +size: 100393 +timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 +md5: d87ff7921124eccd67248aa483c23fec +depends: +- __glibc >=2.17,<3.0.a0 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 63629 +timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda +sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 +md5: 47e340acb35de30501a76c7c799c41d7 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: X11 AND BSD-3-Clause +size: 891641 +timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.2-ha668962_0.conda +sha256: 3825a4c84676a8a5cc23b397a2911e4efa4a805daf2af764153bd904e142ec41 +md5: a41092b0177362dbe5eb2a18501e86c0 +depends: +- xorg-libx11 +- xorg-libxext +- xorg-libxi +- xorg-libxrender +- xorg-libxtst +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- xorg-libxrender >=0.9.12,<0.10.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- giflib >=5.2.2,<5.3.0a0 +- xorg-libxrandr >=1.5.5,<2.0a0 +- harfbuzz >=12.3.2 +- fontconfig >=2.17.1,<3.0a0 +- fonts-conda-ecosystem +- xorg-libxtst >=1.2.5,<2.0a0 +- xorg-libxi >=1.8.2,<2.0a0 +- lcms2 >=2.18,<3.0a0 +- alsa-lib >=1.2.15.3,<1.3.0a0 +- libpng >=1.6.55,<1.7.0a0 +- xorg-libxt >=1.3.1,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- xorg-libxext >=1.3.7,<2.0a0 +- xorg-libx11 >=1.8.13,<2.0a0 +- libcups >=2.3.3,<2.4.0a0 +license: GPL-2.0-or-later WITH Classpath-exception-2.0 +license_family: GPL +size: 122465031 +timestamp: 1771443671180 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda +sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c +md5: f61eb8cd60ff9057122a3d338b99c00f +depends: +- __glibc >=2.17,<3.0.a0 +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3164551 +timestamp: 1769555830639 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda +sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff +md5: 7a3bff861a6583f1889021facefc08b1 +depends: +- __glibc >=2.17,<3.0.a0 +- bzip2 >=1.0.8,<2.0a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 1222481 +timestamp: 1763655398280 +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda +build_number: 7 +sha256: 9ec32b6936b0e37bcb0ed34f22ec3116e75b3c0964f9f50ecea5f58734ed6ce9 +md5: f2cfec9406850991f4e3d960cc9e3321 +depends: +- libgcc-ng >=12 +- libxcrypt >=4.4.36 +license: GPL-1.0-or-later OR Artistic-1.0-Perl +size: 13344463 +timestamp: 1703310653947 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda +sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a +md5: c01af13bdc553d1a8fbfff6e8db075f0 +depends: +- libgcc >=14 +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +license: MIT +license_family: MIT +size: 450960 +timestamp: 1754665235234 +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +sha256: 4ce2e1ee31a6217998f78c31ce7dc0a3e0557d9238b51d49dd20c52d467a126d +md5: f2c23a77b25efcad57d377b34bd84941 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 593603 +timestamp: 1769710381284 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 +md5: b3c17d95b5a10c6e64a21fa17573e70e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: MIT +license_family: MIT +size: 8252 +timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda +sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b +md5: fb901ff28063514abb6046c9ec2c4a45 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: MIT +license_family: MIT +size: 58628 +timestamp: 1734227592886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda +sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250 +md5: 1c74ff8c35dcadf952a16f752ca5aa49 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- libuuid >=2.38.1,<3.0a0 +- xorg-libice >=1.1.2,<2.0a0 +license: MIT +license_family: MIT +size: 27590 +timestamp: 1741896361728 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda +sha256: 516d4060139dbb4de49a4dcdc6317a9353fb39ebd47789c14e6fe52de0deee42 +md5: 861fb6ccbc677bb9a9fb2468430b9c6a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libxcb >=1.17.0,<2.0a0 +license: MIT +license_family: MIT +size: 839652 +timestamp: 1770819209719 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b +md5: b2895afaf55bf96a8c8282a2e47a5de0 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 15321 +timestamp: 1762976464266 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 +md5: 1dafce8548e38671bea82e3f5c6ce22f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 20591 +timestamp: 1762976546182 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda +sha256: 79c60fc6acfd3d713d6340d3b4e296836a0f8c51602327b32794625826bd052f +md5: 34e54f03dfea3e7a2dcf1453a85f1085 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 50326 +timestamp: 1769445253162 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda +sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 +md5: ba231da7fccf9ea1e768caf5c7099b84 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 20071 +timestamp: 1759282564045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda +sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a +md5: 17dcc85db3c7886650b8908b183d6876 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxfixes >=6.0.1,<7.0a0 +license: MIT +license_family: MIT +size: 47179 +timestamp: 1727799254088 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda +sha256: 80ed047a5cb30632c3dc5804c7716131d767089f65877813d4ae855ee5c9d343 +md5: e192019153591938acf7322b6459d36e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: MIT +license_family: MIT +size: 30456 +timestamp: 1769445263457 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda +sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 +md5: 96d57aba173e878a2089d5638016dc5e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +license: MIT +license_family: MIT +size: 33005 +timestamp: 1734229037766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda +sha256: a8afba4a55b7b530eb5c8ad89737d60d60bc151a03fbef7a2182461256953f0e +md5: 279b0de5f6ba95457190a1c459a64e31 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libice >=1.1.1,<2.0a0 +- xorg-libsm >=1.2.4,<2.0a0 +- xorg-libx11 >=1.8.10,<2.0a0 +license: MIT +license_family: MIT +size: 379686 +timestamp: 1731860547604 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda +sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a +md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxi >=1.7.10,<2.0a0 +license: MIT +license_family: MIT +size: 32808 +timestamp: 1727964811275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 +md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 +depends: +- __glibc >=2.17,<3.0.a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 601375 +timestamp: 1764777111296 diff --git a/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt b/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt new file mode 100644 index 00000000..cdc434ca --- /dev/null +++ b/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt @@ -0,0 +1,769 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-aarch64: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.2.1-h1134a53_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.2-h488f50d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.5-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxt-1.3.1-h57736b2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 +md5: 468fd3bb9e1f671d36c2cbc677e56f1d +depends: +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28926 +timestamp: 1770939656741 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda +sha256: ea2233e2db9908c2e5f29d3ca420a546b4583253f4f70abb5494cdd676866d42 +md5: 4a98cbc4ade694520227402ff8880630 +depends: +- libgcc >=14 +license: LGPL-2.1-or-later +license_family: GPL +size: 615729 +timestamp: 1768327548407 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c +md5: 840d8fc0d7b3209be93080bc20e07f2d +depends: +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 192412 +timestamp: 1771350241232 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc +md5: 4492fd26db29495f0ba23f146cd5638d +depends: +- __unix +license: ISC +size: 147413 +timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda +sha256: 675db823f3d6fb6bf747fab3b0170ba99b269a07cf6df1e49fff2f9972be9cd1 +md5: 043c13ed3a18396994be9b4fab6572ad +depends: +- fontconfig >=2.15.0,<3.0a0 +- fonts-conda-ecosystem +- icu >=78.1,<79.0a0 +- libexpat >=2.7.3,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libglib >=2.86.3,<3.0a0 +- libpng >=1.6.53,<1.7.0a0 +- libstdcxx >=14 +- libxcb >=1.17.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pixman >=0.46.4,<1.0a0 +- xorg-libice >=1.1.2,<2.0a0 +- xorg-libsm >=1.2.6,<2.0a0 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: LGPL-2.1-only or MPL-1.1 +size: 927045 +timestamp: 1766416003626 +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +sha256: 7cc26225d590540ae95cd24940ff42f2da7479dd4cd22ae9ab9298665d06790c +md5: c9f6a4b12229f7331f79c9a00dd6e240 +depends: +- font-ttf-dejavu-sans-mono +- fontconfig +- openjdk >=8.0.144 +- perl +license: GPL >=3 +size: 11664291 +timestamp: 1677946722445 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +sha256: 835aff8615dd8d8fff377679710ce81b8a2c47b6404e21a92fb349fda193a15c +md5: 0fed1ff55f4938a65907f3ecf62609db +depends: +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +license: MIT +license_family: MIT +size: 279044 +timestamp: 1771382728182 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 +md5: fee5683a3f04bd15cbd8318b096a27ab +depends: +- fonts-conda-forge +license: BSD-3-Clause +license_family: BSD +size: 3667 +timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda +sha256: a79dc3bd54c4fb1f249942ee2d5b601a76ecf9614774a4cff9af49adfa458db2 +md5: 2f809afaf0ba1ea4135dce158169efac +depends: +- libgcc-ng >=12 +license: MIT +license_family: MIT +size: 82124 +timestamp: 1712692444545 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda +sha256: c9b1781fe329e0b77c5addd741e58600f50bef39321cae75eba72f2f381374b7 +md5: 4aa540e9541cc9d6581ab23ff2043f13 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: LGPL-2.0-or-later +license_family: LGPL +size: 102400 +timestamp: 1755102000043 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.2.1-h1134a53_0.conda +sha256: e22f485fddaaea3ff4b6cae98e0197b9dccd2ed2770337ad6ff38a92afe04e59 +md5: 05d65a2cf410adc331c9ea61f59f1013 +depends: +- cairo >=1.18.4,<2.0a0 +- graphite2 >=1.3.14,<2.0a0 +- icu >=78.3,<79.0a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.2 +- libfreetype6 >=2.14.2 +- libgcc >=14 +- libglib >=2.86.4,<3.0a0 +- libstdcxx >=14 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +size: 2345732 +timestamp: 1774281448329 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda +sha256: 49ba6aed2c6b482bb0ba41078057555d29764299bc947b990708617712ef6406 +md5: 546da38c2fa9efacf203e2ad3f987c59 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: MIT +license_family: MIT +size: 12837286 +timestamp: 1773822650615 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda +sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 +md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 +depends: +- libgcc >=13 +license: LGPL-2.1-or-later +size: 129048 +timestamp: 1754906002667 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda +sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba +md5: d9ca108bd680ea86a963104b6b3e95ca +depends: +- keyutils >=1.6.3,<2.0a0 +- libedit >=3.1.20250104,<3.2.0a0 +- libedit >=3.1.20250104,<4.0a0 +- libgcc >=14 +- libstdcxx >=14 +- openssl >=3.5.5,<4.0a0 +license: MIT +license_family: MIT +size: 1517436 +timestamp: 1769773395215 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda +sha256: 379ef5e91a587137391a6149755d0e929f1a007d2dcb211318ac670a46c8596f +md5: bb960f01525b5e001608afef9d47b79c +depends: +- libgcc >=14 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 293039 +timestamp: 1768184778398 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +sha256: 8957fd460c1c132c8031f65fd5f56ec3807fd71b7cab2c5e2b0937b13404ab36 +md5: d13423b06447113a90b5b1366d4da171 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 240444 +timestamp: 1773114901155 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda +sha256: 41b04f995c9f63af8c4065a35931e46cbc2fdd6b9bf7e4c19f90d53cbb2bc8e5 +md5: 67828c963b17db7dc989fe5d509ef04a +depends: +- krb5 >=1.22.2,<1.23.0a0 +- libgcc >=14 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +license: Apache-2.0 +license_family: Apache +size: 4553739 +timestamp: 1770903929794 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +sha256: 48814b73bd462da6eed2e697e30c060ae16af21e9fbed30d64feaf0aad9da392 +md5: a9138815598fe6b91a1d6782ca657b0c +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 71117 +timestamp: 1761979776756 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda +sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 +md5: fb640d776fc92b682a14e001980825b1 +depends: +- ncurses +- libgcc >=13 +- ncurses >=6.5,<7.0a0 +license: BSD-2-Clause +license_family: BSD +size: 148125 +timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda +sha256: 995ce3ad96d0f4b5ed6296b051a0d7b6377718f325bc0e792fbb96b0e369dad7 +md5: 57f3b3da02a50a1be2a6fe847515417d +depends: +- libgcc >=14 +constrains: +- expat 2.7.4.* +license: MIT +license_family: MIT +size: 76564 +timestamp: 1771259530958 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 +md5: 2f364feefb6a7c00423e80dcb12db62a +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 55952 +timestamp: 1769456078358 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +sha256: 752e4f66283d7deb4c6fd47d88df644d8daa2aaa825a54f3bf350a625190192a +md5: a229e22d4d8814a07702b0919d8e6701 +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8125 +timestamp: 1774301094057 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +sha256: 8e6b27fe4eec4c2fa7b7769a21973734c8dba1de80086fb0213e58375ac09f4c +md5: b99ed99e42dafb27889483b3098cace7 +depends: +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 422941 +timestamp: 1774301093473 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda +sha256: 43df385bedc1cab11993c4369e1f3b04b4ca5d0ea16cba6a0e7f18dbc129fcc9 +md5: 552567ea2b61e3a3035759b2fdb3f9a6 +depends: +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_18 +- libgomp 15.2.0 h8acb6b2_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 622900 +timestamp: 1771378128706 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda +sha256: 83bb0415f59634dccfa8335d4163d1f6db00a27b36666736f9842b650b92cf2f +md5: 4feebd0fbf61075a1a9c2e9b3936c257 +depends: +- libgcc 15.2.0 h8acb6b2_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27568 +timestamp: 1771378136019 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda +sha256: afc503dbd04a5bf2709aa9d8318a03a8c4edb389f661ff280c3494bfef4341ec +md5: 4ac4372fc4d7f20630a91314cdac8afd +depends: +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- libiconv >=1.18,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pcre2 >=10.47,<10.48.0a0 +constrains: +- glib 2.86.4 *_1 +license: LGPL-2.1-or-later +size: 4512186 +timestamp: 1771863220969 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda +sha256: fc716f11a6a8525e27a5d332ef6a689210b0d2a4dd1133edc0f530659aa9faa6 +md5: 4faa39bf919939602e594253bd673958 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 588060 +timestamp: 1771378040807 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda +sha256: 1473451cd282b48d24515795a595801c9b65b567fe399d7e12d50b2d6cdb04d9 +md5: 5a86bf847b9b926f3a4f203339748d78 +depends: +- libgcc >=14 +license: LGPL-2.1-only +size: 791226 +timestamp: 1754910975665 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda +sha256: 84064c7c53a64291a585d7215fe95ec42df74203a5bf7615d33d49a3b0f08bb6 +md5: 5109d7f837a3dfdf5c60f60e311b041f +depends: +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 691818 +timestamp: 1762094728337 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda +sha256: 843c46e20519651a3e357a8928352b16c5b94f4cd3d5481acc48be2e93e8f6a3 +md5: 96944e3c92386a12755b94619bae0b35 +depends: +- libgcc >=14 +constrains: +- xz 5.8.2.* +license: 0BSD +size: 125916 +timestamp: 1768754941722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda +sha256: c7378c6b79de4d571d00ad1caf0a4c19d43c9c94077a761abb6ead44d891f907 +md5: be4088903b94ea297975689b3c3aeb27 +depends: +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: zlib-acknowledgement +size: 340156 +timestamp: 1770691477245 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda +sha256: 31fdb9ffafad106a213192d8319b9f810e05abca9c5436b60e507afb35a6bc40 +md5: f56573d05e3b735cb03efeb64a15f388 +depends: +- libgcc 15.2.0 h8acb6b2_18 +constrains: +- libstdcxx-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5541411 +timestamp: 1771378162499 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +sha256: 7ff79470db39e803e21b8185bc8f19c460666d5557b1378d1b1e857d929c6b39 +md5: 8c6fd84f9c87ac00636007c6131e457d +depends: +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 488407 +timestamp: 1762022048105 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda +sha256: c37a8e89b700646f3252608f8368e7eb8e2a44886b92776e57ad7601fc402a11 +md5: cf2861212053d05f27ec49c3784ff8bb +depends: +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 43453 +timestamp: 1766271546875 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +sha256: b03700a1f741554e8e5712f9b06dd67e76f5301292958cd3cb1ac8c6fdd9ed25 +md5: 24e92d0942c799db387f5c9d7b81f1af +depends: +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 359496 +timestamp: 1752160685488 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b +md5: cd14ee5cca2464a425b1dbfc24d90db2 +depends: +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 397493 +timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda +sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f +md5: b4df5d7d4b63579d081fd3a4cf99740e +depends: +- libgcc-ng >=12 +license: LGPL-2.1-or-later +size: 114269 +timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f +md5: 502006882cf5461adced436e410046d1 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 69833 +timestamp: 1774072605429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda +sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 +md5: 182afabe009dc78d8b73100255ee6868 +depends: +- libgcc >=13 +license: X11 AND BSD-3-Clause +size: 926034 +timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.2-h488f50d_0.conda +sha256: 6fd2c872b275fa5d42a61a4b6dc28a819cde29f9048adb547363597432e0720e +md5: 27fdd5d67e235c20d23b2d66406497d3 +depends: +- xorg-libx11 +- xorg-libxext +- xorg-libxi +- xorg-libxrender +- xorg-libxtst +- libstdcxx >=14 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +- xorg-libxtst >=1.2.5,<2.0a0 +- libpng >=1.6.55,<1.7.0a0 +- alsa-lib >=1.2.15.3,<1.3.0a0 +- xorg-libx11 >=1.8.13,<2.0a0 +- xorg-libxi >=1.8.2,<2.0a0 +- xorg-libxrandr >=1.5.5,<2.0a0 +- lcms2 >=2.18,<3.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +- libcups >=2.3.3,<2.4.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- harfbuzz >=12.3.2 +- xorg-libxext >=1.3.7,<2.0a0 +- giflib >=5.2.2,<5.3.0a0 +- xorg-libxt >=1.3.1,<2.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- fontconfig >=2.17.1,<3.0a0 +- fonts-conda-ecosystem +license: GPL-2.0-or-later WITH Classpath-exception-2.0 +license_family: GPL +size: 106988620 +timestamp: 1771443741031 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda +sha256: 7f8048c0e75b2620254218d72b4ae7f14136f1981c5eb555ef61645a9344505f +md5: 25f5885f11e8b1f075bccf4a2da91c60 +depends: +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3692030 +timestamp: 1769557678657 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda +sha256: 04df2cee95feba440387f33f878e9f655521e69f4be33a0cd637f07d3d81f0f9 +md5: 1a30c42e32ca0ea216bd0bfe6f842f0b +depends: +- bzip2 >=1.0.8,<2.0a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 1166552 +timestamp: 1763655534263 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda +build_number: 7 +sha256: d78296134263b5bf476cad838ded65451e7162db756f9997c5d06b08122572ed +md5: 17d019cb2a6c72073c344e98e40dfd61 +depends: +- libgcc-ng >=12 +- libxcrypt >=4.4.36 +license: GPL-1.0-or-later OR Artistic-1.0-Perl +size: 13338804 +timestamp: 1703310557094 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda +sha256: e6b0846a998f2263629cfeac7bca73565c35af13251969f45d385db537a514e4 +md5: 1587081d537bd4ae77d1c0635d465ba5 +depends: +- libgcc >=14 +- libstdcxx >=14 +- libgcc >=14 +license: MIT +license_family: MIT +size: 357913 +timestamp: 1754665583353 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +sha256: e9cbcbc94e151ada3d6dc365380aaaf591f65012c16d9a2abaea4b9b90adc402 +md5: ab7288cc39545556d1bc5e71ab2df9a9 +depends: +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 636733 +timestamp: 1769712412683 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba +md5: bb5a90c93e3bac3d5690acf76b4a6386 +depends: +- libgcc >=13 +license: MIT +license_family: MIT +size: 8342 +timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda +sha256: a2ba1864403c7eb4194dacbfe2777acf3d596feae43aada8d1b478617ce45031 +md5: c8d8ec3e00cd0fd8a231789b91a7c5b7 +depends: +- libgcc >=13 +license: MIT +license_family: MIT +size: 60433 +timestamp: 1734229908988 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda +sha256: b86a819cd16f90c01d9d81892155126d01555a20dabd5f3091da59d6309afd0a +md5: 2d1409c50882819cb1af2de82e2b7208 +depends: +- libgcc >=13 +- libuuid >=2.38.1,<3.0a0 +- xorg-libice >=1.1.2,<2.0a0 +license: MIT +license_family: MIT +size: 28701 +timestamp: 1741897678254 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda +sha256: cf886160e2ff580d77f7eb8ec1a77c41c2c5b05343e329bc35f0ddf40b8d92ab +md5: 22dd10425ef181e80e130db50675d615 +depends: +- libgcc >=14 +- libxcb >=1.17.0,<2.0a0 +license: MIT +license_family: MIT +size: 869058 +timestamp: 1770819244991 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +sha256: e9f6e931feeb2f40e1fdbafe41d3b665f1ab6cb39c5880a1fcf9f79a3f3c84a5 +md5: 1c246e1105000c3660558459e2fd6d43 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 16317 +timestamp: 1762977521691 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +sha256: 128d72f36bcc8d2b4cdbec07507542e437c7d67f677b7d77b71ed9eeac7d6df1 +md5: bff06dcde4a707339d66d45d96ceb2e2 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 21039 +timestamp: 1762979038025 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-he30d5cf_0.conda +sha256: db2188bc0d844d4e9747bac7f6c1d067e390bd769c5ad897c93f1df759dc5dba +md5: fb42b683034619915863d68dd9df03a3 +depends: +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 52409 +timestamp: 1769446753771 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda +sha256: 8cb9c88e25c57e47419e98f04f9ef3154ad96b9f858c88c570c7b91216a64d0e +md5: e8b4056544341daf1d415eaeae7a040c +depends: +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 20704 +timestamp: 1759284028146 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda +sha256: 7b587407ecb9ccd2bbaf0fb94c5dbdde4d015346df063e9502dc0ce2b682fb5e +md5: eeee3bdb31c6acde2b81ad1b8c287087 +depends: +- libgcc >=13 +- xorg-libx11 >=1.8.9,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxfixes >=6.0.1,<7.0a0 +license: MIT +license_family: MIT +size: 48197 +timestamp: 1727801059062 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.5-he30d5cf_0.conda +sha256: 9f5196665a8d72f4f119c40dcc4bafeb0b540b102cc7b8b299c2abf599e7919f +md5: 1f64c613f0b8d67e9fb0e165d898fb6b +depends: +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: MIT +license_family: MIT +size: 31122 +timestamp: 1769445286951 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda +sha256: ffd77ee860c9635a28cfda46163dcfe9224dc6248c62404c544ae6b564a0be1f +md5: ae2c2dd0e2d38d249887727db2af960e +depends: +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +license: MIT +license_family: MIT +size: 33649 +timestamp: 1734229123157 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxt-1.3.1-h57736b2_0.conda +sha256: 7c109792b60720809a580612aba7f8eb2a0bd425b9fc078748a9d6ffc97cbfa8 +md5: a9e4852c8e0b68ee783e7240030b696f +depends: +- libgcc >=13 +- xorg-libice >=1.1.1,<2.0a0 +- xorg-libsm >=1.2.4,<2.0a0 +- xorg-libx11 >=1.8.9,<2.0a0 +license: MIT +license_family: MIT +size: 384752 +timestamp: 1731860572314 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda +sha256: 6eaffce5a34fc0a16a21ddeaefb597e792a263b1b0c387c1ce46b0a967d558e1 +md5: c05698071b5c8e0da82a282085845860 +depends: +- libgcc >=13 +- xorg-libx11 >=1.8.9,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxi >=1.7.10,<2.0a0 +license: MIT +license_family: MIT +size: 33786 +timestamp: 1727964907993 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 +md5: c3655f82dcea2aa179b291e7099c1fcc +depends: +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 614429 +timestamp: 1764777145593 diff --git a/modules/nf-core/fastqc/environment.yml b/modules/nf-core/fastqc/environment.yml new file mode 100644 index 00000000..f9f54ee9 --- /dev/null +++ b/modules/nf-core/fastqc/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::fastqc=0.12.1 diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 07d5e433..10851264 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -1,19 +1,19 @@ process FASTQC { - tag "$meta.id" - label 'process_medium' + tag "${meta.id}" + label 'process_low' - conda "bioconda::fastqc=0.11.9" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' : - 'biocontainers/fastqc:0.11.9--0' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' + : 'quay.io/biocontainers/fastqc:0.12.1--hdfd78af_0'}" input: - tuple val(meta), path(reads) + tuple val(meta), path(reads, stageAs: '?/*') output: tuple val(meta), path("*.html"), emit: html - tuple val(meta), path("*.zip") , emit: zip - path "versions.yml" , emit: versions + tuple val(meta), path("*.zip"), emit: zip + tuple val("${task.process}"), val('fastqc'), eval('fastqc --version | sed "/FastQC v/!d; s/.*v//"'), emit: versions_fastqc, topic: versions when: task.ext.when == null || task.ext.when @@ -22,19 +22,30 @@ process FASTQC { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" // Make list of old name and new name pairs to use for renaming in the bash while loop - def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } + def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[reads, "${prefix}.${reads.extension}"]] : reads.withIndex().collect { entry, index -> [entry, "${prefix}_${index + 1}.${entry.extension}"] } def rename_to = old_new_pairs*.join(' ').join(' ') - def renamed_files = old_new_pairs.collect{ old_name, new_name -> new_name }.join(' ') + def renamed_files = old_new_pairs.collect { _old_name, new_name -> new_name }.join(' ') + + // The total amount of allocated RAM by FastQC is equal to the number of threads defined (--threads) time the amount of RAM defined (--memory) + // https://github.com/s-andrews/FastQC/blob/1faeea0412093224d7f6a07f777fad60a5650795/fastqc#L211-L222 + // Dividing the task.memory by task.cpus allows to stick to requested amount of RAM in the label + def memory_in_mb = task.memory + ? (task.memory.toUnit('MB') / task.cpus).intValue() + : null + // FastQC memory value allowed range (100 - 10000) + def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) + def fastqc_memory_arg = fastqc_memory ? "--memory ${fastqc_memory}" : '' + """ - printf "%s %s\\n" $rename_to | while read old_name new_name; do + printf "%s %s\\n" ${rename_to} | while read old_name new_name; do [ -f "\${new_name}" ] || ln -s \$old_name \$new_name done - fastqc $args --threads $task.cpus $renamed_files - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) - END_VERSIONS + fastqc \\ + ${args} \\ + --threads ${task.cpus} \\ + ${fastqc_memory_arg} \\ + ${renamed_files} """ stub: @@ -42,10 +53,5 @@ process FASTQC { """ touch ${prefix}.html touch ${prefix}.zip - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) - END_VERSIONS """ } diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index 4da5bb5a..2f6cfef6 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -11,42 +11,101 @@ tools: FastQC gives general quality metrics about your reads. It provides information about the quality score distribution across your reads, the per base sequence content (%A/C/G/T). + You get information about adapter contamination and other overrepresented sequences. homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ licence: ["GPL-2.0-only"] + identifier: biotools:fastqc input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - html: - type: file - description: FastQC report - pattern: "*_{fastqc.html}" - - zip: - type: file - description: FastQC report archive - pattern: "*_{fastqc.zip}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + html: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.html": + type: file + description: FastQC report + pattern: "*_{fastqc.html}" + ontologies: [] + zip: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.zip": + type: file + description: FastQC report archive + pattern: "*_{fastqc.zip}" + ontologies: [] + versions_fastqc: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" - "@grst" - "@ewels" - "@FelixKrueger" +maintainers: + - "@drpatelh" + - "@grst" + - "@ewels" + - "@FelixKrueger" +containers: + docker: + linux/arm64: + name: community.wave.seqera.io/library/fastqc:0.12.1--e455e32f745abe68 + build_id: bd-e455e32f745abe68_1 + scan_id: sc-f102f736465af88c_1 + linux/amd64: + name: community.wave.seqera.io/library/fastqc:0.12.1--5cb1a2fa2f18c7c2 + build_id: bd-5cb1a2fa2f18c7c2_1 + scan_id: sc-0c0466326b6b77d2_1 + singularity: + linux/amd64: + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--5c4bd442468d75dd + build_id: bd-5c4bd442468d75dd_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f2/f20b021476d1d87658820f971ebecc1e8cdbde0f338eb0d9cea2b0a8fc54a54b/data + linux/arm64: + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--127a87fc06499035 + build_id: bd-127a87fc06499035_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/46/46daf2dad0169afd2ae047c3e50ed3776259f664bf07e5e06b045dc23449e994/data + conda: + linux/amd64: + lock_file: modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt + linux/arm64: + lock_file: modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test new file mode 100644 index 00000000..66c44da9 --- /dev/null +++ b/modules/nf-core/fastqc/tests/main.nf.test @@ -0,0 +1,309 @@ +nextflow_process { + + name "Test Process FASTQC" + script "../main.nf" + process "FASTQC" + + tag "modules" + tag "modules_nfcore" + tag "fastqc" + + test("sarscov2 single-end [fastq]") { + + when { + process { + """ + input[0] = Channel.of([ + [ id: 'test', single_end:true ], + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + // NOTE The report contains the date inside it, which means that the md5sum is stable per day, but not longer than that. So you can't md5sum it. + // looks like this:
    Mon 2 Oct 2023
    test.gz
    + // https://github.com/nf-core/modules/pull/3903#issuecomment-1743620039 + { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, + { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, + { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + ) + } + } + + test("sarscov2 paired-end [fastq]") { + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, + { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, + { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, + { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, + { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + ) + } + } + + test("sarscov2 interleaved [fastq]") { + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, + { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, + { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + ) + } + } + + test("sarscov2 paired-end [bam]") { + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, + { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, + { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + ) + } + } + + test("sarscov2 multiple [fastq]") { + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_2.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, + { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, + { assert process.out.html[0][1][2] ==~ ".*/test_3_fastqc.html" }, + { assert process.out.html[0][1][3] ==~ ".*/test_4_fastqc.html" }, + { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, + { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, + { assert process.out.zip[0][1][2] ==~ ".*/test_3_fastqc.zip" }, + { assert process.out.zip[0][1][3] ==~ ".*/test_4_fastqc.zip" }, + { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][1][2]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][1][3]).text.contains("File typeConventional base calls") }, + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + ) + } + } + + test("sarscov2 custom_prefix") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'mysample', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert process.out.html[0][1] ==~ ".*/mysample_fastqc.html" }, + { assert process.out.zip[0][1] ==~ ".*/mysample_fastqc.zip" }, + { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + ) + } + } + + test("sarscov2 single-end [fastq] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id: 'test', single_end:true ], + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 paired-end [fastq] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 interleaved [fastq] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 paired-end [bam] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 multiple [fastq] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_2.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 custom_prefix - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'mysample', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/fastqc/tests/main.nf.test.snap b/modules/nf-core/fastqc/tests/main.nf.test.snap new file mode 100644 index 00000000..c8ee120f --- /dev/null +++ b/modules/nf-core/fastqc/tests/main.nf.test.snap @@ -0,0 +1,476 @@ +{ + "sarscov2 custom_prefix": { + "content": [ + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:14.518503" + }, + "sarscov2 single-end [fastq] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "html": [ + [ + { + "id": "test", + "single_end": true + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "zip": [ + [ + { + "id": "test", + "single_end": true + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:19.309008" + }, + "sarscov2 custom_prefix - stub": { + "content": [ + { + "0": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "html": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "zip": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:44.94888" + }, + "sarscov2 interleaved [fastq]": { + "content": [ + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:38:45.168496" + }, + "sarscov2 paired-end [bam]": { + "content": [ + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:38:53.268919" + }, + "sarscov2 multiple [fastq]": { + "content": [ + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:05.050305" + }, + "sarscov2 paired-end [fastq]": { + "content": [ + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:38:37.2373" + }, + "sarscov2 paired-end [fastq] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:24.450398" + }, + "sarscov2 multiple [fastq] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:39.758762" + }, + "sarscov2 single-end [fastq]": { + "content": [ + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:38:29.555068" + }, + "sarscov2 interleaved [fastq] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:29.193136" + }, + "sarscov2 paired-end [bam] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:34.144919" + } +} \ No newline at end of file diff --git a/modules/nf-core/gffread/environment.yml b/modules/nf-core/gffread/environment.yml new file mode 100644 index 00000000..46c5faec --- /dev/null +++ b/modules/nf-core/gffread/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::gffread=0.12.7 diff --git a/modules/nf-core/gffread/main.nf b/modules/nf-core/gffread/main.nf index f4472b0e..00e4ab92 100644 --- a/modules/nf-core/gffread/main.nf +++ b/modules/nf-core/gffread/main.nf @@ -1,33 +1,51 @@ process GFFREAD { - tag "$gff" + tag "$meta.id" label 'process_low' - conda "bioconda::gffread=0.12.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gffread:0.12.1--h8b12597_0' : - 'biocontainers/gffread:0.12.1--h8b12597_0' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gffread:0.12.7--hdcf5f25_4' : + 'quay.io/biocontainers/gffread:0.12.7--hdcf5f25_4' }" input: - path gff + tuple val(meta), path(gff) + path fasta output: - path "*.gtf" , emit: gtf - path "versions.yml" , emit: versions + tuple val(meta), path("*.gtf") , emit: gtf , optional: true + tuple val(meta), path("*.gff3") , emit: gffread_gff , optional: true + tuple val(meta), path("*.fasta"), emit: gffread_fasta , optional: true + tuple val(meta), path("*.bed") , emit: bed , optional: true + tuple val("${task.process}"), val('gffread'), eval('gffread --version 2>&1'), topic: versions, emit: versions_gffread when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${gff.baseName}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--bed") ? 'bed' : ( args.contains("-T") ? 'gtf' : ( ( ['-w', '-x', '-y' ].any { flag -> args.contains(flag) } ) ? 'fasta' : 'gff3' ) ) + def fasta_arg = fasta ? "-g $fasta" : '' + def output_name = "${prefix}.${extension}" + def output = extension == "fasta" ? "$output_name" : "-o $output_name" + def args_sorted = args.replaceAll(/(.*)(-[wxy])(.*)/) { _all, pre, param, post -> "$pre $post $param" }.trim() + // args_sorted = Move '-w', '-x', and '-y' to the end of the args string as gffread expects the file name after these parameters + if ( "$output_name" in [ "$gff", "$fasta" ] ) error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" """ gffread \\ $gff \\ - $args \\ - -o ${prefix}.gtf - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gffread: \$(gffread --version 2>&1) - END_VERSIONS + $fasta_arg \\ + $args_sorted \\ + $output + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--bed") ? 'bed' : ( args.contains("-T") ? 'gtf' : ( ( ['-w', '-x', '-y' ].any { flag -> args.contains(flag) } ) ? 'fasta' : 'gff3' ) ) + def output_name = "${prefix}.${extension}" + if ( "$output_name" in [ "$gff", "$fasta" ] ) error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + """ + touch $output_name """ } diff --git a/modules/nf-core/gffread/meta.yml b/modules/nf-core/gffread/meta.yml index 20335747..52276cb9 100644 --- a/modules/nf-core/gffread/meta.yml +++ b/modules/nf-core/gffread/meta.yml @@ -1,33 +1,110 @@ name: gffread -description: Validate, filter, convert and perform various other operations on GFF files +description: Validate, filter, convert and perform various other operations on GFF + files keywords: - gff - conversion - validation tools: - gffread: - description: GFF/GTF utility providing format conversions, region filtering, FASTA sequence extraction and more. + description: GFF/GTF utility providing format conversions, region filtering, FASTA + sequence extraction and more. homepage: http://ccb.jhu.edu/software/stringtie/gff.shtml#gffread documentation: http://ccb.jhu.edu/software/stringtie/gff.shtml#gffread tool_dev_url: https://github.com/gpertea/gffread doi: 10.12688/f1000research.23297.1 licence: ["MIT"] - + identifier: biotools:gffread input: - - gff: + - - meta: + type: map + description: | + Groovy Map containing meta data + e.g. [ id:'test' ] + - gff: + type: file + description: A reference file in either the GFF3, GFF2 or GTF format. + pattern: "*.{gff, gtf}" + ontologies: [] + - fasta: type: file - description: A reference file in either the GFF3, GFF2 or GTF format. - pattern: "*.{gff, gtf}" - + description: A multi-fasta file with the genomic sequences + pattern: "*.{fasta,fa,faa,fas,fsa}" + ontologies: [] output: - - gtf: - type: file - description: GTF file resulting from the conversion of the GFF input file - pattern: "*.{gtf}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + gtf: + - - meta: + type: map + description: | + Groovy Map containing meta data + e.g. [ id:'test' ] + - "*.gtf": + type: file + description: GTF file resulting from the conversion of the GFF input file + if '-T' argument is present + pattern: "*.{gtf}" + ontologies: [] + gffread_gff: + - - meta: + type: map + description: | + Groovy Map containing meta data + e.g. [ id:'test' ] + - "*.gff3": + type: file + description: GFF3 file resulting from the conversion of the GFF input file + if '-T' argument is absent + pattern: "*.gff3" + ontologies: [] + gffread_fasta: + - - meta: + type: map + description: | + Groovy Map containing meta data + e.g. [ id:'test' ] + - "*.fasta": + type: file + description: Fasta file produced when either of '-w', '-x', '-y' parameters + is present + pattern: "*.fasta" + ontologies: [] + bed: + - - meta: + type: map + description: | + Groovy Map containing meta data + e.g. [ id:'test' ] + - "*.bed": + type: file + description: BED file resulting from the conversion of the GFF input file + when the '--bed' argument is present + pattern: "*.bed" + ontologies: [] + versions_gffread: + - - ${task.process}: + type: string + description: The process the versions were collected from + - gffread: + type: string + description: The tool name + - gffread --version 2>&1: + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - gffread: + type: string + description: The tool name + - gffread --version 2>&1: + type: eval + description: The expression to obtain the version of the tool authors: - - "@emiller88" + - "@edmundmiller" +maintainers: + - "@edmundmiller" + - "@gallvp" diff --git a/modules/nf-core/gffread/tests/main.nf.test b/modules/nf-core/gffread/tests/main.nf.test new file mode 100644 index 00000000..b3aab183 --- /dev/null +++ b/modules/nf-core/gffread/tests/main.nf.test @@ -0,0 +1,275 @@ +nextflow_process { + + name "Test Process GFFREAD" + script "../main.nf" + process "GFFREAD" + + tag "gffread" + tag "modules_nfcore" + tag "modules" + + test("sarscov2-gff3-gtf") { + + config "./nextflow.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = [] + + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.gffread_gff == [] }, + { assert process.out.gffread_fasta == [] } + ) + } + + } + + test("sarscov2-gff3-gtf-stub") { + + options '-stub' + config "./nextflow.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = [] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.gffread_gff == [] }, + { assert process.out.gffread_fasta == [] } + ) + } + + } + + test("sarscov2-gff3-gff3") { + + config "./nextflow-gff3.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = [] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.gtf == [] }, + { assert process.out.gffread_fasta == [] } + ) + } + + } + + test("sarscov2-gff3-gff3-stub") { + + options '-stub' + config "./nextflow-gff3.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = [] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.gtf == [] }, + { assert process.out.gffread_fasta == [] } + ) + } + + } + + test("sarscov2-gff3-fasta") { + + config "./nextflow-fasta.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.gtf == [] }, + { assert process.out.gffread_gff == [] } + ) + } + + } + + test("sarscov2-gff3-fasta-stub") { + + options '-stub' + config "./nextflow-fasta.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.gtf == [] }, + { assert process.out.gffread_gff == [] } + ) + } + + } + + test("sarscov2-gff3-bed") { + + config "./nextflow-bed.config" + + when { + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = [] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + + } + + test("sarscov2-gff3-bed-stub") { + + options '-stub' + config "./nextflow-bed.config" + + when { + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = [] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + + } + + test("sarscov2-gff3-fasta-fail-catch") { + + options '-stub' + config "./nextflow-fasta.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'genome'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) + """ + } + } + + then { + assertAll ( + { assert ! process.success }, + { assert process.stdout.toString().contains("Input and output names are the same") } + ) + } + + } + +} diff --git a/modules/nf-core/gffread/tests/main.nf.test.snap b/modules/nf-core/gffread/tests/main.nf.test.snap new file mode 100644 index 00000000..c8f7938a --- /dev/null +++ b/modules/nf-core/gffread/tests/main.nf.test.snap @@ -0,0 +1,426 @@ +{ + "sarscov2-gff3-gtf": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.gtf:md5,1ea0ae98d3388e0576407dc4a24ef428" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ], + "bed": [ + + ], + "gffread_fasta": [ + + ], + "gffread_gff": [ + + ], + "gtf": [ + [ + { + "id": "test" + }, + "test.gtf:md5,1ea0ae98d3388e0576407dc4a24ef428" + ] + ], + "versions_gffread": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ] + } + ], + "timestamp": "2026-04-24T10:22:41.259965105", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "sarscov2-gff3-gff3": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "test.gff3:md5,c4e5da6267c6bee5899a2c204ae1ad91" + ] + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ], + "bed": [ + + ], + "gffread_fasta": [ + + ], + "gffread_gff": [ + [ + { + "id": "test" + }, + "test.gff3:md5,c4e5da6267c6bee5899a2c204ae1ad91" + ] + ], + "gtf": [ + + ], + "versions_gffread": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ] + } + ], + "timestamp": "2026-04-24T10:22:51.897172513", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "sarscov2-gff3-gtf-stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ], + "bed": [ + + ], + "gffread_fasta": [ + + ], + "gffread_gff": [ + + ], + "gtf": [ + [ + { + "id": "test" + }, + "test.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_gffread": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ] + } + ], + "timestamp": "2026-04-24T10:22:46.582356403", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "sarscov2-gff3-bed": { + "content": [ + { + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,96fd7117a706e7c2ccbe062beb635172" + ] + ], + "gffread_fasta": [ + + ], + "gffread_gff": [ + + ], + "gtf": [ + + ], + "versions_gffread": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ] + } + ], + "timestamp": "2026-04-24T10:23:13.476804733", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "sarscov2-gff3-bed-stub": { + "content": [ + { + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gffread_fasta": [ + + ], + "gffread_gff": [ + + ], + "gtf": [ + + ], + "versions_gffread": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ] + } + ], + "timestamp": "2026-04-24T10:23:18.831655873", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "sarscov2-gff3-fasta-stub": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ], + "bed": [ + + ], + "gffread_fasta": [ + [ + { + "id": "test" + }, + "test.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gffread_gff": [ + + ], + "gtf": [ + + ], + "versions_gffread": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ] + } + ], + "timestamp": "2026-04-24T10:23:08.064865029", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "sarscov2-gff3-gff3-stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "test.gff3:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ], + "bed": [ + + ], + "gffread_fasta": [ + + ], + "gffread_gff": [ + [ + { + "id": "test" + }, + "test.gff3:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gtf": [ + + ], + "versions_gffread": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ] + } + ], + "timestamp": "2026-04-24T10:22:57.33529754", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "sarscov2-gff3-fasta": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test.fasta:md5,5f8108fb51739a0588ccf0a251de919a" + ] + ], + "3": [ + + ], + "4": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ], + "bed": [ + + ], + "gffread_fasta": [ + [ + { + "id": "test" + }, + "test.fasta:md5,5f8108fb51739a0588ccf0a251de919a" + ] + ], + "gffread_gff": [ + + ], + "gtf": [ + + ], + "versions_gffread": [ + [ + "GFFREAD", + "gffread", + "0.12.7" + ] + ] + } + ], + "timestamp": "2026-04-24T10:23:02.723479313", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/gffread/tests/nextflow-bed.config b/modules/nf-core/gffread/tests/nextflow-bed.config new file mode 100644 index 00000000..e6406899 --- /dev/null +++ b/modules/nf-core/gffread/tests/nextflow-bed.config @@ -0,0 +1,5 @@ +process { + withName: GFFREAD { + ext.args = '--bed' + } +} diff --git a/modules/nf-core/gffread/tests/nextflow-fasta.config b/modules/nf-core/gffread/tests/nextflow-fasta.config new file mode 100644 index 00000000..ac6cb148 --- /dev/null +++ b/modules/nf-core/gffread/tests/nextflow-fasta.config @@ -0,0 +1,5 @@ +process { + withName: GFFREAD { + ext.args = '-w -S' + } +} diff --git a/modules/nf-core/gffread/tests/nextflow-gff3.config b/modules/nf-core/gffread/tests/nextflow-gff3.config new file mode 100644 index 00000000..afe0830e --- /dev/null +++ b/modules/nf-core/gffread/tests/nextflow-gff3.config @@ -0,0 +1,5 @@ +process { + withName: GFFREAD { + ext.args = '' + } +} diff --git a/modules/nf-core/gffread/tests/nextflow.config b/modules/nf-core/gffread/tests/nextflow.config new file mode 100644 index 00000000..74b25094 --- /dev/null +++ b/modules/nf-core/gffread/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: GFFREAD { + ext.args = '-T' + } +} diff --git a/modules/nf-core/gunzip/environment.yml b/modules/nf-core/gunzip/environment.yml new file mode 100644 index 00000000..9b926b1f --- /dev/null +++ b/modules/nf-core/gunzip/environment.yml @@ -0,0 +1,12 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - conda-forge::coreutils=9.5 + - conda-forge::grep=3.11 + - conda-forge::gzip=1.13 + - conda-forge::lbzip2=2.5 + - conda-forge::sed=4.8 + - conda-forge::tar=1.34 diff --git a/modules/nf-core/gunzip/main.nf b/modules/nf-core/gunzip/main.nf index e7189d2f..6edffc59 100644 --- a/modules/nf-core/gunzip/main.nf +++ b/modules/nf-core/gunzip/main.nf @@ -1,44 +1,47 @@ process GUNZIP { - tag "$archive" + tag "${archive}" label 'process_single' - conda "conda-forge::sed=4.7" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'nf-core/ubuntu:20.04' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/52/52ccce28d2ab928ab862e25aae26314d69c8e38bd41ca9431c67ef05221348aa/data' + : 'community.wave.seqera.io/library/coreutils_grep_gzip_lbzip2_pruned:838ba80435a629f8'}" input: tuple val(meta), path(archive) output: - tuple val(meta), path("$gunzip"), emit: gunzip - path "versions.yml" , emit: versions + tuple val(meta), path("${gunzip}"), emit: gunzip + tuple val("${task.process}"), val('gunzip'), eval('gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//"'), topic: versions, emit: versions_gunzip when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' - gunzip = archive.toString() - '.gz' + def nameWithoutGz = archive.extension == 'gz' ? archive.baseName : archive.name + def extension = file(nameWithoutGz).extension + def name = file(nameWithoutGz).baseName + def prefix = task.ext.prefix ?: name + gunzip = prefix + ".${extension}" """ - gunzip \\ - -f \\ - $args \\ - $archive - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gunzip: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') - END_VERSIONS + # Not calling gunzip itself because it creates files + # with the original group ownership rather than the + # default one for that user / the work directory + gzip \\ + -cd \\ + ${args} \\ + ${archive} \\ + > ${gunzip} """ stub: - gunzip = archive.toString() - '.gz' + def nameWithoutGz = archive.extension == 'gz' ? archive.baseName : archive.name + def extension = file(nameWithoutGz).extension + def name = file(nameWithoutGz).baseName + def prefix = task.ext.prefix ?: name + gunzip = prefix + ".${extension}" """ - touch $gunzip - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gunzip: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') - END_VERSIONS + touch ${gunzip} """ } diff --git a/modules/nf-core/gunzip/meta.yml b/modules/nf-core/gunzip/meta.yml index 4cdcdf4c..bba6b3ba 100644 --- a/modules/nf-core/gunzip/meta.yml +++ b/modules/nf-core/gunzip/meta.yml @@ -10,26 +10,59 @@ tools: gzip is a file format and a software application used for file compression and decompression. documentation: https://www.gnu.org/software/gzip/manual/gzip.html licence: ["GPL-3.0-or-later"] + identifier: "" input: - - meta: - type: map - description: | - Optional groovy Map containing meta information - e.g. [ id:'test', single_end:false ] - - archive: - type: file - description: File to be compressed/uncompressed - pattern: "*.*" + - - meta: + type: map + description: | + Optional groovy Map containing meta information + e.g. [ id:'test', single_end:false ] + - archive: + type: file + description: File to be compressed/uncompressed + pattern: "*.*" + ontologies: [] output: - - gunzip: - type: file - description: Compressed/uncompressed file - pattern: "*.*" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + gunzip: + - - meta: + type: file + description: Compressed/uncompressed file + pattern: "*.*" + ontologies: [] + - ${gunzip}: + type: file + description: Compressed/uncompressed file + pattern: "*.*" + ontologies: [] + versions_gunzip: + - - ${task.process}: + type: string + description: The process the versions were collected from + - gunzip: + type: string + description: The tool name + - gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - gunzip: + type: string + description: The tool name + - gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//": + type: eval + description: The expression to obtain the version of the tool + authors: - "@joseespinosa" - "@drpatelh" - "@jfy133" +maintainers: + - "@joseespinosa" + - "@drpatelh" + - "@jfy133" + - "@gallvp" diff --git a/modules/nf-core/gunzip/tests/main.nf.test b/modules/nf-core/gunzip/tests/main.nf.test new file mode 100644 index 00000000..33cb75ae --- /dev/null +++ b/modules/nf-core/gunzip/tests/main.nf.test @@ -0,0 +1,175 @@ +nextflow_process { + + name "Test Process GUNZIP" + script "../main.nf" + process "GUNZIP" + tag "gunzip" + tag "modules_nfcore" + tag "modules" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + ) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("Should run without failures - prefix") { + + config './nextflow.config' + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + ) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("Should run without failures - stub") { + + options '-stub' + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + ) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("Should decompress file with extension appearing multiple times in filename") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true).copyTo('test.fa.v1.fa.gz') + ] + ) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert file(process.out.gunzip[0][1]).name == 'test.fa.v1.fa' } + ) + } + + } + + test("Should decompress file with extension appearing multiple times in filename - prefix") { + + config './nextflow.config' + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true).copyTo('test.fa.v1.fa.gz') + ] + ) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("Should run without failures - prefix - stub") { + + options '-stub' + config './nextflow.config' + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + ) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/gunzip/tests/main.nf.test.snap b/modules/nf-core/gunzip/tests/main.nf.test.snap new file mode 100644 index 00000000..8e6861cd --- /dev/null +++ b/modules/nf-core/gunzip/tests/main.nf.test.snap @@ -0,0 +1,207 @@ +{ + "Should decompress file with extension appearing multiple times in filename - prefix": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.xyz.fa:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "1": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] + ], + "gunzip": [ + [ + { + "id": "test" + }, + "test.xyz.fa:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] + ] + } + ], + "timestamp": "2026-04-15T15:20:52.59447", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "Should run without failures - prefix - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.xyz.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] + ], + "gunzip": [ + [ + { + "id": "test" + }, + "test.xyz.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] + ] + } + ], + "timestamp": "2026-01-19T17:21:56.633550769", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + } + }, + "Should run without failures - stub": { + "content": [ + { + "0": [ + [ + [ + + ], + "test_1.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] + ], + "gunzip": [ + [ + [ + + ], + "test_1.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] + ] + } + ], + "timestamp": "2026-01-19T17:21:51.435621199", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + } + }, + "Should run without failures": { + "content": [ + { + "0": [ + [ + [ + + ], + "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "1": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] + ], + "gunzip": [ + [ + [ + + ], + "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] + ] + } + ], + "timestamp": "2026-01-19T17:21:40.613975821", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + } + }, + "Should run without failures - prefix": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.xyz.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "1": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] + ], + "gunzip": [ + [ + { + "id": "test" + }, + "test.xyz.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] + ] + } + ], + "timestamp": "2026-01-19T17:21:46.086880414", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/gunzip/tests/nextflow.config b/modules/nf-core/gunzip/tests/nextflow.config new file mode 100644 index 00000000..dec77642 --- /dev/null +++ b/modules/nf-core/gunzip/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: GUNZIP { + ext.prefix = { "${meta.id}.xyz" } + } +} diff --git a/modules/nf-core/homer/annotatepeaks/environment.yml b/modules/nf-core/homer/annotatepeaks/environment.yml new file mode 100644 index 00000000..3a556e4c --- /dev/null +++ b/modules/nf-core/homer/annotatepeaks/environment.yml @@ -0,0 +1,12 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::bioconductor-deseq2=1.42.0 + - bioconda::bioconductor-edger=4.0.16 + - bioconda::homer=4.11 + - bioconda::samtools=1.21 + - conda-forge::r-essentials=4.3 + - conda-forge::wget=1.21.4 diff --git a/modules/nf-core/homer/annotatepeaks/main.nf b/modules/nf-core/homer/annotatepeaks/main.nf index cfc140f5..71f6c708 100644 --- a/modules/nf-core/homer/annotatepeaks/main.nf +++ b/modules/nf-core/homer/annotatepeaks/main.nf @@ -1,21 +1,21 @@ process HOMER_ANNOTATEPEAKS { - tag "$meta.id" + tag "${meta.id}" label 'process_medium' - - // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. - conda "bioconda::homer=4.11" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/homer:4.11--pl526hc9558a2_3' : - 'biocontainers/homer:4.11--pl526hc9558a2_3' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/0f/0fe4a3875b78dce3c66b43fb96489769cc32e55e329e2525d2af09096af2252a/data' + : 'community.wave.seqera.io/library/bioconductor-deseq2_bioconductor-edger_homer_samtools_pruned:a8f4c58755bb281b'}" input: tuple val(meta), path(peak) - path fasta - path gtf + path fasta + path gtf output: tuple val(meta), path("*annotatePeaks.txt"), emit: txt - path "versions.yml" , emit: versions + tuple val(meta), path("*annStats.txt"), emit: stats, optional: true + // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + tuple val("${task.process}"), val('homer'), val("4.11"), emit: versions_homer, topic: versions when: task.ext.when == null || task.ext.when @@ -23,19 +23,19 @@ process HOMER_ANNOTATEPEAKS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = '4.11' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ annotatePeaks.pl \\ - $peak \\ - $fasta \\ - $args \\ - -gtf $gtf \\ - -cpu $task.cpus \\ + ${peak} \\ + ${fasta} \\ + ${args} \\ + -gtf ${gtf} \\ + -cpu ${task.cpus} \\ > ${prefix}.annotatePeaks.txt + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - homer: $VERSION - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.annotatePeaks.txt """ } diff --git a/modules/nf-core/homer/annotatepeaks/meta.yml b/modules/nf-core/homer/annotatepeaks/meta.yml index b815e975..31e74eab 100644 --- a/modules/nf-core/homer/annotatepeaks/meta.yml +++ b/modules/nf-core/homer/annotatepeaks/meta.yml @@ -10,39 +10,76 @@ tools: HOMER (Hypergeometric Optimization of Motif EnRichment) is a suite of tools for Motif Discovery and next-gen sequencing analysis. documentation: http://homer.ucsd.edu/homer/ doi: 10.1016/j.molcel.2010.05.004. - licence: ["GPL-3.0-or-later"] + licence: + - "GPL-3.0-or-later" + identifier: biotools:homer input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - peaks: - type: file - description: The peak files in bed format - pattern: "*.bed" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - peak: + type: file + description: Peak file to annotate + ontologies: [] - fasta: type: file description: Fasta file of reference genome pattern: "*.fasta" + ontologies: [] - gtf: type: file description: GTF file of reference genome pattern: "*.gtf" + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - annotated_peaks: - type: file - description: The annotated peaks - pattern: "*annotatePeaks.txt" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + txt: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*annotatePeaks.txt": + type: file + description: Annotated peaks in txt file + pattern: "*annotatePeaks.txt" + ontologies: [] + stats: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*annStats.txt": + type: file + description: Annotation statistics in txt file + pattern: "*annStats.txt" + ontologies: [] + versions_homer: + - - ${task.process}: + type: string + description: The name of the process + - homer: + type: string + description: The name of the tool + - "4.11": + type: string + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - homer: + type: string + description: The name of the tool + - "4.11": + type: string + description: The expression to obtain the version of the tool authors: - "@drpatelh" - "@kevinmenden" +maintainers: + - "@drpatelh" + - "@kevinmenden" diff --git a/modules/nf-core/homer/annotatepeaks/tests/main.nf.test b/modules/nf-core/homer/annotatepeaks/tests/main.nf.test new file mode 100644 index 00000000..6619ed3a --- /dev/null +++ b/modules/nf-core/homer/annotatepeaks/tests/main.nf.test @@ -0,0 +1,63 @@ + +nextflow_process { + + name "Test Process HOMER_ANNOTATEPEAKS" + script "../main.nf" + process "HOMER_ANNOTATEPEAKS" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "homer" + tag "homer/annotatepeaks" + + test("test-homer-annotatepeaks") { + + when { + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed', checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + input[2] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out, unstableKeys:["txt"])).match()} + ) + } + } + + test("test-homer-annotatepeaks-stub") { + options '-stub' + + when { + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed', checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + input[2] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match()} + ) + } + } + +} diff --git a/modules/nf-core/homer/annotatepeaks/tests/main.nf.test.snap b/modules/nf-core/homer/annotatepeaks/tests/main.nf.test.snap new file mode 100644 index 00000000..82f2eb72 --- /dev/null +++ b/modules/nf-core/homer/annotatepeaks/tests/main.nf.test.snap @@ -0,0 +1,65 @@ +{ + "test-homer-annotatepeaks": { + "content": [ + { + "stats": [ + [ + { + "id": "test" + }, + "test.annStats.txt:md5,eba336bce28fb5ec5d4ea3215b502dc5" + ] + ], + "txt": [ + [ + { + "id": "test" + }, + "test.annotatePeaks.txt" + ] + ], + "versions_homer": [ + [ + "HOMER_ANNOTATEPEAKS", + "homer", + "4.11" + ] + ] + } + ], + "timestamp": "2026-05-22T08:26:40.525503224", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "test-homer-annotatepeaks-stub": { + "content": [ + { + "stats": [ + + ], + "txt": [ + [ + { + "id": "test" + }, + "test.annotatePeaks.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_homer": [ + [ + "HOMER_ANNOTATEPEAKS", + "homer", + "4.11" + ] + ] + } + ], + "timestamp": "2026-05-22T08:26:51.670938012", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/homer/annotatepeaks/tests/nextflow.config b/modules/nf-core/homer/annotatepeaks/tests/nextflow.config new file mode 100644 index 00000000..309aac55 --- /dev/null +++ b/modules/nf-core/homer/annotatepeaks/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = {"-annStats ${meta.id}.annStats.txt"} +} diff --git a/modules/nf-core/khmer/uniquekmers/environment.yml b/modules/nf-core/khmer/uniquekmers/environment.yml new file mode 100644 index 00000000..0b1809c4 --- /dev/null +++ b/modules/nf-core/khmer/uniquekmers/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::khmer=3.0.0a3 diff --git a/modules/nf-core/khmer/uniquekmers/main.nf b/modules/nf-core/khmer/uniquekmers/main.nf index 9576034f..fda91d40 100644 --- a/modules/nf-core/khmer/uniquekmers/main.nf +++ b/modules/nf-core/khmer/uniquekmers/main.nf @@ -2,37 +2,40 @@ process KHMER_UNIQUEKMERS { tag "$fasta" label 'process_low' - conda "bioconda::khmer=3.0.0a3" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/khmer:3.0.0a3--py37haa7609a_2' : - 'biocontainers/khmer:3.0.0a3--py37haa7609a_2' }" + 'quay.io/biocontainers/khmer:3.0.0a3--py37haa7609a_2' }" input: - path fasta - val kmer_size + tuple val(meta), path(fasta) + val kmer_size output: - path "report.txt" , emit: report - path "kmers.txt" , emit: kmers - path "versions.yml", emit: versions + tuple val(meta), path("*.report.txt") , emit: report + tuple val(meta), path("*.kmers.txt") , emit: kmers + tuple val("${task.process}"), val('khmer'), eval('unique-kmers.py --version 2>&1 | grep ^khmer | sed "s/^khmer //;s/ .*$//"'), emit: versions_khmer, topic: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ unique-kmers.py \\ -k $kmer_size \\ - -R report.txt \\ + -R ${prefix}.report.txt \\ $args \\ $fasta - grep ^number report.txt | sed 's/^.*:.[[:blank:]]//g' > kmers.txt + grep ^number ${prefix}.report.txt | sed 's/^.*:.[[:blank:]]//g' > ${prefix}.kmers.txt + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - khmer: \$( unique-kmers.py --version 2>&1 | grep ^khmer | sed 's/^khmer //;s/ .*\$//' ) - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.report.txt + touch ${prefix}.kmers.txt """ } diff --git a/modules/nf-core/khmer/uniquekmers/meta.yml b/modules/nf-core/khmer/uniquekmers/meta.yml index f9f63972..21b4a537 100644 --- a/modules/nf-core/khmer/uniquekmers/meta.yml +++ b/modules/nf-core/khmer/uniquekmers/meta.yml @@ -1,10 +1,10 @@ name: "khmer_uniquekmers" -description: In-memory nucleotide sequence k-mer counting, filtering, graph traversal and more +description: In-memory nucleotide sequence k-mer counting, filtering, graph traversal + and more keywords: - khmer - k-mer - effective genome size - tools: - "khmer": description: khmer k-mer counting library @@ -13,30 +13,67 @@ tools: tool_dev_url: https://github.com/dib-lab/khmer doi: "10.12688/f1000research.6924.1" licence: ["BSD License"] - + identifier: biotools:khmer input: - - fasta: - type: file - description: fasta file - pattern: "*.{fa,fasta}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - fasta: + type: file + description: fasta file + pattern: "*.{fa,fasta}" + ontologies: + - edam: "http://edamontology.org/format_1929" # FASTA - kmer_size: - type: value + type: integer description: k-mer size to use - pattern: "[0-9]+" - output: - - report: - type: file - description: Text file containing unique-kmers.py execution report - pattern: "report.txt" - - kmers: - type: file - description: Text file containing number of kmers - pattern: "kmers.txt" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - + report: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*.report.txt": + type: file + description: Text file containing unique-kmers.py execution report + pattern: "*.report.txt" + ontologies: [] + kmers: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*.kmers.txt": + type: file + description: Text file containing number of kmers + pattern: "*.kmers.txt" + ontologies: [] + versions_khmer: + - - ${task.process}: + type: string + description: The process the versions were collected from + - khmer: + type: string + description: The name of the tool + - unique-kmers.py --version 2>&1 | grep ^khmer | sed "s/^khmer //;s/ .*$//": + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - khmer: + type: string + description: The name of the tool + - unique-kmers.py --version 2>&1 | grep ^khmer | sed "s/^khmer //;s/ .*$//": + type: eval + description: The expression to obtain the version of the tool authors: - "@JoseEspinosa" +maintainers: + - "@JoseEspinosa" diff --git a/modules/nf-core/khmer/uniquekmers/tests/main.nf.test b/modules/nf-core/khmer/uniquekmers/tests/main.nf.test new file mode 100644 index 00000000..7c577bdf --- /dev/null +++ b/modules/nf-core/khmer/uniquekmers/tests/main.nf.test @@ -0,0 +1,54 @@ +nextflow_process { + + name "Test Process KHMER_UNIQUEKMERS" + + script "../main.nf" + process "KHMER_UNIQUEKMERS" + + tag "modules" + tag "modules_nfcore" + tag "khmer" + tag "khmer/uniquekmers" + + test("sarscov2 - fasta") { + + when { + process { + """ + input[0] = [ + [ id: 'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta',checkIfExists:true) + ] + input[1] = 50 + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } + + test("sarscov2 - fasta -- stub") { + options '-stub' + when { + process { + """ + input[0] = [ + [ id: 'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta',checkIfExists:true) + ] + input[1] = 50 + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } +} diff --git a/modules/nf-core/khmer/uniquekmers/tests/main.nf.test.snap b/modules/nf-core/khmer/uniquekmers/tests/main.nf.test.snap new file mode 100644 index 00000000..957c0a6c --- /dev/null +++ b/modules/nf-core/khmer/uniquekmers/tests/main.nf.test.snap @@ -0,0 +1,70 @@ +{ + "sarscov2 - fasta -- stub": { + "content": [ + { + "kmers": [ + [ + { + "id": "test" + }, + "test.kmers.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "report": [ + [ + { + "id": "test" + }, + "test.report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_khmer": [ + [ + "KHMER_UNIQUEKMERS", + "khmer", + "3.0.0a3" + ] + ] + } + ], + "timestamp": "2026-06-04T11:57:31.740881709", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "sarscov2 - fasta": { + "content": [ + { + "kmers": [ + [ + { + "id": "test" + }, + "test.kmers.txt:md5,496ebf23653a01c7a42d743e47c19f65" + ] + ], + "report": [ + [ + { + "id": "test" + }, + "test.report.txt:md5,ee489abd3b244dea3640649e1790d55e" + ] + ], + "versions_khmer": [ + [ + "KHMER_UNIQUEKMERS", + "khmer", + "3.0.0a3" + ] + ] + } + ], + "timestamp": "2026-06-04T11:57:25.950222943", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/macs2/callpeak/meta.yml b/modules/nf-core/macs2/callpeak/meta.yml deleted file mode 100644 index 6e2bc1db..00000000 --- a/modules/nf-core/macs2/callpeak/meta.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: macs2_callpeak -description: Peak calling of enriched genomic regions of ChIP-seq and ATAC-seq experiments -keywords: - - alignment - - atac-seq - - chip-seq - - peak-calling -tools: - - macs2: - description: Model Based Analysis for ChIP-Seq data - - documentation: https://docs.csc.fi/apps/macs2/ - tool_dev_url: https://github.com/macs3-project/MACS - doi: "10.1101/496521" - licence: ["BSD"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - ipbam: - type: file - description: The ChIP-seq treatment file - - controlbam: - type: file - description: The control file - - macs2_gsize: - type: string - description: Effective genome size. It can be 1.0e+9 or 1000000000, or shortcuts:'hs' for human (2.7e9), - 'mm' for mouse (1.87e9), 'ce' for C. elegans (9e7) and 'dm' for fruitfly (1.2e8) - -output: - - versions: - type: file - description: File containing software version - pattern: "versions.yml" - - peak: - type: file - description: BED file containing annotated peaks - pattern: "*.gappedPeak,*.narrowPeak}" - - xls: - type: file - description: xls file containing annotated peaks - pattern: "*.xls" - - gapped: - type: file - description: Optional BED file containing gapped peak - pattern: "*.gappedPeak" - - bed: - type: file - description: Optional BED file containing peak summits locations for every peak - pattern: "*.bed" - - bdg: - type: file - description: Optional bedGraph files for input and treatment input samples - pattern: "*.bdg" - -authors: - - "@ntoda03" - - "@JoseEspinosa" - - "@jianhong" diff --git a/modules/nf-core/macs3/callpeak/environment.yml b/modules/nf-core/macs3/callpeak/environment.yml new file mode 100644 index 00000000..43002db0 --- /dev/null +++ b/modules/nf-core/macs3/callpeak/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::macs3=3.0.4 diff --git a/modules/nf-core/macs2/callpeak/main.nf b/modules/nf-core/macs3/callpeak/main.nf similarity index 54% rename from modules/nf-core/macs2/callpeak/main.nf rename to modules/nf-core/macs3/callpeak/main.nf index cbef7838..7f70167c 100644 --- a/modules/nf-core/macs2/callpeak/main.nf +++ b/modules/nf-core/macs3/callpeak/main.nf @@ -1,20 +1,21 @@ -process MACS2_CALLPEAK { + +process MACS3_CALLPEAK { tag "$meta.id" label 'process_medium' - conda "bioconda::macs2=2.2.7.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py38h4a8c8d9_3' : - 'biocontainers/macs2:2.2.7.1--py38h4a8c8d9_3' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/2f/2fb492856efb63a7f824f0801b1386d08468cd4b7819ddc4c21e7f10e09b4fda/data': + 'community.wave.seqera.io/library/macs3:3.0.4--e0346d811b8b428e' }" input: tuple val(meta), path(ipbam), path(controlbam) - val macs2_gsize + val macs3_gsize output: tuple val(meta), path("*.{narrowPeak,broadPeak}"), emit: peak tuple val(meta), path("*.xls") , emit: xls - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('macs3'), eval("macs3 --version | sed -e 's/macs3 //'"), topic: versions, emit: versions_macs3 tuple val(meta), path("*.gappedPeak"), optional:true, emit: gapped tuple val(meta), path("*.bed") , optional:true, emit: bed @@ -30,24 +31,29 @@ process MACS2_CALLPEAK { def format = meta.single_end ? 'BAM' : 'BAMPE' def control = controlbam ? "--control $controlbam" : '' if(args_list.contains('--format')){ - def id = args_list.findIndexOf{it=='--format'} + def id = args_list.findIndexOf{args_i -> args_i=='--format'} format = args_list[id+1] args_list.remove(id+1) args_list.remove(id) } """ - macs2 \\ + macs3 \\ callpeak \\ ${args_list.join(' ')} \\ - --gsize $macs2_gsize \\ + --gsize $macs3_gsize \\ --format $format \\ --name $prefix \\ --treatment $ipbam \\ $control + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - macs2: \$(macs2 --version | sed -e "s/macs2 //g") - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.gappedPeak + touch ${prefix}.bed + touch ${prefix}.bdg + touch ${prefix}.narrowPeak + touch ${prefix}.xls """ } diff --git a/modules/nf-core/macs3/callpeak/meta.yml b/modules/nf-core/macs3/callpeak/meta.yml new file mode 100644 index 00000000..f7eae553 --- /dev/null +++ b/modules/nf-core/macs3/callpeak/meta.yml @@ -0,0 +1,123 @@ +name: "macs3_callpeak" +description: Peak calling of enriched genomic regions of ChIP-seq and ATAC-seq + experiments +keywords: + - alignment + - atac-seq + - chip-seq + - peak-calling +tools: + - macs3: + description: "Model Based Analysis for ChIP-Seq data" + homepage: "https://macs3-project.github.io/MACS/" + documentation: "https://macs3-project.github.io/MACS/" + tool_dev_url: "https://github.com/macs3-project/MACS/" + doi: "10.1101/496521" + licence: + - "BSD-3-clause" + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample_1', single_end:false ]` + - ipbam: + type: file + description: The ChIP-seq treatment file + ontologies: [] + - controlbam: + type: file + description: The control file + ontologies: [] + - macs3_gsize: + type: string + description: | + Effective genome size. It can be 1.0e+9 or 1000000000, + or shortcuts:'hs' for human (2,913,022,398), 'mm' for mouse + (2,652,783,500), 'ce' for C. elegans (100,286,401) + and 'dm' for fruitfly (142,573,017), Default:hs. +output: + peak: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.{narrowPeak,broadPeak}": + type: file + description: BED file containing annotated peaks + pattern: "*.gappedPeak,*.narrowPeak}" + ontologies: [] + xls: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.xls": + type: file + description: xls file containing annotated peaks + pattern: "*.xls" + ontologies: [] + gapped: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.gappedPeak": + type: file + description: Optional BED file containing gapped peak + pattern: "*.gappedPeak" + ontologies: [] + bed: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.bed": + type: file + description: Optional BED file containing peak summits locations for + every peak + pattern: "*.bed" + ontologies: [] + bdg: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.bdg": + type: file + description: Optional bedGraph files for input and treatment input + samples + pattern: "*.bdg" + ontologies: [] + versions_macs3: + - - ${task.process}: + type: string + description: The name of the process + - macs3: + type: string + description: The name of the tool + - macs3 --version | sed -e 's/macs3 //': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - macs3: + type: string + description: The name of the tool + - macs3 --version | sed -e 's/macs3 //': + type: eval + description: The expression to obtain the version of the tool +authors: + - "@JoseEspinosa" +maintainers: + - "@JoseEspinosa" + - "@Kevin-Brockers" diff --git a/modules/nf-core/macs3/callpeak/tests/bam.config b/modules/nf-core/macs3/callpeak/tests/bam.config new file mode 100644 index 00000000..4044f99d --- /dev/null +++ b/modules/nf-core/macs3/callpeak/tests/bam.config @@ -0,0 +1,5 @@ +process { + withName: 'MACS3_CALLPEAK' { + ext.args = '--qval 0.1' + } +} diff --git a/modules/nf-core/macs3/callpeak/tests/bed.config b/modules/nf-core/macs3/callpeak/tests/bed.config new file mode 100644 index 00000000..fd37823a --- /dev/null +++ b/modules/nf-core/macs3/callpeak/tests/bed.config @@ -0,0 +1,5 @@ +process { + withName: 'MACS3_CALLPEAK' { + ext.args = '--format BED --qval 10 --nomodel --extsize 200' + } +} diff --git a/modules/nf-core/macs3/callpeak/tests/main.nf.test b/modules/nf-core/macs3/callpeak/tests/main.nf.test new file mode 100644 index 00000000..4338c96b --- /dev/null +++ b/modules/nf-core/macs3/callpeak/tests/main.nf.test @@ -0,0 +1,113 @@ +nextflow_process { + + name "Test Process MACS3_CALLPEAK" + script "../main.nf" + process "MACS3_CALLPEAK" + + tag "modules" + tag "modules_nfcore" + tag "macs3" + tag "macs3/callpeak" + + test("homo_sapiens - callpeak - bed") { + + when { + config "./bed.config" + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/pacbio/bed/alz.ccs.fl.NEB_5p--NEB_Clontech_3p.flnc.clustered.singletons.merged.aligned_tc.bed', checkIfExists: true) ], + [] + ] + input[1] = 4000 + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - callpeak - bam") { + + when { + config "./bam.config" + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.name.sorted.bam', checkIfExists: true) ], + [] + ] + input[1] = 40000 + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - callpeak - control - bam") { + + when { + config "./bam.config" + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.name.sorted.bam', checkIfExists: true) ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.name.sorted.bam', checkIfExists: true) ] + ] + input[1] = 40000 + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) ], + [] + ] + input[1] = 40000 + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/macs3/callpeak/tests/main.nf.test.snap b/modules/nf-core/macs3/callpeak/tests/main.nf.test.snap new file mode 100644 index 00000000..af74ebeb --- /dev/null +++ b/modules/nf-core/macs3/callpeak/tests/main.nf.test.snap @@ -0,0 +1,390 @@ +{ + "homo_sapiens - callpeak - bam": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.narrowPeak:md5,2e4da1c1704595e12aaf99cc715ad70c" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.xls:md5,7bb3dd1f0ba377fc81eabb7b01a45b14" + ] + ], + "2": [ + [ + "MACS3_CALLPEAK", + "macs3", + "3.0.4" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test_summits.bed:md5,26f0f97b6c14dbca129e947a58067c82" + ] + ], + "5": [ + + ], + "bdg": [ + + ], + "bed": [ + [ + { + "id": "test", + "single_end": false + }, + "test_summits.bed:md5,26f0f97b6c14dbca129e947a58067c82" + ] + ], + "gapped": [ + + ], + "peak": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.narrowPeak:md5,2e4da1c1704595e12aaf99cc715ad70c" + ] + ], + "versions_macs3": [ + [ + "MACS3_CALLPEAK", + "macs3", + "3.0.4" + ] + ], + "xls": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.xls:md5,7bb3dd1f0ba377fc81eabb7b01a45b14" + ] + ] + } + ], + "timestamp": "2026-03-16T21:39:32.130928", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.narrowPeak:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "MACS3_CALLPEAK", + "macs3", + "3.0.4" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gappedPeak:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bdg:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bdg": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bdg:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bed": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gapped": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gappedPeak:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "peak": [ + [ + { + "id": "test", + "single_end": false + }, + "test.narrowPeak:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_macs3": [ + [ + "MACS3_CALLPEAK", + "macs3", + "3.0.4" + ] + ], + "xls": [ + [ + { + "id": "test", + "single_end": false + }, + "test.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "timestamp": "2026-03-16T21:39:43.27179", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "homo_sapiens - callpeak - control - bam": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.narrowPeak:md5,653e1108cc57ca07d0f60fc0f4fb8ba3" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.xls:md5,9e661b949cf7ddfedfcc6c9f0a84e14f" + ] + ], + "2": [ + [ + "MACS3_CALLPEAK", + "macs3", + "3.0.4" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test_summits.bed:md5,4f3c7c53a1d730d90d1b3dd9d3197af4" + ] + ], + "5": [ + + ], + "bdg": [ + + ], + "bed": [ + [ + { + "id": "test", + "single_end": false + }, + "test_summits.bed:md5,4f3c7c53a1d730d90d1b3dd9d3197af4" + ] + ], + "gapped": [ + + ], + "peak": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.narrowPeak:md5,653e1108cc57ca07d0f60fc0f4fb8ba3" + ] + ], + "versions_macs3": [ + [ + "MACS3_CALLPEAK", + "macs3", + "3.0.4" + ] + ], + "xls": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.xls:md5,9e661b949cf7ddfedfcc6c9f0a84e14f" + ] + ] + } + ], + "timestamp": "2026-03-16T21:39:38.355442", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "homo_sapiens - callpeak - bed": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.narrowPeak:md5,10e7d4747f8a2513e5ebb04856a51673" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.xls:md5,b5ea33e20a0e9b5f188eba614cd0d9a6" + ] + ], + "2": [ + [ + "MACS3_CALLPEAK", + "macs3", + "3.0.4" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test_summits.bed:md5,28833eeb7816688f0d698f51670be946" + ] + ], + "5": [ + + ], + "bdg": [ + + ], + "bed": [ + [ + { + "id": "test", + "single_end": false + }, + "test_summits.bed:md5,28833eeb7816688f0d698f51670be946" + ] + ], + "gapped": [ + + ], + "peak": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.narrowPeak:md5,10e7d4747f8a2513e5ebb04856a51673" + ] + ], + "versions_macs3": [ + [ + "MACS3_CALLPEAK", + "macs3", + "3.0.4" + ] + ], + "xls": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.xls:md5,b5ea33e20a0e9b5f188eba614cd0d9a6" + ] + ] + } + ], + "timestamp": "2026-03-16T21:39:26.580158", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt new file mode 100644 index 00000000..2a91c22d --- /dev/null +++ b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt @@ -0,0 +1,1526 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-64: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.8.1-hecca717_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.0-h27c8c51_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.41.0-py310h49dadd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.41.0-py310hcbd6021_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.4-py314h2e6c369_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.5.9-py314h5bd0f2a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 +md5: a9f577daf3de00bca7c3c76c0ecbd1de +depends: +- __glibc >=2.17,<3.0.a0 +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28948 +timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 +md5: aaa2a381ccc56eac91d63b6c1240312f +depends: +- cpython +- python-gil +license: MIT +license_family: MIT +size: 8191 +timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 +md5: 2934f256a8acfe48f6ebb4fce6cde29c +depends: +- python >=3.9 +- typing-extensions >=4.0.0 +license: MIT +license_family: MIT +size: 18074 +timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab +md5: c6b0543676ecb1fb2d7643941fe375f2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 64927 +timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda +noarch: generic +sha256: a1c97297e867776760489537bc5ae36fa83a154be30e3b79385a39ca4cb058fe +md5: 1133126d840e75287d83947be3fc3e71 +depends: +- python >=3.14 +license: BSD-3-Clause AND MIT AND EPL-2.0 +size: 7533 +timestamp: 1778594057496 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda +sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 +md5: 8910d2c46f7e7b519129f486e0fe927a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- libbrotlicommon 1.2.0 hb03c661_1 +license: MIT +license_family: MIT +size: 367376 +timestamp: 1764017265553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 +md5: d2ffd7602c02f2b316fd921d39876885 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 260182 +timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda +sha256: 9812a303a1395e1dafbd92e5bc8a1ff6013bcbba0a09c7f03a8d23e43560aa9b +md5: 489b8e97e666c93f68fdb35c3c9b957f +depends: +- __unix +license: ISC +size: 129868 +timestamp: 1779289852439 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda +sha256: 645655a3510e38e625da136595f3f16f2130c3263630cc3bc8f60f619ddbe490 +md5: 9fefff2f745ea1cc2ef15211a20c054a +depends: +- python >=3.10 +license: ISC +size: 134201 +timestamp: 1779285131141 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda +sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 +md5: a9167b9571f3baa9d448faa2139d1089 +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 58872 +timestamp: 1775127203018 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda +sha256: 99ab8ef815c4520cce3a7482c2513f377c14348206857661d84c76a55e030f97 +md5: 003767c47f1f0a474c4de268b57839c3 +depends: +- __unix +- python +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 104631 +timestamp: 1779108494556 +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 +md5: b866ff7007b934d564961066c8195983 +depends: +- humanfriendly >=9.1 +- python >=3.9 +license: MIT +license_family: MIT +size: 43758 +timestamp: 1733928076798 +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +sha256: 59c9e29800b483b390467f90e82b0da3a4fbf0612efe1c90813fca232780e160 +md5: 071cf7b0ce333c81718b054066c15102 +depends: +- networkx >=2.0 +- numpy +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 39326 +timestamp: 1735759976140 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda +noarch: generic +sha256: 777882d2685f368417f31bbe1b28f73687fc6c8f6a5768bda20ffeefa6b07f5b +md5: a749029ce5d0632a913db19d17f944ab +depends: +- python >=3.14,<3.15.0a0 +- python_abi * *_cp314 +license: Python-2.0 +size: 50212 +timestamp: 1779236682725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.8.1-hecca717_0.conda +sha256: 29a10599d56d93bd750914888ebe6822d47722070762b4647b34d12df9f4476e +md5: d0757fd84af06f065eba49d39af6c546 +depends: +- __glibc >=2.17,<3.0.a0 +- libexpat 2.8.1 hecca717_0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 148238 +timestamp: 1779278694477 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.0-h27c8c51_0.conda +sha256: e798086d8a65d55dc4c51f5746705639c9a5f2eeb0b8fc50e6152cfc0d69a4e8 +md5: 06965b2f9854d0b15e0443ee81fe83dc +depends: +- __glibc >=2.17,<3.0.a0 +- libexpat >=2.8.1,<3.0a0 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 +- libgcc >=14 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +size: 280882 +timestamp: 1779421631622 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 +md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 +depends: +- python >=3.10 +- hyperframe >=6.1,<7 +- hpack >=4.1,<5 +- python +license: MIT +license_family: MIT +size: 95967 +timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba +md5: 0a802cb9888dd14eeefc611f05c40b6e +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 30731 +timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d +md5: 7fe569c10905402ed47024fc481bb371 +depends: +- __unix +- python >=3.9 +license: MIT +license_family: MIT +size: 73563 +timestamp: 1733928021866 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +sha256: 6c4343b376d0b12a4c75ab992640970d36c933cad1fd924f6a1181fa91710e80 +md5: daddf757c3ecd6067b9af1df1f25d89e +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 67994 +timestamp: 1766267728652 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 +md5: 8e6923fc12f1fe8f8c4e5c9f343256ac +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 17397 +timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda +sha256: 3d25f9f6f7ab3e1ce6429fc8c8aae0335cf446692e715068488536d220cc43de +md5: 1b9083b7f00609605d1483dbc6071a81 +depends: +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 62642 +timestamp: 1779294335905 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda +sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8 +md5: ffc17e785d64e12fc311af9184221839 +depends: +- python >=3.10 +- zipp >=3.20 +- python +license: Apache-2.0 +size: 34766 +timestamp: 1779714582554 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b +md5: 04558c96691bed63104678757beb4f8d +depends: +- markupsafe >=2.0 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 120685 +timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 +md5: ada41c863af263cc4c5fcbaff7c3e4dc +depends: +- attrs >=22.2.0 +- jsonschema-specifications >=2023.3.6 +- python >=3.10 +- referencing >=0.28.4 +- rpds-py >=0.25.0 +- python +license: MIT +license_family: MIT +size: 82356 +timestamp: 1767839954256 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 +md5: 439cd0f567d697b20a8f45cb70a1005a +depends: +- python >=3.10 +- referencing >=0.31.0 +- python +license: MIT +license_family: MIT +size: 19236 +timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2 +sha256: 7f243680ca03eba7457b7a48f93a9440ba8181a8eac20a3eb5ef165ab6c96664 +md5: b3723b235b0758abaae8c82ce4d80146 +depends: +- __glibc >=2.17,<3.0.a0 +- expat >=2.2.10,<3.0.0a0 +- fontconfig +- fonts-conda-forge +- libgcc-ng >=9.3.0 +- mathjax 2.7.* +- nspr >=4.29,<5.0a0 +- nss >=3.62,<4.0a0 +- sqlite >=3.34.0,<4.0a0 +license: MIT +license_family: MIT +size: 62099926 +timestamp: 1615199463039 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda +sha256: eb89c6c39f2f6a93db55723dbb2f6bba8c8e63e6312bf1abf13e6e9ff45849c8 +md5: f92f984b558e6e6204014b16d212b271 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.4.1,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 251086 +timestamp: 1778079286384 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda +sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c +md5: 18335a698559cdbcd86150a48bf54ba6 +depends: +- __glibc >=2.17,<3.0.a0 +- zstd >=1.5.7,<1.6.0a0 +constrains: +- binutils_impl_linux-64 2.45.1 +license: GPL-3.0-only +license_family: GPL +size: 728002 +timestamp: 1774197446916 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 +md5: a752488c68f2e7c456bcbd8f16eec275 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 261513 +timestamp: 1773113328888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda +build_number: 7 +sha256: 081c850f99bc355821fac9c6e3727d40b3f8ce3beb50a5437cf03726b611ff39 +md5: 955b44e8b00b7f7ef4ce0130cef12394 +depends: +- libopenblas >=0.3.33,<0.3.34.0a0 +- libopenblas >=0.3.33,<1.0a0 +constrains: +- libcblas 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapack 3.11.0 7*_openblas +- liblapacke 3.11.0 7*_openblas +- mkl <2027 +license: BSD-3-Clause +license_family: BSD +size: 18716 +timestamp: 1778489854108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda +build_number: 7 +sha256: 956ae0bb1ec8b0c3663d75b151aceb0521b54e513bf97f621a035f9c87037970 +md5: 0675639dc24cb0032f199e7ff68e4633 +depends: +- libblas 3.11.0 7_h4a7cf45_openblas +constrains: +- liblapacke 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapack 3.11.0 7*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18675 +timestamp: 1778489861559 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 +md5: 6c77a605a7a689d17d4819c0f8ac9a00 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 73490 +timestamp: 1761979956660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda +sha256: 363018b25fdb5534c79783d912bd4b685a3547f4fc5996357ad548899b0ee8e7 +md5: 93764a5ca80616e9c10106cdaec92f74 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- expat 2.8.1.* +license: MIT +license_family: MIT +size: 77294 +timestamp: 1779278686680 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 +md5: a360c33a5abe61c07959e449fa1453eb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 58592 +timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 +md5: e289f3d17880e44b633ba911d57a321b +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8049 +timestamp: 1774298163029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d +md5: fb16b4b69e3f1dcfe79d80db8fd0c55d +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 384575 +timestamp: 1774298162622 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda +sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 +md5: 57736f29cc2b0ec0b6c2952d3f101b6a +depends: +- __glibc >=2.17,<3.0.a0 +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_19 +- libgomp 15.2.0 he0feb66_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 1041084 +timestamp: 1778269013026 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda +sha256: 9dcf54adfaa5e861123c2da4f2f0451a685464ea7e5a41ad91cf67b31d658d98 +md5: 331ee9b72b9dff570d56b1302c5ab37d +depends: +- libgcc 15.2.0 he0feb66_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27694 +timestamp: 1778269016987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda +sha256: 561a42758ef25b9ce308c4e2cf56daee4f06138385a17e29a492cd928e00be6f +md5: 42bf7eca1a951735fa06c0e3c0d5c8e6 +depends: +- libgfortran5 15.2.0 h68bc16d_19 +constrains: +- libgfortran-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27655 +timestamp: 1778269042954 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda +sha256: 057978bb69fea29ed715a9b98adf71015c31baecc4aeb2bfc20d4fd5d83579d4 +md5: 85072b0ad177c966294f129b7c04a2d5 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=15.2.0 +constrains: +- libgfortran 15.2.0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 2483673 +timestamp: 1778269025089 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda +sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b +md5: faac990cb7aedc7f3a2224f2c9b0c26c +depends: +- __glibc >=2.17,<3.0.a0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 603817 +timestamp: 1778268942614 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda +sha256: 10056646c28115b174de81a44e23e3a0a3b95b5347d2e6c45cc6d49d35294256 +md5: 6178c6f2fb254558238ef4e6c56fb782 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 633831 +timestamp: 1775962768273 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda +build_number: 7 +sha256: 96962084921f197c9ad13fb7f8b324f2351d50ff3d8d962148751ad532f54a01 +md5: 6569b4f273740e25dc0dc7e3232c2a6c +depends: +- libblas 3.11.0 7_h4a7cf45_openblas +constrains: +- liblapacke 3.11.0 7*_openblas +- libcblas 3.11.0 7*_openblas +- blas 2.307 openblas +license: BSD-3-Clause +license_family: BSD +size: 18694 +timestamp: 1778489869038 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda +sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d +md5: b88d90cad08e6bc8ad540cb310a761fb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- xz 5.8.3.* +license: 0BSD +size: 113478 +timestamp: 1775825492909 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda +sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 +md5: 2c21e66f50753a083cbe6b80f38268fa +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: BSD-2-Clause +license_family: BSD +size: 92400 +timestamp: 1769482286018 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda +sha256: 3d9aa85648e5e18a6d66db98b8c4317cc426721ad7a220aa86330d1ccedc8903 +md5: 2d3278b721e40468295ca755c3b84070 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libgfortran +- libgfortran5 >=14.3.0 +constrains: +- openblas >=0.3.33,<0.3.34.0a0 +license: BSD-3-Clause +license_family: BSD +size: 5931919 +timestamp: 1776993658641 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda +sha256: 377cfe037f3eeb3b1bf3ad333f724a64d32f315ee1958581fc671891d63d3f89 +md5: eba48a68a1a2b9d3c0d9511548db85db +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libzlib >=1.3.2,<2.0a0 +license: zlib-acknowledgement +size: 317729 +timestamp: 1776315175087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda +sha256: 54cdcd3214313b62c2a8ee277e6f42150d9b748264c1b70d958bf735e420ef8d +md5: 7dc38adcbf71e6b38748e919e16e0dce +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libzlib >=1.3.2,<2.0a0 +license: blessing +size: 954962 +timestamp: 1777986471789 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda +sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc +md5: 5794b3bdc38177caf969dabd3af08549 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc 15.2.0 he0feb66_19 +constrains: +- libstdcxx-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5852044 +timestamp: 1778269036376 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 +md5: cd5a90476766d53e901500df9215e927 +depends: +- __glibc >=2.17,<3.0.a0 +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 435273 +timestamp: 1762022005702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda +sha256: 3f0edf1280e2f6684a986f821eaa3e123d2694a00b31b96ca0d4a4c12c129231 +md5: 7d0a66598195ef00b6efc55aefc7453b +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 40163 +timestamp: 1779118517630 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b +md5: aea31d2e5b1091feca96fcfe945c3cf9 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 429011 +timestamp: 1752159441324 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa +md5: 92ed62436b625154323d40d5f2f11dd7 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 395888 +timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 +md5: d87ff7921124eccd67248aa483c23fec +depends: +- __glibc >=2.17,<3.0.a0 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 63629 +timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b +md5: ba0a9221ce1063f31692c07370d062f3 +depends: +- importlib-metadata >=4.4 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 85893 +timestamp: 1770694658918 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f +md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 +depends: +- mdurl >=0.1,<1 +- python >=3.10 +license: MIT +license_family: MIT +size: 69017 +timestamp: 1778169663339 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda +sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf +md5: 9a17c4307d23318476d7fbf0fedc0cde +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- jinja2 >=3.0.0 +license: BSD-3-Clause +license_family: BSD +size: 27424 +timestamp: 1772445227915 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2 +sha256: 02fef69bde69db264a12f21386612262f545b6e3e68d8f1ccec19f3eaae58edf +md5: 86e69bd82c2a2c6fd29f5ab7e02b3691 +license: Apache-2.0 +license_family: Apache +size: 22281629 +timestamp: 1662784498331 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 +md5: 592132998493b3ff25fd7479396e8351 +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 14465 +timestamp: 1733255681319 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +sha256: e86033aa55a9e915e2d0957e770bdb81e3feb26a227d1adb17f9d6c528da6a71 +md5: cdb20309681ba3ce8f52c110e214d4f3 +depends: +- click +- coloredlogs +- humanize +- importlib-metadata +- jinja2 >=3.0.0 +- jsonschema +- markdown +- natsort +- numpy +- packaging +- pillow >=10.2.0 +- plotly >=5.18 +- polars >=1.34.0 +- polars-runtime-compat >=1.34.0 +- pyaml-env +- pydantic >=2.7.1 +- python >=3.9,!=3.14.1 +- python-dotenv +- python-kaleido 0.2.1 +- pyyaml >=4 +- requests +- rich >=10 +- rich-click +- spectra >=0.0.10 +- tiktoken +- tqdm +- typeguard >=4 +license: GPL-3.0-or-later +license_family: GPL3 +size: 4282188 +timestamp: 1779465338806 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda +sha256: 70f43d62450927d51673eecd8823e14f5b3cfebdb43cda1d502eba97162bab42 +md5: 6687827c332121727ce383919e1ec8c2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 284323 +timestamp: 1778929680962 +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 +md5: e941e85e273121222580723010bd4fa2 +depends: +- python >=3.9 +- python +license: MIT +license_family: MIT +size: 39262 +timestamp: 1770905275632 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda +sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 +md5: fc21868a1a5aacc937e7a18747acb8a5 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: X11 AND BSD-3-Clause +size: 918956 +timestamp: 1777422145199 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 +md5: a2c1eeadae7a309daed9d62c96012a2b +depends: +- python >=3.11 +- python +constrains: +- numpy >=1.25 +- scipy >=1.11.2 +- matplotlib-base >=3.8 +- pandas >=2.0 +license: BSD-3-Clause +license_family: BSD +size: 1587439 +timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda +sha256: e3664264bd936c357523b55c71ed5a30263c6ba278d726a75b1eb112e6fb0b64 +md5: e235d5566c9cc8970eb2798dd4ecf62f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: MPL-2.0 +license_family: MOZILLA +size: 228588 +timestamp: 1762348634537 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda +sha256: 44dd98ffeac859d84a6dcba79a2096193a42fc10b29b28a5115687a680dd6aea +md5: 567fbeed956c200c1db5782a424e58ee +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libsqlite >=3.51.0,<4.0a0 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +- nspr >=4.38,<5.0a0 +license: MPL-2.0 +license_family: MOZILLA +size: 2057773 +timestamp: 1763485556350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda +sha256: bc61ae892973751a6b0e6ecea57ed6d7053224bddcb007165d6ceb1d7344ad47 +md5: f49b5f950379e0b97c35ca97682f7c6a +depends: +- python +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- liblapack >=3.9.0,<4.0a0 +- python_abi 3.14.* *_cp314 +- libblas >=3.9.0,<4.0a0 +- libcblas >=3.9.0,<4.0a0 +constrains: +- numpy-base <0a0 +license: BSD-3-Clause +license_family: BSD +size: 8928909 +timestamp: 1779169198391 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda +sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d +md5: 11b3379b191f63139e29c0d19dee24cd +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libpng >=1.6.50,<1.7.0a0 +- libstdcxx >=14 +- libtiff >=4.7.1,<4.8.0a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-2-Clause +license_family: BSD +size: 355400 +timestamp: 1758489294972 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda +sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb +md5: da1b85b6a87e141f5140bb9924cecab0 +depends: +- __glibc >=2.17,<3.0.a0 +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3167099 +timestamp: 1775587756857 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda +sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 +md5: 4c06a92e74452cfa53623a81592e8934 +depends: +- python >=3.8 +- python +license: Apache-2.0 +license_family: APACHE +size: 91574 +timestamp: 1777103621679 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda +sha256: 123d8a7c16c88658b4f29e9f115a047598c941708dade74fbaff373a32dbec5e +md5: 76c4757c0ec9d11f969e8eb44899307b +depends: +- python +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libtiff >=4.7.1,<4.8.0a0 +- openjpeg >=2.5.4,<3.0a0 +- libxcb >=1.17.0,<2.0a0 +- libwebp-base >=1.6.0,<2.0a0 +- zlib-ng >=2.3.3,<2.4.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- python_abi 3.14.* *_cp314 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 +- lcms2 >=2.18,<3.0a0 +- tk >=8.6.13,<8.7.0a0 +license: HPND +size: 1082797 +timestamp: 1775060059882 +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 +md5: 3e9427ee186846052e81fadde8ebe96a +depends: +- narwhals >=1.15.1 +- packaging +- python >=3.10 +constrains: +- ipywidgets >=7.6 +license: MIT +license_family: MIT +size: 5251872 +timestamp: 1772628857717 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +sha256: 70fc56877c4a095ee658d61924d8019768fbae4a48437058d181fc94b0a7c4d8 +md5: 25a883fed9f1f3f21ff317a3e7c92ac4 +depends: +- polars-runtime-32 ==1.41.0 +- python >=3.10 +- python +constrains: +- numpy >=1.16.0 +- pyarrow >=7.0.0 +- fastexcel >=0.9 +- openpyxl >=3.0.0 +- xlsx2csv >=0.8.0 +- connectorx >=0.3.2 +- deltalake >=1.0.0 +- pyiceberg >=0.7.1 +- altair >=5.4.0 +- great_tables >=0.8.0 +- polars-runtime-32 ==1.41.0 +- polars-runtime-64 ==1.41.0 +- polars-runtime-compat ==1.41.0 +license: MIT +size: 539656 +timestamp: 1779630790562 +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.41.0-py310h49dadd8_0.conda +noarch: python +sha256: e51ee3fe5259f2e115b2f78f8fbe3554e419c7c82b0c110878e12a5ff95ce3ab +md5: 7682765a1588e5ac887c99736d297c93 +depends: +- python +- __glibc >=2.17,<3.0.a0 +- libstdcxx >=14 +- libgcc >=14 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +size: 42578921 +timestamp: 1779630790562 +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.41.0-py310hcbd6021_0.conda +noarch: python +sha256: 29c3831c92394af11d9f7d04882dda9479ffbb76a3d36ba155d52159d67805fa +md5: cb0b620c9914a07a9022cb8b183ea9ee +depends: +- python +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +size: 41864944 +timestamp: 1779630722548 +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +sha256: 4ce2e1ee31a6217998f78c31ce7dc0a3e0557d9238b51d49dd20c52d467a126d +md5: f2c23a77b25efcad57d377b34bd84941 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 593603 +timestamp: 1769710381284 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 +md5: b3c17d95b5a10c6e64a21fa17573e70e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: MIT +license_family: MIT +size: 8252 +timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +sha256: 58994e0d2ea8584cb399546e6f6896d771995e6121d1a7b6a2c9948388358932 +md5: e17be1016bcc3516827b836cd3e4d9dc +depends: +- python >=3.9 +- pyyaml >=5.0,<=7.0 +license: MIT +license_family: MIT +size: 14645 +timestamp: 1736766960536 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +sha256: 69700e31165df070e9716315e042196aa92525dae5deb5107785847ab9f4189f +md5: 729843edafc0899b3348bd3f19525b9d +depends: +- typing-inspection >=0.4.2 +- typing_extensions >=4.14.1 +- python >=3.10 +- annotated-types >=0.6.0 +- pydantic-core ==2.46.4 +- python +license: MIT +license_family: MIT +size: 346511 +timestamp: 1778103405862 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.4-py314h2e6c369_0.conda +sha256: 802e216c39f1359aed60823b6e11d8ccd812b0ae1c81ae5ac1c81f99446409ab +md5: 0c96993dbeadf3a277cf757b9f1c9412 +depends: +- python +- typing-extensions >=4.6.0,!=4.7.0 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 1895020 +timestamp: 1778084229247 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda +sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 +md5: 16c18772b340887160c79a6acc022db0 +depends: +- python >=3.10 +license: BSD-2-Clause +license_family: BSD +size: 893031 +timestamp: 1774796815820 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 +md5: 461219d1a5bd61342293efa2c0c90eac +depends: +- __unix +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 21085 +timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda +build_number: 100 +sha256: 55eed9bf2a3f6e90311276f0834737fe7c2d9ec3e5e2e557507858df4c7521e6 +md5: da92e59ff92f2d5ede4f612af20f583f +depends: +- __glibc >=2.17,<3.0.a0 +- bzip2 >=1.0.8,<2.0a0 +- ld_impl_linux-64 >=2.36.1 +- libexpat >=2.8.0,<3.0a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- liblzma >=5.8.3,<6.0a0 +- libmpdec >=4.0.0,<5.0a0 +- libsqlite >=3.53.1,<4.0a0 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 +- openssl >=3.5.6,<4.0a0 +- python_abi 3.14.* *_cp314 +- readline >=8.3,<9.0a0 +- tk >=8.6.13,<8.7.0a0 +- tzdata +- zstd >=1.5.7,<1.6.0a0 +license: Python-2.0 +size: 36745188 +timestamp: 1779236923603 +python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 +md5: 130584ad9f3a513cdd71b1fdc1244e9c +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 27848 +timestamp: 1772388605021 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda +sha256: 41dd7da285d71d519257fa7dacb1cae060d5ebfaa5f92cba5994899d2978e943 +md5: 41954747ba952ec4b01e16c2c9e8d8ff +depends: +- cpython 3.14.5.* +- python_abi * *_cp314 +license: Python-2.0 +size: 50212 +timestamp: 1779236703009 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 +sha256: e17bf63a30aec33432f1ead86e15e9febde9fc40a7f869c0e766be8d2db44170 +md5: 310259a5b03ff02289d7705f39e2b1d2 +depends: +- kaleido-core 0.2.1.* +- python >=3.5 +license: MIT +license_family: MIT +size: 18320 +timestamp: 1615204747600 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +build_number: 8 +sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 +md5: 0539938c55b6b1a59b560e843ad864a4 +constrains: +- python 3.14.* *_cp314 +license: BSD-3-Clause +license_family: BSD +size: 6989 +timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda +sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d +md5: 2035f68f96be30dc60a5dfd7452c7941 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- yaml >=0.2.5,<0.3.0a0 +license: MIT +license_family: MIT +size: 202391 +timestamp: 1770223462836 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda +sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 +md5: d7d95fc8287ea7bf33e0e7116d2b95ec +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-3.0-only +license_family: GPL +size: 345073 +timestamp: 1765813471974 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 +md5: 870293df500ca7e18bedefa5838a22ab +depends: +- attrs >=22.2.0 +- python >=3.10 +- rpds-py >=0.7.0 +- typing_extensions >=4.4.0 +- python +license: MIT +license_family: MIT +size: 51788 +timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.5.9-py314h5bd0f2a_0.conda +sha256: c7a4aca4977c15c82d053b06cbc676460974c1b25757cfeea8a9a2497ac911f8 +md5: 9dd235b6ac69a0198080dac39f9891aa +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +license: Apache-2.0 AND CNRI-Python +license_family: PSF +size: 413611 +timestamp: 1778374155646 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da +md5: 4a85203c1d80c1059086ae860836ffb9 +depends: +- python >=3.10 +- certifi >=2023.5.7 +- charset-normalizer >=2,<4 +- idna >=2.5,<4 +- urllib3 >=1.26,<3 +- python +constrains: +- chardet >=3.0.2,<8 +license: Apache-2.0 +license_family: APACHE +size: 68709 +timestamp: 1778851103479 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a +md5: 0242025a3c804966bf71aa04eee82f66 +depends: +- markdown-it-py >=2.2.0 +- pygments >=2.13.0,<3.0.0 +- python >=3.10 +- typing_extensions >=4.0.0,<5.0.0 +- python +license: MIT +license_family: MIT +size: 208577 +timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 +md5: 0c20a8ebcddb24a45da89d5e917e6cb9 +depends: +- python >=3.10 +- rich >=12 +- click >=8 +- typing-extensions >=4 +- __unix +- python +license: MIT +license_family: MIT +size: 64356 +timestamp: 1769850479089 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda +sha256: e53b0cbf3b324eaa03ca1fe1a688fdf4ab42cea9c25270b0a7307d8aaaa4f446 +md5: c1c368b5437b0d1a68f372ccf01cb133 +depends: +- python +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 376121 +timestamp: 1764543122774 +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +sha256: 7c65782d2511738e62c70462e89d65da4fa54d5a7e47c46667bcd27a59f81876 +md5: 472239e4eb7b5a84bb96b3ed7e3a596a +depends: +- colormath >=3.0.0 +- python >=3.9 +license: MIT +license_family: MIT +size: 22284 +timestamp: 1735770589188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda +sha256: d167fa92781bcdcd3b9aaa6bb1cd50c5b108f6190c170098a118b5cf5df2f881 +md5: 8e0b8654ead18e50af552e54b5a08a61 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libsqlite 3.53.1 h0c1763c_0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 +- readline >=8.3,<9.0a0 +license: blessing +size: 205399 +timestamp: 1777986477546 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda +sha256: 7e395d67fd249d901beb1ae269057763c0d8c3ee5f7a348694bdb16d158a37d9 +md5: d705f9d8a1185a2b01cced191177a028 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- regex >=2022.1.18 +- requests >=2.26.0 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 939648 +timestamp: 1764028306357 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda +sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac +md5: cffd3bdd58090148f4cfcd831f4b26ab +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +constrains: +- xorg-libx11 >=1.8.12,<2.0a0 +license: TCL +license_family: BSD +size: 3301196 +timestamp: 1769460227866 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 +md5: e5ce43272193b38c2e9037446c1d9206 +depends: +- python >=3.10 +- __unix +- python +license: MPL-2.0 and MIT +size: 94132 +timestamp: 1770153424136 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +sha256: 59d7851d32fddb5b510272e6557aa982edeb927d349648dac27f5bf01d18bb26 +md5: 4460f039b7dedf15f7df086446ca75ae +depends: +- typing_extensions >=4.14.0 +- python >=3.10 +- importlib-metadata >=3.6 +- python +constrains: +- pytest >=7 +license: MIT +license_family: MIT +size: 38297 +timestamp: 1778779291237 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c +md5: edd329d7d3a4ab45dcf905899a7a6115 +depends: +- typing_extensions ==4.15.0 pyhcf101f3_0 +license: PSF-2.0 +license_family: PSF +size: 91383 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +sha256: 8b90d2f19f9458b8c58a55e1fcdc1d90c1603a847a47654d8a454549413ba60a +md5: 53f5409c5cfd6c5a66417d68e3f0a864 +depends: +- python >=3.10 +- typing_extensions >=4.12.0 +- python +license: MIT +license_family: MIT +size: 20935 +timestamp: 1777105465795 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 +md5: 0caa1af407ecff61170c9437a808404d +depends: +- python >=3.10 +- python +license: PSF-2.0 +license_family: PSF +size: 51692 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c +md5: ad659d0a2b3e47e38d829aa8cad2d610 +license: LicenseRef-Public-Domain +size: 119135 +timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda +sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 +md5: cbb88288f74dbe6ada1c6c7d0a97223e +depends: +- backports.zstd >=1.0.0 +- brotli-python >=1.2.0 +- h2 >=4,<5 +- pysocks >=1.5.6,<2.0,!=1.5.7 +- python >=3.10 +license: MIT +license_family: MIT +size: 103560 +timestamp: 1778188657149 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b +md5: b2895afaf55bf96a8c8282a2e47a5de0 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 15321 +timestamp: 1762976464266 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 +md5: 1dafce8548e38671bea82e3f5c6ce22f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 20591 +timestamp: 1762976546182 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda +sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad +md5: a77f85f77be52ff59391544bfe73390a +depends: +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +license: MIT +license_family: MIT +size: 85189 +timestamp: 1753484064210 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 +md5: ba3dcdc8584155c97c648ae9c044b7a3 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 24190 +timestamp: 1779159948016 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda +sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f +md5: 2aadb0d17215603a82a2a6b0afd9a4cb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: Zlib +license_family: Other +size: 122618 +timestamp: 1770167931827 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 +md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 +depends: +- __glibc >=2.17,<3.0.a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 601375 +timestamp: 1764777111296 diff --git a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt new file mode 100644 index 00000000..3d5b93db --- /dev/null +++ b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt @@ -0,0 +1,1476 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-aarch64: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.8.1-hfae3067_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.0-hba86a56_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-7_haddc8a3_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-7_hd72aa62_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-7_h88aeb00_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.33-pthreads_h9d3fd7e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.1-h1022ec0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py314he1698a1_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.2.0-py314hac3e5ec_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.41.0-py310h32c7c23_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.41.0-py310hc0e61be_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.46.4-py314h451b6cc_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.5-hfd9ac0a_100_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.5.9-py314h51f160d_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.1-he8854b5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 +md5: 468fd3bb9e1f671d36c2cbc677e56f1d +depends: +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28926 +timestamp: 1770939656741 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 +md5: aaa2a381ccc56eac91d63b6c1240312f +depends: +- cpython +- python-gil +license: MIT +license_family: MIT +size: 8191 +timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 +md5: 2934f256a8acfe48f6ebb4fce6cde29c +depends: +- python >=3.9 +- typing-extensions >=4.0.0 +license: MIT +license_family: MIT +size: 18074 +timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab +md5: c6b0543676ecb1fb2d7643941fe375f2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 64927 +timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda +noarch: generic +sha256: a1c97297e867776760489537bc5ae36fa83a154be30e3b79385a39ca4cb058fe +md5: 1133126d840e75287d83947be3fc3e71 +depends: +- python >=3.14 +license: BSD-3-Clause AND MIT AND EPL-2.0 +size: 7533 +timestamp: 1778594057496 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda +sha256: 5a5b0cdcd7ed89c6a8fb830924967f6314a2b71944bc1ebc2c105781ba97aa75 +md5: a1b5c571a0923a205d663d8678df4792 +depends: +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python >=3.14,<3.15.0a0 *_cp314 +- python_abi 3.14.* *_cp314 +constrains: +- libbrotlicommon 1.2.0 he30d5cf_1 +license: MIT +license_family: MIT +size: 373193 +timestamp: 1764017486851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c +md5: 840d8fc0d7b3209be93080bc20e07f2d +depends: +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 192412 +timestamp: 1771350241232 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda +sha256: 9812a303a1395e1dafbd92e5bc8a1ff6013bcbba0a09c7f03a8d23e43560aa9b +md5: 489b8e97e666c93f68fdb35c3c9b957f +depends: +- __unix +license: ISC +size: 129868 +timestamp: 1779289852439 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda +sha256: 645655a3510e38e625da136595f3f16f2130c3263630cc3bc8f60f619ddbe490 +md5: 9fefff2f745ea1cc2ef15211a20c054a +depends: +- python >=3.10 +license: ISC +size: 134201 +timestamp: 1779285131141 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda +sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 +md5: a9167b9571f3baa9d448faa2139d1089 +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 58872 +timestamp: 1775127203018 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda +sha256: 99ab8ef815c4520cce3a7482c2513f377c14348206857661d84c76a55e030f97 +md5: 003767c47f1f0a474c4de268b57839c3 +depends: +- __unix +- python +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 104631 +timestamp: 1779108494556 +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 +md5: b866ff7007b934d564961066c8195983 +depends: +- humanfriendly >=9.1 +- python >=3.9 +license: MIT +license_family: MIT +size: 43758 +timestamp: 1733928076798 +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +sha256: 59c9e29800b483b390467f90e82b0da3a4fbf0612efe1c90813fca232780e160 +md5: 071cf7b0ce333c81718b054066c15102 +depends: +- networkx >=2.0 +- numpy +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 39326 +timestamp: 1735759976140 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda +noarch: generic +sha256: 777882d2685f368417f31bbe1b28f73687fc6c8f6a5768bda20ffeefa6b07f5b +md5: a749029ce5d0632a913db19d17f944ab +depends: +- python >=3.14,<3.15.0a0 +- python_abi * *_cp314 +license: Python-2.0 +size: 50212 +timestamp: 1779236682725 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.8.1-hfae3067_0.conda +sha256: a9cd5eb1700e11cc39acc36630a2d72a4e317943bd7c5695cd8804419f04ff42 +md5: 89f0247b3cea528d8ad1a6664a313153 +depends: +- libexpat 2.8.1 hfae3067_0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 140114 +timestamp: 1779278679081 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.0-hba86a56_0.conda +sha256: 1805f4ab3d9e1734a5a17abccc2cb0fdade51d4d5f29bdc410600ea0115ec050 +md5: b660d59a9d0fb3297327418624acaec3 +depends: +- libexpat >=2.8.1,<3.0a0 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 +- libgcc >=14 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +size: 293348 +timestamp: 1779421661332 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 +md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 +depends: +- python >=3.10 +- hyperframe >=6.1,<7 +- hpack >=4.1,<5 +- python +license: MIT +license_family: MIT +size: 95967 +timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba +md5: 0a802cb9888dd14eeefc611f05c40b6e +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 30731 +timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d +md5: 7fe569c10905402ed47024fc481bb371 +depends: +- __unix +- python >=3.9 +license: MIT +license_family: MIT +size: 73563 +timestamp: 1733928021866 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +sha256: 6c4343b376d0b12a4c75ab992640970d36c933cad1fd924f6a1181fa91710e80 +md5: daddf757c3ecd6067b9af1df1f25d89e +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 67994 +timestamp: 1766267728652 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 +md5: 8e6923fc12f1fe8f8c4e5c9f343256ac +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 17397 +timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda +sha256: 3d25f9f6f7ab3e1ce6429fc8c8aae0335cf446692e715068488536d220cc43de +md5: 1b9083b7f00609605d1483dbc6071a81 +depends: +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 62642 +timestamp: 1779294335905 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda +sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8 +md5: ffc17e785d64e12fc311af9184221839 +depends: +- python >=3.10 +- zipp >=3.20 +- python +license: Apache-2.0 +size: 34766 +timestamp: 1779714582554 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b +md5: 04558c96691bed63104678757beb4f8d +depends: +- markupsafe >=2.0 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 120685 +timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 +md5: ada41c863af263cc4c5fcbaff7c3e4dc +depends: +- attrs >=22.2.0 +- jsonschema-specifications >=2023.3.6 +- python >=3.10 +- referencing >=0.28.4 +- rpds-py >=0.25.0 +- python +license: MIT +license_family: MIT +size: 82356 +timestamp: 1767839954256 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 +md5: 439cd0f567d697b20a8f45cb70a1005a +depends: +- python >=3.10 +- referencing >=0.31.0 +- python +license: MIT +license_family: MIT +size: 19236 +timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2 +sha256: d3c7f4797566e6f983d16c2a87063a18e4b2d819a66230190a21584d70042755 +md5: 4f0d284f5d11e04277b552eb1c172c7f +depends: +- __glibc >=2.17,<3.0.a0 +- expat >=2.2.10,<3.0.0a0 +- fontconfig +- fonts-conda-forge +- libgcc-ng >=9.3.0 +- mathjax 2.7.* +- nspr >=4.29,<5.0a0 +- nss >=3.62,<4.0a0 +- sqlite >=3.34.0,<4.0a0 +license: MIT +license_family: MIT +size: 65750397 +timestamp: 1615199465742 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_0.conda +sha256: 1e5f68e4b36a0e1a278c6dc026bc3d7775518a15832cbc9d7fc1c0e4c47784b1 +md5: b1f8bee3c53a6d2c103fb4a1ae44f5c4 +depends: +- libgcc >=14 +- libjpeg-turbo >=3.1.4.1,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 296899 +timestamp: 1778079402392 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda +sha256: 7abd913d81a9bf00abb699e8987966baa2065f5132e37e815f92d90fc6bba530 +md5: a21644fc4a83da26452a718dc9468d5f +depends: +- zstd >=1.5.7,<1.6.0a0 +constrains: +- binutils_impl_linux-aarch64 2.45.1 +license: GPL-3.0-only +license_family: GPL +size: 875596 +timestamp: 1774197520746 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +sha256: 8957fd460c1c132c8031f65fd5f56ec3807fd71b7cab2c5e2b0937b13404ab36 +md5: d13423b06447113a90b5b1366d4da171 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 240444 +timestamp: 1773114901155 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-7_haddc8a3_openblas.conda +build_number: 7 +sha256: f27ba323c2f1e1731b5e880fe520f178f55047f25be94f77e649605b2343c066 +md5: e8d07b777f6ff1fab69665336561910b +depends: +- libopenblas >=0.3.33,<0.3.34.0a0 +- libopenblas >=0.3.33,<1.0a0 +constrains: +- liblapack 3.11.0 7*_openblas +- libcblas 3.11.0 7*_openblas +- mkl <2027 +- blas 2.307 openblas +- liblapacke 3.11.0 7*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18696 +timestamp: 1778489796402 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-7_hd72aa62_openblas.conda +build_number: 7 +sha256: c8f0192362966df0828419f042d6f94c079e5df00ad6bd05b5e84c12b42f8cc7 +md5: 90ac57b82c055faa9be25031864b7d8f +depends: +- libblas 3.11.0 7_haddc8a3_openblas +constrains: +- liblapack 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapacke 3.11.0 7*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18664 +timestamp: 1778489802790 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +sha256: 48814b73bd462da6eed2e697e30c060ae16af21e9fbed30d64feaf0aad9da392 +md5: a9138815598fe6b91a1d6782ca657b0c +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 71117 +timestamp: 1761979776756 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_0.conda +sha256: 1fc392b997c6ee2bd3226a7cd870d0edbcbb367e25f9f18dd4a7025fced6efc0 +md5: 513dd884361dfb8a554298ed69b58823 +depends: +- libgcc >=14 +constrains: +- expat 2.8.1.* +license: MIT +license_family: MIT +size: 77140 +timestamp: 1779278671302 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 +md5: 2f364feefb6a7c00423e80dcb12db62a +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 55952 +timestamp: 1769456078358 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +sha256: 752e4f66283d7deb4c6fd47d88df644d8daa2aaa825a54f3bf350a625190192a +md5: a229e22d4d8814a07702b0919d8e6701 +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8125 +timestamp: 1774301094057 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +sha256: 8e6b27fe4eec4c2fa7b7769a21973734c8dba1de80086fb0213e58375ac09f4c +md5: b99ed99e42dafb27889483b3098cace7 +depends: +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 422941 +timestamp: 1774301093473 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda +sha256: 4592b096e553f67799ae70d4b6167eeda3ec74587d68c7aecbf4e7b1df136681 +md5: f35b3f52d0a2ec4ffe3c89ba135cdb9a +depends: +- _openmp_mutex >=4.5 +constrains: +- libgomp 15.2.0 h8acb6b2_19 +- libgcc-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 622462 +timestamp: 1778268755949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_19.conda +sha256: 1137f93f477f56199ded24117430045a0c02cbe8b10031beac3b9ad2138539d3 +md5: 770cf892e5530f43e63cadc673e85653 +depends: +- libgcc 15.2.0 h8acb6b2_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27738 +timestamp: 1778268759211 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_19.conda +sha256: e5ad94be72634233510b33ba792a3339921bd468f0b8bc6961ea05eded251d9b +md5: c7a5b5decf969ead5ecada83654164cf +depends: +- libgfortran5 15.2.0 h1b7bec0_19 +constrains: +- libgfortran-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27728 +timestamp: 1778268784621 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_19.conda +sha256: af8e9bdcaa77f133a8ee4c1ef57ef564d9c45aa262abf9f5ef9b50eb99d96407 +md5: 779dbb494de6d3d6477cab52eb34285a +depends: +- libgcc >=15.2.0 +constrains: +- libgfortran 15.2.0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 1487244 +timestamp: 1778268767295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda +sha256: 2370ef0ffcbae5bede3c4bf136add4abc257245eb91f724c99bb4a43116c5a83 +md5: c5e8a379c4a2ec2aea4ba22758c001d9 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 587387 +timestamp: 1778268674393 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda +sha256: e97ec2af5f09f8f6ea8ecd550055c95ae80fae22015fcfadaa94eafe025c9ccc +md5: a85ba48648f6868016f2741fd9170250 +depends: +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 693143 +timestamp: 1775962625956 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-7_h88aeb00_openblas.conda +build_number: 7 +sha256: 20b38a0156200ac65f597bf0a93914c565435f2cc58b1042581854231a99ac35 +md5: 5899cbd743cc74fd655c1ed2af7120f3 +depends: +- libblas 3.11.0 7_haddc8a3_openblas +constrains: +- libcblas 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapacke 3.11.0 7*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18685 +timestamp: 1778489809140 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda +sha256: d61962b9cd54c3554361550203c64d5b65b71e3058a285b66e4b04b9769f0a5c +md5: 76298a9e6d71ee6e832a8d0d7373b261 +depends: +- libgcc >=14 +constrains: +- xz 5.8.3.* +license: 0BSD +size: 126102 +timestamp: 1775828008518 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda +sha256: 57c0dd12d506e84541c4e877898bd2a59cca141df493d34036f18b2751e0a453 +md5: 7b9813e885482e3ccb1fa212b86d7fd0 +depends: +- libgcc >=14 +license: BSD-2-Clause +license_family: BSD +size: 114056 +timestamp: 1769482343003 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.33-pthreads_h9d3fd7e_0.conda +sha256: b018ecfb05e75a8eea3f21f6b5c5c2a54b5178bdcf19e2e2df2735740214a8c8 +md5: 58a66cd95e9692f08abe89f55a6f3f12 +depends: +- libgcc >=14 +- libgfortran +- libgfortran5 >=14.3.0 +constrains: +- openblas >=0.3.33,<0.3.34.0a0 +license: BSD-3-Clause +license_family: BSD +size: 5121336 +timestamp: 1776993423004 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda +sha256: 483eaa53da40a6a3e558709d9f7b1ca388735364ae21a1ba58cf942514649c92 +md5: f51503ac45a4888bce71af9027a2ecc9 +depends: +- libgcc >=14 +- libzlib >=1.3.2,<2.0a0 +license: zlib-acknowledgement +size: 341202 +timestamp: 1776315188425 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda +sha256: ad03b7d8e4d08001f0df88ee7a56108bb35bae4795a42b9a04cc1abfa822bd07 +md5: 2ec1119217d8f0d086e9a62f3cb0e5ea +depends: +- libgcc >=14 +- libzlib >=1.3.2,<2.0a0 +license: blessing +size: 955361 +timestamp: 1777986487553 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda +sha256: 1dadc45e599f510dd5f97141dddcdbb9844d9f1430c1f3a38075cf1c58f87b4e +md5: 543fbc8d71f2a0baf04cf88ce96cb8bb +depends: +- libgcc 15.2.0 h8acb6b2_19 +constrains: +- libstdcxx-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5546559 +timestamp: 1778268777463 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +sha256: 7ff79470db39e803e21b8185bc8f19c460666d5557b1378d1b1e857d929c6b39 +md5: 8c6fd84f9c87ac00636007c6131e457d +depends: +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 488407 +timestamp: 1762022048105 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.1-h1022ec0_0.conda +sha256: 1628839b062e98b2192857d4da8496ac9ac6b0dbb77aa040c34efc9192c440ee +md5: 0f42f9fedd2a32d798de95a7f65c456f +depends: +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 43453 +timestamp: 1779118526838 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +sha256: b03700a1f741554e8e5712f9b06dd67e76f5301292958cd3cb1ac8c6fdd9ed25 +md5: 24e92d0942c799db387f5c9d7b81f1af +depends: +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 359496 +timestamp: 1752160685488 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b +md5: cd14ee5cca2464a425b1dbfc24d90db2 +depends: +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 397493 +timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f +md5: 502006882cf5461adced436e410046d1 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 69833 +timestamp: 1774072605429 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b +md5: ba0a9221ce1063f31692c07370d062f3 +depends: +- importlib-metadata >=4.4 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 85893 +timestamp: 1770694658918 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f +md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 +depends: +- mdurl >=0.1,<1 +- python >=3.10 +license: MIT +license_family: MIT +size: 69017 +timestamp: 1778169663339 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda +sha256: 383c188496d13a55658c06e61e7d4cdff2c9f9d5a0648769fca8250bece7e0ef +md5: e5de3c36dd548b35ff2a8aa49208dcb3 +depends: +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- jinja2 >=3.0.0 +license: BSD-3-Clause +license_family: BSD +size: 27913 +timestamp: 1772446407659 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2 +sha256: 8fd4c79d6eda3d4cba73783114305a53a154ada4d1e334d4e02cb3521429599b +md5: 7b08314a6867a9d5648a1c3265e9eb8e +license: Apache-2.0 +license_family: Apache +size: 22257008 +timestamp: 1662784555011 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 +md5: 592132998493b3ff25fd7479396e8351 +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 14465 +timestamp: 1733255681319 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +sha256: e86033aa55a9e915e2d0957e770bdb81e3feb26a227d1adb17f9d6c528da6a71 +md5: cdb20309681ba3ce8f52c110e214d4f3 +depends: +- click +- coloredlogs +- humanize +- importlib-metadata +- jinja2 >=3.0.0 +- jsonschema +- markdown +- natsort +- numpy +- packaging +- pillow >=10.2.0 +- plotly >=5.18 +- polars >=1.34.0 +- polars-runtime-compat >=1.34.0 +- pyaml-env +- pydantic >=2.7.1 +- python >=3.9,!=3.14.1 +- python-dotenv +- python-kaleido 0.2.1 +- pyyaml >=4 +- requests +- rich >=10 +- rich-click +- spectra >=0.0.10 +- tiktoken +- tqdm +- typeguard >=4 +license: GPL-3.0-or-later +license_family: GPL3 +size: 4282188 +timestamp: 1779465338806 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda +sha256: 70f43d62450927d51673eecd8823e14f5b3cfebdb43cda1d502eba97162bab42 +md5: 6687827c332121727ce383919e1ec8c2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 284323 +timestamp: 1778929680962 +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 +md5: e941e85e273121222580723010bd4fa2 +depends: +- python >=3.9 +- python +license: MIT +license_family: MIT +size: 39262 +timestamp: 1770905275632 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda +sha256: 369db85c5cd8d99dde364ce70725d76511d9c8199e5b820c740414091bf5bcca +md5: b2a43456aa56fe80c2477a5094899eff +depends: +- libgcc >=14 +license: X11 AND BSD-3-Clause +size: 960036 +timestamp: 1777422174534 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 +md5: a2c1eeadae7a309daed9d62c96012a2b +depends: +- python >=3.11 +- python +constrains: +- numpy >=1.25 +- scipy >=1.11.2 +- matplotlib-base >=3.8 +- pandas >=2.0 +license: BSD-3-Clause +license_family: BSD +size: 1587439 +timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda +sha256: 78a06e89285fef242e272998b292c1e621e3ee3dd4fba62ec014e503c7ec118f +md5: 6dd4f07147774bf720075a210f8026b9 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: MPL-2.0 +license_family: MOZILLA +size: 235140 +timestamp: 1762350120355 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda +sha256: 48942696889367ffd448f8dccfc080fb7e130b9938a4a3b6b20ef8e6af856463 +md5: 4540f9570d12db2150f42ba036154552 +depends: +- libgcc >=14 +- libsqlite >=3.51.0,<4.0a0 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +- nspr >=4.38,<5.0a0 +license: MPL-2.0 +license_family: MOZILLA +size: 2061869 +timestamp: 1763490303490 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py314he1698a1_0.conda +sha256: 04af718b911f8a3a0095481c7e283aa081a175fe626eccbc2c5644bcb2aba9a1 +md5: 8b173772deea177b45d2a133b509b3f7 +depends: +- python +- libstdcxx >=14 +- libgcc >=14 +- python_abi 3.14.* *_cp314 +- libblas >=3.9.0,<4.0a0 +- liblapack >=3.9.0,<4.0a0 +- libcblas >=3.9.0,<4.0a0 +constrains: +- numpy-base <0a0 +license: BSD-3-Clause +license_family: BSD +size: 8002900 +timestamp: 1779169206742 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda +sha256: bd1bc8bdde5e6c5cbac42d462b939694e40b59be6d0698f668515908640c77b8 +md5: cea962410e327262346d48d01f05936c +depends: +- libgcc >=14 +- libpng >=1.6.50,<1.7.0a0 +- libstdcxx >=14 +- libtiff >=4.7.1,<4.8.0a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-2-Clause +license_family: BSD +size: 392636 +timestamp: 1758489353577 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda +sha256: 348cb74c1530ac241215d047ef65d134cf797af935c97a68655319362b7e6a01 +md5: 3b129669089e4d6a5c6871dbb4669b99 +depends: +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3706406 +timestamp: 1775589602258 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda +sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 +md5: 4c06a92e74452cfa53623a81592e8934 +depends: +- python >=3.8 +- python +license: Apache-2.0 +license_family: APACHE +size: 91574 +timestamp: 1777103621679 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.2.0-py314hac3e5ec_0.conda +sha256: 96b26c2657275ffe84ab510edf0865e21999d791485d12794edd4a71b837beb6 +md5: 87d58d103b47c4a8567b3d7666647684 +depends: +- python +- libgcc >=14 +- python 3.14.* *_cp314 +- openjpeg >=2.5.4,<3.0a0 +- libxcb >=1.17.0,<2.0a0 +- libwebp-base >=1.6.0,<2.0a0 +- zlib-ng >=2.3.3,<2.4.0a0 +- python_abi 3.14.* *_cp314 +- lcms2 >=2.18,<3.0a0 +- tk >=8.6.13,<8.7.0a0 +- libtiff >=4.7.1,<4.8.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 +license: HPND +size: 1062080 +timestamp: 1775060067775 +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 +md5: 3e9427ee186846052e81fadde8ebe96a +depends: +- narwhals >=1.15.1 +- packaging +- python >=3.10 +constrains: +- ipywidgets >=7.6 +license: MIT +license_family: MIT +size: 5251872 +timestamp: 1772628857717 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +sha256: 70fc56877c4a095ee658d61924d8019768fbae4a48437058d181fc94b0a7c4d8 +md5: 25a883fed9f1f3f21ff317a3e7c92ac4 +depends: +- polars-runtime-32 ==1.41.0 +- python >=3.10 +- python +constrains: +- numpy >=1.16.0 +- pyarrow >=7.0.0 +- fastexcel >=0.9 +- openpyxl >=3.0.0 +- xlsx2csv >=0.8.0 +- connectorx >=0.3.2 +- deltalake >=1.0.0 +- pyiceberg >=0.7.1 +- altair >=5.4.0 +- great_tables >=0.8.0 +- polars-runtime-32 ==1.41.0 +- polars-runtime-64 ==1.41.0 +- polars-runtime-compat ==1.41.0 +license: MIT +size: 539656 +timestamp: 1779630790562 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.41.0-py310h32c7c23_0.conda +noarch: python +sha256: d903b774ec09189e164207328aac157eee82fed8cc5c9ace46aeb5d1c15cb5b3 +md5: 8c08c506ed1ea8ce0ca37af5e918c58d +depends: +- python +- libgcc >=14 +- libstdcxx >=14 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +size: 38704429 +timestamp: 1779630794932 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.41.0-py310hc0e61be_0.conda +noarch: python +sha256: 101696adff43a654146376c62ef9611bf7946b95fa46f604fe247d77eefc6267 +md5: 65b73e4260677ee5162bdbb252e28e06 +depends: +- python +- libstdcxx >=14 +- libgcc >=14 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +size: 38651498 +timestamp: 1779630714016 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +sha256: e9cbcbc94e151ada3d6dc365380aaaf591f65012c16d9a2abaea4b9b90adc402 +md5: ab7288cc39545556d1bc5e71ab2df9a9 +depends: +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 636733 +timestamp: 1769712412683 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba +md5: bb5a90c93e3bac3d5690acf76b4a6386 +depends: +- libgcc >=13 +license: MIT +license_family: MIT +size: 8342 +timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +sha256: 58994e0d2ea8584cb399546e6f6896d771995e6121d1a7b6a2c9948388358932 +md5: e17be1016bcc3516827b836cd3e4d9dc +depends: +- python >=3.9 +- pyyaml >=5.0,<=7.0 +license: MIT +license_family: MIT +size: 14645 +timestamp: 1736766960536 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +sha256: 69700e31165df070e9716315e042196aa92525dae5deb5107785847ab9f4189f +md5: 729843edafc0899b3348bd3f19525b9d +depends: +- typing-inspection >=0.4.2 +- typing_extensions >=4.14.1 +- python >=3.10 +- annotated-types >=0.6.0 +- pydantic-core ==2.46.4 +- python +license: MIT +license_family: MIT +size: 346511 +timestamp: 1778103405862 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.46.4-py314h451b6cc_0.conda +sha256: 1a7c6b18e404c13c4d959888ecb48a9ed9de0e41be2872932b83a35278088df0 +md5: 9c3ace6aba6df14b943256095ac1281e +depends: +- python +- typing-extensions >=4.6.0,!=4.7.0 +- libgcc >=14 +- python 3.14.* *_cp314 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 1780773 +timestamp: 1778084251775 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda +sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 +md5: 16c18772b340887160c79a6acc022db0 +depends: +- python >=3.10 +license: BSD-2-Clause +license_family: BSD +size: 893031 +timestamp: 1774796815820 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 +md5: 461219d1a5bd61342293efa2c0c90eac +depends: +- __unix +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 21085 +timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.5-hfd9ac0a_100_cp314.conda +build_number: 100 +sha256: d37bad5447365346166c72950ea8f49689aa49cecc1b0623d00458427627b8df +md5: d956e09feb806f5974675ce92ad81d45 +depends: +- bzip2 >=1.0.8,<2.0a0 +- ld_impl_linux-aarch64 >=2.36.1 +- libexpat >=2.8.0,<3.0a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- liblzma >=5.8.3,<6.0a0 +- libmpdec >=4.0.0,<5.0a0 +- libsqlite >=3.53.1,<4.0a0 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 +- openssl >=3.5.6,<4.0a0 +- python_abi 3.14.* *_cp314 +- readline >=8.3,<9.0a0 +- tk >=8.6.13,<8.7.0a0 +- tzdata +- zstd >=1.5.7,<1.6.0a0 +license: Python-2.0 +size: 37510439 +timestamp: 1779236267040 +python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 +md5: 130584ad9f3a513cdd71b1fdc1244e9c +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 27848 +timestamp: 1772388605021 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda +sha256: 41dd7da285d71d519257fa7dacb1cae060d5ebfaa5f92cba5994899d2978e943 +md5: 41954747ba952ec4b01e16c2c9e8d8ff +depends: +- cpython 3.14.5.* +- python_abi * *_cp314 +license: Python-2.0 +size: 50212 +timestamp: 1779236703009 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 +sha256: e17bf63a30aec33432f1ead86e15e9febde9fc40a7f869c0e766be8d2db44170 +md5: 310259a5b03ff02289d7705f39e2b1d2 +depends: +- kaleido-core 0.2.1.* +- python >=3.5 +license: MIT +license_family: MIT +size: 18320 +timestamp: 1615204747600 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +build_number: 8 +sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 +md5: 0539938c55b6b1a59b560e843ad864a4 +constrains: +- python 3.14.* *_cp314 +license: BSD-3-Clause +license_family: BSD +size: 6989 +timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda +sha256: 496b5e65dfdd0aaaaa5de0dcaaf3bceea00fcb4398acf152f89e567c82ec1046 +md5: 9ae2c92975118058bd720e9ba2bb7c58 +depends: +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python >=3.14,<3.15.0a0 *_cp314 +- python_abi 3.14.* *_cp314 +- yaml >=0.2.5,<0.3.0a0 +license: MIT +license_family: MIT +size: 195678 +timestamp: 1770223441816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda +sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216 +md5: 3d49cad61f829f4f0e0611547a9cda12 +depends: +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-3.0-only +license_family: GPL +size: 357597 +timestamp: 1765815673644 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 +md5: 870293df500ca7e18bedefa5838a22ab +depends: +- attrs >=22.2.0 +- python >=3.10 +- rpds-py >=0.7.0 +- typing_extensions >=4.4.0 +- python +license: MIT +license_family: MIT +size: 51788 +timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.5.9-py314h51f160d_0.conda +sha256: 05ef55f09f31eabd0a205f6b065e13fc746675f41924620977692ef0ffe5aad8 +md5: 34ed7bc9febeca70f55b757ca09c354d +depends: +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python >=3.14,<3.15.0a0 *_cp314 +- python_abi 3.14.* *_cp314 +license: Apache-2.0 AND CNRI-Python +license_family: PSF +size: 409780 +timestamp: 1778374195988 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da +md5: 4a85203c1d80c1059086ae860836ffb9 +depends: +- python >=3.10 +- certifi >=2023.5.7 +- charset-normalizer >=2,<4 +- idna >=2.5,<4 +- urllib3 >=1.26,<3 +- python +constrains: +- chardet >=3.0.2,<8 +license: Apache-2.0 +license_family: APACHE +size: 68709 +timestamp: 1778851103479 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a +md5: 0242025a3c804966bf71aa04eee82f66 +depends: +- markdown-it-py >=2.2.0 +- pygments >=2.13.0,<3.0.0 +- python >=3.10 +- typing_extensions >=4.0.0,<5.0.0 +- python +license: MIT +license_family: MIT +size: 208577 +timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 +md5: 0c20a8ebcddb24a45da89d5e917e6cb9 +depends: +- python >=3.10 +- rich >=12 +- click >=8 +- typing-extensions >=4 +- __unix +- python +license: MIT +license_family: MIT +size: 64356 +timestamp: 1769850479089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda +sha256: a587240f16eac7c6a80f9585cef679cd1cb9a287b8dfcdd36dcef1f7e7db15dc +md5: e7f6ed9e60043bb5cbcc527764897f0d +depends: +- python +- libgcc >=14 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 376332 +timestamp: 1764543345455 +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +sha256: 7c65782d2511738e62c70462e89d65da4fa54d5a7e47c46667bcd27a59f81876 +md5: 472239e4eb7b5a84bb96b3ed7e3a596a +depends: +- colormath >=3.0.0 +- python >=3.9 +license: MIT +license_family: MIT +size: 22284 +timestamp: 1735770589188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.1-he8854b5_0.conda +sha256: 27467e4bfb0681546f149718c33b806fec078185fbaa6a4d17d440bc8f56185c +md5: 46009bdca2315a99e0a3a7d0ba1af3b9 +depends: +- libgcc >=14 +- libsqlite 3.53.1 h022381a_0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 +- readline >=8.3,<9.0a0 +license: blessing +size: 209964 +timestamp: 1777986493350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda +sha256: c1da41c79262b27efa168407cfecc47b20270e5fc071a8307f95a2c85fb94170 +md5: 55bf7b559202236157b14323b40f19e6 +depends: +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- regex >=2022.1.18 +- requests >=2.26.0 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 914402 +timestamp: 1764030357702 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda +sha256: e25c314b52764219f842b41aea2c98a059f06437392268f09b03561e4f6e5309 +md5: 7fc6affb9b01e567d2ef1d05b84aa6ed +depends: +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +constrains: +- xorg-libx11 >=1.8.12,<2.0a0 +license: TCL +license_family: BSD +size: 3368666 +timestamp: 1769464148928 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 +md5: e5ce43272193b38c2e9037446c1d9206 +depends: +- python >=3.10 +- __unix +- python +license: MPL-2.0 and MIT +size: 94132 +timestamp: 1770153424136 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +sha256: 59d7851d32fddb5b510272e6557aa982edeb927d349648dac27f5bf01d18bb26 +md5: 4460f039b7dedf15f7df086446ca75ae +depends: +- typing_extensions >=4.14.0 +- python >=3.10 +- importlib-metadata >=3.6 +- python +constrains: +- pytest >=7 +license: MIT +license_family: MIT +size: 38297 +timestamp: 1778779291237 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c +md5: edd329d7d3a4ab45dcf905899a7a6115 +depends: +- typing_extensions ==4.15.0 pyhcf101f3_0 +license: PSF-2.0 +license_family: PSF +size: 91383 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +sha256: 8b90d2f19f9458b8c58a55e1fcdc1d90c1603a847a47654d8a454549413ba60a +md5: 53f5409c5cfd6c5a66417d68e3f0a864 +depends: +- python >=3.10 +- typing_extensions >=4.12.0 +- python +license: MIT +license_family: MIT +size: 20935 +timestamp: 1777105465795 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 +md5: 0caa1af407ecff61170c9437a808404d +depends: +- python >=3.10 +- python +license: PSF-2.0 +license_family: PSF +size: 51692 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c +md5: ad659d0a2b3e47e38d829aa8cad2d610 +license: LicenseRef-Public-Domain +size: 119135 +timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda +sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 +md5: cbb88288f74dbe6ada1c6c7d0a97223e +depends: +- backports.zstd >=1.0.0 +- brotli-python >=1.2.0 +- h2 >=4,<5 +- pysocks >=1.5.6,<2.0,!=1.5.7 +- python >=3.10 +license: MIT +license_family: MIT +size: 103560 +timestamp: 1778188657149 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +sha256: e9f6e931feeb2f40e1fdbafe41d3b665f1ab6cb39c5880a1fcf9f79a3f3c84a5 +md5: 1c246e1105000c3660558459e2fd6d43 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 16317 +timestamp: 1762977521691 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +sha256: 128d72f36bcc8d2b4cdbec07507542e437c7d67f677b7d77b71ed9eeac7d6df1 +md5: bff06dcde4a707339d66d45d96ceb2e2 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 21039 +timestamp: 1762979038025 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda +sha256: 66265e943f32ce02396ad214e27cb35f5b0490b3bd4f064446390f9d67fa5d88 +md5: 032d8030e4a24fe1f72c74423a46fb88 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 88088 +timestamp: 1753484092643 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 +md5: ba3dcdc8584155c97c648ae9c044b7a3 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 24190 +timestamp: 1779159948016 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda +sha256: 638a3a41a4fbfed52d3c60c8ef5a3693b3f12a5b1a3f58fa29f5698d0a0702e2 +md5: f731af71c723065d91b4c01bb822641b +depends: +- libgcc >=14 +- libstdcxx >=14 +license: Zlib +license_family: Other +size: 121046 +timestamp: 1770167944449 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 +md5: c3655f82dcea2aa179b291e7099c1fcc +depends: +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 614429 +timestamp: 1764777145593 diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml new file mode 100644 index 00000000..7a970e2b --- /dev/null +++ b/modules/nf-core/multiqc/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::multiqc=1.35 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf new file mode 100644 index 00000000..c4bc715e --- /dev/null +++ b/modules/nf-core/multiqc/main.nf @@ -0,0 +1,50 @@ +process MULTIQC { + tag "${meta.id}" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data' + : 'community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc'}" + + input: + tuple val(meta), path(multiqc_files, stageAs: "?/*"), path(multiqc_config, stageAs: "?/*"), path(multiqc_logo), path(replace_names), path(sample_names) + + output: + tuple val(meta), path("*.html"), emit: report + tuple val(meta), path("*_data"), emit: data + tuple val(meta), path("*_plots"), emit: plots, optional: true + // MultiQC should not push its versions to the `versions` topic. Its input depends on the versions topic to be resolved thus outputting to the topic will let the pipeline hang forever + tuple val("${task.process}"), val('multiqc'), eval('multiqc --version | sed "s/.* //g"'), emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : '' + def config = multiqc_config ? multiqc_config instanceof List ? "--config ${multiqc_config.join(' --config ')}" : "--config ${multiqc_config}" : "" + def logo = multiqc_logo ? "--cl-config 'custom_logo: \"${multiqc_logo}\"'" : '' + def replace = replace_names ? "--replace-names ${replace_names}" : '' + def samples = sample_names ? "--sample-names ${sample_names}" : '' + """ + multiqc \\ + --force \\ + ${args} \\ + ${config} \\ + ${prefix} \\ + ${logo} \\ + ${replace} \\ + ${samples} \\ + . + """ + + stub: + """ + mkdir multiqc_data + touch multiqc_data/.stub + mkdir multiqc_plots + touch multiqc_plots/.stub + touch multiqc_report.html + """ +} diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml new file mode 100644 index 00000000..27ce18d8 --- /dev/null +++ b/modules/nf-core/multiqc/meta.yml @@ -0,0 +1,133 @@ +name: multiqc +description: Aggregate results from bioinformatics analyses across many samples + into a single report +keywords: + - QC + - bioinformatics tools + - Beautiful stand-alone HTML report +tools: + - multiqc: + description: | + MultiQC searches a given directory for analysis logs and compiles a HTML report. + It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. + homepage: https://multiqc.info/ + documentation: https://multiqc.info/docs/ + licence: + - "GPL-3.0-or-later" + identifier: biotools:multiqc +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + ontologies: [] + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + ontologies: [] + - replace_names: + type: file + description: | + Optional two-column sample renaming file. First column a set of + patterns, second column a set of corresponding replacements. Passed via + MultiQC's `--replace-names` option. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 + - sample_names: + type: file + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 +output: + report: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - "*.html": + type: file + description: MultiQC report file + pattern: ".html" + ontologies: [] + data: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + plots: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - "*_plots": + type: file + description: Plots created by MultiQC + pattern: "*_plots" + ontologies: [] + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - multiqc: + type: string + description: The tool name + - multiqc --version | sed "s/.* //g": + type: eval + description: The expression to obtain the version of the tool +authors: + - "@abhi18av" + - "@bunop" + - "@drpatelh" + - "@jfy133" +maintainers: + - "@abhi18av" + - "@bunop" + - "@drpatelh" + - "@jfy133" +containers: + conda: + linux/amd64: + lock_file: modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt + linux/arm64: + lock_file: modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt + docker: + linux/amd64: + name: community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc + build_id: bd-c17fb751507e9dfc_1 + scan_id: sc-3b1b3932f9846892_1 + linux/arm64: + name: community.wave.seqera.io/library/multiqc:1.35--5c84a5000a226ab5 + build_id: bd-5c84a5000a226ab5_1 + scan_id: sc-0d39df41e9737bbd_1 + singularity: + linux/amd64: + name: oras://community.wave.seqera.io/library/multiqc:1.35--c680f2aea25ccec2 + build_id: bd-c680f2aea25ccec2_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data + linux/arm64: + name: oras://community.wave.seqera.io/library/multiqc:1.35--c0468833d65b2f81 + build_id: bd-c0468833d65b2f81_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e4/e48aa28aebc881254a499b24c3e1ce77b8df1b85a5432699ed6f72eb17ac7fb5/data diff --git a/modules/nf-core/multiqc/tests/custom_prefix.config b/modules/nf-core/multiqc/tests/custom_prefix.config new file mode 100644 index 00000000..b30b1358 --- /dev/null +++ b/modules/nf-core/multiqc/tests/custom_prefix.config @@ -0,0 +1,5 @@ +process { + withName: 'MULTIQC' { + ext.prefix = "custom_prefix" + } +} diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test new file mode 100644 index 00000000..4cbdb95d --- /dev/null +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -0,0 +1,211 @@ +nextflow_process { + + name "Test Process MULTIQC" + script "../main.nf" + process "MULTIQC" + + tag "modules" + tag "modules_nfcore" + tag "multiqc" + + config "./nextflow.config" + + test("sarscov2 single-end [fastqc]") { + + when { + process { + """ + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [], + [], + [], + [] + ]) + """ + } + } + + then { + assert process.success + assert snapshot( + sanitizeOutput(process.out).collectEntries { key, val -> + if (key == "data") { + return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] + } + else if (key == "plots") { + return [key, val.collect { [ + "pdf", + path("${it[1]}/pdf").list().collect { file(it.toString()).name }, + "png", + path("${it[1]}/png").list().collect { file(it.toString()).name }, + "svg", + path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] + } + else if (key == "report") { + return [key, file(val[0][1].toString()).name] + } + return [key, val] + } + ).match() + } + } + + test("sarscov2 single-end [fastqc] - custom prefix") { + config "./custom_prefix.config" + + when { + process { + """ + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [], + [], + [], + [] + ]) + """ + } + } + + then { + assert process.success + assert snapshot( + sanitizeOutput(process.out).collectEntries { key, val -> + if (key == "data") { + return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] + } + else if (key == "plots") { + return [key, val.collect { [ + "pdf", + path("${it[1]}/pdf").list().collect { file(it.toString()).name }, + "png", + path("${it[1]}/png").list().collect { file(it.toString()).name }, + "svg", + path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] + } + else if (key == "report") { + return [key, file(val[0][1].toString()).name] + } + return [key, val] + } + ).match() + } + } + + test("sarscov2 single-end [fastqc] [config]") { + + when { + process { + """ + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + file("https://raw.githubusercontent.com/nf-core/seqinspector/1.0.0/assets/multiqc_config.yml", checkIfExists: true), + [], + [], + [] + ]) + """ + } + } + + then { + assert process.success + assert snapshot( + sanitizeOutput(process.out).collectEntries { key, val -> + if (key == "data") { + return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] + } + else if (key == "plots") { + return [key, val.collect { [ + "pdf", + path("${it[1]}/pdf").list().collect { file(it.toString()).name }, + "png", + path("${it[1]}/png").list().collect { file(it.toString()).name }, + "svg", + path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] + } + else if (key == "report") { + return [key, file(val[0][1].toString()).name] + } + return [key, val] + } + ).match() + } + } + + test("sarscov2 single-end [fastqc] [multiple configs]") { + + when { + process { + """ + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [ + file("https://raw.githubusercontent.com/nf-core/seqinspector/1.0.0/assets/multiqc_config.yml", checkIfExists: true), + file("https://raw.githubusercontent.com/nf-core/seqinspector/1.0.0/assets/multiqc_config.yml", checkIfExists: true) + ], + [], + [], + [] + ]) + """ + } + } + + then { + assert process.success + assert snapshot( + sanitizeOutput(process.out).collectEntries { key, val -> + if (key == "data") { + return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] + } + else if (key == "plots") { + return [key, val.collect { [ + "pdf", + path("${it[1]}/pdf").list().collect { file(it.toString()).name }, + "png", + path("${it[1]}/png").list().collect { file(it.toString()).name }, + "svg", + path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] + } + else if (key == "report") { + return [key, file(val[0][1].toString()).name] + } + return [key, val] + } + ).match() + } + } + + test("sarscov2 single-end [fastqc] - stub") { + + options "-stub" + + when { + process { + """ + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [], + [], + [], + [] + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } +} diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap new file mode 100644 index 00000000..44899216 --- /dev/null +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -0,0 +1,422 @@ +{ + "sarscov2 single-end [fastqc] [multiple configs]": { + "content": [ + { + "data": [ + [ + [ + "fastqc-status-check-heatmap.txt", + "fastqc_overrepresented_sequences_plot.txt", + "fastqc_per_base_n_content_plot.txt", + "fastqc_per_base_sequence_quality_plot.txt", + "fastqc_per_sequence_gc_content_plot_Counts.txt", + "fastqc_per_sequence_gc_content_plot_Percentages.txt", + "fastqc_per_sequence_quality_scores_plot.txt", + "fastqc_sequence_counts_plot.txt", + "fastqc_sequence_duplication_levels_plot.txt", + "fastqc_sequence_length_distribution_plot.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "llms-full.txt", + "multiqc.log", + "multiqc.parquet", + "multiqc_citations.txt", + "multiqc_data.json", + "multiqc_fastqc.txt", + "multiqc_general_stats.txt", + "multiqc_sources.txt" + ] + ] + ], + "plots": [ + [ + "pdf", + [ + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf" + ], + "png", + [ + "fastqc-status-check-heatmap.png", + "fastqc_overrepresented_sequences_plot.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_per_sequence_gc_content_plot_Counts.png", + "fastqc_per_sequence_gc_content_plot_Percentages.png", + "fastqc_per_sequence_quality_scores_plot.png", + "fastqc_sequence_counts_plot-cnt.png", + "fastqc_sequence_counts_plot-pct.png", + "fastqc_sequence_duplication_levels_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png" + ], + "svg", + [ + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg" + ] + ] + ], + "report": "multiqc_report.html", + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.35" + ] + ] + } + ], + "timestamp": "2026-03-17T16:15:42.577775492", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 single-end [fastqc]": { + "content": [ + { + "data": [ + [ + [ + "fastqc-status-check-heatmap.txt", + "fastqc_overrepresented_sequences_plot.txt", + "fastqc_per_base_n_content_plot.txt", + "fastqc_per_base_sequence_quality_plot.txt", + "fastqc_per_sequence_gc_content_plot_Counts.txt", + "fastqc_per_sequence_gc_content_plot_Percentages.txt", + "fastqc_per_sequence_quality_scores_plot.txt", + "fastqc_sequence_counts_plot.txt", + "fastqc_sequence_duplication_levels_plot.txt", + "fastqc_sequence_length_distribution_plot.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "llms-full.txt", + "multiqc.log", + "multiqc.parquet", + "multiqc_citations.txt", + "multiqc_data.json", + "multiqc_fastqc.txt", + "multiqc_general_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt" + ] + ] + ], + "plots": [ + [ + "pdf", + [ + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf" + ], + "png", + [ + "fastqc-status-check-heatmap.png", + "fastqc_overrepresented_sequences_plot.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_per_sequence_gc_content_plot_Counts.png", + "fastqc_per_sequence_gc_content_plot_Percentages.png", + "fastqc_per_sequence_quality_scores_plot.png", + "fastqc_sequence_counts_plot-cnt.png", + "fastqc_sequence_counts_plot-pct.png", + "fastqc_sequence_duplication_levels_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png" + ], + "svg", + [ + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg" + ] + ] + ], + "report": "multiqc_report.html", + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.35" + ] + ] + } + ], + "timestamp": "2026-03-17T16:21:17.072841555", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 single-end [fastqc] - stub": { + "content": [ + { + "data": [ + [ + { + "id": "FASTQC" + }, + [ + ".stub:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "plots": [ + [ + { + "id": "FASTQC" + }, + [ + ".stub:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "report": [ + [ + { + "id": "FASTQC" + }, + "multiqc_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.35" + ] + ] + } + ], + "timestamp": "2026-02-26T15:14:39.789193051", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 single-end [fastqc] [config]": { + "content": [ + { + "data": [ + [ + [ + "fastqc-status-check-heatmap.txt", + "fastqc_overrepresented_sequences_plot.txt", + "fastqc_per_base_n_content_plot.txt", + "fastqc_per_base_sequence_quality_plot.txt", + "fastqc_per_sequence_gc_content_plot_Counts.txt", + "fastqc_per_sequence_gc_content_plot_Percentages.txt", + "fastqc_per_sequence_quality_scores_plot.txt", + "fastqc_sequence_counts_plot.txt", + "fastqc_sequence_duplication_levels_plot.txt", + "fastqc_sequence_length_distribution_plot.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "llms-full.txt", + "multiqc.log", + "multiqc.parquet", + "multiqc_citations.txt", + "multiqc_data.json", + "multiqc_fastqc.txt", + "multiqc_general_stats.txt", + "multiqc_sources.txt" + ] + ] + ], + "plots": [ + [ + "pdf", + [ + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf" + ], + "png", + [ + "fastqc-status-check-heatmap.png", + "fastqc_overrepresented_sequences_plot.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_per_sequence_gc_content_plot_Counts.png", + "fastqc_per_sequence_gc_content_plot_Percentages.png", + "fastqc_per_sequence_quality_scores_plot.png", + "fastqc_sequence_counts_plot-cnt.png", + "fastqc_sequence_counts_plot-pct.png", + "fastqc_sequence_duplication_levels_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png" + ], + "svg", + [ + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg" + ] + ] + ], + "report": "multiqc_report.html", + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.35" + ] + ] + } + ], + "timestamp": "2026-03-17T16:15:30.372239611", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 single-end [fastqc] - custom prefix": { + "content": [ + { + "data": [ + [ + [ + "fastqc-status-check-heatmap.txt", + "fastqc_overrepresented_sequences_plot.txt", + "fastqc_per_base_n_content_plot.txt", + "fastqc_per_base_sequence_quality_plot.txt", + "fastqc_per_sequence_gc_content_plot_Counts.txt", + "fastqc_per_sequence_gc_content_plot_Percentages.txt", + "fastqc_per_sequence_quality_scores_plot.txt", + "fastqc_sequence_counts_plot.txt", + "fastqc_sequence_duplication_levels_plot.txt", + "fastqc_sequence_length_distribution_plot.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "llms-full.txt", + "multiqc.log", + "multiqc.parquet", + "multiqc_citations.txt", + "multiqc_data.json", + "multiqc_fastqc.txt", + "multiqc_general_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt" + ] + ] + ], + "plots": [ + [ + "pdf", + [ + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf" + ], + "png", + [ + "fastqc-status-check-heatmap.png", + "fastqc_overrepresented_sequences_plot.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_per_sequence_gc_content_plot_Counts.png", + "fastqc_per_sequence_gc_content_plot_Percentages.png", + "fastqc_per_sequence_quality_scores_plot.png", + "fastqc_sequence_counts_plot-cnt.png", + "fastqc_sequence_counts_plot-pct.png", + "fastqc_sequence_duplication_levels_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png" + ], + "svg", + [ + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg" + ] + ] + ], + "report": "custom_prefix.html", + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.35" + ] + ] + } + ], + "timestamp": "2026-03-17T16:15:18.189023981", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/multiqc/tests/nextflow.config b/modules/nf-core/multiqc/tests/nextflow.config new file mode 100644 index 00000000..374dfef2 --- /dev/null +++ b/modules/nf-core/multiqc/tests/nextflow.config @@ -0,0 +1,6 @@ +process { + withName: 'MULTIQC' { + ext.prefix = null + ext.args = '-p' + } +} diff --git a/modules/nf-core/picard/addorreplacereadgroups/environment.yml b/modules/nf-core/picard/addorreplacereadgroups/environment.yml new file mode 100644 index 00000000..b4ac4fe0 --- /dev/null +++ b/modules/nf-core/picard/addorreplacereadgroups/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/picard + - bioconda::picard=3.4.0 diff --git a/modules/nf-core/picard/addorreplacereadgroups/main.nf b/modules/nf-core/picard/addorreplacereadgroups/main.nf new file mode 100644 index 00000000..0a323ed6 --- /dev/null +++ b/modules/nf-core/picard/addorreplacereadgroups/main.nf @@ -0,0 +1,58 @@ +process PICARD_ADDORREPLACEREADGROUPS { + tag "${meta.id}" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/08/0861295baa7c01fc593a9da94e82b44a729dcaf8da92be8e565da109aa549b25/data' + : 'community.wave.seqera.io/library/picard:3.4.0--e9963040df0a9bf6'}" + + input: + tuple val(meta), path(reads) + tuple val(meta2), path(fasta), path(fai) + + output: + tuple val(meta), path("*.bam"), emit: bam, optional: true + tuple val(meta), path("*.bai"), emit: bai, optional: true + tuple val(meta), path("*.cram"), emit: cram, optional: true + tuple val("${task.process}"), val('picard'), eval("picard AddOrReplaceReadGroups --version 2>&1 | sed -n 's/.*Version://p'"), topic: versions, emit: versions_picard + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def suffix = task.ext.suffix ?: "${reads.getExtension()}" + def reference = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" + def avail_mem = 3072 + if (!task.memory) { + log.info('[Picard AddOrReplaceReadGroups] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() + } + + if ("${reads}" == "${prefix}.${suffix}") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } + """ + picard \\ + -Xmx${avail_mem}M \\ + AddOrReplaceReadGroups \\ + ${args} \\ + ${reference} \\ + --INPUT ${reads} \\ + --OUTPUT ${prefix}.${suffix} + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def suffix = task.ext.suffix ?: "${reads.getExtension()}" + if ("${reads}" == "${prefix}.${suffix}") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } + """ + touch ${prefix}.${suffix} + """ +} diff --git a/modules/nf-core/picard/addorreplacereadgroups/meta.yml b/modules/nf-core/picard/addorreplacereadgroups/meta.yml new file mode 100644 index 00000000..907c401d --- /dev/null +++ b/modules/nf-core/picard/addorreplacereadgroups/meta.yml @@ -0,0 +1,111 @@ +name: picard_addorreplacereadgroups +description: Assigns all the reads in a file to a single new read-group +keywords: + - add + - replace + - read-group + - picard +tools: + - picard: + description: | + A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) + data and formats such as SAM/BAM/CRAM and VCF. + homepage: https://broadinstitute.github.io/picard/ + documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360037226472-AddOrReplaceReadGroups-Picard- + tool_dev_url: https://github.com/broadinstitute/picard + licence: ["MIT"] + identifier: biotools:picard_tools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: Sequence reads file, can be SAM/BAM/CRAM format + pattern: "*.{bam,cram,sam}" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: Reference genome file + pattern: "*.{fasta,fa,fasta.gz,fa.gz}" + ontologies: [] + - fai: + type: file + description: Reference genome index file + pattern: "*.{fai,fasta.fai,fa.fai,fasta.gz.fai,fa.gz.fai}" + ontologies: [] +output: + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bam": + type: file + description: Output BAM file + pattern: "*.{bam}" + ontologies: [] + bai: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bai": + type: file + description: An optional BAM index file + pattern: "*.{bai}" + ontologies: [] + cram: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.cram": + type: file + description: Output CRAM file + pattern: "*.{cram}" + ontologies: [] + versions_picard: + - - ${task.process}: + type: string + description: The process the versions were collected from + - picard: + type: string + description: The tool name + - "picard AddOrReplaceReadGroups --version 2>&1 | sed -n 's/.*Version://p'": + type: string + description: The command used to generate the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - picard: + type: string + description: The tool name + - "picard AddOrReplaceReadGroups --version 2>&1 | sed -n 's/.*Version://p'": + type: string + description: The command used to generate the version of the tool + +authors: + - "@sateeshperi" + - "@mjcipriano" + - "@hseabolt" + - "@cmatKhan" + - "@muffato" +maintainers: + - "@sateeshperi" + - "@mjcipriano" + - "@hseabolt" + - "@cmatKhan" + - "@muffato" diff --git a/modules/nf-core/picard/addorreplacereadgroups/tests/bam.config b/modules/nf-core/picard/addorreplacereadgroups/tests/bam.config new file mode 100644 index 00000000..132cc0f7 --- /dev/null +++ b/modules/nf-core/picard/addorreplacereadgroups/tests/bam.config @@ -0,0 +1,12 @@ +process { + withName: 'PICARD_ADDORREPLACEREADGROUPS'{ + ext.prefix = { "${meta.id}.replaced"} + ext.args = {[ + "--CREATE_INDEX", + "-LB ${meta.id}", + "-PL ILLUMINA", + "-PU bc1", + "-SM ${meta.id}" + ].join(' ').trim()} + } +} diff --git a/modules/nf-core/picard/addorreplacereadgroups/tests/cram.config b/modules/nf-core/picard/addorreplacereadgroups/tests/cram.config new file mode 100644 index 00000000..be92e72b --- /dev/null +++ b/modules/nf-core/picard/addorreplacereadgroups/tests/cram.config @@ -0,0 +1,12 @@ +process { + withName: 'PICARD_ADDORREPLACEREADGROUPS'{ + ext.prefix = { "${meta.id}.replaced"} + ext.args = {[ + "-LB ${meta.id}", + "-PL ILLUMINA", + "-PU bc1", + "-SM ${meta.id}" + ].join(' ').trim()} + ext.suffix = { "cram" } + } +} diff --git a/modules/nf-core/picard/addorreplacereadgroups/tests/main.nf.test b/modules/nf-core/picard/addorreplacereadgroups/tests/main.nf.test new file mode 100644 index 00000000..78565882 --- /dev/null +++ b/modules/nf-core/picard/addorreplacereadgroups/tests/main.nf.test @@ -0,0 +1,83 @@ + +nextflow_process { + + name "Test Process PICARD_ADDORREPLACEREADGROUPS" + script "../main.nf" + process "PICARD_ADDORREPLACEREADGROUPS" + + tag "modules" + tag "modules_nfcore" + tag "picard" + tag "picard/addorreplacereadgroups" + + test("sarscov2 - bam") { + config "./bam.config" + + when { + process { + """ + input[0] = [ [:], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) ] + input[1] = [ [:], [], [] ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.bam[0][1]).name, + file(process.out.bai[0][1]).name, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match()} + ) + } + } + + test("homo_sapiens - cram") { + config "./cram.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), ] + ] + input[1] = [ [:], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.cram[0][1]).name, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match()} + ) + } + } + + test("sarscov2 - bam - stub") { + config "./bam.config" + options "-stub" + when { + process { + """ + input[0] = [ [:], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) ] + input[1] = [ [:], [], [] ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } +} diff --git a/modules/nf-core/picard/addorreplacereadgroups/tests/main.nf.test.snap b/modules/nf-core/picard/addorreplacereadgroups/tests/main.nf.test.snap new file mode 100644 index 00000000..17295697 --- /dev/null +++ b/modules/nf-core/picard/addorreplacereadgroups/tests/main.nf.test.snap @@ -0,0 +1,73 @@ +{ + "homo_sapiens - cram": { + "content": [ + "test.replaced.cram", + { + "versions_picard": [ + [ + "PICARD_ADDORREPLACEREADGROUPS", + "picard", + "3.4.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T09:36:16.966842212" + }, + "sarscov2 - bam - stub": { + "content": [ + { + "bai": [ + + ], + "bam": [ + [ + { + + }, + "null.replaced.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + + ], + "versions_picard": [ + [ + "PICARD_ADDORREPLACEREADGROUPS", + "picard", + "3.4.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + }, + "timestamp": "2026-02-19T17:34:40.3572859" + }, + "sarscov2 - bam": { + "content": [ + "null.replaced.bam", + "null.replaced.bai", + { + "versions_picard": [ + [ + "PICARD_ADDORREPLACEREADGROUPS", + "picard", + "3.4.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T09:36:00.935196996" + } +} \ No newline at end of file diff --git a/modules/nf-core/picard/collectmultiplemetrics/environment.yml b/modules/nf-core/picard/collectmultiplemetrics/environment.yml new file mode 100644 index 00000000..b4ac4fe0 --- /dev/null +++ b/modules/nf-core/picard/collectmultiplemetrics/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/picard + - bioconda::picard=3.4.0 diff --git a/modules/nf-core/picard/collectmultiplemetrics/main.nf b/modules/nf-core/picard/collectmultiplemetrics/main.nf index 91fe9170..1aea6473 100644 --- a/modules/nf-core/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/picard/collectmultiplemetrics/main.nf @@ -1,21 +1,21 @@ process PICARD_COLLECTMULTIPLEMETRICS { - tag "$meta.id" + tag "${meta.id}" label 'process_single' - conda "bioconda::picard=3.0.0" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:3.0.0--hdfd78af_1' : - 'biocontainers/picard:3.0.0--hdfd78af_1' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/08/0861295baa7c01fc593a9da94e82b44a729dcaf8da92be8e565da109aa549b25/data' + : 'community.wave.seqera.io/library/picard:3.4.0--e9963040df0a9bf6'}" input: - tuple val(meta) , path(bam), path(bai) + tuple val(meta), path(bam), path(bai) tuple val(meta2), path(fasta) tuple val(meta3), path(fai) output: tuple val(meta), path("*_metrics"), emit: metrics - tuple val(meta), path("*.pdf") , emit: pdf - path "versions.yml" , emit: versions + tuple val(meta), path("*.pdf"), emit: pdf, optional: true + tuple val("${task.process}"), val('picard'), eval("picard CollectMultipleMetrics --version 2>&1 | sed -n 's/.*Version://p'"), topic: versions, emit: versions_picard when: task.ext.when == null || task.ext.when @@ -26,23 +26,19 @@ process PICARD_COLLECTMULTIPLEMETRICS { def reference = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" def avail_mem = 3072 if (!task.memory) { - log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ picard \\ -Xmx${avail_mem}M \\ CollectMultipleMetrics \\ - $args \\ - --INPUT $bam \\ + ${args} \\ + --INPUT ${bam} \\ --OUTPUT ${prefix}.CollectMultipleMetrics \\ - $reference - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - picard: \$(picard CollectMultipleMetrics --version 2>&1 | grep -o 'Version.*' | cut -f2- -d:) - END_VERSIONS + ${reference} """ stub: @@ -58,10 +54,5 @@ process PICARD_COLLECTMULTIPLEMETRICS { touch ${prefix}.CollectMultipleMetrics.quality_by_cycle.pdf touch ${prefix}.CollectMultipleMetrics.insert_size_histogram.pdf touch ${prefix}.CollectMultipleMetrics.quality_distribution_metrics - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - picard: \$(echo \$(picard CollectMultipleMetrics --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) - END_VERSIONS """ } diff --git a/modules/nf-core/picard/collectmultiplemetrics/meta.yml b/modules/nf-core/picard/collectmultiplemetrics/meta.yml index 22656080..213d600b 100644 --- a/modules/nf-core/picard/collectmultiplemetrics/meta.yml +++ b/modules/nf-core/picard/collectmultiplemetrics/meta.yml @@ -15,54 +15,89 @@ tools: homepage: https://broadinstitute.github.io/picard/ documentation: https://broadinstitute.github.io/picard/ licence: ["MIT"] + identifier: biotools:picard_tools input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: SAM/BAM/CRAM file - pattern: "*.{sam,bam,cram}" - - bai: - type: file - description: Optional SAM/BAM/CRAM file index - pattern: "*.{sai,bai,crai}" - - meta2: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome'] - - fasta: - type: file - description: Genome fasta file - - meta3: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome'] - - fai: - type: file - description: Index of FASTA file. Only needed when fasta is supplied. - pattern: "*.fai" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: SAM/BAM/CRAM file + pattern: "*.{sam,bam,cram}" + ontologies: [] + - bai: + type: file + description: Optional SAM/BAM/CRAM file index + pattern: "*.{sai,bai,crai}" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome'] + - fasta: + type: file + description: Genome fasta file + ontologies: [] + - - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome'] + - fai: + type: file + description: Index of FASTA file. Only needed when fasta is supplied. + pattern: "*.fai" + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - metrics: - type: file - description: Alignment metrics files generated by picard - pattern: "*_{metrics}" - - pdf: - type: file - description: PDF plots of metrics - pattern: "*.{pdf}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + metrics: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*_metrics": + type: file + description: Alignment metrics files generated by picard + pattern: "*_{metrics}" + ontologies: [] + pdf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.pdf": + type: file + description: PDF plots of metrics + pattern: "*.{pdf}" + ontologies: [] + versions_picard: + - - ${task.process}: + type: string + description: The process the versions were collected from + - picard: + type: string + description: The tool name + - "picard CollectMultipleMetrics --version 2>&1 | sed -n 's/.*Version://p'": + type: string + description: The command used to generate the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - picard: + type: string + description: The tool name + - "picard CollectMultipleMetrics --version 2>&1 | sed -n 's/.*Version://p'": + type: string + description: The command used to generate the version of the tool + authors: - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test b/modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test new file mode 100644 index 00000000..0037acab --- /dev/null +++ b/modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test @@ -0,0 +1,186 @@ + +nextflow_process { + + name "Test Process PICARD_COLLECTMULTIPLEMETRICS" + script "../main.nf" + process "PICARD_COLLECTMULTIPLEMETRICS" + + tag "modules" + tag "modules_nfcore" + tag "picard" + tag "picard/collectmultiplemetrics" + + test("test-picard-collectmultiplemetrics") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ] + input[1] = [ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [[id:'genome'],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.metrics[0][1].collect { file(it).name }.toSorted(), + process.out.pdf[0][1].collect { file(it).name }.toSorted(), + process.out.findAll { key, val -> key.startsWith("versions") } + ).match()} + ) + } + } + + test("test-picard-collectmultiplemetrics-nofasta") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ] + input[1] = [[id:'genome'],[]] + input[2] = [[id:'genome'],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.metrics[0][1].collect { file(it).name }.toSorted(), + process.out.pdf[0][1].collect { file(it).name }.toSorted(), + process.out.findAll { key, val -> key.startsWith("versions") } + ).match()} + ) + } + } + + test("test-picard-collectmultiplemetrics-cram") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ] + input[1] = [ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.metrics[0][1].collect { file(it).name }.toSorted(), + process.out.pdf[0][1].collect { file(it).name }.toSorted(), + process.out.findAll { key, val -> key.startsWith("versions") } + ).match()} + ) + } + } + + test("test-picard-collectmultiplemetrics - stub") { + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ] + input[1] = [ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [[id:'genome'],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } + + test("test-picard-collectmultiplemetrics-nofasta - stub") { + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ] + input[1] = [[id:'genome'],[]] + input[2] = [[id:'genome'],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } + + test("test-picard-collectmultiplemetrics-cram - stub") { + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ] + input[1] = [ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } +} diff --git a/modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test.snap b/modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test.snap new file mode 100644 index 00000000..393ed100 --- /dev/null +++ b/modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test.snap @@ -0,0 +1,242 @@ +{ + "test-picard-collectmultiplemetrics": { + "content": [ + [ + "test.CollectMultipleMetrics.alignment_summary_metrics", + "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "test.CollectMultipleMetrics.insert_size_metrics", + "test.CollectMultipleMetrics.quality_by_cycle_metrics", + "test.CollectMultipleMetrics.quality_distribution_metrics" + ], + [ + "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "test.CollectMultipleMetrics.insert_size_histogram.pdf", + "test.CollectMultipleMetrics.quality_by_cycle.pdf", + "test.CollectMultipleMetrics.quality_distribution.pdf", + "test.CollectMultipleMetrics.read_length_histogram.pdf" + ], + { + "versions_picard": [ + [ + "PICARD_COLLECTMULTIPLEMETRICS", + "picard", + "3.4.0" + ] + ] + } + ], + "timestamp": "2026-02-02T10:22:21.230301646", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + } + }, + "test-picard-collectmultiplemetrics - stub": { + "content": [ + { + "metrics": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.CollectMultipleMetrics.alignment_summary_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.insert_size_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.quality_by_cycle_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.quality_distribution_metrics:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.insert_size_histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.quality_by_cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.quality_distribution.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.read_length_histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions_picard": [ + [ + "PICARD_COLLECTMULTIPLEMETRICS", + "picard", + "3.4.0" + ] + ] + } + ], + "timestamp": "2026-02-20T10:32:38.701455244", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "test-picard-collectmultiplemetrics-nofasta - stub": { + "content": [ + { + "metrics": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.CollectMultipleMetrics.alignment_summary_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.insert_size_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.quality_by_cycle_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.quality_distribution_metrics:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.insert_size_histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.quality_by_cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.quality_distribution.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.read_length_histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions_picard": [ + [ + "PICARD_COLLECTMULTIPLEMETRICS", + "picard", + "3.4.0" + ] + ] + } + ], + "timestamp": "2026-02-20T10:32:48.923918624", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "test-picard-collectmultiplemetrics-cram": { + "content": [ + [ + "test.CollectMultipleMetrics.alignment_summary_metrics", + "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "test.CollectMultipleMetrics.insert_size_metrics", + "test.CollectMultipleMetrics.quality_by_cycle_metrics", + "test.CollectMultipleMetrics.quality_distribution_metrics" + ], + [ + "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "test.CollectMultipleMetrics.insert_size_histogram.pdf", + "test.CollectMultipleMetrics.quality_by_cycle.pdf", + "test.CollectMultipleMetrics.quality_distribution.pdf", + "test.CollectMultipleMetrics.read_length_histogram.pdf" + ], + { + "versions_picard": [ + [ + "PICARD_COLLECTMULTIPLEMETRICS", + "picard", + "3.4.0" + ] + ] + } + ], + "timestamp": "2026-02-02T10:23:52.23446844", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + } + }, + "test-picard-collectmultiplemetrics-nofasta": { + "content": [ + [ + "test.CollectMultipleMetrics.alignment_summary_metrics", + "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "test.CollectMultipleMetrics.insert_size_metrics", + "test.CollectMultipleMetrics.quality_by_cycle_metrics", + "test.CollectMultipleMetrics.quality_distribution_metrics" + ], + [ + "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "test.CollectMultipleMetrics.insert_size_histogram.pdf", + "test.CollectMultipleMetrics.quality_by_cycle.pdf", + "test.CollectMultipleMetrics.quality_distribution.pdf", + "test.CollectMultipleMetrics.read_length_histogram.pdf" + ], + { + "versions_picard": [ + [ + "PICARD_COLLECTMULTIPLEMETRICS", + "picard", + "3.4.0" + ] + ] + } + ], + "timestamp": "2026-02-02T10:23:27.387621193", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + } + }, + "test-picard-collectmultiplemetrics-cram - stub": { + "content": [ + { + "metrics": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.CollectMultipleMetrics.alignment_summary_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.insert_size_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.quality_by_cycle_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.quality_distribution_metrics:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.insert_size_histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.quality_by_cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.quality_distribution.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.CollectMultipleMetrics.read_length_histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions_picard": [ + [ + "PICARD_COLLECTMULTIPLEMETRICS", + "picard", + "3.4.0" + ] + ] + } + ], + "timestamp": "2026-02-20T10:32:57.11686549", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/picard/markduplicates/environment.yml b/modules/nf-core/picard/markduplicates/environment.yml new file mode 100644 index 00000000..b4ac4fe0 --- /dev/null +++ b/modules/nf-core/picard/markduplicates/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/picard + - bioconda::picard=3.4.0 diff --git a/modules/nf-core/picard/markduplicates/main.nf b/modules/nf-core/picard/markduplicates/main.nf index facd7efb..36afba6f 100644 --- a/modules/nf-core/picard/markduplicates/main.nf +++ b/modules/nf-core/picard/markduplicates/main.nf @@ -1,22 +1,22 @@ process PICARD_MARKDUPLICATES { - tag "$meta.id" + tag "${meta.id}" label 'process_medium' - conda "bioconda::picard=3.0.0" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:3.0.0--hdfd78af_1' : - 'biocontainers/picard:3.0.0--hdfd78af_1' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/08/0861295baa7c01fc593a9da94e82b44a729dcaf8da92be8e565da109aa549b25/data' + : 'community.wave.seqera.io/library/picard:3.4.0--e9963040df0a9bf6'}" input: - tuple val(meta), path(bam) - tuple val(meta2), path(fasta) - tuple val(meta3), path(fai) + tuple val(meta), path(reads) + tuple val(meta2), path(fasta), path(fai) output: - tuple val(meta), path("*.bam") , emit: bam - tuple val(meta), path("*.bai") , optional:true, emit: bai + tuple val(meta), path("*.bam"), emit: bam, optional: true + tuple val(meta), path("*.bai"), emit: bai, optional: true + tuple val(meta), path("*.cram"), emit: cram, optional: true tuple val(meta), path("*.metrics.txt"), emit: metrics - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('picard'), eval("picard MarkDuplicates --version 2>&1 | sed -n 's/.*Version://p'"), topic: versions, emit: versions_picard when: task.ext.when == null || task.ext.when @@ -24,38 +24,39 @@ process PICARD_MARKDUPLICATES { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def suffix = task.ext.suffix ?: "${reads.getExtension()}" + def reference = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" def avail_mem = 3072 if (!task.memory) { - log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() + } + + if ("${reads}" == "${prefix}.${suffix}") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") } """ picard \\ -Xmx${avail_mem}M \\ MarkDuplicates \\ - $args \\ - --INPUT $bam \\ - --OUTPUT ${prefix}.bam \\ - --REFERENCE_SEQUENCE $fasta \\ - --METRICS_FILE ${prefix}.MarkDuplicates.metrics.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - picard: \$(echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) - END_VERSIONS + ${args} \\ + --INPUT ${reads} \\ + --OUTPUT ${prefix}.${suffix} \\ + ${reference} \\ + --METRICS_FILE ${prefix}.metrics.txt """ stub: def prefix = task.ext.prefix ?: "${meta.id}" + def suffix = task.ext.suffix ?: "${reads.getExtension()}" + if ("${reads}" == "${prefix}.${suffix}") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } """ - touch ${prefix}.bam - touch ${prefix}.bam.bai - touch ${prefix}.MarkDuplicates.metrics.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - picard: \$(echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) - END_VERSIONS + touch ${prefix}.${suffix} + touch ${prefix}.${suffix}.bai + touch ${prefix}.metrics.txt """ } diff --git a/modules/nf-core/picard/markduplicates/meta.yml b/modules/nf-core/picard/markduplicates/meta.yml index f7693d2f..cf95a0c5 100644 --- a/modules/nf-core/picard/markduplicates/meta.yml +++ b/modules/nf-core/picard/markduplicates/meta.yml @@ -15,57 +15,105 @@ tools: homepage: https://broadinstitute.github.io/picard/ documentation: https://broadinstitute.github.io/picard/ licence: ["MIT"] + identifier: biotools:picard_tools input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM file - pattern: "*.{bam,cram,sam}" - - meta2: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome' ] - - fasta: - type: file - description: Reference genome fasta file - pattern: "*.{fasta,fa}" - - meta3: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome' ] - - fai: - type: file - description: Reference genome fasta index - pattern: "*.{fai}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: Sequence reads file, can be SAM/BAM/CRAM format + pattern: "*.{bam,cram,sam}" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: Reference genome fasta file, required for CRAM input + pattern: "*.{fasta,fa}" + ontologies: [] + - fai: + type: file + description: Reference genome fasta index + pattern: "*.{fai}" + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM file with duplicate reads marked/removed - pattern: "*.{bam}" - - bai: - type: file - description: An optional BAM index file. If desired, --CREATE_INDEX must be passed as a flag - pattern: "*.{bai}" - - metrics: - type: file - description: Duplicate metrics file generated by picard - pattern: "*.{metrics.txt}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bam": + type: file + description: BAM file with duplicate reads marked/removed + pattern: "*.{bam}" + ontologies: [] + bai: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bai": + type: file + description: An optional BAM index file. If desired, --CREATE_INDEX must be + passed as a flag + pattern: "*.{bai}" + ontologies: [] + cram: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.cram": + type: file + description: Output CRAM file + pattern: "*.{cram}" + ontologies: [] + metrics: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.metrics.txt": + type: file + description: Duplicate metrics file generated by picard + pattern: "*.{metrics.txt}" + ontologies: [] + versions_picard: + - - ${task.process}: + type: string + description: The process the versions were collected from + - picard: + type: string + description: The tool name + - "picard MarkDuplicates --version 2>&1 | sed -n 's/.*Version://p'": + type: string + description: The command used to generate the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - picard: + type: string + description: The tool name + - "picard MarkDuplicates --version 2>&1 | sed -n 's/.*Version://p'": + type: string + description: The command used to generate the version of the tool authors: - "@drpatelh" - "@projectoriented" - "@ramprasadn" +maintainers: + - "@drpatelh" + - "@projectoriented" + - "@ramprasadn" diff --git a/modules/nf-core/picard/markduplicates/tests/main.nf.test b/modules/nf-core/picard/markduplicates/tests/main.nf.test new file mode 100644 index 00000000..227bfc84 --- /dev/null +++ b/modules/nf-core/picard/markduplicates/tests/main.nf.test @@ -0,0 +1,163 @@ +nextflow_process { + + name "Test Process PICARD_MARKDUPLICATES" + script "../main.nf" + process "PICARD_MARKDUPLICATES" + config "./nextflow.config" + tag "modules" + tag "modules_nfcore" + tag "picard" + tag "picard/markduplicates" + + test("sarscov2 [unsorted bam]") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true) + ]) + input[1] = [ [:], [], [] ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.bam[0][1]).name, + path(process.out.metrics.get(0).get(1)).readLines()[0..2], + process.out.findAll { key, val -> key.startsWith("versions") }) + .match() } + ) + } + } + + test("sarscov2 [sorted bam]") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + input[1] = [ [:], [], [] ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.bam[0][1]).name, + path(process.out.metrics.get(0).get(1)).readLines()[0..2], + process.out.findAll { key, val -> key.startsWith("versions") }) + .match() } + ) + } + } + + test("homo_sapiens [cram]") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.cram[0][1]).name, + path(process.out.metrics.get(0).get(1)).readLines()[0..2], + process.out.findAll { key, val -> key.startsWith("versions") }) + .match() } + ) + } + } + + test("sarscov2 [unsorted bam] - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true) + ]) + input[1] = [ [:], [], [] ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } + + test("sarscov2 [sorted bam] - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + input[1] = [ [:], [], [] ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } + + test("homo_sapiens [cram] - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } +} diff --git a/modules/nf-core/picard/markduplicates/tests/main.nf.test.snap b/modules/nf-core/picard/markduplicates/tests/main.nf.test.snap new file mode 100644 index 00000000..c8878c23 --- /dev/null +++ b/modules/nf-core/picard/markduplicates/tests/main.nf.test.snap @@ -0,0 +1,218 @@ +{ + "sarscov2 [sorted bam] - stub": { + "content": [ + { + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + + ], + "metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_picard": [ + [ + "PICARD_MARKDUPLICATES", + "picard", + "3.4.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + }, + "timestamp": "2026-02-19T17:43:13.544887277" + }, + "sarscov2 [unsorted bam] - stub": { + "content": [ + { + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + + ], + "metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_picard": [ + [ + "PICARD_MARKDUPLICATES", + "picard", + "3.4.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + }, + "timestamp": "2026-02-19T17:43:06.193033248" + }, + "sarscov2 [unsorted bam]": { + "content": [ + "test.md.bam", + [ + "## htsjdk.samtools.metrics.StringHeader", + "# MarkDuplicates --INPUT test.paired_end.bam --OUTPUT test.md.bam --METRICS_FILE test.md.metrics.txt --ASSUME_SORT_ORDER queryname --MAX_SEQUENCES_FOR_DISK_READ_ENDS_MAP 50000 --MAX_FILE_HANDLES_FOR_READ_ENDS_MAP 8000 --SORTING_COLLECTION_SIZE_RATIO 0.25 --TAG_DUPLICATE_SET_MEMBERS false --REMOVE_SEQUENCING_DUPLICATES false --TAGGING_POLICY DontTag --CLEAR_DT true --DUPLEX_UMI false --FLOW_MODE false --FLOW_DUP_STRATEGY FLOW_QUALITY_SUM_STRATEGY --FLOW_USE_END_IN_UNPAIRED_READS false --FLOW_USE_UNPAIRED_CLIPPED_END false --FLOW_UNPAIRED_END_UNCERTAINTY 0 --FLOW_UNPAIRED_START_UNCERTAINTY 0 --FLOW_SKIP_FIRST_N_FLOWS 0 --FLOW_Q_IS_KNOWN_END false --FLOW_EFFECTIVE_QUALITY_THRESHOLD 15 --ADD_PG_TAG_TO_READS true --REMOVE_DUPLICATES false --ASSUME_SORTED false --DUPLICATE_SCORING_STRATEGY SUM_OF_BASE_QUALITIES --PROGRAM_RECORD_ID MarkDuplicates --PROGRAM_GROUP_NAME MarkDuplicates --READ_NAME_REGEX --OPTICAL_DUPLICATE_PIXEL_DISTANCE 100 --MAX_OPTICAL_DUPLICATE_SET_SIZE 300000 --VERBOSITY INFO --QUIET false --VALIDATION_STRINGENCY STRICT --COMPRESSION_LEVEL 5 --MAX_RECORDS_IN_RAM 500000 --CREATE_INDEX false --CREATE_MD5_FILE false --help false --version false --showHidden false --USE_JDK_DEFLATER false --USE_JDK_INFLATER false", + "## htsjdk.samtools.metrics.StringHeader" + ], + { + "versions_picard": [ + [ + "PICARD_MARKDUPLICATES", + "picard", + "3.4.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + }, + "timestamp": "2026-02-19T17:42:40.574463587" + }, + "sarscov2 [sorted bam]": { + "content": [ + "test.md.bam", + [ + "## htsjdk.samtools.metrics.StringHeader", + "# MarkDuplicates --INPUT test.paired_end.sorted.bam --OUTPUT test.md.bam --METRICS_FILE test.md.metrics.txt --ASSUME_SORT_ORDER queryname --MAX_SEQUENCES_FOR_DISK_READ_ENDS_MAP 50000 --MAX_FILE_HANDLES_FOR_READ_ENDS_MAP 8000 --SORTING_COLLECTION_SIZE_RATIO 0.25 --TAG_DUPLICATE_SET_MEMBERS false --REMOVE_SEQUENCING_DUPLICATES false --TAGGING_POLICY DontTag --CLEAR_DT true --DUPLEX_UMI false --FLOW_MODE false --FLOW_DUP_STRATEGY FLOW_QUALITY_SUM_STRATEGY --FLOW_USE_END_IN_UNPAIRED_READS false --FLOW_USE_UNPAIRED_CLIPPED_END false --FLOW_UNPAIRED_END_UNCERTAINTY 0 --FLOW_UNPAIRED_START_UNCERTAINTY 0 --FLOW_SKIP_FIRST_N_FLOWS 0 --FLOW_Q_IS_KNOWN_END false --FLOW_EFFECTIVE_QUALITY_THRESHOLD 15 --ADD_PG_TAG_TO_READS true --REMOVE_DUPLICATES false --ASSUME_SORTED false --DUPLICATE_SCORING_STRATEGY SUM_OF_BASE_QUALITIES --PROGRAM_RECORD_ID MarkDuplicates --PROGRAM_GROUP_NAME MarkDuplicates --READ_NAME_REGEX --OPTICAL_DUPLICATE_PIXEL_DISTANCE 100 --MAX_OPTICAL_DUPLICATE_SET_SIZE 300000 --VERBOSITY INFO --QUIET false --VALIDATION_STRINGENCY STRICT --COMPRESSION_LEVEL 5 --MAX_RECORDS_IN_RAM 500000 --CREATE_INDEX false --CREATE_MD5_FILE false --help false --version false --showHidden false --USE_JDK_DEFLATER false --USE_JDK_INFLATER false", + "## htsjdk.samtools.metrics.StringHeader" + ], + { + "versions_picard": [ + [ + "PICARD_MARKDUPLICATES", + "picard", + "3.4.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + }, + "timestamp": "2026-02-19T17:42:49.374645492" + }, + "homo_sapiens [cram]": { + "content": [ + "test.md.cram", + [ + "## htsjdk.samtools.metrics.StringHeader", + "# MarkDuplicates --INPUT test.paired_end.sorted.cram --OUTPUT test.md.cram --METRICS_FILE test.md.metrics.txt --ASSUME_SORT_ORDER queryname --REFERENCE_SEQUENCE genome.fasta --MAX_SEQUENCES_FOR_DISK_READ_ENDS_MAP 50000 --MAX_FILE_HANDLES_FOR_READ_ENDS_MAP 8000 --SORTING_COLLECTION_SIZE_RATIO 0.25 --TAG_DUPLICATE_SET_MEMBERS false --REMOVE_SEQUENCING_DUPLICATES false --TAGGING_POLICY DontTag --CLEAR_DT true --DUPLEX_UMI false --FLOW_MODE false --FLOW_DUP_STRATEGY FLOW_QUALITY_SUM_STRATEGY --FLOW_USE_END_IN_UNPAIRED_READS false --FLOW_USE_UNPAIRED_CLIPPED_END false --FLOW_UNPAIRED_END_UNCERTAINTY 0 --FLOW_UNPAIRED_START_UNCERTAINTY 0 --FLOW_SKIP_FIRST_N_FLOWS 0 --FLOW_Q_IS_KNOWN_END false --FLOW_EFFECTIVE_QUALITY_THRESHOLD 15 --ADD_PG_TAG_TO_READS true --REMOVE_DUPLICATES false --ASSUME_SORTED false --DUPLICATE_SCORING_STRATEGY SUM_OF_BASE_QUALITIES --PROGRAM_RECORD_ID MarkDuplicates --PROGRAM_GROUP_NAME MarkDuplicates --READ_NAME_REGEX --OPTICAL_DUPLICATE_PIXEL_DISTANCE 100 --MAX_OPTICAL_DUPLICATE_SET_SIZE 300000 --VERBOSITY INFO --QUIET false --VALIDATION_STRINGENCY STRICT --COMPRESSION_LEVEL 5 --MAX_RECORDS_IN_RAM 500000 --CREATE_INDEX false --CREATE_MD5_FILE false --help false --version false --showHidden false --USE_JDK_DEFLATER false --USE_JDK_INFLATER false", + "## htsjdk.samtools.metrics.StringHeader" + ], + { + "versions_picard": [ + [ + "PICARD_MARKDUPLICATES", + "picard", + "3.4.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + }, + "timestamp": "2026-02-19T17:42:59.07843756" + }, + "homo_sapiens [cram] - stub": { + "content": [ + { + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.cram.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam": [ + + ], + "cram": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_picard": [ + [ + "PICARD_MARKDUPLICATES", + "picard", + "3.4.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + }, + "timestamp": "2026-02-19T17:43:20.676018462" + } +} \ No newline at end of file diff --git a/modules/nf-core/picard/markduplicates/tests/nextflow.config b/modules/nf-core/picard/markduplicates/tests/nextflow.config new file mode 100644 index 00000000..f8dd0f1c --- /dev/null +++ b/modules/nf-core/picard/markduplicates/tests/nextflow.config @@ -0,0 +1,6 @@ +process { + withName: PICARD_MARKDUPLICATES { + ext.prefix = { "${meta.id}.md" } + ext.args = '--ASSUME_SORT_ORDER queryname' + } +} diff --git a/modules/nf-core/picard/mergesamfiles/environment.yml b/modules/nf-core/picard/mergesamfiles/environment.yml new file mode 100644 index 00000000..b4ac4fe0 --- /dev/null +++ b/modules/nf-core/picard/mergesamfiles/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/picard + - bioconda::picard=3.4.0 diff --git a/modules/nf-core/picard/mergesamfiles/main.nf b/modules/nf-core/picard/mergesamfiles/main.nf index fc23ea01..7c20a823 100644 --- a/modules/nf-core/picard/mergesamfiles/main.nf +++ b/modules/nf-core/picard/mergesamfiles/main.nf @@ -1,18 +1,18 @@ process PICARD_MERGESAMFILES { - tag "$meta.id" + tag "${meta.id}" label 'process_medium' - conda "bioconda::picard=3.0.0" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:3.0.0--hdfd78af_1' : - 'biocontainers/picard:3.0.0--hdfd78af_1' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/08/0861295baa7c01fc593a9da94e82b44a729dcaf8da92be8e565da109aa549b25/data' + : 'community.wave.seqera.io/library/picard:3.4.0--e9963040df0a9bf6'}" input: tuple val(meta), path(bams) output: tuple val(meta), path("*.bam"), emit: bam - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('picard'), eval("picard MergeSamFiles --version 2>&1 | sed -n 's/.*Version://p'"), topic: versions, emit: versions_picard when: task.ext.when == null || task.ext.when @@ -23,30 +23,30 @@ process PICARD_MERGESAMFILES { def bam_files = bams.sort() def avail_mem = 3072 if (!task.memory) { - log.info '[Picard MergeSamFiles] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[Picard MergeSamFiles] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } if (bam_files.size() > 1) { """ picard \\ -Xmx${avail_mem}M \\ MergeSamFiles \\ - $args \\ - ${'--INPUT '+bam_files.join(' --INPUT ')} \\ + ${args} \\ + ${'--INPUT ' + bam_files.join(' --INPUT ')} \\ --OUTPUT ${prefix}.bam - cat <<-END_VERSIONS > versions.yml - "${task.process}": - picard: \$( echo \$(picard MergeSamFiles --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) - END_VERSIONS """ - } else { + } + else { """ ln -s ${bam_files[0]} ${prefix}.bam - cat <<-END_VERSIONS > versions.yml - "${task.process}": - picard: \$( echo \$(picard MergeSamFiles --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) - END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + """ } diff --git a/modules/nf-core/picard/mergesamfiles/meta.yml b/modules/nf-core/picard/mergesamfiles/meta.yml index 5f07ecd0..0ff19f33 100644 --- a/modules/nf-core/picard/mergesamfiles/meta.yml +++ b/modules/nf-core/picard/mergesamfiles/meta.yml @@ -13,29 +13,51 @@ tools: homepage: https://broadinstitute.github.io/picard/ documentation: https://broadinstitute.github.io/picard/ licence: ["MIT"] + identifier: biotools:picard_tools input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: List of BAM files - pattern: "*.{bam}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bams: + type: list + description: List of input BAM files to be merged + pattern: "*.{bam}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: Merged BAM file - pattern: "*.{bam}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bam": + type: file + description: Merged BAM file + pattern: "*.{bam}" + ontologies: [] + versions_picard: + - - ${task.process}: + type: string + description: The process the versions were collected from + - picard: + type: string + description: The tool name + - "picard MergeSamFiles --version 2>&1 | sed -n 's/.*Version://p'": + type: string + description: The command used to generate the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - picard: + type: string + description: The tool name + - "picard MergeSamFiles --version 2>&1 | sed -n 's/.*Version://p'": + type: string + description: The command used to generate the version of the tool authors: - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/modules/nf-core/picard/mergesamfiles/tests/main.nf.test b/modules/nf-core/picard/mergesamfiles/tests/main.nf.test new file mode 100644 index 00000000..e18d882f --- /dev/null +++ b/modules/nf-core/picard/mergesamfiles/tests/main.nf.test @@ -0,0 +1,57 @@ + +nextflow_process { + + name "Test Process PICARD_MERGESAMFILES" + script "../main.nf" + process "PICARD_MERGESAMFILES" + + tag "modules" + tag "modules_nfcore" + tag "picard" + tag "picard/mergesamfiles" + + test("test-picard-mergesamfiles") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.bam', checkIfExists: true), ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.findAll { key, val -> key.startsWith("versions") } + ).match()} + ) + } + } + + test("test-picard-mergesamfiles - stub") { + options "-stub" + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.bam', checkIfExists: true), ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } +} diff --git a/modules/nf-core/picard/mergesamfiles/tests/main.nf.test.snap b/modules/nf-core/picard/mergesamfiles/tests/main.nf.test.snap new file mode 100644 index 00000000..4fa2be19 --- /dev/null +++ b/modules/nf-core/picard/mergesamfiles/tests/main.nf.test.snap @@ -0,0 +1,48 @@ +{ + "test-picard-mergesamfiles - stub": { + "content": [ + { + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_picard": [ + [ + "PICARD_MERGESAMFILES", + "picard", + "3.4.0" + ] + ] + } + ], + "timestamp": "2026-02-19T17:43:50.01825207", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "test-picard-mergesamfiles": { + "content": [ + "730da54c088350ff625d34b95e623dca", + { + "versions_picard": [ + [ + "PICARD_MERGESAMFILES", + "picard", + "3.4.0" + ] + ] + } + ], + "timestamp": "2026-02-19T17:43:43.104519248", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/preseq/lcextrap/environment.yml b/modules/nf-core/preseq/lcextrap/environment.yml new file mode 100644 index 00000000..a2088502 --- /dev/null +++ b/modules/nf-core/preseq/lcextrap/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::preseq=3.2.0 diff --git a/modules/nf-core/preseq/lcextrap/main.nf b/modules/nf-core/preseq/lcextrap/main.nf index 12546f0a..ba4640fb 100644 --- a/modules/nf-core/preseq/lcextrap/main.nf +++ b/modules/nf-core/preseq/lcextrap/main.nf @@ -1,12 +1,12 @@ process PRESEQ_LCEXTRAP { tag "$meta.id" label 'process_single' - label 'error_ignore' + label 'error_retry' - conda "bioconda::preseq=3.1.2" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/preseq:3.1.2--h445547b_2': - 'biocontainers/preseq:3.1.2--h445547b_2' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/preseq:3.2.0--hdcf5f25_6': + 'quay.io/biocontainers/preseq:3.2.0--hdcf5f25_6' }" input: tuple val(meta), path(bam) @@ -14,13 +14,14 @@ process PRESEQ_LCEXTRAP { output: tuple val(meta), path("*.lc_extrap.txt"), emit: lc_extrap tuple val(meta), path("*.log") , emit: log - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('preseq'), eval("preseq 2>&1 | sed -n 's/.*Version: \\(.*\\)/\\1/p'"), emit: versions_preseq, topic: versions when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' + args = task.attempt > 1 ? args.join(' -defects') : args // Disable testing for defects def prefix = task.ext.prefix ?: "${meta.id}" def paired_end = meta.single_end ? '' : '-pe' """ @@ -31,10 +32,12 @@ process PRESEQ_LCEXTRAP { -output ${prefix}.lc_extrap.txt \\ $bam cp .command.err ${prefix}.command.log + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - preseq: \$(echo \$(preseq 2>&1) | sed 's/^.*Version: //; s/Usage:.*\$//') - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.lc_extrap.txt + touch ${prefix}.command.log """ } diff --git a/modules/nf-core/preseq/lcextrap/meta.yml b/modules/nf-core/preseq/lcextrap/meta.yml old mode 100755 new mode 100644 index 1391961c..bb309952 --- a/modules/nf-core/preseq/lcextrap/meta.yml +++ b/modules/nf-core/preseq/lcextrap/meta.yml @@ -1,48 +1,79 @@ name: preseq_lcextrap -description: Software for predicting library complexity and genome coverage in high-throughput sequencing +description: Software for predicting library complexity and genome coverage in high-throughput + sequencing keywords: - preseq - library - complexity tools: - preseq: - description: Software for predicting library complexity and genome coverage in high-throughput sequencing + description: Software for predicting library complexity and genome coverage in + high-throughput sequencing homepage: http://smithlabresearch.org/software/preseq/ documentation: http://smithlabresearch.org/wp-content/uploads/manual.pdf tool_dev_url: https://github.com/smithlabcode/preseq - licence: ["GPL"] - + identifier: biotools:preseq input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - lc_extrap: - type: file - description: File containing output of Preseq lcextrap - pattern: "*.{lc_extrap.txt}" - - log: - type: file - description: Log file containing stderr produced by Preseq - pattern: "*.{log}" + lc_extrap: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.lc_extrap.txt": + type: file + description: File containing output of Preseq lcextrap + pattern: "*.{lc_extrap.txt}" + ontologies: [] + log: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.log": + type: file + description: Log file containing stderr produced by Preseq + pattern: "*.{log}" + ontologies: [] + versions_preseq: + - - ${task.process}: + type: string + description: The name of the process + - preseq: + type: string + description: The name of the tool + - "preseq 2>&1 | sed -n 's/.*Version: \\(.*\\)/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - preseq: + type: string + description: The name of the tool + - "preseq 2>&1 | sed -n 's/.*Version: \\(.*\\)/\\1/p'": + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" - - "@Emiller88" + - "@edmundmiller" +maintainers: + - "@drpatelh" + - "@edmundmiller" diff --git a/modules/nf-core/preseq/lcextrap/tests/main.nf.test b/modules/nf-core/preseq/lcextrap/tests/main.nf.test new file mode 100644 index 00000000..e3163ea0 --- /dev/null +++ b/modules/nf-core/preseq/lcextrap/tests/main.nf.test @@ -0,0 +1,104 @@ +nextflow_process { + + name "Test Process PRESEQ_LCEXTRAP" + script "../main.nf" + process "PRESEQ_LCEXTRAP" + tag "modules" + tag "modules_nfcore" + tag "preseq" + tag "preseq/lcextrap" + + test("sarscov2 - single_end") { + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + 'delete_me/preseq/SRR1003759_5M_subset.mr', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log[0][1]).name, + process.out.lc_extrap, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("sarscov2 - single_end - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + 'delete_me/preseq/SRR1003759_5M_subset.mr', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - paired_end") { + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + 'delete_me/preseq/SRR1003759_5M_subset.mr', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log[0][1]).name, + process.out.lc_extrap, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("sarscov2 - paired_end - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + 'delete_me/preseq/SRR1003759_5M_subset.mr', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/preseq/lcextrap/tests/main.nf.test.snap b/modules/nf-core/preseq/lcextrap/tests/main.nf.test.snap new file mode 100644 index 00000000..ad073de6 --- /dev/null +++ b/modules/nf-core/preseq/lcextrap/tests/main.nf.test.snap @@ -0,0 +1,180 @@ +{ + "sarscov2 - single_end": { + "content": [ + "test.command.log", + [ + [ + { + "id": "test", + "single_end": true + }, + "test.lc_extrap.txt:md5,1fa5cdd601079329618f61660bee00de" + ] + ], + { + "versions_preseq": [ + [ + "PRESEQ_LCEXTRAP", + "preseq", + "3.2.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-02T14:35:59.779654786" + }, + "sarscov2 - single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.lc_extrap.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.command.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "PRESEQ_LCEXTRAP", + "preseq", + "3.2.0" + ] + ], + "lc_extrap": [ + [ + { + "id": "test", + "single_end": true + }, + "test.lc_extrap.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.command.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_preseq": [ + [ + "PRESEQ_LCEXTRAP", + "preseq", + "3.2.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-02T14:36:05.164534216" + }, + "sarscov2 - paired_end": { + "content": [ + "test.command.log", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.lc_extrap.txt:md5,10e5ea860e87fb6f5dc10f4f20c62040" + ] + ], + { + "versions_preseq": [ + [ + "PRESEQ_LCEXTRAP", + "preseq", + "3.2.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-02T14:36:10.713888585" + }, + "sarscov2 - paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.lc_extrap.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.command.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "PRESEQ_LCEXTRAP", + "preseq", + "3.2.0" + ] + ], + "lc_extrap": [ + [ + { + "id": "test", + "single_end": false + }, + "test.lc_extrap.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.command.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_preseq": [ + [ + "PRESEQ_LCEXTRAP", + "preseq", + "3.2.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-02T14:36:16.120076691" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/environment.yml b/modules/nf-core/samtools/faidx/environment.yml new file mode 100644 index 00000000..946bb362 --- /dev/null +++ b/modules/nf-core/samtools/faidx/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.23.1 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.23.1 diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf new file mode 100644 index 00000000..175a53a8 --- /dev/null +++ b/modules/nf-core/samtools/faidx/main.nf @@ -0,0 +1,49 @@ +process SAMTOOLS_FAIDX { + tag "${fasta}" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c5d2818c8b9f58e1fba77ce219fdaf32087ae53e857c4a496402978af26e78c/data' + : 'community.wave.seqera.io/library/htslib_samtools:1.23.1--5b6bb4ede7e612e5'}" + + input: + tuple val(meta), path(fasta), path(fai) + val get_sizes + + output: + tuple val(meta), path("*.{fa,fasta}"), emit: fa, optional: true + tuple val(meta), path("*.sizes"), emit: sizes, optional: true + tuple val(meta), path("*.fai"), emit: fai, optional: true + tuple val(meta), path("*.gzi"), emit: gzi, optional: true + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), topic: versions, emit: versions_samtools + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def get_sizes_command = get_sizes ? "cut -f 1,2 ${fasta}.fai > ${fasta}.sizes" : '' + """ + samtools \\ + faidx \\ + ${fasta} \\ + ${args} + + ${get_sizes_command} + """ + + stub: + def match = (task.ext.args =~ /-o(?:utput)?\s(.*)\s?/).findAll() + def fastacmd = match[0] ? "touch ${match[0][1]}" : '' + def get_sizes_command = get_sizes ? "touch ${fasta}.sizes" : '' + """ + ${fastacmd} + touch ${fasta}.fai + if [[ "${fasta.extension}" == "gz" ]]; then + touch ${fasta}.gzi + fi + + ${get_sizes_command} + """ +} diff --git a/modules/nf-core/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml new file mode 100644 index 00000000..529f7a26 --- /dev/null +++ b/modules/nf-core/samtools/faidx/meta.yml @@ -0,0 +1,113 @@ +name: samtools_faidx +description: Index FASTA file, and optionally generate a file of chromosome + sizes +keywords: + - index + - fasta + - faidx + - chromosome +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: + - "MIT" + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test' ] + - fasta: + type: file + description: FASTA file + pattern: "*.{fa,fasta}" + ontologies: [] + - fai: + type: file + description: FASTA index file + pattern: "*.{fai}" + ontologies: [] + - get_sizes: + type: boolean + description: use cut to get the sizes of the index (true) or not (false) +output: + fa: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{fa,fasta}": + type: file + description: FASTA file + pattern: "*.{fa}" + ontologies: [] + sizes: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.sizes": + type: file + description: File containing chromosome lengths + pattern: "*.{sizes}" + ontologies: [] + fai: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.fai": + type: file + description: FASTA index file + pattern: "*.{fai}" + ontologies: [] + gzi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.gzi": + type: file + description: Optional gzip index file for compressed inputs + pattern: "*.gzi" + ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: eval + description: The command used to generate the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: eval + description: The command used to generate the version of the tool +authors: + - "@drpatelh" + - "@ewels" + - "@phue" +maintainers: + - "@maxulysse" + - "@phue" + - "@matthdsm" diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test b/modules/nf-core/samtools/faidx/tests/main.nf.test new file mode 100644 index 00000000..9a86db86 --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test @@ -0,0 +1,253 @@ +nextflow_process { + + name "Test Process SAMTOOLS_FAIDX" + script "../main.nf" + process "SAMTOOLS_FAIDX" + + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/faidx" + config "./nextflow.config" + + test("test_samtools_faidx") { + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + [] + ] + input[1] = false + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match()} + ) + } + } + + test("test_samtools_faidx_bgzip") { + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true), + [] + ] + input[1] = false + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match()} + ) + } + } + + test("test_samtools_faidx_fasta") { + + when { + params { + module_args = 'MT192765.1 -o extract.fa' + } + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + input[1] = false + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match()} + ) + } + } + + test("test_samtools_faidx_stub_fasta") { + + options "-stub" + when { + params { + module_args = '-o extract.fa' + } + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + input[1] = false + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match()} + ) + } + } + + test("test_samtools_faidx_stub_fai") { + + options "-stub" + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + [] + ] + input[1] = false + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match()} + ) + } + } + + test("test_samtools_faidx_get_sizes") { + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + [] + ] + input[1] = true + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match()} + ) + } + } + + test("test_samtools_faidx_get_sizes_bgzip") { + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true), + [] + ] + input[1] = true + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match()} + ) + } + } + + test("test_samtools_faidx_get_sizes - stub") { + + options "-stub" + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + [] + ] + input[1] = true + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match()} + ) + } + } + + test("test_samtools_faidx_get_sizes_bgzip - stub") { + + options "-stub" + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true), + [] + ] + input[1] = true + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match()} + ) + } + } + +} diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap new file mode 100644 index 00000000..64fe7fc4 --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap @@ -0,0 +1,352 @@ +{ + "test_samtools_faidx": { + "content": [ + { + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + + ], + "sizes": [ + + ], + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T08:57:29.747964" + }, + "test_samtools_faidx_get_sizes_bgzip - stub": { + "content": [ + { + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gzi": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T08:58:10.04235" + }, + "test_samtools_faidx_get_sizes": { + "content": [ + { + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] + ], + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T08:57:55.552612" + }, + "test_samtools_faidx_bgzip": { + "content": [ + { + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "sizes": [ + + ], + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T08:57:34.346045" + }, + "test_samtools_faidx_fasta": { + "content": [ + { + "fa": [ + [ + { + "id": "test" + }, + "extract.fa:md5,6a0774a0ad937ba0bfd2ac7457d90f36" + ] + ], + "fai": [ + + ], + "gzi": [ + + ], + "sizes": [ + + ], + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T08:57:39.136814" + }, + "test_samtools_faidx_get_sizes - stub": { + "content": [ + { + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gzi": [ + + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T08:58:05.200994" + }, + "test_samtools_faidx_stub_fasta": { + "content": [ + { + "fa": [ + [ + { + "id": "test" + }, + "extract.fa:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fai": [ + + ], + "gzi": [ + + ], + "sizes": [ + + ], + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T08:57:44.105654" + }, + "test_samtools_faidx_stub_fai": { + "content": [ + { + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gzi": [ + + ], + "sizes": [ + + ], + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T08:57:50.839162" + }, + "test_samtools_faidx_get_sizes_bgzip": { + "content": [ + { + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] + ], + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.23.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-03-19T08:58:00.460031" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/tests/nextflow.config b/modules/nf-core/samtools/faidx/tests/nextflow.config new file mode 100644 index 00000000..b3c4d0cb --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/nextflow.config @@ -0,0 +1,6 @@ +process { + + withName: SAMTOOLS_FAIDX { + ext.args = params.module_args + } +} diff --git a/modules/nf-core/samtools/flagstat/environment.yml b/modules/nf-core/samtools/flagstat/environment.yml new file mode 100644 index 00000000..6a19f168 --- /dev/null +++ b/modules/nf-core/samtools/flagstat/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 diff --git a/modules/nf-core/samtools/flagstat/main.nf b/modules/nf-core/samtools/flagstat/main.nf index eb7e72fc..f4a0b3b3 100644 --- a/modules/nf-core/samtools/flagstat/main.nf +++ b/modules/nf-core/samtools/flagstat/main.nf @@ -1,35 +1,47 @@ process SAMTOOLS_FLAGSTAT { - tag "$meta.id" + tag "${meta.id}" label 'process_single' - conda "bioconda::samtools=1.17" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : - 'biocontainers/samtools:1.17--h00cdaf9_0' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e9/e994bf4eb3731150511a14f5706b7bdfd64df1b6d40898fff334286c027e0859/data' + : 'community.wave.seqera.io/library/htslib_samtools:1.24--d697cfb9dce007cd'}" input: tuple val(meta), path(bam), path(bai) output: tuple val(meta), path("*.flagstat"), emit: flagstat - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), emit: versions_samtools, topic: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ samtools \\ flagstat \\ --threads ${task.cpus} \\ - $bam \\ + ${bam} \\ > ${prefix}.flagstat + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + cat <<-END_FLAGSTAT > ${prefix}.flagstat + 1000000 + 0 in total (QC-passed reads + QC-failed reads) + 0 + 0 secondary + 0 + 0 supplementary + 0 + 0 duplicates + 900000 + 0 mapped (90.00% : N/A) + 1000000 + 0 paired in sequencing + 500000 + 0 read1 + 500000 + 0 read2 + 800000 + 0 properly paired (80.00% : N/A) + 850000 + 0 with mate mapped to a different chr + 50000 + 0 with mate mapped to a different chr (mapQ>=5) + END_FLAGSTAT """ } diff --git a/modules/nf-core/samtools/flagstat/meta.yml b/modules/nf-core/samtools/flagstat/meta.yml index 954225df..f658acdd 100644 --- a/modules/nf-core/samtools/flagstat/meta.yml +++ b/modules/nf-core/samtools/flagstat/meta.yml @@ -1,5 +1,6 @@ name: samtools_flagstat -description: Counts the number of alignments in a BAM/CRAM/SAM file for each FLAG type +description: Counts the number of alignments in a BAM/CRAM/SAM file for each + FLAG type keywords: - stats - mapping @@ -16,34 +17,60 @@ tools: homepage: http://www.htslib.org/ documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" + identifier: biotools:samtools input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - bai: - type: file - description: Index for BAM/CRAM/SAM file - pattern: "*.{bai,crai,sai}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: [] + - bai: + type: file + description: Index for BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - flagstat: - type: file - description: File containing samtools flagstat output - pattern: "*.{flagstat}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + flagstat: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.flagstat": + type: file + description: File containing samtools flagstat output + pattern: "*.{flagstat}" + ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" +maintainers: + - "@drpatelh" + - "@matthdsm" diff --git a/modules/nf-core/samtools/flagstat/tests/main.nf.test b/modules/nf-core/samtools/flagstat/tests/main.nf.test new file mode 100644 index 00000000..dbf7c996 --- /dev/null +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test @@ -0,0 +1,56 @@ +nextflow_process { + + name "Test Process SAMTOOLS_FLAGSTAT" + script "../main.nf" + process "SAMTOOLS_FLAGSTAT" + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/flagstat" + + test("BAM") { + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } + + test("BAM - stub") { + + options "-stub" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } +} diff --git a/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap new file mode 100644 index 00000000..f572957b --- /dev/null +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap @@ -0,0 +1,56 @@ +{ + "BAM - stub": { + "content": [ + { + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "versions_samtools": [ + [ + "SAMTOOLS_FLAGSTAT", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T15:53:38.552555213", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "BAM": { + "content": [ + { + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ], + "versions_samtools": [ + [ + "SAMTOOLS_FLAGSTAT", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T15:53:33.931611374", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/idxstats/environment.yml b/modules/nf-core/samtools/idxstats/environment.yml new file mode 100644 index 00000000..6a19f168 --- /dev/null +++ b/modules/nf-core/samtools/idxstats/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 diff --git a/modules/nf-core/samtools/idxstats/main.nf b/modules/nf-core/samtools/idxstats/main.nf index a257d700..58d31062 100644 --- a/modules/nf-core/samtools/idxstats/main.nf +++ b/modules/nf-core/samtools/idxstats/main.nf @@ -1,36 +1,38 @@ process SAMTOOLS_IDXSTATS { - tag "$meta.id" + tag "${meta.id}" label 'process_single' - conda "bioconda::samtools=1.17" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : - 'biocontainers/samtools:1.17--h00cdaf9_0' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e9/e994bf4eb3731150511a14f5706b7bdfd64df1b6d40898fff334286c027e0859/data' + : 'community.wave.seqera.io/library/htslib_samtools:1.24--d697cfb9dce007cd'}" input: tuple val(meta), path(bam), path(bai) output: tuple val(meta), path("*.idxstats"), emit: idxstats - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), emit: versions_samtools, topic: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ + # Note: --threads value represents *additional* CPUs to allocate (total CPUs = 1 + --threads). samtools \\ idxstats \\ - --threads ${task.cpus-1} \\ - $bam \\ + --threads ${task.cpus - 1} \\ + ${bam} \\ > ${prefix}.idxstats + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + """ + touch ${prefix}.idxstats """ } diff --git a/modules/nf-core/samtools/idxstats/meta.yml b/modules/nf-core/samtools/idxstats/meta.yml index dda87e1e..0f9fb3d7 100644 --- a/modules/nf-core/samtools/idxstats/meta.yml +++ b/modules/nf-core/samtools/idxstats/meta.yml @@ -17,34 +17,60 @@ tools: homepage: http://www.htslib.org/ documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" + identifier: biotools:samtools input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - bai: - type: file - description: Index for BAM/CRAM/SAM file - pattern: "*.{bai,crai,sai}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: [] + - bai: + type: file + description: Index for BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - idxstats: - type: file - description: File containing samtools idxstats output - pattern: "*.{idxstats}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + idxstats: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.idxstats": + type: file + description: File containing samtools idxstats output + pattern: "*.{idxstats}" + ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" +maintainers: + - "@drpatelh" + - "@matthdsm" diff --git a/modules/nf-core/samtools/idxstats/tests/main.nf.test b/modules/nf-core/samtools/idxstats/tests/main.nf.test new file mode 100644 index 00000000..cc204d6a --- /dev/null +++ b/modules/nf-core/samtools/idxstats/tests/main.nf.test @@ -0,0 +1,62 @@ +nextflow_process { + + name "Test Process SAMTOOLS_IDXSTATS" + script "../main.nf" + process "SAMTOOLS_IDXSTATS" + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/idxstats" + + test("bam") { + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.idxstats, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.idxstats, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } +} diff --git a/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap b/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap new file mode 100644 index 00000000..2dba681c --- /dev/null +++ b/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap @@ -0,0 +1,56 @@ +{ + "bam - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_IDXSTATS", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-03-19T08:59:41.877526", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "bam": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_IDXSTATS", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-03-19T08:59:34.725514", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/index/environment.yml b/modules/nf-core/samtools/index/environment.yml new file mode 100644 index 00000000..6a19f168 --- /dev/null +++ b/modules/nf-core/samtools/index/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 diff --git a/modules/nf-core/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf index 0b20aa4b..4dd9311a 100644 --- a/modules/nf-core/samtools/index/main.nf +++ b/modules/nf-core/samtools/index/main.nf @@ -1,20 +1,18 @@ process SAMTOOLS_INDEX { - tag "$meta.id" + tag "${meta.id}" label 'process_low' - conda "bioconda::samtools=1.17" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : - 'biocontainers/samtools:1.17--h00cdaf9_0' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e9/e994bf4eb3731150511a14f5706b7bdfd64df1b6d40898fff334286c027e0859/data' + : 'community.wave.seqera.io/library/htslib_samtools:1.24--d697cfb9dce007cd'}" input: tuple val(meta), path(input) output: - tuple val(meta), path("*.bai") , optional:true, emit: bai - tuple val(meta), path("*.csi") , optional:true, emit: csi - tuple val(meta), path("*.crai"), optional:true, emit: crai - path "versions.yml" , emit: versions + tuple val(meta), path("*.{bai,csi,crai}"), emit: index + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), emit: versions_samtools, topic: versions when: task.ext.when == null || task.ext.when @@ -24,25 +22,17 @@ process SAMTOOLS_INDEX { """ samtools \\ index \\ - -@ ${task.cpus-1} \\ - $args \\ - $input - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + -@ ${task.cpus} \\ + ${args} \\ + ${input} """ stub: + def args = task.ext.args ?: '' + def extension = file(input).getExtension() == 'cram' + ? "crai" + : args.contains("-c") ? "csi" : "bai" """ - touch ${input}.bai - touch ${input}.crai - touch ${input}.csi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + touch ${input}.${extension} """ } diff --git a/modules/nf-core/samtools/index/meta.yml b/modules/nf-core/samtools/index/meta.yml index 8bd2fa6f..d4938bcd 100644 --- a/modules/nf-core/samtools/index/meta.yml +++ b/modules/nf-core/samtools/index/meta.yml @@ -14,40 +14,57 @@ tools: homepage: http://www.htslib.org/ documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" + identifier: biotools:samtools input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: input file + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bai: - type: file - description: BAM/CRAM/SAM index file - pattern: "*.{bai,crai,sai}" - - crai: - type: file - description: BAM/CRAM/SAM index file - pattern: "*.{bai,crai,sai}" - - csi: - type: file - description: CSI index file - pattern: "*.{csi}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + index: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{bai,csi,crai}": + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,csi,crai}" + ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" - "@ewels" - "@maxulysse" +maintainers: + - "@ewels" + - "@maxulysse" + - "@matthdsm" diff --git a/modules/nf-core/samtools/index/tests/csi.nextflow.config b/modules/nf-core/samtools/index/tests/csi.nextflow.config new file mode 100644 index 00000000..4af6d82c --- /dev/null +++ b/modules/nf-core/samtools/index/tests/csi.nextflow.config @@ -0,0 +1,6 @@ +process { + + withName: SAMTOOLS_INDEX { + ext.args = '-c' + } +} diff --git a/modules/nf-core/samtools/index/tests/main.nf.test b/modules/nf-core/samtools/index/tests/main.nf.test new file mode 100644 index 00000000..d62d2d0f --- /dev/null +++ b/modules/nf-core/samtools/index/tests/main.nf.test @@ -0,0 +1,161 @@ +nextflow_process { + + name "Test Process SAMTOOLS_INDEX" + script "../main.nf" + process "SAMTOOLS_INDEX" + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/index" + + test("bai") { + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.index, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("crai") { + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true) + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.index, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("csi") { + config "./csi.nextflow.config" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + file(process.out.index[0][1]).name, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("bai - stub") { + + options "-stub" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.index, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("crai - stub") { + + options "-stub" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true) + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.index, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("csi - stub") { + + options "-stub" + + config "./csi.nextflow.config" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.index, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } +} diff --git a/modules/nf-core/samtools/index/tests/main.nf.test.snap b/modules/nf-core/samtools/index/tests/main.nf.test.snap new file mode 100644 index 00000000..7aec3823 --- /dev/null +++ b/modules/nf-core/samtools/index/tests/main.nf.test.snap @@ -0,0 +1,156 @@ +{ + "csi - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_INDEX", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-03-19T09:00:39.171613", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "crai - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_INDEX", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-03-19T09:00:32.838795", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "bai - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_INDEX", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-03-19T09:00:25.255379", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "csi": { + "content": [ + "test.paired_end.sorted.bam.csi", + { + "versions_samtools": [ + [ + "SAMTOOLS_INDEX", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-03-19T09:00:18.414839", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "crai": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,14bc3bd5c89cacc8f4541f9062429029" + ] + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_INDEX", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-03-19T09:00:13.571297", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "bai": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,704c10dd1326482448ca3073fdebc2f4" + ] + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_INDEX", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-03-19T09:00:06.767362", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/sort/environment.yml b/modules/nf-core/samtools/sort/environment.yml new file mode 100644 index 00000000..6a19f168 --- /dev/null +++ b/modules/nf-core/samtools/sort/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 diff --git a/modules/nf-core/samtools/sort/main.nf b/modules/nf-core/samtools/sort/main.nf index 2b7753fd..01f4f8c6 100644 --- a/modules/nf-core/samtools/sort/main.nf +++ b/modules/nf-core/samtools/sort/main.nf @@ -1,49 +1,97 @@ process SAMTOOLS_SORT { - tag "$meta.id" + tag "${meta.id}" label 'process_medium' - conda "bioconda::samtools=1.17" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : - 'biocontainers/samtools:1.17--h00cdaf9_0' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e9/e994bf4eb3731150511a14f5706b7bdfd64df1b6d40898fff334286c027e0859/data' + : 'community.wave.seqera.io/library/htslib_samtools:1.24--d697cfb9dce007cd'}" input: - tuple val(meta), path(bam) + tuple val(meta), path(bam, stageAs: "?/*") + tuple val(meta2), path(fasta), path(fai) + val index_format output: - tuple val(meta), path("*.bam"), emit: bam - tuple val(meta), path("*.csi"), emit: csi, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("${prefix}.bam"), emit: bam, optional: true + tuple val(meta), path("${prefix}.cram"), emit: cram, optional: true + tuple val(meta), path("${prefix}.sam"), emit: sam, optional: true + tuple val(meta), path("${prefix}.${extension}.{crai,csi,bai}"), emit: index, optional: true + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), topic: versions, emit: versions_samtools when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - if ("$bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + prefix = task.ext.prefix ?: "${meta.id}" + extension = args.contains("--output-fmt sam") + ? "sam" + : args.contains("--output-fmt cram") + ? "cram" + : "bam" + def reference = fasta ? "--reference ${fasta}" : "" + //setting default values + def write_index = "" + def output_file = "${prefix}.${extension}" + + // Update if index is requested + if (index_format != '' && index_format) { + write_index = "--write-index" + output_file = "${prefix}.${extension}##idx##${prefix}.${extension}.${index_format}" + } + def is_sam = (bam instanceof List ? bam[0] : bam).name.endsWith('.sam') + if (index_format) { + if (!index_format.matches('bai|csi|crai')) { + error("Index format not one of bai, csi, crai.") + } + else if (extension == "sam") { + error("Indexing not compatible with SAM output") + } + } + if ("${bam}" == "${prefix}.bam") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } + if ("${bam}" == "${prefix}.bam") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } + + def input_source = is_sam ? "${bam}" : "-" + def pre_command = is_sam ? "" : "samtools cat ${bam} | " + """ - samtools sort \\ - $args \\ - -@ $task.cpus \\ - -o ${prefix}.bam \\ - -T $prefix \\ - $bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + ${pre_command}samtools sort \\ + ${args} \\ + -T ${prefix} \\ + --threads ${task.cpus} \\ + ${reference} \\ + -o ${output_file} \\ + ${write_index} \\ + ${input_source} """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.bam + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + extension = args.contains("--output-fmt sam") + ? "sam" + : args.contains("--output-fmt cram") + ? "cram" + : "bam" + + if (index_format) { + if (!index_format.matches('bai|csi|crai')) { + error("Index format not one of bai, csi, crai.") + } + else if (extension == "sam") { + error("Indexing not compatible with SAM output") + } + } - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + index = index_format ? "touch ${prefix}.${extension}.${index_format}" : "" + + """ + touch ${prefix}.${extension} + ${index} """ } diff --git a/modules/nf-core/samtools/sort/meta.yml b/modules/nf-core/samtools/sort/meta.yml index 07328431..0447a95e 100644 --- a/modules/nf-core/samtools/sort/meta.yml +++ b/modules/nf-core/samtools/sort/meta.yml @@ -15,34 +15,112 @@ tools: documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 licence: ["MIT"] + identifier: biotools:samtools input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file(s) + pattern: "*.{bam,cram,sam}" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: Reference genome FASTA file + pattern: "*.{fa,fasta,fna}" + optional: true + ontologies: [] + - fai: + type: file + description: Reference genome FASTA index file + pattern: "*.{fai}" + optional: true + ontologies: [] + - index_format: + type: string + description: Index format to use (optional) + pattern: "bai|csi|crai" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - csi: - type: file - description: BAM index file (optional) - pattern: "*.csi" + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "${prefix}.bam": + type: file + description: Sorted BAM file + pattern: "*.{bam}" + ontologies: [] + cram: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "${prefix}.cram": + type: file + description: Sorted CRAM file + pattern: "*.{cram}" + ontologies: [] + sam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "${prefix}.sam": + type: file + description: Sorted SAM file + pattern: "*.{sam}" + ontologies: [] + index: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "${prefix}.${extension}.{crai,csi,bai}": + type: file + description: CRAM index file (optional) + pattern: "*.{crai,csi,bai}" + ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool + authors: - "@drpatelh" - "@ewels" + - "@matthdsm" +maintainers: + - "@drpatelh" + - "@ewels" + - "@matthdsm" diff --git a/modules/nf-core/samtools/sort/tests/main.nf.test b/modules/nf-core/samtools/sort/tests/main.nf.test new file mode 100644 index 00000000..035e91b6 --- /dev/null +++ b/modules/nf-core/samtools/sort/tests/main.nf.test @@ -0,0 +1,375 @@ +nextflow_process { + + name "Test Process SAMTOOLS_SORT" + script "../main.nf" + process "SAMTOOLS_SORT" + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/sort" + + test("bam_no_index") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true) + ]) + input[1] = channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + input[2] = '' + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.bam.collect{meta, bam_ -> file(bam_).name + ':readsMD5,' + bam(bam_).getReadsMD5()}, + process.out.index, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("bam_bai_index") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true) + ]) + input[1] = channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + input[2] = 'bai' + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.bam.collect{meta, bam_ -> file(bam_).name + ':readsMD5,' + bam(bam_).getReadsMD5()}, + process.out.index, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("bam_csi_index") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true) + ]) + input[1] = channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + input[2] = 'csi' + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.bam.collect{meta, bam_ -> file(bam_).name + ':readsMD5,' + bam(bam_).getReadsMD5()}, + process.out.index, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("multiple bam") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam', checkIfExists: true) + ] + ]) + input[1] = channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + input[2] = '' + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.bam.collect{meta, bam_ -> file(bam_).name + ':readsMD5,' + bam(bam_).getReadsMD5()}, + process.out.index.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("multiple bam bai index") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam', checkIfExists: true) + ] + ]) + input[1] = channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + input[2] = 'bai' + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.bam.collect{meta, bam_ -> file(bam_).name + ':readsMD5,' + bam(bam_).getReadsMD5()}, + process.out.index.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("multiple bam csi index") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam', checkIfExists: true) + ] + ]) + input[1] = channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + input[2] = 'csi' + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.bam.collect{meta, bam_ -> file(bam_).name + ':readsMD5,' + bam(bam_).getReadsMD5()}, + process.out.index.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("cram") { + + config "./nextflow_cram.config" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true) + ]) + input[1] = channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + input[2] = '' + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.cram.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.index.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("bam - stub") { + + options "-stub" + config "./nextflow.config" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true) + ]) + input[1] = channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + input[2] = '' + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match() } + ) + } + } + + test("multiple bam - stub") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam', checkIfExists: true) + ] + ]) + input[1] = channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + input[2] = '' + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match() } + ) + } + } + + test("cram - stub") { + + options "-stub" + config "./nextflow_cram.config" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true) + ]) + input[1] = channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + input[2] = '' + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match() } + ) + } + } + + test("sam") { + + config "./nextflow_sam.config" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/pairtools/mock.sam', checkIfExists: true) + ]) + input[1] = channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + input[2] = '' + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.bam.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.index.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } +} diff --git a/modules/nf-core/samtools/sort/tests/main.nf.test.snap b/modules/nf-core/samtools/sort/tests/main.nf.test.snap new file mode 100644 index 00000000..77866728 --- /dev/null +++ b/modules/nf-core/samtools/sort/tests/main.nf.test.snap @@ -0,0 +1,284 @@ +{ + "cram": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.cram" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.cram.crai" + ] + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T07:15:51.469358", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.6" + } + }, + "bam_csi_index": { + "content": [ + [ + "test.sorted.bam:readsMD5,894549ee3ced6b5ca2eed2563a985217" + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.csi:md5,43f545200e545ca2075c475d194a5130" + ] + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T17:05:03.136300204", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "bam - stub": { + "content": [ + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-03-19T09:04:43.558376", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "multiple bam bai index": { + "content": [ + [ + "test.sorted.bam:readsMD5,c4525b95f05075208347295e6a1fb232" + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.bai" + ] + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T17:05:14.840145298", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "cram - stub": { + "content": [ + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-03-19T09:04:54.684578", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "multiple bam": { + "content": [ + [ + "test.sorted.bam:readsMD5,c4525b95f05075208347295e6a1fb232" + ], + [ + + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T17:05:09.324351486", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "multiple bam - stub": { + "content": [ + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-03-19T09:04:48.874947", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "bam_no_index": { + "content": [ + [ + "test.sorted.bam:readsMD5,894549ee3ced6b5ca2eed2563a985217" + ], + [ + + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T17:04:53.194840222", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "multiple bam csi index": { + "content": [ + [ + "test.sorted.bam:readsMD5,c4525b95f05075208347295e6a1fb232" + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.csi" + ] + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T17:05:22.574450685", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "sam": { + "content": [ + [ + + ], + [ + + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T07:19:30.478625", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.6" + } + }, + "bam_bai_index": { + "content": [ + [ + "test.sorted.bam:readsMD5,894549ee3ced6b5ca2eed2563a985217" + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.bai:md5,4810374728f259a493e1e61c90847da3" + ] + ], + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T17:04:58.163543444", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/sort/tests/nextflow.config b/modules/nf-core/samtools/sort/tests/nextflow.config new file mode 100644 index 00000000..ca694caa --- /dev/null +++ b/modules/nf-core/samtools/sort/tests/nextflow.config @@ -0,0 +1,6 @@ +process { + + withName: SAMTOOLS_SORT { + ext.prefix = { "${meta.id}.sorted" } + } +} diff --git a/modules/nf-core/samtools/sort/tests/nextflow_cram.config b/modules/nf-core/samtools/sort/tests/nextflow_cram.config new file mode 100644 index 00000000..8ebc9d91 --- /dev/null +++ b/modules/nf-core/samtools/sort/tests/nextflow_cram.config @@ -0,0 +1,7 @@ +process { + + withName: SAMTOOLS_SORT { + ext.prefix = { "${meta.id}.sorted" } + ext.args = "--write-index --output-fmt cram" + } +} diff --git a/modules/nf-core/samtools/sort/tests/nextflow_sam.config b/modules/nf-core/samtools/sort/tests/nextflow_sam.config new file mode 100644 index 00000000..29ee6a88 --- /dev/null +++ b/modules/nf-core/samtools/sort/tests/nextflow_sam.config @@ -0,0 +1,7 @@ +process { + + withName: SAMTOOLS_SORT { + ext.prefix = { "${meta.id}.sorted" } + ext.args = "--output-fmt sam" + } +} diff --git a/modules/nf-core/samtools/stats/environment.yml b/modules/nf-core/samtools/stats/environment.yml new file mode 100644 index 00000000..6a19f168 --- /dev/null +++ b/modules/nf-core/samtools/stats/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf index 4a2607de..525ae00f 100644 --- a/modules/nf-core/samtools/stats/main.nf +++ b/modules/nf-core/samtools/stats/main.nf @@ -1,19 +1,19 @@ process SAMTOOLS_STATS { - tag "$meta.id" + tag "${meta.id}" label 'process_single' - conda "bioconda::samtools=1.17" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : - 'biocontainers/samtools:1.17--h00cdaf9_0' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e9/e994bf4eb3731150511a14f5706b7bdfd64df1b6d40898fff334286c027e0859/data' + : 'community.wave.seqera.io/library/htslib_samtools:1.24--d697cfb9dce007cd'}" input: tuple val(meta), path(input), path(input_index) - tuple val(meta2), path(fasta) + tuple val(meta2), path(fasta), path(fai) output: tuple val(meta), path("*.stats"), emit: stats - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval('samtools version | sed "1!d;s/.* //"'), emit: versions_samtools, topic: versions when: task.ext.when == null || task.ext.when @@ -25,25 +25,16 @@ process SAMTOOLS_STATS { """ samtools \\ stats \\ + ${args} \\ --threads ${task.cpus} \\ ${reference} \\ ${input} \\ > ${prefix}.stats - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.stats - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/samtools/stats/meta.yml b/modules/nf-core/samtools/stats/meta.yml index 90e6345f..5fd7e76d 100644 --- a/modules/nf-core/samtools/stats/meta.yml +++ b/modules/nf-core/samtools/stats/meta.yml @@ -16,44 +16,79 @@ tools: documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 licence: ["MIT"] + identifier: biotools:samtools input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - input: - type: file - description: BAM/CRAM file from alignment - pattern: "*.{bam,cram}" - - input_index: - type: file - description: BAI/CRAI file from alignment - pattern: "*.{bai,crai}" - - meta2: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome' ] - - fasta: - type: file - description: Reference file the CRAM was created with (optional) - pattern: "*.{fasta,fa}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM file from alignment + pattern: "*.{bam,cram}" + ontologies: [] + - input_index: + type: file + description: BAI/CRAI file from alignment + pattern: "*.{bai,crai}" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: Reference file the CRAM was created with (optional) + pattern: "*.{fasta,fa,fna}" + ontologies: [] + - fai: + type: file + description: FASTA ref index file + pattern: "*.{fasta,fa,fna}.fai" + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - stats: - type: file - description: File containing samtools stats output - pattern: "*.{stats}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + stats: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.stats": + type: file + description: File containing samtools stats output + pattern: "*.{stats}" + ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: Name of the process + - samtools: + type: string + description: Name of the tool + - samtools version | sed "1!d;s/.* //": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: Name of the process + - samtools: + type: string + description: Name of the tool + - samtools version | sed "1!d;s/.* //": + type: eval + description: The expression to obtain the version of the tool + authors: - "@drpatelh" - "@FriederikeHanssen" - "@ramprasadn" +maintainers: + - "@drpatelh" + - "@FriederikeHanssen" + - "@ramprasadn" + - "@matthdsm" diff --git a/modules/nf-core/samtools/stats/tests/main.nf.test b/modules/nf-core/samtools/stats/tests/main.nf.test new file mode 100644 index 00000000..5059e296 --- /dev/null +++ b/modules/nf-core/samtools/stats/tests/main.nf.test @@ -0,0 +1,115 @@ +nextflow_process { + + name "Test Process SAMTOOLS_STATS" + script "../main.nf" + process "SAMTOOLS_STATS" + + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/stats" + + test("bam") { + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = [[],[],[]] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } + + test("cram") { + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = channel.of([ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } + + test("bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = [[],[],[]] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } + + test("cram - stub") { + + options "-stub" + + when { + process { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = channel.of([ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } +} diff --git a/modules/nf-core/samtools/stats/tests/main.nf.test.snap b/modules/nf-core/samtools/stats/tests/main.nf.test.snap new file mode 100644 index 00000000..12eb0e47 --- /dev/null +++ b/modules/nf-core/samtools/stats/tests/main.nf.test.snap @@ -0,0 +1,110 @@ +{ + "cram": { + "content": [ + { + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,f8d811a048831b83812d55073566e67f" + ] + ], + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T16:10:52.814596882", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "bam - stub": { + "content": [ + { + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T16:10:57.131242371", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "cram - stub": { + "content": [ + { + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T16:11:08.400007304", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "bam": { + "content": [ + { + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,2313c93da60ff8673a793b14a0886987" + ] + ], + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.24" + ] + ] + } + ], + "timestamp": "2026-07-10T16:10:38.846072426", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/subread/featurecounts/environment.yml b/modules/nf-core/subread/featurecounts/environment.yml new file mode 100644 index 00000000..4b433c9f --- /dev/null +++ b/modules/nf-core/subread/featurecounts/environment.yml @@ -0,0 +1,11 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # PINNED: subread held at 2.0.1. 2.1.1 strictly rejects mixed single-end / + # paired-end BAMs in one featureCounts call (both -p and no -p error), which + # breaks consensus-peak quantification for mixed cohorts. 2.0.1 auto-detects + # per BAM. Remove the pin once mixed-library counting is handled explicitly. + - bioconda::subread=2.0.1 diff --git a/modules/nf-core/subread/featurecounts/main.nf b/modules/nf-core/subread/featurecounts/main.nf index a524b92f..a8c5facf 100644 --- a/modules/nf-core/subread/featurecounts/main.nf +++ b/modules/nf-core/subread/featurecounts/main.nf @@ -1,19 +1,19 @@ process SUBREAD_FEATURECOUNTS { - tag "$meta.id" + tag "${meta.id}" label 'process_medium' - conda "bioconda::subread=2.0.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0' : - 'biocontainers/subread:2.0.1--hed695b0_0' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0' + : 'quay.io/biocontainers/subread:2.0.1--hed695b0_0'}" input: tuple val(meta), path(bams), path(annotation) output: - tuple val(meta), path("*featureCounts.txt") , emit: counts - tuple val(meta), path("*featureCounts.txt.summary"), emit: summary - path "versions.yml" , emit: versions + tuple val(meta), path("*featureCounts.tsv"), emit: counts + tuple val(meta), path("*featureCounts.tsv.summary"), emit: summary + tuple val("${task.process}"), val('subread'), eval("featureCounts -v 2>&1 | sed 's/featureCounts v//'"), emit: versions_subread, topic: versions when: task.ext.when == null || task.ext.when @@ -26,22 +26,25 @@ process SUBREAD_FEATURECOUNTS { def strandedness = 0 if (meta.strandedness == 'forward') { strandedness = 1 - } else if (meta.strandedness == 'reverse') { + } + else if (meta.strandedness == 'reverse') { strandedness = 2 } """ featureCounts \\ - $args \\ - $paired_end \\ - -T $task.cpus \\ - -a $annotation \\ - -s $strandedness \\ - -o ${prefix}.featureCounts.txt \\ + ${args} \\ + ${paired_end} \\ + -T ${task.cpus} \\ + -a ${annotation} \\ + -s ${strandedness} \\ + -o ${prefix}.featureCounts.tsv \\ ${bams.join(' ')} + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - subread: \$( echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g") - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.featureCounts.tsv + touch ${prefix}.featureCounts.tsv.summary """ } diff --git a/modules/nf-core/subread/featurecounts/meta.yml b/modules/nf-core/subread/featurecounts/meta.yml index cf02f1ea..eafcd1f8 100644 --- a/modules/nf-core/subread/featurecounts/meta.yml +++ b/modules/nf-core/subread/featurecounts/meta.yml @@ -5,48 +5,81 @@ keywords: - fasta - genome - reference - tools: - featurecounts: - description: featureCounts is a highly efficient general-purpose read summarization program that counts mapped reads for genomic features such as genes, exons, promoter, gene bodies, genomic bins and chromosomal locations. It can be used to count both RNA-seq and genomic DNA-seq reads. + description: featureCounts is a highly efficient general-purpose read summarization + program that counts mapped reads for genomic features such as genes, exons, + promoter, gene bodies, genomic bins and chromosomal locations. It can be used + to count both RNA-seq and genomic DNA-seq reads. homepage: http://bioinf.wehi.edu.au/featureCounts/ documentation: http://bioinf.wehi.edu.au/subread-package/SubreadUsersGuide.pdf doi: "10.1093/bioinformatics/btt656" licence: ["GPL v3"] - + identifier: biotools:subread input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/SAM file containing read alignments - pattern: "*.{bam}" - - annotation: - type: file - description: Genomic features annotation in GTF or SAF - pattern: "*.{gtf,saf}" - + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bams: + type: file + description: BAM files containing mapped reads + pattern: "*.bam" + ontologies: [] + - annotation: + type: file + description: Genomic features annotation in GTF or SAF + pattern: "*.{gtf,saf}" + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - counts: - type: file - description: Counts of reads mapping to features - pattern: "*featureCounts.txt" - - summary: - type: file - description: Summary log file - pattern: "*.featureCounts.txt.summary" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + counts: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*featureCounts.tsv": + type: file + description: Counts of reads mapping to features + pattern: "*featureCounts.tsv" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + summary: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*featureCounts.tsv.summary": + type: file + description: Summary log file + pattern: "*.featureCounts.tsv.summary" + ontologies: [] + versions_subread: + - - ${task.process}: + type: string + description: The name of the process + - subread: + type: string + description: The name of the tool + - "featureCounts -v 2>&1 | sed 's/featureCounts v//'": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - subread: + type: string + description: The name of the tool + - "featureCounts -v 2>&1 | sed 's/featureCounts v//'": + type: eval + description: The expression to obtain the version of the tool authors: - "@ntoda03" +maintainers: + - "@ntoda03" diff --git a/modules/nf-core/subread/featurecounts/subread-featurecounts.diff b/modules/nf-core/subread/featurecounts/subread-featurecounts.diff new file mode 100644 index 00000000..a920bc96 --- /dev/null +++ b/modules/nf-core/subread/featurecounts/subread-featurecounts.diff @@ -0,0 +1,35 @@ +Changes in component 'nf-core/subread/featurecounts' +Changes in 'subread/featurecounts/environment.yml': +--- modules/nf-core/subread/featurecounts/environment.yml ++++ modules/nf-core/subread/featurecounts/environment.yml +@@ -4,4 +4,8 @@ + - conda-forge + - bioconda + dependencies: +- - bioconda::subread=2.1.1 ++ # PINNED: subread held at 2.0.1. 2.1.1 strictly rejects mixed single-end / ++ # paired-end BAMs in one featureCounts call (both -p and no -p error), which ++ # breaks consensus-peak quantification for mixed cohorts. 2.0.1 auto-detects ++ # per BAM. Remove the pin once mixed-library counting is handled explicitly. ++ - bioconda::subread=2.0.1 + +'modules/nf-core/subread/featurecounts/meta.yml' is unchanged +Changes in 'subread/featurecounts/main.nf': +--- modules/nf-core/subread/featurecounts/main.nf ++++ modules/nf-core/subread/featurecounts/main.nf +@@ -4,8 +4,8 @@ + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container +- ? 'https://depot.galaxyproject.org/singularity/subread:2.1.1--h577a1d6_0' +- : 'quay.io/biocontainers/subread:2.1.1--h577a1d6_0'}" ++ ? 'https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0' ++ : 'quay.io/biocontainers/subread:2.0.1--hed695b0_0'}" + + input: + tuple val(meta), path(bams), path(annotation) + +'modules/nf-core/subread/featurecounts/tests/main.nf.test.snap' is unchanged +'modules/nf-core/subread/featurecounts/tests/nextflow.config' is unchanged +'modules/nf-core/subread/featurecounts/tests/main.nf.test' is unchanged +************************************************************ diff --git a/modules/nf-core/subread/featurecounts/tests/main.nf.test b/modules/nf-core/subread/featurecounts/tests/main.nf.test new file mode 100644 index 00000000..8ce45266 --- /dev/null +++ b/modules/nf-core/subread/featurecounts/tests/main.nf.test @@ -0,0 +1,161 @@ +nextflow_process { + + name "Test Process SUBREAD_FEATURECOUNTS" + script "../main.nf" + process "SUBREAD_FEATURECOUNTS" + config "./nextflow.config" + tag "modules" + tag "modules_nfcore" + tag "subread" + tag "subread/featurecounts" + + test("sarscov2 [bam] - forward") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'forward' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.counts, + process.out.summary, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("sarscov2 [bam] - forward - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'forward' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 [bam] - reverse") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'reverse' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.counts, + process.out.summary, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("sarscov2 [bam] - reverse - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'reverse' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 [bam] - unstranded") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'unstranded' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.counts, + process.out.summary, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("sarscov2 [bam] - unstranded - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'unstranded' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/subread/featurecounts/tests/main.nf.test.snap b/modules/nf-core/subread/featurecounts/tests/main.nf.test.snap new file mode 100644 index 00000000..fb98cfee --- /dev/null +++ b/modules/nf-core/subread/featurecounts/tests/main.nf.test.snap @@ -0,0 +1,311 @@ +{ + "sarscov2 [bam] - forward": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.featureCounts.tsv:md5,af5abde30c52606302d64a3f960a262a" + ] + ], + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.featureCounts.tsv.summary:md5,8f602ff9a8ef467af43294e80b367cdf" + ] + ], + { + "versions_subread": [ + [ + "SUBREAD_FEATURECOUNTS", + "subread", + "2.1.1" + ] + ] + } + ], + "timestamp": "2026-02-26T03:28:13.8156532", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 [bam] - forward - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.featureCounts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.featureCounts.tsv.summary:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "SUBREAD_FEATURECOUNTS", + "subread", + "2.1.1" + ] + ], + "counts": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.featureCounts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "summary": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.featureCounts.tsv.summary:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_subread": [ + [ + "SUBREAD_FEATURECOUNTS", + "subread", + "2.1.1" + ] + ] + } + ], + "timestamp": "2026-02-26T03:28:21.127211404", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 [bam] - unstranded": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "unstranded" + }, + "test.featureCounts.tsv:md5,355c22823290c40ccadeee94a21eca8b" + ] + ], + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "unstranded" + }, + "test.featureCounts.tsv.summary:md5,23164b79f9f23f11c82820db61a35560" + ] + ], + { + "versions_subread": [ + [ + "SUBREAD_FEATURECOUNTS", + "subread", + "2.1.1" + ] + ] + } + ], + "timestamp": "2026-02-26T03:28:43.068113331", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 [bam] - reverse - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "reverse" + }, + "test.featureCounts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "reverse" + }, + "test.featureCounts.tsv.summary:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "SUBREAD_FEATURECOUNTS", + "subread", + "2.1.1" + ] + ], + "counts": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "reverse" + }, + "test.featureCounts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "summary": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "reverse" + }, + "test.featureCounts.tsv.summary:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_subread": [ + [ + "SUBREAD_FEATURECOUNTS", + "subread", + "2.1.1" + ] + ] + } + ], + "timestamp": "2026-02-26T03:28:35.854492757", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 [bam] - reverse": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "reverse" + }, + "test.featureCounts.tsv:md5,e79027ec5752cfdd6e8d85bb6932294c" + ] + ], + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "reverse" + }, + "test.featureCounts.tsv.summary:md5,7cfa30ad678b9bc1bc63afbb0281547b" + ] + ], + { + "versions_subread": [ + [ + "SUBREAD_FEATURECOUNTS", + "subread", + "2.1.1" + ] + ] + } + ], + "timestamp": "2026-02-26T03:28:28.511647205", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 [bam] - unstranded - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "unstranded" + }, + "test.featureCounts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "unstranded" + }, + "test.featureCounts.tsv.summary:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "SUBREAD_FEATURECOUNTS", + "subread", + "2.1.1" + ] + ], + "counts": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "unstranded" + }, + "test.featureCounts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "summary": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "unstranded" + }, + "test.featureCounts.tsv.summary:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_subread": [ + [ + "SUBREAD_FEATURECOUNTS", + "subread", + "2.1.1" + ] + ] + } + ], + "timestamp": "2026-02-26T03:28:50.377997465", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/subread/featurecounts/tests/nextflow.config b/modules/nf-core/subread/featurecounts/tests/nextflow.config new file mode 100644 index 00000000..d9fd4fd5 --- /dev/null +++ b/modules/nf-core/subread/featurecounts/tests/nextflow.config @@ -0,0 +1,9 @@ +process { + + publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" } + + withName: SUBREAD_FEATURECOUNTS { + ext.args = '-t CDS' + } + +} diff --git a/modules/nf-core/trimgalore/environment.yml b/modules/nf-core/trimgalore/environment.yml new file mode 100644 index 00000000..ac5b9faa --- /dev/null +++ b/modules/nf-core/trimgalore/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::trim-galore=2.1.0 diff --git a/modules/nf-core/trimgalore/main.nf b/modules/nf-core/trimgalore/main.nf index dcb77ae7..2a08be91 100644 --- a/modules/nf-core/trimgalore/main.nf +++ b/modules/nf-core/trimgalore/main.nf @@ -1,22 +1,23 @@ process TRIMGALORE { - tag "$meta.id" - label 'process_high' + tag "${meta.id}" + label 'process_medium' + label 'process_low_memory' - conda "bioconda::trim-galore=0.6.7" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/trim-galore:0.6.7--hdfd78af_0' : - 'biocontainers/trim-galore:0.6.7--hdfd78af_0' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/7e/7e44249e3fafe3d136ea726225551b51bca642387e16d9687b3e602207dedb20/data' : + 'community.wave.seqera.io/library/trim-galore:2.1.0--27e6376b8f6c1872'}" input: tuple val(meta), path(reads) output: - tuple val(meta), path("*{3prime,5prime,trimmed,val}*.fq.gz"), emit: reads - tuple val(meta), path("*report.txt") , emit: log , optional: true - tuple val(meta), path("*unpaired*.fq.gz") , emit: unpaired, optional: true - tuple val(meta), path("*.html") , emit: html , optional: true - tuple val(meta), path("*.zip") , emit: zip , optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("*{3prime,5prime,trimmed,val}{,_1,_2}.fq.gz"), emit: reads + tuple val(meta), path("*report.txt") , emit: log , optional: true + tuple val(meta), path("*unpaired{,_1,_2}.fq.gz") , emit: unpaired, optional: true + tuple val(meta), path("*.html") , emit: html , optional: true + tuple val(meta), path("*.zip") , emit: zip , optional: true + tuple val("${task.process}"), val("trimgalore"), eval('trim_galore --version | grep -Eo "[0-9]+(\\.[0-9]+)+"'), topic: versions, emit: versions_trimgalore when: task.ext.when == null || task.ext.when @@ -24,52 +25,63 @@ process TRIMGALORE { script: def args = task.ext.args ?: '' // Calculate number of --cores for TrimGalore based on value of task.cpus - // See: https://github.com/FelixKrueger/TrimGalore/blob/master/Changelog.md#version-060-release-on-1-mar-2019 + // See: https://github.com/FelixKrueger/TrimGalore/blob/master/CHANGELOG.md#version-060-release-on-1-mar-2019 // See: https://github.com/nf-core/atacseq/pull/65 def cores = 1 if (task.cpus) { cores = (task.cpus as int) - 4 - if (meta.single_end) cores = (task.cpus as int) - 3 - if (cores < 1) cores = 1 - if (cores > 8) cores = 8 + if (meta.single_end) { + cores = (task.cpus as int) - 3 + } + if (cores < 1) { + cores = 1 + } + if (cores > 8) { + cores = 8 + } } // Added soft-links to original fastqs for consistent naming in MultiQC def prefix = task.ext.prefix ?: "${meta.id}" if (meta.single_end) { def args_list = args.split("\\s(?=--)").toList() - args_list.removeAll { it.toLowerCase().contains('_r2 ') } + args_list.removeAll { arg -> arg.toLowerCase().contains('_r2 ') } """ - [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz + [ ! -f ${prefix}.fastq.gz ] && ln -s ${reads} ${prefix}.fastq.gz trim_galore \\ ${args_list.join(' ')} \\ - --cores $cores \\ + --cores ${cores} \\ --gzip \\ ${prefix}.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - trimgalore: \$(echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//') - cutadapt: \$(cutadapt --version) - END_VERSIONS """ - } else { + } + else { """ [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz trim_galore \\ - $args \\ - --cores $cores \\ + ${args} \\ + --cores ${cores} \\ --paired \\ --gzip \\ ${prefix}_1.fastq.gz \\ ${prefix}_2.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - trimgalore: \$(echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//') - cutadapt: \$(cutadapt --version) - END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + if (meta.single_end) { + output_command = "echo '' | gzip > ${prefix}_trimmed.fq.gz ;" + output_command += "touch ${prefix}.fastq.gz_trimming_report.txt" + } + else { + output_command = "echo '' | gzip > ${prefix}_1_trimmed.fq.gz ;" + output_command += "touch ${prefix}_1.fastq.gz_trimming_report.txt ;" + output_command += "echo '' | gzip > ${prefix}_2_trimmed.fq.gz ;" + output_command += "touch ${prefix}_2.fastq.gz_trimming_report.txt" + } + """ + ${output_command} + """ } diff --git a/modules/nf-core/trimgalore/meta.yml b/modules/nf-core/trimgalore/meta.yml index f84c4d77..dcd9b170 100644 --- a/modules/nf-core/trimgalore/meta.yml +++ b/modules/nf-core/trimgalore/meta.yml @@ -1,9 +1,11 @@ name: trimgalore -description: Trim FastQ files using Trim Galore! +description: | + A wrapper around Cutadapt and FastQC to consistently apply adapter and quality trimming to FastQ files, + with extra functionality for RRBS data keywords: - trimming - adapters - - sequencing adapters + - sequencing - fastq tools: - trimgalore: @@ -14,51 +16,114 @@ tools: homepage: https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/ documentation: https://github.com/FelixKrueger/TrimGalore/blob/master/Docs/Trim_Galore_User_Guide.md licence: ["GPL-3.0-or-later"] + identifier: biotools:trim_galore + input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + ontologies: + - edam: "http://edamontology.org/format_1930" # FASTQ output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input adapter trimmed FastQ files of size 1 and 2 for - single-end and paired-end data, respectively. - pattern: "*{3prime,5prime,trimmed,val}*.fq.gz" - - unpaired: - type: file - description: | - FastQ files containing unpaired reads from read 1 or read 2 - pattern: "*unpaired*.fq.gz" - - html: - type: file - description: FastQC report (optional) - pattern: "*_{fastqc.html}" - - zip: - type: file - description: FastQC report archive (optional) - pattern: "*_{fastqc.zip}" - - log: - type: file - description: Trim Galore! trimming report - pattern: "*_{report.txt}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + reads: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*{3prime,5prime,trimmed,val}{,_1,_2}.fq.gz": + type: file + description: The trimmed/modified fastq reads + pattern: "*{3prime,5prime,trimmed,val}{,_1,_2}.fq.gz" + ontologies: + - edam: "http://edamontology.org/format_1930" # FASTQ + - edam: http://edamontology.org/format_3989 # GZIP format + log: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*report.txt": + type: file + description: trimgalore log file + pattern: "*report.txt" + ontologies: + - edam: "http://edamontology.org/format_2330" # Textual format + unpaired: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*unpaired{,_1,_2}.fq.gz": + type: file + description: unpaired reads when --retain_unpaired flag is used + pattern: "*unpaired*.fq.gz" + ontologies: + - edam: "http://edamontology.org/format_1930" # FASTQ + - edam: http://edamontology.org/format_3989 # GZIP format + html: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.html": + type: file + description: FastQC HTML report after trimming when the --fastqc flag is used + pattern: "*_fastqc.html" + ontologies: + - edam: "http://edamontology.org/format_2331" # HTML + zip: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.zip": + type: file + description: FastQC report output zip after trimming when the --fastqc flag + is used + pattern: "*_fastqc.zip" + ontologies: + - edam: http://edamontology.org/format_3987 # ZIP format + versions_trimgalore: + - - ${task.process}: + type: string + description: The name of the process + - trimgalore: + type: string + description: The name of the tool + - trim_galore --version | grep -Eo "[0-9]+(\.[0-9]+)+": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - trimgalore: + type: string + description: The name of the tool + - trim_galore --version | grep -Eo "[0-9]+(\.[0-9]+)+": + type: eval + description: The expression to obtain the version of the tool + authors: - "@drpatelh" - "@ewels" - "@FelixKrueger" +maintainers: + - "@drpatelh" + - "@ewels" + - "@FelixKrueger" + - "@vagkaratzas" diff --git a/modules/nf-core/trimgalore/tests/main.nf.test b/modules/nf-core/trimgalore/tests/main.nf.test new file mode 100644 index 00000000..11d68f4d --- /dev/null +++ b/modules/nf-core/trimgalore/tests/main.nf.test @@ -0,0 +1,154 @@ +nextflow_process { + + name "Test Process TRIMGALORE" + script "../main.nf" + process "TRIMGALORE" + + tag "modules" + tag "modules_nfcore" + tag "trimgalore" + + test("sarscov2 - fastq - single-end") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.reads, + path(process.out.log[0][1]).readLines().dropWhile { !it.startsWith("=== Summary") }.join('\n').md5(), + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - fastq - paired-end") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.reads, + path(process.out.log[0][1][0]).readLines().dropWhile { !it.startsWith("=== Summary") }.join('\n').md5(), + path(process.out.log[0][1][1]).readLines().dropWhile { !it.startsWith("=== Summary") }.join('\n').md5(), + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - fastq - paired-end - keep-unpaired") { + + config "./nextflow.config" + + when { + params { + module_args = '--retain_unpaired --length 150' + } + + process { + """ + input[0] = [ [ id:'test', single_end:false ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.reads, + process.out.unpaired, + path(process.out.log[0][1][0]).readLines().dropWhile { !it.startsWith("=== Summary") }.join('\n').md5(), + path(process.out.log[0][1][1]).readLines().dropWhile { !it.startsWith("=== Summary") }.join('\n').md5(), + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - fastq - single-end - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.reads, + process.out.log, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - fastq - paired-end - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.reads, + process.out.log, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } +} diff --git a/modules/nf-core/trimgalore/tests/main.nf.test.snap b/modules/nf-core/trimgalore/tests/main.nf.test.snap new file mode 100644 index 00000000..3a806d8e --- /dev/null +++ b/modules/nf-core/trimgalore/tests/main.nf.test.snap @@ -0,0 +1,184 @@ +{ + "sarscov2 - fastq - paired-end - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1_trimmed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2_trimmed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_2.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + { + "versions_trimgalore": [ + [ + "TRIMGALORE", + "trimgalore", + "2.1.0" + ] + ] + } + ], + "timestamp": "2026-05-05T08:48:10.832490464", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "sarscov2 - fastq - paired-end - keep-unpaired": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1_val_1.fq.gz:md5,75413e85910bbc2e1556e12f6479f935", + "test_2_val_2.fq.gz:md5,d3c588c12646ebd36a0812fe02d0bda6" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1_unpaired_1.fq.gz:md5,17e0e878f6d0e93b9008a05f128660b6", + "test_2_unpaired_2.fq.gz:md5,b09a064368a867e099e66df5ef69b044" + ] + ] + ], + "4cbef464fbc09252a1282078ec23942e", + "ee1b8a371f1490e5faf5e346523b8886", + { + "versions_trimgalore": [ + [ + "TRIMGALORE", + "trimgalore", + "2.1.0" + ] + ] + } + ], + "timestamp": "2026-05-05T09:34:57.668635539", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "sarscov2 - fastq - single-end - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test_trimmed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + { + "versions_trimgalore": [ + [ + "TRIMGALORE", + "trimgalore", + "2.1.0" + ] + ] + } + ], + "timestamp": "2026-05-05T08:48:05.803691794", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "sarscov2 - fastq - paired-end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1_val_1.fq.gz:md5,566d44cca0d22c522d6cf0e50c7165dc", + "test_2_val_2.fq.gz:md5,3c023e8e890b897821df3dc98f48c2b3" + ] + ] + ], + "4da0165f1c5a0d3f1d5eea9ad17fb1fb", + "808929d2f70ffea0ddd7750bbb400b02", + { + "versions_trimgalore": [ + [ + "TRIMGALORE", + "trimgalore", + "2.1.0" + ] + ] + } + ], + "timestamp": "2026-05-05T09:34:52.551563029", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "sarscov2 - fastq - single-end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test_trimmed.fq.gz:md5,566d44cca0d22c522d6cf0e50c7165dc" + ] + ], + "76dd6b9d009e332d2aa6443de525c182", + { + "versions_trimgalore": [ + [ + "TRIMGALORE", + "trimgalore", + "2.1.0" + ] + ] + } + ], + "timestamp": "2026-05-05T09:34:47.273738299", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/trimgalore/tests/nextflow.config b/modules/nf-core/trimgalore/tests/nextflow.config new file mode 100644 index 00000000..d8e3ac13 --- /dev/null +++ b/modules/nf-core/trimgalore/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: TRIMGALORE { + ext.args = params.module_args + } +} diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/environment.yml b/modules/nf-core/ucsc/bedgraphtobigwig/environment.yml new file mode 100644 index 00000000..1211bc40 --- /dev/null +++ b/modules/nf-core/ucsc/bedgraphtobigwig/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::ucsc-bedgraphtobigwig=482 diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/main.nf b/modules/nf-core/ucsc/bedgraphtobigwig/main.nf index 054924e7..31c43aec 100644 --- a/modules/nf-core/ucsc/bedgraphtobigwig/main.nf +++ b/modules/nf-core/ucsc/bedgraphtobigwig/main.nf @@ -2,11 +2,10 @@ process UCSC_BEDGRAPHTOBIGWIG { tag "$meta.id" label 'process_single' - // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. - conda "bioconda::ucsc-bedgraphtobigwig=377" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1' : - 'biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:482--hdc0a859_0' : + 'quay.io/biocontainers/ucsc-bedgraphtobigwig:482--hdc0a859_0' }" input: tuple val(meta), path(bedgraph) @@ -14,24 +13,25 @@ process UCSC_BEDGRAPHTOBIGWIG { output: tuple val(meta), path("*.bigWig"), emit: bigwig - path "versions.yml" , emit: versions - + tuple val("${task.process}"), val('ucsc'), val('482'), topic: versions, emit: versions_ucsc + // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = '377' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ bedGraphToBigWig \\ + $args \\ $bedgraph \\ $sizes \\ ${prefix}.bigWig + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - ucsc: $VERSION - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bigWig """ } diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml b/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml index ba8915be..7d0cf57f 100755 --- a/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml +++ b/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml @@ -3,42 +3,68 @@ description: Convert a bedGraph file to bigWig format. keywords: - bedgraph - bigwig + - ucsc + - bedgraphtobigwig + - converter tools: - ucsc: description: Convert a bedGraph file to bigWig format. homepage: http://hgdownload.cse.ucsc.edu/admin/exe/ documentation: https://genome.ucsc.edu/goldenPath/help/bigWig.html licence: ["varies; see http://genome.ucsc.edu/license"] - + identifier: "" input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bedgraph: - type: file - description: bedGraph file - pattern: "*.{bedGraph}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bedgraph: + type: file + description: bedGraph file + pattern: "*.{bedGraph}" + ontologies: [] - sizes: type: file description: chromosome sizes file pattern: "*.{sizes}" - + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - bigwig: - type: file - description: bigWig file - pattern: "*.{bigWig}" + bigwig: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bigWig": + type: file + description: bigWig file + pattern: "*.{bigWig}" + ontologies: [] + versions_ucsc: + - - ${task.process}: + type: string + description: The process the versions were collected from + - ucsc: + type: string + description: The tool name + - "482": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - ucsc: + type: string + description: The tool name + - "482": + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/tests/main.nf.test b/modules/nf-core/ucsc/bedgraphtobigwig/tests/main.nf.test new file mode 100644 index 00000000..94a799ef --- /dev/null +++ b/modules/nf-core/ucsc/bedgraphtobigwig/tests/main.nf.test @@ -0,0 +1,53 @@ +nextflow_process { + + name "Test Process UCSC_BEDGRAPHTOBIGWIG" + script "../main.nf" + process "UCSC_BEDGRAPHTOBIGWIG" + tag "modules" + tag "modules_nfcore" + tag "ucsc" + tag "ucsc/bedgraphtobigwig" + + test("Should run without failures") { + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bedgraph/test.bedgraph", checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.sizes", checkIfExists: true)) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bedgraph/test.bedgraph", checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.sizes", checkIfExists: true)) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/tests/main.nf.test.snap b/modules/nf-core/ucsc/bedgraphtobigwig/tests/main.nf.test.snap new file mode 100644 index 00000000..7c51213f --- /dev/null +++ b/modules/nf-core/ucsc/bedgraphtobigwig/tests/main.nf.test.snap @@ -0,0 +1,84 @@ +{ + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bigWig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + "UCSC_BEDGRAPHTOBIGWIG", + "ucsc", + "482" + ] + ], + "bigwig": [ + [ + { + "id": "test" + }, + "test.bigWig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_ucsc": [ + [ + "UCSC_BEDGRAPHTOBIGWIG", + "ucsc", + "482" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.3" + }, + "timestamp": "2026-02-25T14:56:47.843203613" + }, + "Should run without failures": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bigWig:md5,910ecc7f57e3bbd5fac5a8edba4f615d" + ] + ], + "1": [ + [ + "UCSC_BEDGRAPHTOBIGWIG", + "ucsc", + "482" + ] + ], + "bigwig": [ + [ + { + "id": "test" + }, + "test.bigWig:md5,910ecc7f57e3bbd5fac5a8edba4f615d" + ] + ], + "versions_ucsc": [ + [ + "UCSC_BEDGRAPHTOBIGWIG", + "ucsc", + "482" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.3" + }, + "timestamp": "2026-02-25T14:56:35.886146907" + } +} \ No newline at end of file diff --git a/modules/nf-core/umitools/extract/environment.yml b/modules/nf-core/umitools/extract/environment.yml new file mode 100644 index 00000000..4d05188b --- /dev/null +++ b/modules/nf-core/umitools/extract/environment.yml @@ -0,0 +1,17 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/umi_tools + - bioconda::umi_tools=1.1.6 + - conda-forge::future=0.18.3 + - conda-forge::matplotlib=3.8.2 + - conda-forge::numpy=1.26.4 + - conda-forge::pandas=2.2.0 + - conda-forge::python=3.9.18 + - conda-forge::regex=2023.12.25 + - conda-forge::scipy=1.12.0 + - conda-forge::pybktree=1.1 + - bioconda::pysam=0.22.0 diff --git a/modules/nf-core/umitools/extract/main.nf b/modules/nf-core/umitools/extract/main.nf index 2f94fa93..0aafe59d 100644 --- a/modules/nf-core/umitools/extract/main.nf +++ b/modules/nf-core/umitools/extract/main.nf @@ -3,10 +3,10 @@ process UMITOOLS_EXTRACT { label "process_single" label "process_long" - conda "bioconda::umi_tools=1.1.4" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/umi_tools:1.1.4--py38hbff2b2d_1' : - 'biocontainers/umi_tools:1.1.4--py38hbff2b2d_1' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/32/32476f0107d72dbd2210a4e56b2873abde07300025cc11052680475509d2db81/data' : + 'community.wave.seqera.io/library/umi_tools_future_matplotlib_numpy_pruned:1ee668bafc8c9f81' }" input: tuple val(meta), path(reads) @@ -14,7 +14,7 @@ process UMITOOLS_EXTRACT { output: tuple val(meta), path("*.fastq.gz"), emit: reads tuple val(meta), path("*.log") , emit: log - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('umitools'), eval("umi_tools --version | sed -n '/version:/s/.*: //p'"), emit: versions_umitools, topic: versions when: task.ext.when == null || task.ext.when @@ -30,11 +30,6 @@ process UMITOOLS_EXTRACT { -S ${prefix}.umi_extract.fastq.gz \\ $args \\ > ${prefix}.umi_extract.log - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - umitools: \$(umi_tools --version 2>&1 | sed 's/^.*UMI-tools version://; s/ *\$//') - END_VERSIONS """ } else { """ @@ -46,11 +41,19 @@ process UMITOOLS_EXTRACT { --read2-out=${prefix}.umi_extract_2.fastq.gz \\ $args \\ > ${prefix}.umi_extract.log - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - umitools: \$(umi_tools --version 2>&1 | sed 's/^.*UMI-tools version://; s/ *\$//') - END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + if (meta.single_end) { + output_command = "echo '' | gzip > ${prefix}.umi_extract.fastq.gz" + } else { + output_command = "echo '' | gzip > ${prefix}.umi_extract_1.fastq.gz ;" + output_command += "echo '' | gzip > ${prefix}.umi_extract_2.fastq.gz" + } + """ + touch ${prefix}.umi_extract.log + ${output_command} + """ } diff --git a/modules/nf-core/umitools/extract/meta.yml b/modules/nf-core/umitools/extract/meta.yml index db64a0f8..0bec392a 100644 --- a/modules/nf-core/umitools/extract/meta.yml +++ b/modules/nf-core/umitools/extract/meta.yml @@ -1,47 +1,80 @@ name: umitools_extract -description: Extracts UMI barcode from a read and add it to the read name, leaving any sample barcode in place +description: Extracts UMI barcode from a read and add it to the read name, leaving + any sample barcode in place keywords: - - umitools + - UMI + - barcode - extract + - umitools tools: - umi_tools: description: > - UMI-tools contains tools for dealing with Unique Molecular Identifiers (UMIs)/Random Molecular Tags (RMTs) - and single cell RNA-Seq cell barcodes + UMI-tools contains tools for dealing with Unique Molecular Identifiers (UMIs)/Random + Molecular Tags (RMTs) and single cell RNA-Seq cell barcodes documentation: https://umi-tools.readthedocs.io/en/latest/ - license: ["MIT"] + license: "MIT" + identifier: "" input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: list - description: | - List of input FASTQ files whose UMIs will be extracted. + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: list + description: | + List of input FASTQ files whose UMIs will be extracted. output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: > - Extracted FASTQ files. | - For single-end reads, pattern is \${prefix}.umi_extract.fastq.gz. | - For paired-end reads, pattern is \${prefix}.umi_extract_{1,2}.fastq.gz. - pattern: "*.{fastq.gz}" - - log: - type: file - description: Logfile for umi_tools - pattern: "*.{log}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + reads: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.fastq.gz": + type: file + description: > + Extracted FASTQ files. | For single-end reads, pattern is \${prefix}.umi_extract.fastq.gz. + | For paired-end reads, pattern is \${prefix}.umi_extract_{1,2}.fastq.gz. + pattern: "*.{fastq.gz}" + ontologies: [] + log: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.log": + type: file + description: Logfile for umi_tools + pattern: "*.{log}" + ontologies: [] + versions_umitools: + - - ${task.process}: + type: string + description: The name of the process + - umitools: + type: string + description: The name of the tool + - "umi_tools --version | sed -n '/version:/s/.*: //p'": + type: eval + description: The expression to obtain the version of umitools + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - umitools: + type: string + description: The name of the tool + - "umi_tools --version | sed -n '/version:/s/.*: //p'": + type: eval + description: The expression to obtain the version of umitools authors: - "@drpatelh" - "@grst" +maintainers: + - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/umitools/extract/tests/main.nf.test b/modules/nf-core/umitools/extract/tests/main.nf.test new file mode 100644 index 00000000..b6fa0482 --- /dev/null +++ b/modules/nf-core/umitools/extract/tests/main.nf.test @@ -0,0 +1,106 @@ +nextflow_process { + + name "Test Process UMITOOLS_EXTRACT" + script "../main.nf" + process "UMITOOLS_EXTRACT" + config "./nextflow.config" + tag "modules_nfcore" + tag "modules" + tag "umitools" + tag "umitools/extract" + + test("single end") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.reads.collect { item -> item.collect { element -> element instanceof Map ? element : file(element).name }}, + process.out.log.collect { item -> item.collect { element -> element instanceof Map ? element : file(element).name }}, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("single end - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("pair end") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_2.fastq.gz", checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + file(process.out.reads[0][1][0]).name, + file(process.out.reads[0][1][1]).name, + process.out.log.collect { item -> item.collect { element -> element instanceof Map ? element : file(element).name }}, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + } + + test("pair end - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_2.fastq.gz", checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/umitools/extract/tests/main.nf.test.snap b/modules/nf-core/umitools/extract/tests/main.nf.test.snap new file mode 100644 index 00000000..91623428 --- /dev/null +++ b/modules/nf-core/umitools/extract/tests/main.nf.test.snap @@ -0,0 +1,195 @@ +{ + "pair end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.umi_extract_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.umi_extract_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.umi_extract.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "UMITOOLS_EXTRACT", + "umitools", + "1.1.6" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.umi_extract.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.umi_extract_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.umi_extract_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "versions_umitools": [ + [ + "UMITOOLS_EXTRACT", + "umitools", + "1.1.6" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-03T13:17:55.612739621" + }, + "single end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.umi_extract.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.umi_extract.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "UMITOOLS_EXTRACT", + "umitools", + "1.1.6" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.umi_extract.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test.umi_extract.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_umitools": [ + [ + "UMITOOLS_EXTRACT", + "umitools", + "1.1.6" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-03T13:17:37.310716092" + }, + "pair end": { + "content": [ + "test.umi_extract_1.fastq.gz", + "test.umi_extract_2.fastq.gz", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.umi_extract.log" + ] + ], + { + "versions_umitools": [ + [ + "UMITOOLS_EXTRACT", + "umitools", + "1.1.6" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-03T13:17:47.683802227" + }, + "single end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.umi_extract.fastq.gz" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.umi_extract.log" + ] + ], + { + "versions_umitools": [ + [ + "UMITOOLS_EXTRACT", + "umitools", + "1.1.6" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-03T13:17:29.607052009" + } +} \ No newline at end of file diff --git a/modules/nf-core/umitools/extract/tests/nextflow.config b/modules/nf-core/umitools/extract/tests/nextflow.config new file mode 100644 index 00000000..628f5fcd --- /dev/null +++ b/modules/nf-core/umitools/extract/tests/nextflow.config @@ -0,0 +1,9 @@ +process { + + publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" } + + withName: UMITOOLS_EXTRACT { + ext.args = '--bc-pattern="NNNN"' + } + +} diff --git a/modules/nf-core/untar/environment.yml b/modules/nf-core/untar/environment.yml new file mode 100644 index 00000000..9b926b1f --- /dev/null +++ b/modules/nf-core/untar/environment.yml @@ -0,0 +1,12 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - conda-forge::coreutils=9.5 + - conda-forge::grep=3.11 + - conda-forge::gzip=1.13 + - conda-forge::lbzip2=2.5 + - conda-forge::sed=4.8 + - conda-forge::tar=1.34 diff --git a/modules/nf-core/untar/main.nf b/modules/nf-core/untar/main.nf index 8cd1856c..bf2c056c 100644 --- a/modules/nf-core/untar/main.nf +++ b/modules/nf-core/untar/main.nf @@ -1,63 +1,75 @@ process UNTAR { - tag "$archive" + tag "${archive}" label 'process_single' - conda "conda-forge::sed=4.7 bioconda::grep=3.4 conda-forge::tar=1.34" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'nf-core/ubuntu:20.04' }" + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/52/52ccce28d2ab928ab862e25aae26314d69c8e38bd41ca9431c67ef05221348aa/data' + : 'community.wave.seqera.io/library/coreutils_grep_gzip_lbzip2_pruned:838ba80435a629f8'}" input: tuple val(meta), path(archive) output: - tuple val(meta), path("$prefix"), emit: untar - path "versions.yml" , emit: versions + tuple val(meta), path("${prefix}"), emit: untar + tuple val("${task.process}"), val('untar'), eval('tar --version 2>&1 | head -1 | sed "s/tar (GNU tar) //; s/ Copyright.*//"'), emit: versions_untar, topic: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' - prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.baseName.toString().replaceFirst(/\.tar$/, "")) + prefix = task.ext.prefix ?: (meta.id ? "${meta.id}" : archive.baseName.toString().replaceFirst(/\.tar$/, "")) """ - mkdir $prefix + mkdir ${prefix} ## Ensures --strip-components only applied when top level of tar contents is a directory ## If just files or multiple directories, place all in prefix if [[ \$(tar -taf ${archive} | grep -o -P "^.*?\\/" | uniq | wc -l) -eq 1 ]]; then tar \\ - -C $prefix --strip-components 1 \\ + -C ${prefix} --strip-components 1 \\ -xavf \\ - $args \\ - $archive \\ - $args2 + ${args} \\ + ${archive} \\ + ${args2} else tar \\ - -C $prefix \\ + -C ${prefix} \\ -xavf \\ - $args \\ - $archive \\ - $args2 + ${args} \\ + ${archive} \\ + ${args2} fi - cat <<-END_VERSIONS > versions.yml - "${task.process}": - untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') - END_VERSIONS """ stub: - prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.toString().replaceFirst(/\.[^\.]+(.gz)?$/, "")) + prefix = task.ext.prefix ?: (meta.id ? "${meta.id}" : archive.toString().replaceFirst(/\.[^\.]+(.gz)?$/, "")) """ - mkdir $prefix - touch ${prefix}/file.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') - END_VERSIONS + mkdir ${prefix} + ## Dry-run untaring the archive to get the files and place all in prefix + if [[ \$(tar -taf ${archive} | grep -o -P "^.*?\\/" | uniq | wc -l) -eq 1 ]]; then + for i in `tar -tf ${archive}`; + do + if [[ \$(echo "\${i}" | grep -E "/\$") == "" ]]; + then + touch \${i} + else + mkdir -p \${i} + fi + done + else + for i in `tar -tf ${archive}`; + do + if [[ \$(echo "\${i}" | grep -E "/\$") == "" ]]; + then + touch ${prefix}/\${i} + else + mkdir -p ${prefix}/\${i} + fi + done + fi """ } diff --git a/modules/nf-core/untar/meta.yml b/modules/nf-core/untar/meta.yml index db241a6e..571d8078 100644 --- a/modules/nf-core/untar/meta.yml +++ b/modules/nf-core/untar/meta.yml @@ -1,5 +1,5 @@ name: untar -description: Extract files. +description: Extract files from tar, tar.gz, tar.bz2, tar.xz archives keywords: - untar - uncompress @@ -7,35 +7,67 @@ keywords: tools: - untar: description: | - Extract tar.gz files. + Extract tar, tar.gz, tar.bz2, tar.xz files. documentation: https://www.gnu.org/software/tar/manual/ licence: ["GPL-3.0-or-later"] + identifier: "" input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - archive: - type: file - description: File to be untar - pattern: "*.{tar}.{gz}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - archive: + type: file + description: File to be untarred + pattern: "*.{tar,tar.gz,tar.bz2,tar.xz}" + ontologies: + - edam: http://edamontology.org/format_3981 # TAR format + - edam: http://edamontology.org/format_3989 # GZIP format output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - untar: - type: directory - description: Directory containing contents of archive - pattern: "*/" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + untar: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*/" + - ${prefix}: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*/" + versions_untar: + - - ${task.process}: + type: string + description: The name of the process + - untar: + type: string + description: The name of the tool + - tar --version 2>&1 | head -1 | sed "s/tar (GNU tar) //; s/ Copyright.*//": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - untar: + type: string + description: The name of the tool + - tar --version 2>&1 | head -1 | sed "s/tar (GNU tar) //; s/ Copyright.*//": + type: eval + description: The expression to obtain the version of the tool + authors: - "@joseespinosa" - "@drpatelh" - "@matthdsm" - "@jfy133" +maintainers: + - "@joseespinosa" + - "@drpatelh" + - "@matthdsm" + - "@jfy133" diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test new file mode 100644 index 00000000..fde8db16 --- /dev/null +++ b/modules/nf-core/untar/tests/main.nf.test @@ -0,0 +1,97 @@ +nextflow_process { + + name "Test Process UNTAR" + script "../main.nf" + process "UNTAR" + tag "modules" + tag "modules_nfcore" + tag "untar" + + test("test_untar") { + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.untar, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() }, + ) + } + } + + test("test_untar_onlyfiles") { + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.untar, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() }, + ) + } + } + + test("test_untar - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.untar, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() }, + ) + } + } + + test("test_untar_onlyfiles - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.untar, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() }, + ) + } + } +} diff --git a/modules/nf-core/untar/tests/main.nf.test.snap b/modules/nf-core/untar/tests/main.nf.test.snap new file mode 100644 index 00000000..9dd1563d --- /dev/null +++ b/modules/nf-core/untar/tests/main.nf.test.snap @@ -0,0 +1,118 @@ +{ + "test_untar_onlyfiles": { + "content": [ + [ + [ + [ + + ], + [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ] + ] + ], + { + "versions_untar": [ + [ + "UNTAR", + "untar", + "1.34" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-28T17:49:32.000491" + }, + "test_untar_onlyfiles - stub": { + "content": [ + [ + [ + [ + + ], + [ + "hello.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + { + "versions_untar": [ + [ + "UNTAR", + "untar", + "1.34" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-28T17:49:58.812479" + }, + "test_untar - stub": { + "content": [ + [ + [ + [ + + ], + [ + "hash.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "opts.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "taxo.k2d:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + { + "versions_untar": [ + [ + "UNTAR", + "untar", + "1.34" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-28T17:49:48.119456" + }, + "test_untar": { + "content": [ + [ + [ + [ + + ], + [ + "hash.k2d:md5,8b8598468f54a7087c203ad0190555d9", + "opts.k2d:md5,a033d00cf6759407010b21700938f543", + "taxo.k2d:md5,094d5891cdccf2f1468088855c214b2c" + ] + ] + ], + { + "versions_untar": [ + [ + "UNTAR", + "untar", + "1.34" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-28T17:49:17.252494" + } +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index f3a8ea72..ea5186e7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -19,9 +19,10 @@ params { // References genome = null - igenomes_base = 's3://ngi-igenomes/igenomes' + igenomes_base = 's3://ngi-igenomes/igenomes/' igenomes_ignore = false save_reference = false + ataqv_mito_reference = null // Options: Trimming clip_r1 = null @@ -42,7 +43,9 @@ params { skip_merge_replicates = false save_align_intermeds = false save_unaligned = false - shift_reads = true + shift_reads = false + minFragmentLength = 0 + maxFragmentLength = 120 // Options: Peaks narrow_peak = false @@ -60,15 +63,16 @@ params { skip_deseq2_qc = false // Options: QC - skip_qc = false - skip_fastqc = false - skip_picard_metrics = false - skip_preseq = true - skip_plot_profile = false - skip_plot_fingerprint = false - skip_ataqv = false - skip_igv = false - skip_multiqc = false + skip_qc = false + skip_fastqc = false + skip_picard_metrics = false + skip_preseq = true + skip_plot_profile = false + skip_plot_fingerprint = false + skip_ataqv = false + skip_merged_replicate_bigwig = false + skip_igv = false + skip_multiqc = false // Options: Config bamtools_filter_pe_config = "$projectDir/assets/bamtools_filter_pe.json" @@ -82,157 +86,176 @@ params { multiqc_methods_description = null // Boilerplate options - outdir = null - tracedir = "${params.outdir}/pipeline_info" - publish_dir_mode = 'copy' - email = null - email_on_fail = null - plaintext_email = false - monochrome_logs = false - hook_url = null - help = false - version = false - validate_params = true - show_hidden_params = false - schema_ignore_params = 'genomes' + outdir = null + publish_dir_mode = 'copy' + email = null + email_on_fail = null + plaintext_email = false + monochrome_logs = false + help = false + help_full = false + show_hidden = false + version = false + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' + trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') // Config options + config_profile_name = null + config_profile_description = null + custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - config_profile_description = null config_profile_contact = null config_profile_url = null - config_profile_name = null - - // Max resource options - // Defaults only, expecting to be overwritten - max_memory = '128.GB' - max_cpus = 16 - max_time = '240.h' + // Schema validation default options + validate_params = true } +// Backwards compatibility for publishDir syntax +outputDir = params.outdir +workflow.output.mode = params.publish_dir_mode + // 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") -} - -// Load nf-core/atacseq custom profiles from different institutions. -// Warning: Uncomment only if a pipeline-specific instititutional config already exists on nf-core/configs! -// try { -// includeConfig "${params.custom_config_base}/pipeline/atacseq.config" -// } catch (Exception e) { -// System.err.println("WARNING: Could not load nf-core/config/atacseq profiles: ${params.custom_config_base}/pipeline/atacseq.config") -// } - profiles { debug { - dumpHashes = true - process.beforeScript = 'echo $HOSTNAME' - cleanup = false + dumpHashes = true + process.beforeScript = 'echo $HOSTNAME' + cleanup = false + nextflow.enable.configProcessNamesValidation = true } conda { - conda.enabled = true - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + conda.enabled = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + conda.channels = ['conda-forge', 'bioconda'] + apptainer.enabled = false } mamba { - conda.enabled = true - conda.useMamba = true - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + conda.enabled = true + conda.useMamba = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false } docker { - docker.enabled = true - docker.userEmulation = true - conda.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + docker.enabled = true + conda.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false + docker.runOptions = '-u $(id -u):$(id -g)' + } + arm64 { + process.arch = 'arm64' + // TODO https://github.com/nf-core/modules/issues/6694 + // For now if you're using arm64 you have to use wave for the sake of the maintainers + // wave profile + apptainer.ociAutoPull = true + singularity.ociAutoPull = true + wave.enabled = true + wave.freeze = true + wave.strategy = 'conda,container' } - arm { - docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' + emulate_amd64 { + docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' } singularity { - singularity.enabled = true - singularity.autoMounts = true - conda.enabled = false - docker.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + singularity.enabled = true + singularity.autoMounts = true + conda.enabled = false + docker.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false } podman { - podman.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + podman.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false } shifter { - shifter.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + shifter.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + charliecloud.enabled = false + apptainer.enabled = false } charliecloud { - charliecloud.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - apptainer.enabled = false + charliecloud.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + apptainer.enabled = false } apptainer { - apptainer.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false + apptainer.enabled = true + apptainer.autoMounts = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false } - gitpod { - executor.name = 'local' - executor.cpus = 16 - executor.memory = 60.GB + wave { + apptainer.ociAutoPull = true + singularity.ociAutoPull = true + wave.enabled = true + wave.freeze = true + wave.strategy = 'conda,container' } - public_aws_ecr { - includeConfig 'conf/public_aws_ecr.config' + gpu { + docker.runOptions = '-u $(id -u):$(id -g) --gpus all' + apptainer.runOptions = '--nv' + singularity.runOptions = '--nv' } test { includeConfig 'conf/test.config' } test_controls { includeConfig 'conf/test_controls.config' } test_full { includeConfig 'conf/test_full.config' } } +// Load nf-core custom profiles from different institutions + +// If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. +// Load nf-core/atacseq custom profiles from different institutions. +includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" + + +// Load nf-core/atacseq custom profiles from different institutions. +// TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs +includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/atacseq.config" : "/dev/null" + +// Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile +// Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled +// Set to your registry if you have a mirror of containers +apptainer.registry = 'quay.io' +docker.registry = 'quay.io' +podman.registry = 'quay.io' +singularity.registry = 'quay.io' +charliecloud.registry = 'quay.io' + // Load igenomes.config if required -if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' -} else { - params.genomes = [:] -} +includeConfig !params.igenomes_ignore ? 'conf/igenomes.config' : 'conf/igenomes_ignored.config' // Export these variables to prevent local Python/R libraries from conflicting with those in the container // The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. @@ -245,76 +268,91 @@ env { JULIA_DEPOT_PATH = "/usr/local/share/julia" } -// Capture exit codes from upstream processes when piping -process.shell = ['/bin/bash', '-euo', 'pipefail'] +// Set bash options +process.shell = [ + "bash", + "-C", // No clobber - prevent output redirection from overwriting files. + "-e", // Exit if a tool returns a non-zero status/exit code + "-u", // Treat unset variables and parameters as an error + "-o", // Returns the status of the last command to exit.. + "pipefail" // ..with a non-zero status or zero if all successfully execute +] -// Set default registry for Docker and Podman independent of -profile -// Will not be used unless Docker / Podman are enabled -// Set to your registry if you have a mirror of containers -docker.registry = 'quay.io' -podman.registry = 'quay.io' +// Disable process selector warnings by default. Use debug profile to enable warnings. +nextflow.enable.configProcessNamesValidation = false -def trace_timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') timeline { enabled = true - file = "${params.tracedir}/execution_timeline_${trace_timestamp}.html" + file = "${params.outdir}/pipeline_info/execution_timeline_${params.trace_report_suffix}.html" } report { enabled = true - file = "${params.tracedir}/execution_report_${trace_timestamp}.html" + file = "${params.outdir}/pipeline_info/execution_report_${params.trace_report_suffix}.html" } trace { enabled = true - file = "${params.tracedir}/execution_trace_${trace_timestamp}.txt" + file = "${params.outdir}/pipeline_info/execution_trace_${params.trace_report_suffix}.txt" } dag { enabled = true - file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.html" + file = "${params.outdir}/pipeline_info/pipeline_dag_${params.trace_report_suffix}.html" } manifest { name = 'nf-core/atacseq' - author = """Patel H, Langer B, Espinosa-Carrasco J, Syme R""" + contributors = [ + // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 + [ + name: 'Patel H', + affiliation: '', + email: '', + github: '', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: '' + ], + [ + name: ' Langer B', + affiliation: '', + email: '', + github: '', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: '' + ], + [ + name: ' Espinosa-Carrasco J', + affiliation: '', + email: '', + github: '', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: '' + ], + [ + name: ' Syme R', + affiliation: '', + email: '', + github: '', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: '' + ], + ] homePage = 'https://github.com/nf-core/atacseq' description = """ATACSeq peak-calling and differential analysis pipeline.""" mainScript = 'main.nf' - nextflowVersion = '!>=22.10.1' - version = '2.1dev' + defaultBranch = 'master' + nextflowVersion = '!>=25.10.4' + version = '2.2.0dev' doi = 'https://doi.org/10.5281/zenodo.2634132' + diagram = 'docs/images/nf-core-atacseq_metro_map_grey.png' } -// Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' +// Nextflow plugins +plugins { + id 'nf-schema@2.5.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet +} -// 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 - } - } +validation { + defaultIgnoreParams = ["genomes","igenomes_base"] + monochromeLogs = params.monochrome_logs } +// Load modules.config for DSL2 module specific options +includeConfig 'conf/modules.config' diff --git a/nextflow_schema.json b/nextflow_schema.json index ef70e46d..2a1628df 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -1,10 +1,10 @@ { - "$schema": "http://json-schema.org/draft-07/schema", + "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/nf-core/atacseq/master/nextflow_schema.json", "title": "nf-core/atacseq pipeline parameters", "description": "ATACSeq peak-calling and differential analysis pipeline.", "type": "object", - "definitions": { + "$defs": { "input_output_options": { "title": "Input/output options", "type": "object", @@ -15,9 +15,10 @@ "input": { "type": "string", "format": "file-path", + "exists": true, + "schema": "assets/schema_input.json", "mimetype": "text/csv", "pattern": "^\\S+\\.csv$", - "schema": "assets/schema_input.json", "description": "Path to comma-separated file containing information about the samples in the experiment.", "help_text": "You will need to create a samplesheet with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 5 columns, and a header row. See [usage docs](https://nf-co.re/atacseq/docs/usage#introduction).", "fa_icon": "fas fa-file-csv" @@ -35,8 +36,9 @@ }, "read_length": { "type": "integer", - "description": "Read length used to calculate MACS2 genome size for peak calling if `--macs_gsize` isn't provided.", + "description": "Read length used to calculate or retrieve pre-computed MACS3 genome size for peak calling if `--macs_gsize` isn't provided.", "fa_icon": "fas fa-chart-area", + "help_text": "Read length together with the genome fasta are used to calculate MACS3 genome size using the `khmer` program as explained [here](https://deeptools.readthedocs.io/en/develop/content/feature/effectiveGenomeSize.html#effective-genome-size). For all the genomes present in the `igenomes.config` the genome size has been already precomputed and the read length is then used to retrieve the corresponding value", "enum": [50, 75, 100, 150, 200] }, "with_control": { @@ -80,6 +82,7 @@ "fasta": { "type": "string", "format": "file-path", + "exists": true, "mimetype": "text/plain", "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", "description": "Path to FASTA genome file.", @@ -89,6 +92,7 @@ "gtf": { "type": "string", "format": "file-path", + "exists": true, "mimetype": "text/plain", "pattern": "^\\S+\\.gtf(\\.gz)?$", "description": "Path to GTF annotation file.", @@ -98,6 +102,7 @@ "gff": { "type": "string", "format": "file-path", + "exists": true, "mimetype": "text/plain", "pattern": "^\\S+\\.gff(\\.gz)?$", "fa_icon": "fas fa-code-branch", @@ -106,30 +111,36 @@ }, "bwa_index": { "type": "string", + "format": "path", + "exists": true, "description": "Path to directory or tar.gz archive for pre-built BWA index.", "fa_icon": "fas fa-bezier-curve" }, "bowtie2_index": { "type": "string", "format": "path", + "exists": true, "fa_icon": "fas fa-bezier-curve", "description": "Path to directory or tar.gz archive for pre-built Bowtie2 index." }, "chromap_index": { "type": "string", "format": "path", + "exists": true, "fa_icon": "fas fa-bezier-curve", "description": "Path to directory or tar.gz archive for pre-built Chromap index." }, "star_index": { "type": "string", "format": "path", + "exists": true, "fa_icon": "fas fa-bezier-curve", "description": "Path to directory or tar.gz archive for pre-built STAR index." }, "gene_bed": { "type": "string", "format": "file-path", + "exists": true, "mimetype": "text/plain", "pattern": "^\\S+\\.bed(\\.gz)?$", "fa_icon": "fas fa-procedures", @@ -138,6 +149,7 @@ "tss_bed": { "type": "string", "format": "file-path", + "exists": true, "mimetype": "text/plain", "pattern": "^\\S+\\.bed(\\.gz)?$", "fa_icon": "fas fa-procedures", @@ -145,12 +157,14 @@ }, "macs_gsize": { "type": "number", - "description": "Effective genome size parameter required by MACS2.", - "help_text": "[Effective genome size](https://github.com/taoliu/MACS#-g--gsize) parameter required by MACS2. If using an iGenomes reference these have been provided when `--genome` is set as *GRCh37*, *GRCh38*, *GRCm38*, *WBcel235*, *BDGP6*, *R64-1-1*, *EF2*, *hg38*, *hg19* and *mm10*. For other genomes, if this parameter is not specified then the MACS2 peak-calling and differential analysis will be skipped.", + "description": "Effective genome size parameter required by MACS3.", + "help_text": "[Effective genome size](https://github.com/taoliu/MACS#-g--gsize) parameter required by MACS3. If using an iGenomes reference these have been provided when `--genome` is set as *GRCh37*, *GRCh38*, *GRCm38*, *WBcel235*, *BDGP6*, *R64-1-1*, *EF2*, *hg38*, *hg19* and *mm10*. For other genomes, if this parameter is not specified then the MACS3 peak-calling and differential analysis will be skipped.", "fa_icon": "fas fa-arrows-alt-h" }, "blacklist": { "type": "string", + "format": "path", + "exists": true, "description": "Path to blacklist regions in BED format, used for filtering alignments.", "help_text": "If provided, alignments that overlap with the regions in this file will be filtered out (see [ENCODE blacklists](https://sites.google.com/site/anshulkundaje/projects/blacklists)). The file should be in BED format. Blacklisted regions for *GRCh37*, *GRCh38*, *GRCm38*, *hg19*, *hg38*, *mm10* are bundled with the pipeline in the [`blacklists`](../assets/blacklists/) directory, and as such will be automatically used if any of those genomes are specified with the `--genome` parameter.", "fa_icon": "fas fa-book-dead" @@ -169,11 +183,10 @@ }, "igenomes_base": { "type": "string", - "format": "directory-path", - "description": "Directory / URL base for iGenomes references.", - "default": "s3://ngi-igenomes/igenomes", - "fa_icon": "fas fa-cloud-download-alt", - "hidden": true + "description": "The base path to the igenomes reference files", + "fa_icon": "fas fa-ban", + "hidden": true, + "default": "s3://ngi-igenomes/igenomes/" }, "igenomes_ignore": { "type": "boolean", @@ -185,7 +198,14 @@ "keep_mito": { "type": "boolean", "description": "Reads mapping to mitochondrial contig are not filtered from alignments.", + "fa_icon": "fas fa-cart-arrow-down", "default": false + }, + "ataqv_mito_reference": { + "type": "string", + "description": "Sets the value of the ataqv --mitochondrial-reference-name argument", + "help_text": "By default takes the value of the mito_name parameter, if set. However, some plants and algae have chloroplast genomes in addition to a mitochondrial genome and thus mito_name can have values as multiple names that are separated by a | symbol that will break ataqv, in these cases this parameter can be used to overwrite these values.", + "fa_icon": "fas fa-signature" } } }, @@ -285,11 +305,13 @@ "save_unaligned": { "type": "boolean", "fa_icon": "fas fa-save", - "description": "Where possible, save unaligned reads from either STAR, HISAT2 or Salmon to the results directory.", + "description": "Save unaligned sequences to the output directory (only available for Bowtie 2 And STAR", "help_text": "This may either be in the form of FastQ or BAM files depending on the options available for that particular tool." }, "bamtools_filter_pe_config": { "type": "string", + "format": "path", + "exists": true, "default": "$projectDir/assets/bamtools_filter_pe.json", "hidden": true, "description": "BAMTools JSON file with custom filters for paired-end data.", @@ -297,6 +319,8 @@ }, "bamtools_filter_se_config": { "type": "string", + "format": "path", + "exists": true, "default": "$projectDir/assets/bamtools_filter_se.json", "hidden": true, "description": "BAMTools JSON file with custom filters for single-end data.", @@ -305,9 +329,21 @@ "shift_reads": { "type": "boolean", "fa_icon": "fas fa-chart-area", - "default": true, - "help_text": "Shift aligned reads as commonly done for ATACseq, +4bp for reads on the + strand, -5 bp for reads on the - strand. This can only be applied if all samples are paired-end.", - "description": "Shift aligned reads (+4bp and -5bp)." + "default": false, + "help_text": "Shift aligned reads as commonly done for ATACseq footprinting analysis, +4 bp for reads on the + strand, -5 bp for reads on the - strand. This can only be applied if all samples are paired-end.", + "description": "Shift aligned reads (+4 bp and -5 bp)." + }, + "minFragmentLength": { + "type": "integer", + "default": 0, + "description": "Minimum fragment length to select for DEEPTOOLS ALIGNMENT-SIEVE.", + "fa_icon": "fas fa-dumpster" + }, + "maxFragmentLength": { + "type": "integer", + "default": 120, + "description": "Maximum fragment length to select for DEEPTOOLS ALIGNMENT-SIEVE.", + "fa_icon": "fas fa-dumpster" } } }, @@ -319,14 +355,14 @@ "properties": { "narrow_peak": { "type": "boolean", - "description": "Run MACS2 in narrowPeak mode.", - "help_text": "MACS2 is run by default with the [`--broad`](https://github.com/taoliu/MACS#--broad) flag. Specify this flag to call peaks in narrowPeak mode.", + "description": "Run MACS3 in narrowPeak mode.", + "help_text": "MACS3 is run by default with the [`--broad`](https://github.com/taoliu/MACS#--broad) flag. Specify this flag to call peaks in narrowPeak mode.", "fa_icon": "fas fa-arrows-alt-h" }, "broad_cutoff": { "type": "number", "default": 0.1, - "description": "Specifies broad cutoff value for MACS2. Only used when --narrow_peak isnt specified.", + "description": "Specifies broad cutoff value for MACS3. Only used when --narrow_peak isnt specified.", "fa_icon": "fas fa-hand-scissors" }, "macs_fdr": { @@ -348,23 +384,28 @@ }, "save_macs_pileup": { "type": "boolean", - "description": "Instruct MACS2 to create bedGraph files normalised to signal per million reads.", + "description": "Instruct MACS3 to create bedGraph files normalised to signal per million reads.", "fa_icon": "fas fa-save" }, "skip_peak_qc": { "type": "boolean", "fa_icon": "fas fa-fast-forward", - "description": "Skip MACS2 peak QC plot generation." + "description": "Skip MACS3 peak QC plot generation." }, "skip_peak_annotation": { "type": "boolean", "fa_icon": "fas fa-fast-forward", - "description": "Skip annotation of MACS2 and consensus peaks with HOMER." + "description": "Skip annotation of MACS3 and consensus peaks with HOMER." }, "skip_consensus_peaks": { "type": "boolean", "description": "Skip consensus peak generation, annotation and counting.", "fa_icon": "fas fa-fast-forward" + }, + "skip_merged_replicate_bigwig": { + "type": "boolean", + "description": "Skip generation of bigwig files for merged replicates.", + "fa_icon": "fas fa-fast-forward" } } }, @@ -491,41 +532,6 @@ } } }, - "max_job_request_options": { - "title": "Max job request options", - "type": "object", - "fa_icon": "fab fa-acquisitions-incorporated", - "description": "Set the top limit for requested resources for any single job.", - "help_text": "If you are running on a smaller system, a pipeline step requesting more resources than are available may cause the Nextflow to stop the run with an error. These options allow you to cap the maximum resources requested by any single job so that the pipeline will run on your system.\n\nNote that you can not _increase_ the resources requested by any job using these options. For that you will need your own configuration file. See [the nf-core website](https://nf-co.re/usage/configuration) for details.", - "properties": { - "max_cpus": { - "type": "integer", - "description": "Maximum number of CPUs that can be requested for any single job.", - "default": 16, - "fa_icon": "fas fa-microchip", - "hidden": true, - "help_text": "Use to set an upper-limit for the CPU requirement for each process. Should be an integer e.g. `--max_cpus 1`" - }, - "max_memory": { - "type": "string", - "description": "Maximum amount of memory that can be requested for any single job.", - "default": "128.GB", - "fa_icon": "fas fa-memory", - "pattern": "^\\d+(\\.\\d+)?\\.?\\s*(K|M|G|T)?B$", - "hidden": true, - "help_text": "Use to set an upper-limit for the memory requirement for each process. Should be a string in the format integer-unit e.g. `--max_memory '8.GB'`" - }, - "max_time": { - "type": "string", - "description": "Maximum amount of time that can be requested for any single job.", - "default": "240.h", - "fa_icon": "far fa-clock", - "pattern": "^(\\d+\\.?\\s*(s|m|h|day)\\s*)+$", - "hidden": true, - "help_text": "Use to set an upper-limit for the time requirement for each process. Should be a string in the format integer-unit e.g. `--max_time '2.h'`" - } - } - }, "generic_options": { "title": "Generic options", "type": "object", @@ -533,12 +539,6 @@ "description": "Less common options for the pipeline, typically set in a config file.", "help_text": "These options are common to all nf-core pipelines and allow you to customise some of the core preferences for how the pipeline runs.\n\nTypically these options would be set in a Nextflow config file loaded for all pipeline runs, such as `~/.nextflow/config`.", "properties": { - "help": { - "type": "boolean", - "description": "Display help text.", - "fa_icon": "fas fa-question-circle", - "hidden": true - }, "version": { "type": "boolean", "description": "Display version and exit.", @@ -589,37 +589,32 @@ "fa_icon": "fas fa-palette", "hidden": true }, - "hook_url": { - "type": "string", - "description": "Incoming hook URL for messaging service", - "fa_icon": "fas fa-people-group", - "help_text": "Incoming hook URL for messaging service. Currently, MS Teams and Slack are supported.", - "hidden": true - }, "multiqc_config": { "type": "string", + "format": "file-path", + "exists": true, + "mimetype": "text/plain", "description": "Custom config file to supply to MultiQC.", "fa_icon": "fas fa-cog", "hidden": true }, "multiqc_logo": { "type": "string", + "format": "file-path", + "exists": true, + "mimetype": "text/plain", "description": "Custom logo file to supply to MultiQC. File name must also be set in the MultiQC config file", "fa_icon": "fas fa-image", "hidden": true }, "multiqc_methods_description": { "type": "string", + "format": "file-path", + "exists": true, + "mimetype": "text/plain", "description": "Custom MultiQC yaml file containing HTML including a methods description.", "fa_icon": "fas fa-cog" }, - "tracedir": { - "type": "string", - "description": "Directory to keep pipeline Nextflow logs and reports.", - "default": "${params.outdir}/pipeline_info", - "fa_icon": "fas fa-cogs", - "hidden": true - }, "validate_params": { "type": "boolean", "description": "Boolean whether to validate parameters against the schema at runtime", @@ -627,46 +622,61 @@ "fa_icon": "fas fa-check-square", "hidden": true }, - "show_hidden_params": { + "pipelines_testdata_base_path": { + "type": "string", + "fa_icon": "far fa-check-circle", + "description": "Base URL or local path to location of pipeline test dataset files", + "default": "https://raw.githubusercontent.com/nf-core/test-datasets/", + "hidden": true + }, + "trace_report_suffix": { + "type": "string", + "fa_icon": "far calendar", + "description": "Suffix to add to the trace report filename. Default is the date and time in the format yyyy-MM-dd_HH-mm-ss.", + "hidden": true + }, + "help": { + "type": ["boolean", "string"], + "description": "Display the help message." + }, + "help_full": { "type": "boolean", - "fa_icon": "far fa-eye-slash", - "description": "Show all params when using `--help`", - "hidden": true, - "help_text": "By default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with `--help`. Specifying this option will tell the pipeline to show all parameters." + "description": "Display the full detailed help message." + }, + "show_hidden": { + "type": "boolean", + "description": "Display hidden parameters in the help message (only works when --help or --help_full are provided)." } } } }, "allOf": [ { - "$ref": "#/definitions/input_output_options" - }, - { - "$ref": "#/definitions/reference_genome_options" + "$ref": "#/$defs/input_output_options" }, { - "$ref": "#/definitions/adapter_trimming_options" + "$ref": "#/$defs/adapter_trimming_options" }, { - "$ref": "#/definitions/alignment_options" + "$ref": "#/$defs/alignment_options" }, { - "$ref": "#/definitions/peak_calling_options" + "$ref": "#/$defs/peak_calling_options" }, { - "$ref": "#/definitions/deseq_qc_options" + "$ref": "#/$defs/deseq_qc_options" }, { - "$ref": "#/definitions/process_skipping_options" + "$ref": "#/$defs/process_skipping_options" }, { - "$ref": "#/definitions/institutional_config_options" + "$ref": "#/$defs/reference_genome_options" }, { - "$ref": "#/definitions/max_job_request_options" + "$ref": "#/$defs/institutional_config_options" }, { - "$ref": "#/definitions/generic_options" + "$ref": "#/$defs/generic_options" } ] } diff --git a/nf-test.config b/nf-test.config new file mode 100644 index 00000000..f7aaeb4a --- /dev/null +++ b/nf-test.config @@ -0,0 +1,38 @@ +config { + // location for all nf-test tests + testsDir = "." + + // nf-test directory including temporary files for each test + workDir = System.getenv("NFT_WORKDIR") ?: ".nf-test" + + // location of an optional nextflow.config file specific for executing tests + configFile = "tests/nextflow.config" + + // ignore tests coming from the nf-core/modules repo + ignore = [ + 'modules/nf-core/**/tests/*', + 'subworkflows/nf-core/**/tests/*', + ] + + // run all test with defined profile(s) from the main nextflow.config + profile = "test" + + // list of filenames or patterns that should be trigger a full test run + triggers = [ + '.github/actions/nf-test/action.yml', + '.github/workflows/nf-test.yml', + 'assets/schema_input.json', + 'bin/*', + 'conf/test.config', + 'nextflow.config', + 'nextflow_schema.json', + 'nf-test.config', + 'tests/.nftignore', + 'tests/nextflow.config', + ] + + // load the necessary plugins + plugins { + load "nft-utils@0.0.3" + } +} diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 0d62beb6..00000000 --- a/pyproject.toml +++ /dev/null @@ -1,10 +0,0 @@ -# Config file for Python. Mostly used to configure linting of bin/check_samplesheet.py with Black. -# Should be kept the same as nf-core/tools to avoid fighting with template synchronisation. -[tool.black] -line-length = 120 -target_version = ["py37", "py38", "py39", "py310"] - -[tool.isort] -profile = "black" -known_first_party = ["nf_core"] -multi_line_output = 3 diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json new file mode 100644 index 00000000..f3843d16 --- /dev/null +++ b/ro-crate-metadata.json @@ -0,0 +1,377 @@ +{ + "@context": [ + "https://w3id.org/ro/crate/1.2/context", + { + "GithubService": "https://w3id.org/ro/terms/test#GithubService", + "JenkinsService": "https://w3id.org/ro/terms/test#JenkinsService", + "PlanemoEngine": "https://w3id.org/ro/terms/test#PlanemoEngine", + "TestDefinition": "https://w3id.org/ro/terms/test#TestDefinition", + "TestInstance": "https://w3id.org/ro/terms/test#TestInstance", + "TestService": "https://w3id.org/ro/terms/test#TestService", + "TestSuite": "https://w3id.org/ro/terms/test#TestSuite", + "TravisService": "https://w3id.org/ro/terms/test#TravisService", + "definition": "https://w3id.org/ro/terms/test#definition", + "engineVersion": "https://w3id.org/ro/terms/test#engineVersion", + "instance": "https://w3id.org/ro/terms/test#instance", + "resource": "https://w3id.org/ro/terms/test#resource", + "runsOn": "https://w3id.org/ro/terms/test#runsOn" + } + ], + "@graph": [ + { + "@id": "./", + "@type": "Dataset", + "creativeWorkStatus": "InProgress", + "datePublished": "2026-07-29T16:21:39+00:00", + "description": "

    \n \n \n \"nf-core/atacseq\"\n \n

    \n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/atacseq)\n[![GitHub Actions CI Status](https://github.com/nf-core/atacseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/atacseq/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/atacseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/atacseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/atacseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.10.4-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-4.0.3-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.0.3)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/atacseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23atacseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/atacseq)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/atacseq** is a bioinformatics analysis pipeline used for ATAC-seq data.\n\nThe 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 uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community!\n\nOn release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources.The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/atacseq/results).\n\n## Pipeline summary\n\n![nf-core/atacseq metro map](docs/images/nf-core-atacseq_metro_map_grey.png)\n\n1. Raw read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))\n2. Adapter trimming ([`Trim Galore!`](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/))\n3. Choice of multiple aligners\n 1.([`BWA`](https://sourceforge.net/projects/bio-bwa/files/))\n 2.([`Chromap`](https://github.com/haowenz/chromap)). **For paired-end reads only working until mapping steps, see [here](https://github.com/nf-core/chipseq/issues/291)**\n 3.([`Bowtie2`](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml))\n 4.([`STAR`](https://github.com/alexdobin/STAR))\n4. Mark duplicates ([`picard`](https://broadinstitute.github.io/picard/))\n5. Merge alignments from multiple libraries of the same sample ([`picard`](https://broadinstitute.github.io/picard/))\n 1. Re-mark duplicates ([`picard`](https://broadinstitute.github.io/picard/))\n 2. Filtering to remove:\n - reads mapping to mitochondrial DNA ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/))\n - reads mapping to blacklisted regions ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/), [`BEDTools`](https://github.com/arq5x/bedtools2/))\n - reads that are marked as duplicates ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/))\n - reads that are not marked as primary alignments ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/))\n - reads that are unmapped ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/))\n - reads that map to multiple locations ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/))\n - reads containing > 4 mismatches ([`BAMTools`](https://github.com/pezmaster31/bamtools))\n - reads that are soft-clipped ([`BAMTools`](https://github.com/pezmaster31/bamtools))\n - reads that have an insert size > 2kb ([`BAMTools`](https://github.com/pezmaster31/bamtools); _paired-end only_)\n - reads that map to different chromosomes ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); _paired-end only_)\n - reads that arent in FR orientation ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); _paired-end only_)\n - reads where only one read of the pair fails the above criteria ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); _paired-end only_)\n 3. Alignment-level QC and estimation of library complexity ([`picard`](https://broadinstitute.github.io/picard/), [`Preseq`](http://smithlabresearch.org/software/preseq/))\n 4. Create normalised bigWig files scaled to 1 million mapped reads ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/))\n 5. Generate gene-body meta-profile from bigWig files ([`deepTools`](https://deeptools.readthedocs.io/en/develop/content/tools/plotProfile.html))\n 6. Calculate genome-wide enrichment (optionally relative to control) ([`deepTools`](https://deeptools.readthedocs.io/en/develop/content/tools/plotFingerprint.html))\n 7. Call broad/narrow peaks ([`MACS3`](https://github.com/macs3-project/MACS))\n 8. Annotate peaks relative to gene features ([`HOMER`](http://homer.ucsd.edu/homer/download.html))\n 9. Create consensus peakset across all samples and create tabular file to aid in the filtering of the data ([`BEDTools`](https://github.com/arq5x/bedtools2/))\n 10. Count reads in consensus peaks ([`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/))\n 11. Differential accessibility analysis, PCA and clustering ([`R`](https://www.r-project.org/), [`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html))\n 12. Generate ATAC-seq specific QC html report ([`ataqv`](https://github.com/ParkerLab/ataqv))\n6. Merge filtered alignments across replicates ([`picard`](https://broadinstitute.github.io/picard/))\n 1. Re-mark duplicates ([`picard`](https://broadinstitute.github.io/picard/))\n 2. Remove duplicate reads ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/))\n 3. Create normalised bigWig files scaled to 1 million mapped reads ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/))\n 4. Call broad/narrow peaks ([`MACS3`](https://github.com/macs3-project/MACS))\n 5. Annotate peaks relative to gene features ([`HOMER`](http://homer.ucsd.edu/homer/download.html))\n 6. Create consensus peakset across all samples and create tabular file to aid in the filtering of the data ([`BEDTools`](https://github.com/arq5x/bedtools2/))\n 7. Count reads in consensus peaks relative to merged library-level alignments ([`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/))\n 8. Differential accessibility analysis, PCA and clustering ([`R`](https://www.r-project.org/), [`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html))\n7. Create IGV session file containing bigWig tracks, peaks and differential sites for data visualisation ([`IGV`](https://software.broadinstitute.org/software/igv/)).\n8. Present QC for raw read, alignment, peak-calling and differential accessibility results ([`ataqv`](https://github.com/ParkerLab/ataqv), [`MultiQC`](http://multiqc.info/), [`R`](https://www.r-project.org/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/get_started/environment_setup/overview) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/get_started/run-your-first-pipeline) with `-profile test` before running the workflow on actual data.\n\nTo run on your data, prepare a tab-separated samplesheet with your input data. Please follow the [documentation on samplesheets](https://nf-co.re/atacseq/usage#samplesheet-input) for more details. An example samplesheet for running the pipeline looks as follows:\n\n```csv\nsample,fastq_1,fastq_2,replicate\nSAMPLE_A,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz,1\nSAMPLE_A,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz,2\nSAMPLE_A,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz,3\n```\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/atacseq --input samplesheet.csv --outdir --genome GRCh37 --read_length <50|100|150|200> -profile \n```\n\nSee [usage docs](https://nf-co.re/atacseq/usage) for all of the available options when running the pipeline.\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/running/run-pipelines#using-parameter-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/atacseq/usage) and the [parameter documentation](https://nf-co.re/atacseq/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/atacseq/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/atacseq/output).\n\n## Credits\n\nThe pipeline was originally written by Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [Seqera Labs, Spain](https://seqera.io/) and converted to Nextflow DSL2 by Björn Langer ([@bjlang](https://github.com/bjlang)) and Jose Espinosa-Carrasco ([@JoseEspinosa](https://github.com/JoseEspinosa)) from [The Comparative Bioinformatics Group](https://www.crg.eu/en/cedric_notredame) at [The Centre for Genomic Regulation, Spain](https://www.crg.eu/) under the umbrella of the [BovReg project](https://www.bovreg.eu/).\n\nMany thanks to others who have helped out and contributed along the way too, including (but not limited to): [@ewels](https://github.com/ewels), [@apeltzer](https://github.com/apeltzer), [@crickbabs](https://github.com/crickbabs), [drewjbeh](https://github.com/drewjbeh), [@houghtos](https://github.com/houghtos), [@jinmingda](https://github.com/jinmingda), [@ktrns](https://github.com/ktrns), [@MaxUlysse](https://github.com/MaxUlysse), [@mashehu](https://github.com/mashehu), [@micans](https://github.com/micans), [@pditommaso](https://github.com/pditommaso) and [@sven1103](https://github.com/sven1103).\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](docs/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#atacseq` channel](https://nfcore.slack.com/channels/atacseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/atacseq for your analysis, please cite it using the following doi: [10.5281/zenodo.2634132](https://doi.org/10.5281/zenodo.2634132)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "hasPart": [ + { + "@id": "main.nf" + }, + { + "@id": "docs/images/nf-core-atacseq_metro_map_grey.png" + }, + { + "@id": "assets/" + }, + { + "@id": "bin/" + }, + { + "@id": "conf/" + }, + { + "@id": "docs/" + }, + { + "@id": "docs/images/" + }, + { + "@id": "modules/" + }, + { + "@id": "modules/local/" + }, + { + "@id": "modules/nf-core/" + }, + { + "@id": "workflows/" + }, + { + "@id": "subworkflows/" + }, + { + "@id": "nextflow.config" + }, + { + "@id": "README.md" + }, + { + "@id": "nextflow_schema.json" + }, + { + "@id": "CHANGELOG.md" + }, + { + "@id": "LICENSE" + }, + { + "@id": "CODE_OF_CONDUCT.md" + }, + { + "@id": "CITATIONS.md" + }, + { + "@id": "modules.json" + }, + { + "@id": "docs/usage.md" + }, + { + "@id": "docs/output.md" + }, + { + "@id": ".nf-core.yml" + }, + { + "@id": ".pre-commit-config.yaml" + }, + { + "@id": ".prettierignore" + } + ], + "isBasedOn": "https://github.com/nf-core/atacseq", + "license": "MIT", + "mainEntity": { + "@id": "main.nf" + }, + "mentions": [ + { + "@id": "#7c1271b6-b995-4a55-a551-2307a7d7757f" + } + ], + "name": "nf-core/atacseq" + }, + { + "@id": "ro-crate-metadata.json", + "@type": "CreativeWork", + "about": { + "@id": "./" + }, + "conformsTo": [ + { + "@id": "https://w3id.org/ro/crate/1.2" + }, + { + "@id": "https://w3id.org/workflowhub/workflow-ro-crate/1.0" + } + ] + }, + { + "@id": "main.nf", + "@type": [ + "File", + "SoftwareSourceCode", + "ComputationalWorkflow" + ], + "contributor": [ + { + "@id": "#3eb029c6-ad2f-4976-8cb5-128d13929eea" + }, + { + "@id": "#5b90a1a4-8af4-4f8d-8800-cd47cf89cc65" + }, + { + "@id": "#23223118-6234-41ef-aaa6-bdbda8bc9096" + }, + { + "@id": "#e009c858-2251-4980-b422-d9b99d134eb4" + } + ], + "dateCreated": "", + "dateModified": "2026-07-29T18:21:39Z", + "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", + "image": { + "@id": "docs/images/nf-core-atacseq_metro_map_grey.png" + }, + "keywords": [ + "nf-core", + "nextflow", + "atac-seq", + "chromatin-accessibiity" + ], + "license": [ + "MIT" + ], + "name": [ + "nf-core/atacseq" + ], + "programmingLanguage": { + "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow" + }, + "sdPublisher": { + "@id": "https://nf-co.re/" + }, + "url": [ + "https://github.com/nf-core/atacseq", + "https://nf-co.re/atacseq/dev/" + ], + "version": [ + "2.2.0dev" + ] + }, + { + "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow", + "@type": "ComputerLanguage", + "identifier": { + "@id": "https://www.nextflow.io/" + }, + "name": "Nextflow", + "url": { + "@id": "https://www.nextflow.io/" + }, + "version": "!>=25.10.4" + }, + { + "@id": "docs/images/nf-core-atacseq_metro_map_grey.png", + "@type": [ + "File", + "ImageObject" + ], + "name": "Workflow diagram" + }, + { + "@id": "#7c1271b6-b995-4a55-a551-2307a7d7757f", + "@type": "TestSuite", + "instance": [ + { + "@id": "#04595088-616b-4350-8d47-d1b43b1e9ec7" + } + ], + "mainEntity": { + "@id": "main.nf" + }, + "name": "Test suite for nf-core/atacseq" + }, + { + "@id": "#04595088-616b-4350-8d47-d1b43b1e9ec7", + "@type": "TestInstance", + "name": "GitHub Actions workflow for testing nf-core/atacseq", + "resource": "repos/nf-core/atacseq/actions/workflows/nf-test.yml", + "runsOn": { + "@id": "https://w3id.org/ro/terms/test#GithubService" + }, + "url": "https://api.github.com" + }, + { + "@id": "https://w3id.org/ro/terms/test#GithubService", + "@type": "TestService", + "name": "Github Actions", + "url": { + "@id": "https://github.com" + } + }, + { + "@id": "assets/", + "@type": "Dataset", + "description": "Additional files" + }, + { + "@id": "bin/", + "@type": "Dataset", + "description": "Scripts that must be callable from a pipeline process" + }, + { + "@id": "conf/", + "@type": "Dataset", + "description": "Configuration files" + }, + { + "@id": "docs/", + "@type": "Dataset", + "description": "Markdown files for documenting the pipeline" + }, + { + "@id": "docs/images/", + "@type": "Dataset", + "description": "Images for the documentation files" + }, + { + "@id": "modules/", + "@type": "Dataset", + "description": "Modules used by the pipeline" + }, + { + "@id": "modules/local/", + "@type": "Dataset", + "description": "Pipeline-specific modules" + }, + { + "@id": "modules/nf-core/", + "@type": "Dataset", + "description": "nf-core modules" + }, + { + "@id": "workflows/", + "@type": "Dataset", + "description": "Main pipeline workflows to be executed in main.nf" + }, + { + "@id": "subworkflows/", + "@type": "Dataset", + "description": "Smaller subworkflows" + }, + { + "@id": "nextflow.config", + "@type": "File", + "description": "Main Nextflow configuration file" + }, + { + "@id": "README.md", + "@type": "File", + "description": "Basic pipeline usage information" + }, + { + "@id": "nextflow_schema.json", + "@type": "File", + "description": "JSON schema for pipeline parameter specification" + }, + { + "@id": "CHANGELOG.md", + "@type": "File", + "description": "Information on changes made to the pipeline" + }, + { + "@id": "LICENSE", + "@type": "File", + "description": "The license - should be MIT" + }, + { + "@id": "CODE_OF_CONDUCT.md", + "@type": "File", + "description": "The nf-core code of conduct" + }, + { + "@id": "CITATIONS.md", + "@type": "File", + "description": "Citations needed when using the pipeline" + }, + { + "@id": "modules.json", + "@type": "File", + "description": "Version information for modules from nf-core/modules" + }, + { + "@id": "docs/usage.md", + "@type": "File", + "description": "Usage documentation" + }, + { + "@id": "docs/output.md", + "@type": "File", + "description": "Output documentation" + }, + { + "@id": ".nf-core.yml", + "@type": "File", + "description": "nf-core configuration file, configuring template features and linting rules" + }, + { + "@id": ".pre-commit-config.yaml", + "@type": "File", + "description": "Configuration file for pre-commit hooks" + }, + { + "@id": ".prettierignore", + "@type": "File", + "description": "Ignore file for prettier" + }, + { + "@id": "https://nf-co.re/", + "@type": "Organization", + "name": "nf-core", + "url": "https://nf-co.re/" + }, + { + "@id": "#3eb029c6-ad2f-4976-8cb5-128d13929eea", + "@type": "Person", + "name": "Patel H" + }, + { + "@id": "#5b90a1a4-8af4-4f8d-8800-cd47cf89cc65", + "@type": "Person", + "name": "Langer B" + }, + { + "@id": "#23223118-6234-41ef-aaa6-bdbda8bc9096", + "@type": "Person", + "name": "Espinosa-Carrasco J" + }, + { + "@id": "#e009c858-2251-4980-b422-d9b99d134eb4", + "@type": "Person", + "name": "Syme R" + } + ] +} \ No newline at end of file diff --git a/subworkflows/local/align_star.nf b/subworkflows/local/align_star.nf index 843f303e..e9c058a8 100644 --- a/subworkflows/local/align_star.nf +++ b/subworkflows/local/align_star.nf @@ -7,26 +7,23 @@ include { BAM_SORT_STATS_SAMTOOLS } from '../nf-core/bam_sort_stats_samtools/mai workflow ALIGN_STAR { take: - ch_reads // channel: [ val(meta), [ reads ] ] - ch_index // channel: /path/to/star/index/ - ch_fasta // channel: /path/to/fasta - seq_center // string: sequencing center + ch_reads // channel: [ val(meta), [ reads ] ] + ch_index // channel: /path/to/star/index/ + ch_fasta_fai // channel: [ val(meta), path(fasta), path(fai) ] + seq_center // string: sequencing center main: - ch_versions = Channel.empty() // // Map reads with STAR // STAR_ALIGN ( ch_reads, ch_index, seq_center ) - ch_versions = ch_versions.mix(STAR_ALIGN.out.versions.first()) // // Sort, index BAM file and run samtools stats, flagstat and idxstats // - BAM_SORT_STATS_SAMTOOLS ( STAR_ALIGN.out.bam, ch_fasta ) - ch_versions = ch_versions.mix(BAM_SORT_STATS_SAMTOOLS.out.versions) + BAM_SORT_STATS_SAMTOOLS ( STAR_ALIGN.out.bam, ch_fasta_fai ) emit: orig_bam = STAR_ALIGN.out.bam // channel: [ val(meta), bam ] @@ -39,10 +36,9 @@ workflow ALIGN_STAR { tab = STAR_ALIGN.out.tab // channel: [ val(meta), tab ] bam = BAM_SORT_STATS_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] - bai = BAM_SORT_STATS_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] + index = BAM_SORT_STATS_SAMTOOLS.out.index // channel: [ val(meta), [ bai/csi ] ] stats = BAM_SORT_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] flagstat = BAM_SORT_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] idxstats = BAM_SORT_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_bedgraph_bigwig_bedtools_ucsc.nf b/subworkflows/local/bam_bedgraph_bigwig_bedtools_ucsc.nf index 0947571c..623076dc 100644 --- a/subworkflows/local/bam_bedgraph_bigwig_bedtools_ucsc.nf +++ b/subworkflows/local/bam_bedgraph_bigwig_bedtools_ucsc.nf @@ -10,10 +10,9 @@ workflow BAM_BEDGRAPH_BIGWIG_BEDTOOLS_UCSC { take: ch_bam_flagstat // channel: [ val(meta), [bam], [flagstat] ] ch_chrom_sizes // channel: [ bed ] - + main: - ch_versions = Channel.empty() // // Create bedGraph coverage track @@ -21,7 +20,6 @@ workflow BAM_BEDGRAPH_BIGWIG_BEDTOOLS_UCSC { BEDTOOLS_GENOMECOV ( ch_bam_flagstat ) - ch_versions = ch_versions.mix(BEDTOOLS_GENOMECOV.out.versions.first()) // // Create bigWig coverage tracks @@ -30,7 +28,6 @@ workflow BAM_BEDGRAPH_BIGWIG_BEDTOOLS_UCSC { BEDTOOLS_GENOMECOV.out.bedgraph, ch_chrom_sizes ) - ch_versions = ch_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions.first()) emit: bedgraph = BEDTOOLS_GENOMECOV.out.bedgraph // channel: [ val(meta), [ bedgraph ] ] @@ -38,5 +35,4 @@ workflow BAM_BEDGRAPH_BIGWIG_BEDTOOLS_UCSC { bigwig = UCSC_BEDGRAPHTOBIGWIG.out.bigwig // channel: [ val(meta), [ bigwig ] ] - versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_filter_bamtools.nf b/subworkflows/local/bam_filter_bamtools.nf index 7c0bba66..c00ec8f0 100644 --- a/subworkflows/local/bam_filter_bamtools.nf +++ b/subworkflows/local/bam_filter_bamtools.nf @@ -8,31 +8,29 @@ include { BAM_REMOVE_ORPHANS } from '../../modules/local/bam_remove_orphans workflow BAM_FILTER_BAMTOOLS { take: - ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + ch_bam_index // channel: [ val(meta), [ bam ], [ bai/csi ] ] ch_bed // channel: [ bed ] - ch_fasta // channel: [ fasta ] + ch_fasta_fai // channel: [ val(meta), path(fasta), path(fai) ] ch_bamtools_filter_se_config // channel: [ config_file ] ch_bamtools_filter_pe_config // channel: [ config_file ] main: - ch_versions = Channel.empty() // // Filter BAM file with BAMTools // BAMTOOLS_FILTER ( - ch_bam_bai, + ch_bam_index, ch_bed, ch_bamtools_filter_se_config, ch_bamtools_filter_pe_config ) - ch_versions = ch_versions.mix(BAMTOOLS_FILTER.out.versions.first()) BAMTOOLS_FILTER .out .bam - .branch { + .branch { meta, bam -> single_end: meta.single_end return [ meta, bam ] @@ -47,24 +45,25 @@ workflow BAM_FILTER_BAMTOOLS { SAMTOOLS_INDEX { ch_bam.single_end } - ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions.first()) + + ch_index = SAMTOOLS_INDEX.out.index // // Run samtools stats, flagstat and idxstats on SE BAM // BAM_STATS_SAMTOOLS ( - ch_bam.single_end.join(SAMTOOLS_INDEX.out.bai), - ch_fasta + ch_bam.single_end.join(ch_index), + ch_fasta_fai ) - ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions.first()) // // Name sort PE BAM before filtering with pysam // SAMTOOLS_SORT ( - ch_bam.paired_end + ch_bam.paired_end, + ch_fasta_fai, + '' ) - ch_versions = ch_versions.mix(SAMTOOLS_SORT.out.versions.first()) // // Remove orphan reads from PE BAM file @@ -72,23 +71,20 @@ workflow BAM_FILTER_BAMTOOLS { BAM_REMOVE_ORPHANS ( SAMTOOLS_SORT.out.bam ) - ch_versions = ch_versions.mix(BAM_REMOVE_ORPHANS.out.versions.first()) // // Sort, index PE BAM file and run samtools stats, flagstat and idxstats // BAM_SORT_STATS_SAMTOOLS ( BAM_REMOVE_ORPHANS.out.bam, - ch_fasta + ch_fasta_fai ) - ch_versions = ch_versions.mix(BAM_SORT_STATS_SAMTOOLS.out.versions.first()) emit: name_bam = SAMTOOLS_SORT.out.bam // channel: [ val(meta), [ bam ] ] bam = BAM_SORT_STATS_SAMTOOLS.out.bam.mix(ch_bam.single_end) // channel: [ val(meta), [ bam ] ] - bai = BAM_SORT_STATS_SAMTOOLS.out.bai.mix(SAMTOOLS_INDEX.out.bai) // channel: [ val(meta), [ bai ] ] + index = BAM_SORT_STATS_SAMTOOLS.out.index.mix(ch_index) // channel: [ val(meta), [ bai/csi ] ] stats = BAM_SORT_STATS_SAMTOOLS.out.stats.mix(BAM_STATS_SAMTOOLS.out.stats) // channel: [ val(meta), [ stats ] ] flagstat = BAM_SORT_STATS_SAMTOOLS.out.flagstat.mix(BAM_STATS_SAMTOOLS.out.flagstat) // channel: [ val(meta), [ flagstat ] ] idxstats = BAM_SORT_STATS_SAMTOOLS.out.idxstats.mix(BAM_STATS_SAMTOOLS.out.idxstats) // channel: [ val(meta), [ idxstats ] ] - versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_peaks_call_qc_annotate_macs2_homer.nf b/subworkflows/local/bam_peaks_call_qc_annotate_macs3_homer.nf similarity index 56% rename from subworkflows/local/bam_peaks_call_qc_annotate_macs2_homer.nf rename to subworkflows/local/bam_peaks_call_qc_annotate_macs3_homer.nf index b28b255c..2c10493f 100644 --- a/subworkflows/local/bam_peaks_call_qc_annotate_macs2_homer.nf +++ b/subworkflows/local/bam_peaks_call_qc_annotate_macs3_homer.nf @@ -1,17 +1,16 @@ // -// Call peaks with MACS2, annotate with HOMER and perform downstream QC +// Call peaks with MACS3, annotate with HOMER and perform downstream QC // -include { BEDTOOLS_BAMTOBED } from '../../modules/nf-core/bedtools/bamtobed/main' -include { MACS2_CALLPEAK } from '../../modules/nf-core/macs2/callpeak/main' +include { MACS3_CALLPEAK } from '../../modules/nf-core/macs3/callpeak/main' include { HOMER_ANNOTATEPEAKS } from '../../modules/nf-core/homer/annotatepeaks/main' include { FRIP_SCORE } from '../../modules/local/frip_score' include { MULTIQC_CUSTOM_PEAKS } from '../../modules/local/multiqc_custom_peaks' -include { PLOT_MACS2_QC } from '../../modules/local/plot_macs2_qc' +include { PLOT_MACS3_QC } from '../../modules/local/plot_macs3_qc' include { PLOT_HOMER_ANNOTATEPEAKS } from '../../modules/local/plot_homer_annotatepeaks' -workflow BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER { +workflow BAM_PEAKS_CALL_QC_ANNOTATE_MACS3_HOMER { take: ch_bam // channel: [ val(meta), [ ip_bam ], [ control_bam ] ] ch_fasta // channel: [ fasta ] @@ -24,55 +23,35 @@ workflow BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER { is_narrow_peak // boolean: true/false skip_peak_annotation // boolean: true/false skip_peak_qc // boolean: true/false - + main: - ch_versions = Channel.empty() // - // Convert bam to bed + // Call peaks with MACS3 // - BEDTOOLS_BAMTOBED ( - ch_bam.map { meta, ip_bam, control_bam -> [ meta, ip_bam ] } - ) - ch_versions = ch_versions.mix(BEDTOOLS_BAMTOBED.out.versions.first()) - - // Create channels: [meta, ip_bed, []] - BEDTOOLS_BAMTOBED - .out - .bed - .map { - meta, ip_bed -> - [ meta, ip_bed, [] ] - } - .set { ch_bed } - - // - // Call peaks with MACS2 - // - MACS2_CALLPEAK ( - ch_bed, + MACS3_CALLPEAK ( + ch_bam, macs_gsize ) - ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions.first()) // - // Filter out samples with 0 MACS2 peaks called + // Filter out samples with 0 MACS3 peaks called // - MACS2_CALLPEAK + MACS3_CALLPEAK .out .peak - .filter { - meta, peaks -> + .filter { + _meta, peaks -> peaks.size() > 0 } - .set { ch_macs2_peaks } + .set { ch_macs3_peaks } // Create channels: [ meta, ip_bam, peaks ] ch_bam - .join(ch_macs2_peaks, by: [0]) + .join(ch_macs3_peaks, by: [0]) .map { - meta, ip_bam, control_bam, peaks -> + meta, ip_bam, _control_bam, peaks -> [ meta, ip_bam, peaks ] } .set { ch_bam_peaks } @@ -83,13 +62,12 @@ workflow BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER { FRIP_SCORE ( ch_bam_peaks ) - ch_versions = ch_versions.mix(FRIP_SCORE.out.versions.first()) // Create channels: [ meta, peaks, frip ] ch_bam_peaks .join(FRIP_SCORE.out.txt, by: [0]) .map { - meta, ip_bam, peaks, frip -> + meta, _ip_bam, peaks, frip -> [ meta, peaks, frip ] } .set { ch_bam_peak_frip } @@ -102,73 +80,68 @@ workflow BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER { ch_peak_count_header_multiqc, ch_frip_score_multiqc ) - ch_versions = ch_versions.mix(MULTIQC_CUSTOM_PEAKS.out.versions.first()) - - ch_homer_annotatepeaks = Channel.empty() - ch_plot_macs2_qc_txt = Channel.empty() - ch_plot_macs2_qc_pdf = Channel.empty() - ch_plot_homer_annotatepeaks_txt = Channel.empty() - ch_plot_homer_annotatepeaks_pdf = Channel.empty() - ch_plot_homer_annotatepeaks_tsv = Channel.empty() + + ch_homer_annotatepeaks = channel.empty() + ch_plot_macs3_qc_txt = channel.empty() + ch_plot_macs3_qc_pdf = channel.empty() + ch_plot_homer_annotatepeaks_txt = channel.empty() + ch_plot_homer_annotatepeaks_pdf = channel.empty() + ch_plot_homer_annotatepeaks_tsv = channel.empty() if (!skip_peak_annotation) { // // Annotate peaks with HOMER // HOMER_ANNOTATEPEAKS ( - ch_macs2_peaks, + ch_macs3_peaks, ch_fasta, ch_gtf ) ch_homer_annotatepeaks = HOMER_ANNOTATEPEAKS.out.txt - ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS.out.versions.first()) - + if (!skip_peak_qc) { // - // MACS2 QC plots with R + // MACS3 QC plots with R // - PLOT_MACS2_QC ( - ch_macs2_peaks.collect{it[1]}, + PLOT_MACS3_QC ( + ch_macs3_peaks.collect { item -> item[1] }, is_narrow_peak ) - ch_plot_macs2_qc_txt = PLOT_MACS2_QC.out.txt - ch_plot_macs2_qc_pdf = PLOT_MACS2_QC.out.pdf - ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions) + ch_plot_macs3_qc_txt = PLOT_MACS3_QC.out.txt + ch_plot_macs3_qc_pdf = PLOT_MACS3_QC.out.pdf // // Peak annotation QC plots with R // PLOT_HOMER_ANNOTATEPEAKS ( - HOMER_ANNOTATEPEAKS.out.txt.collect{it[1]}, + HOMER_ANNOTATEPEAKS.out.txt.collect { item -> item[1] }, ch_peak_annotation_header_multiqc, annotate_peaks_suffix ) ch_plot_homer_annotatepeaks_txt = PLOT_HOMER_ANNOTATEPEAKS.out.txt ch_plot_homer_annotatepeaks_pdf = PLOT_HOMER_ANNOTATEPEAKS.out.pdf ch_plot_homer_annotatepeaks_tsv = PLOT_HOMER_ANNOTATEPEAKS.out.tsv - ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions) } } emit: - peaks = ch_macs2_peaks // channel: [ val(meta), [ peaks ] ] - xls = MACS2_CALLPEAK.out.xls // channel: [ val(meta), [ xls ] ] - gapped_peaks = MACS2_CALLPEAK.out.gapped // channel: [ val(meta), [ gapped_peak ] ] - bed = MACS2_CALLPEAK.out.bed // channel: [ val(meta), [ bed ] ] - bedgraph = MACS2_CALLPEAK.out.bdg // channel: [ val(meta), [ bedgraph ] ] + peaks = ch_macs3_peaks // channel: [ val(meta), [ peaks ] ] + xls = MACS3_CALLPEAK.out.xls // channel: [ val(meta), [ xls ] ] + gapped_peaks = MACS3_CALLPEAK.out.gapped // channel: [ val(meta), [ gapped_peak ] ] + bed = MACS3_CALLPEAK.out.bed // channel: [ val(meta), [ bed ] ] + bedgraph = MACS3_CALLPEAK.out.bdg // channel: [ val(meta), [ bedgraph ] ] frip_txt = FRIP_SCORE.out.txt // channel: [ val(meta), [ txt ] ] - + frip_multiqc = MULTIQC_CUSTOM_PEAKS.out.frip // channel: [ val(meta), [ frip ] ] peak_count_multiqc = MULTIQC_CUSTOM_PEAKS.out.count // channel: [ val(meta), [ counts ] ] homer_annotatepeaks = ch_homer_annotatepeaks // channel: [ val(meta), [ txt ] ] - plot_macs2_qc_txt = ch_plot_macs2_qc_txt // channel: [ txt ] - plot_macs2_qc_pdf = ch_plot_macs2_qc_pdf // channel: [ pdf ] + plot_macs3_qc_txt = ch_plot_macs3_qc_txt // channel: [ txt ] + plot_macs3_qc_pdf = ch_plot_macs3_qc_pdf // channel: [ pdf ] plot_homer_annotatepeaks_txt = ch_plot_homer_annotatepeaks_txt // channel: [ txt ] plot_homer_annotatepeaks_pdf = ch_plot_homer_annotatepeaks_pdf // channel: [ pdf ] plot_homer_annotatepeaks_tsv = ch_plot_homer_annotatepeaks_tsv // channel: [ tsv ] - versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_shift_reads.nf b/subworkflows/local/bam_shift_reads.nf index 4e99c1df..6e9c9f8a 100644 --- a/subworkflows/local/bam_shift_reads.nf +++ b/subworkflows/local/bam_shift_reads.nf @@ -1,30 +1,30 @@ include { SAMTOOLS_SORT } from '../../modules/nf-core/samtools/sort/main' include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main' -include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/samtools/flagstat/main' -include { DEEPTOOLS_ALIGNMENTSIEVE } from '../../modules/local/deeptools_alignmentsieve' +include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/samtools/flagstat/main' +include { DEEPTOOLS_ALIGNMENTSIEVE } from '../../modules/nf-core/deeptools/alignmentsieve' workflow BAM_SHIFT_READS { take: - ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + ch_bam_index // channel: [ val(meta), [ bam ], [ bai/csi ] ] + ch_fasta_fai // channel: [ val(meta), path(fasta), path(fai) ] main: - ch_versions = Channel.empty() // // Shift reads // DEEPTOOLS_ALIGNMENTSIEVE ( - ch_bam_bai + ch_bam_index ) - ch_versions = ch_versions.mix(DEEPTOOLS_ALIGNMENTSIEVE.out.versions) // // Sort reads // SAMTOOLS_SORT ( - DEEPTOOLS_ALIGNMENTSIEVE.out.bam + DEEPTOOLS_ALIGNMENTSIEVE.out.bam, + ch_fasta_fai, + '' ) - ch_versions = ch_versions.mix(SAMTOOLS_SORT.out.versions) // // Index reads @@ -32,20 +32,16 @@ workflow BAM_SHIFT_READS { SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) - ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) // // Run samtools flagstat // SAMTOOLS_FLAGSTAT ( - SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]) + SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.index, by: [0]) ) - ch_versions = ch_versions.mix(SAMTOOLS_FLAGSTAT.out.versions) emit: bam = SAMTOOLS_SORT.out.bam // channel: [ val(meta), [ bam ] ] - bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] - csi = SAMTOOLS_INDEX.out.csi // channel: [ val(meta), [ csi ] ] + index = SAMTOOLS_INDEX.out.index // channel: [ val(meta), [ bai/csi ] ] flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), [ flagstat ] ] - versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bed_consensus_quantify_qc_bedtools_featurecounts_deseq2.nf b/subworkflows/local/bed_consensus_quantify_qc_bedtools_featurecounts_deseq2.nf index 0285a18a..edbf150c 100644 --- a/subworkflows/local/bed_consensus_quantify_qc_bedtools_featurecounts_deseq2.nf +++ b/subworkflows/local/bed_consensus_quantify_qc_bedtools_featurecounts_deseq2.nf @@ -5,7 +5,7 @@ include { HOMER_ANNOTATEPEAKS } from '../../modules/nf-core/homer/annotatepeaks/main' include { SUBREAD_FEATURECOUNTS } from '../../modules/nf-core/subread/featurecounts/main' -include { MACS2_CONSENSUS } from '../../modules/local/macs2_consensus' +include { MACS3_CONSENSUS } from '../../modules/local/macs3_consensus' include { DESEQ2_QC } from '../../modules/local/deseq2_qc' workflow BED_CONSENSUS_QUANTIFY_QC_BEDTOOLS_FEATURECOUNTS_DESEQ2 { @@ -19,17 +19,16 @@ workflow BED_CONSENSUS_QUANTIFY_QC_BEDTOOLS_FEATURECOUNTS_DESEQ2 { is_narrow_peak // boolean: true/false skip_peak_annotation // boolean: true/false skip_deseq2_qc // boolean: true/false - + main: - ch_versions = Channel.empty() // Create channels: [ meta , [ peaks ] ] // where meta = [ id : consensus_peaks ] ch_peaks - .collect { it[1] } - .filter { it.size() > 1 } - .map { + .collect { item -> item[1] } + .filter { item -> item.size() > 1 } + .map { peaks -> [ [ id: 'consensus_peaks' ], peaks ] } @@ -38,38 +37,40 @@ workflow BED_CONSENSUS_QUANTIFY_QC_BEDTOOLS_FEATURECOUNTS_DESEQ2 { // // Generate consensus peaks across samples // - MACS2_CONSENSUS ( + MACS3_CONSENSUS ( ch_consensus_peaks, is_narrow_peak ) - ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) // // Annotate consensus peaks // - ch_homer_annotatepeaks = Channel.empty() + ch_homer_annotatepeaks = channel.empty() if (!skip_peak_annotation) { HOMER_ANNOTATEPEAKS ( - MACS2_CONSENSUS.out.bed, + MACS3_CONSENSUS.out.bed, ch_fasta, ch_gtf ) ch_homer_annotatepeaks = HOMER_ANNOTATEPEAKS.out.txt - ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS.out.versions) } // Create channels: [ meta, [ bams ], saf ] + // The bam list comes from an unordered channel collect, so its order (and + // therefore the featureCounts column order and output file) is otherwise + // non-deterministic across runs/hosts. Sort by filename so the consensus + // count matrix is reproducible and its snapshot is stable. ch_bams .join(ch_peaks) - .collect { it[1] } - .filter { it.size() > 1 } - .map { [ it ] } - .concat(MACS2_CONSENSUS.out.saf) + .collect { item -> item[1] } + .filter { item -> item.size() > 1 } + .map { item -> [ item ] } + .concat(MACS3_CONSENSUS.out.saf) .collect() - .filter { it.size() == 3 } + .filter { item -> item.size() == 3 } .map { - bam, meta, saf -> - [ meta, bam , saf ] + bam, meta, saf -> + [ meta, bam.toSorted { b -> b.name }, saf ] } .set { ch_bam_saf } @@ -79,20 +80,19 @@ workflow BED_CONSENSUS_QUANTIFY_QC_BEDTOOLS_FEATURECOUNTS_DESEQ2 { SUBREAD_FEATURECOUNTS ( ch_bam_saf ) - ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions) // // Generate QC plots with DESeq2 // - ch_deseq2_qc_pdf = Channel.empty() - ch_deseq2_qc_rdata = Channel.empty() - ch_deseq2_qc_rds = Channel.empty() - ch_deseq2_qc_pca_txt = Channel.empty() - ch_deseq2_qc_pca_multiqc = Channel.empty() - ch_deseq2_qc_dists_txt = Channel.empty() - ch_deseq2_qc_dists_multiqc = Channel.empty() - ch_deseq2_qc_log = Channel.empty() - ch_deseq2_qc_size_factors = Channel.empty() + ch_deseq2_qc_pdf = channel.empty() + ch_deseq2_qc_rdata = channel.empty() + ch_deseq2_qc_rds = channel.empty() + ch_deseq2_qc_pca_txt = channel.empty() + ch_deseq2_qc_pca_multiqc = channel.empty() + ch_deseq2_qc_dists_txt = channel.empty() + ch_deseq2_qc_dists_multiqc = channel.empty() + ch_deseq2_qc_log = channel.empty() + ch_deseq2_qc_size_factors = channel.empty() if (!skip_deseq2_qc) { DESEQ2_QC ( SUBREAD_FEATURECOUNTS.out.counts, @@ -108,15 +108,14 @@ workflow BED_CONSENSUS_QUANTIFY_QC_BEDTOOLS_FEATURECOUNTS_DESEQ2 { ch_deseq2_qc_dists_multiqc = DESEQ2_QC.out.dists_multiqc ch_deseq2_qc_log = DESEQ2_QC.out.log ch_deseq2_qc_size_factors = DESEQ2_QC.out.size_factors - ch_versions = ch_versions.mix(DESEQ2_QC.out.versions) } emit: - consensus_bed = MACS2_CONSENSUS.out.bed // channel: [ bed ] - consensus_saf = MACS2_CONSENSUS.out.saf // channel: [ saf ] - consensus_pdf = MACS2_CONSENSUS.out.pdf // channel: [ pdf ] - consensus_boolean_txt = MACS2_CONSENSUS.out.boolean_txt // channel: [ txt ] - consensus_intersect_txt = MACS2_CONSENSUS.out.intersect_txt // channel: [ txt ] + consensus_bed = MACS3_CONSENSUS.out.bed // channel: [ bed ] + consensus_saf = MACS3_CONSENSUS.out.saf // channel: [ saf ] + consensus_pdf = MACS3_CONSENSUS.out.pdf // channel: [ pdf ] + consensus_boolean_txt = MACS3_CONSENSUS.out.boolean_txt // channel: [ txt ] + consensus_intersect_txt = MACS3_CONSENSUS.out.intersect_txt // channel: [ txt ] homer_annotatepeaks = ch_homer_annotatepeaks // channel: [ txt ] @@ -133,5 +132,4 @@ workflow BED_CONSENSUS_QUANTIFY_QC_BEDTOOLS_FEATURECOUNTS_DESEQ2 { deseq2_qc_log = ch_deseq2_qc_log // channel: [ txt ] deseq2_qc_size_factors = ch_deseq2_qc_size_factors // channel: [ txt ] - versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bigwig_plot_deeptools.nf b/subworkflows/local/bigwig_plot_deeptools.nf index 45c2c0c2..9e6aea50 100644 --- a/subworkflows/local/bigwig_plot_deeptools.nf +++ b/subworkflows/local/bigwig_plot_deeptools.nf @@ -13,10 +13,9 @@ workflow BIGWIG_PLOT_DEEPTOOLS { ch_bigwig // channel: [ val(meta), bigwig ] ch_gene_bed // channel: [ bed ] ch_tss_bed // channel: [ bed ] - + main: - ch_versions = Channel.empty() // // deepTools matrix generation for plotting over full transcript length @@ -25,7 +24,6 @@ workflow BIGWIG_PLOT_DEEPTOOLS { ch_bigwig, ch_gene_bed ) - ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX_SCALE_REGIONS.out.versions.first()) // // deepTools matrix generation for plotting at TSS point @@ -34,7 +32,6 @@ workflow BIGWIG_PLOT_DEEPTOOLS { ch_bigwig, ch_tss_bed ) - ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX_REFERENCE_POINT.out.versions.first()) // // deepTools profile plots @@ -42,7 +39,6 @@ workflow BIGWIG_PLOT_DEEPTOOLS { DEEPTOOLS_PLOTPROFILE ( DEEPTOOLS_COMPUTEMATRIX_SCALE_REGIONS.out.matrix ) - ch_versions = ch_versions.mix(DEEPTOOLS_PLOTPROFILE.out.versions.first()) // // deepTools heatmaps @@ -50,7 +46,6 @@ workflow BIGWIG_PLOT_DEEPTOOLS { DEEPTOOLS_PLOTHEATMAP ( DEEPTOOLS_COMPUTEMATRIX_REFERENCE_POINT.out.matrix ) - ch_versions = ch_versions.mix(DEEPTOOLS_PLOTHEATMAP.out.versions.first()) emit: scale_regions_matrix = DEEPTOOLS_COMPUTEMATRIX_SCALE_REGIONS.out.matrix // channel: [ val(meta), [ matrix ] ] @@ -65,5 +60,4 @@ workflow BIGWIG_PLOT_DEEPTOOLS { plotheatmap_pdf = DEEPTOOLS_PLOTHEATMAP.out.pdf // channel: [ val(meta), [ pdf ] ] plotheatmap_table = DEEPTOOLS_PLOTHEATMAP.out.table // channel: [ val(meta), [ table ] ] - versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index 0c00f5ba..01867df7 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -8,19 +8,16 @@ workflow INPUT_CHECK { take: samplesheet // file: /path/to/samplesheet.csv seq_center // string: sequencing center for read group - with_control // boolean: samplesheet contains controls + _with_control // boolean: samplesheet contains controls main: SAMPLESHEET_CHECK ( samplesheet ) - .csv - .splitCsv ( header:true, sep:',' ) - .map { create_fastq_channel(it, seq_center) } - .set { reads } emit: - reads // channel: [ val(meta), [ reads ] ] - versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] + SAMPLESHEET_CHECK.out.csv // channel: [ val(meta), [ reads ] ] + .splitCsv ( header:true, sep:',' ) + .map { item -> create_fastq_channel(item, seq_center) } } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] @@ -30,9 +27,9 @@ def create_fastq_channel(LinkedHashMap row, String seq_center) { meta.single_end = row.single_end.toBoolean() meta.control = row.control - def read_group = "\'@RG\\tID:${meta.id}\\tSM:${meta.id.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${meta.id}\\tPU:1\'" + def read_group = "\'@RG\\tID:${meta.id}\\tSM:${meta.id - ~/_T\d+$/}\\tPL:ILLUMINA\\tLB:${meta.id}\\tPU:1\'" if (seq_center) { - read_group = "\'@RG\\tID:${meta.id}\\tSM:${meta.id.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${meta.id}\\tPU:1\\tCN:${seq_center}\'" + read_group = "\'@RG\\tID:${meta.id}\\tSM:${meta.id - ~/_T\d+$/}\\tPL:ILLUMINA\\tLB:${meta.id}\\tPU:1\\tCN:${seq_center}\'" } meta.read_group = read_group diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index d6dbffcf..c4c3ccc4 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -17,7 +17,7 @@ include { UNTAR as UNTAR_STAR_INDEX } from '../../modules/nf-core/untar/main' include { GFFREAD } from '../../modules/nf-core/gffread/main' -include { CUSTOM_GETCHROMSIZES } from '../../modules/nf-core/custom/getchromsizes/main' +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' include { BWA_INDEX } from '../../modules/nf-core/bwa/index/main' include { BOWTIE2_BUILD } from '../../modules/nf-core/bowtie2/build/main' include { CHROMAP_INDEX } from '../../modules/nf-core/chromap/index/main' @@ -31,210 +31,202 @@ include { TSS_EXTRACT } from '../../modules/local/tss_extract' workflow PREPARE_GENOME { take: - prepare_tool_index // string : tool to prepare index for + genome // string: genome name + genomes // map: genome attributes + prepare_tool_index // string: tool to prepare index for + fasta // path: path to genome fasta file + gtf // file: /path/to/genome.gtf + gff // file: /path/to/genome.gff + blacklist // file: /path/to/blacklist.bed + gene_bed // file: /path/to/gene.bed + tss_bed // file: /path/to/tss.bed + mito_name // string: name of mitochondrial chromosome + keep_mito // boolean: keep mitochondrial chromosome + bwa_index // file: /path/to/bwa/index/ + bowtie2_index // file: /path/to/bowtie2/index/ + chromap_index // file: /path/to/chromap/index/ + star_index // file: /path/to/star/index/ + macs_gsize // integer: MACS3 genome size + read_length // integer: read length main: - ch_versions = Channel.empty() // // Uncompress genome fasta file if required // - ch_fasta = Channel.empty() - if (params.fasta.endsWith('.gz')) { - ch_fasta = GUNZIP_FASTA ( [ [:], params.fasta ] ).gunzip.map{ it[1] } - ch_versions = ch_versions.mix(GUNZIP_FASTA.out.versions) + ch_fasta = channel.empty() + if (fasta.endsWith('.gz')) { + ch_fasta = GUNZIP_FASTA ( [ [:], fasta ] ).gunzip.map { tuple -> tuple[1] }.first() } else { - ch_fasta = Channel.value(file(params.fasta)) + ch_fasta = channel.value(file(fasta, checkIfExists: true)) } // // Uncompress GTF annotation file or create from GFF3 if required // - if (params.gtf) { - if (params.gtf.endsWith('.gz')) { - ch_gtf = GUNZIP_GTF ( [ [:], params.gtf ] ).gunzip.map{ it[1] } - ch_versions = ch_versions.mix(GUNZIP_GTF.out.versions) + if (gtf) { + if (gtf.endsWith('.gz')) { + ch_gtf = GUNZIP_GTF ( [ [:], gtf ] ).gunzip.map { tuple -> tuple[1] } } else { - ch_gtf = Channel.value(file(params.gtf)) + ch_gtf = channel.value(file(gtf, checkIfExists: true)) } - } else if (params.gff) { - if (params.gff.endsWith('.gz')) { - ch_gff = GUNZIP_GFF ( [ [:], params.gff ] ).gunzip.map{ it[1] } - ch_versions = ch_versions.mix(GUNZIP_GFF.out.versions) + } else if (gff) { + if (gff.endsWith('.gz')) { + ch_gff = GUNZIP_GFF ( [ [:], gff ] ).gunzip.map { tuple -> tuple[1] } } else { - ch_gff = Channel.value(file(params.gff)) + ch_gff = channel.value(file(gff, checkIfExists: true)) } - ch_gtf = GFFREAD ( ch_gff ).gtf - ch_versions = ch_versions.mix(GFFREAD.out.versions) + ch_gtf = GFFREAD ( ch_gff.map { gff_file -> [ [:], gff_file ] }, [] ).gtf.map { _meta, gtf_file -> gtf_file } } // // Uncompress blacklist file if required // - ch_blacklist = Channel.empty() - if (params.blacklist) { - if (params.blacklist.endsWith('.gz')) { - ch_blacklist = GUNZIP_BLACKLIST ( [ [:], params.blacklist ] ).gunzip.map{ it[1] } - ch_versions = ch_versions.mix(GUNZIP_BLACKLIST.out.versions) + ch_blacklist = channel.empty() + if (blacklist) { + if (blacklist.endsWith('.gz')) { + ch_blacklist = GUNZIP_BLACKLIST ( [ [:], blacklist ] ).gunzip.map { tuple -> tuple[1] } } else { - ch_blacklist = Channel.value(file(params.blacklist)) + ch_blacklist = channel.value(file(blacklist, checkIfExists: true)) } } - // // Uncompress gene BED annotation file or create from GTF if required // - // If --gtf is supplied along with --genome // Make gene bed from supplied --gtf instead of using iGenomes one automatically def make_bed = false - if (!params.gene_bed) { + if (!gene_bed) { make_bed = true - } else if (params.genome && params.gtf) { - if (params.genomes[ params.genome ].gtf != params.gtf) { + } else if (genome && gtf) { + if (genomes[ genome ].gtf != gtf) { make_bed = true } } if (make_bed) { ch_gene_bed = GTF2BED ( ch_gtf ).bed - ch_versions = ch_versions.mix(GTF2BED.out.versions) } else { - if (params.gene_bed.endsWith('.gz')) { - ch_gene_bed = GUNZIP_GENE_BED ( [ [:], params.gene_bed ] ).gunzip.map{ it[1] } - ch_versions = ch_versions.mix(GUNZIP_GENE_BED.out.versions) + if (gene_bed.endsWith('.gz')) { + ch_gene_bed = GUNZIP_GENE_BED ( [ [:], params.gene_bed ] ).gunzip.map { tuple -> tuple[1] } } else { - ch_gene_bed = Channel.value(file(params.gene_bed)) + ch_gene_bed = channel.value(file(gene_bed, checkIfExists: true)) } } - if (!params.tss_bed) { + if (!tss_bed) { ch_tss_bed = TSS_EXTRACT ( ch_gene_bed ).tss - ch_versions = ch_versions.mix(TSS_EXTRACT.out.versions) } else { - if (params.tss_bed.endsWith('.gz')) { - ch_tss_bed = GUNZIP_TSS_BED ( [ [:], params.tss_bed ] ).gunzip.map{ it[1] } - ch_versions = ch_versions.mix(GUNZIP_TSS_BED.out.versions) + if (tss_bed.endsWith('.gz')) { + ch_tss_bed = GUNZIP_TSS_BED ( [ [:], tss_bed ] ).gunzip.map { tuple -> tuple[1] } } else { - ch_tss_bed = Channel.value(file(params.tss_bed)) + ch_tss_bed = channel.value(file(tss_bed, checkIfExists: true)) } } // // Create chromosome sizes file // - CUSTOM_GETCHROMSIZES ( ch_fasta.map { [ [:], it ] } ) - ch_chrom_sizes = CUSTOM_GETCHROMSIZES.out.sizes.map { it[1] } - ch_fai = CUSTOM_GETCHROMSIZES.out.fai.map{ it[1] } - ch_versions = ch_versions.mix(CUSTOM_GETCHROMSIZES.out.versions) + SAMTOOLS_FAIDX ( ch_fasta.map { item -> [ [:], item, [] ] }, true ) + ch_chrom_sizes = SAMTOOLS_FAIDX.out.sizes.map { tuple -> tuple[1] }.first() + ch_fai = SAMTOOLS_FAIDX.out.fai.map { tuple -> tuple[1] }.first() // // Create autosomal chromosome list for ataqv // - ch_genome_autosomes = Channel.empty() + ch_genome_autosomes = channel.empty() GET_AUTOSOMES ( ch_fai ) ch_genome_autosomes = GET_AUTOSOMES.out.txt - ch_versions = ch_versions.mix(GET_AUTOSOMES.out.versions) // // Prepare genome intervals for filtering by removing regions in blacklist file // - ch_genome_filtered_bed = Channel.empty() + ch_genome_filtered_bed = channel.empty() GENOME_BLACKLIST_REGIONS ( ch_chrom_sizes, ch_blacklist.ifEmpty([]), - params.mito_name ?: '', - params.keep_mito + mito_name ?: '', + keep_mito ) ch_genome_filtered_bed = GENOME_BLACKLIST_REGIONS.out.bed - ch_versions = ch_versions.mix(GENOME_BLACKLIST_REGIONS.out.versions) // // Uncompress BWA index or generate from scratch if required // - ch_bwa_index = Channel.empty() + ch_bwa_index = channel.empty() if (prepare_tool_index == 'bwa') { - if (params.bwa_index) { - if (params.bwa_index.endsWith('.tar.gz')) { - ch_bwa_index = UNTAR_BWA_INDEX ( [ [:], params.bwa_index ] ).untar - ch_versions = ch_versions.mix(UNTAR_BWA_INDEX.out.versions) + if (bwa_index) { + if (bwa_index.endsWith('.tar.gz')) { + ch_bwa_index = UNTAR_BWA_INDEX ( [ [:], bwa_index ] ).untar } else { - ch_bwa_index = [ [:], file(params.bwa_index) ] + ch_bwa_index = [ [:], file(params.bwa_index, checkIfExists: true)] } } else { - ch_bwa_index = BWA_INDEX ( ch_fasta.map { [ [:], it ] } ).index - ch_versions = ch_versions.mix(BWA_INDEX.out.versions) + ch_bwa_index = BWA_INDEX ( ch_fasta.map { item -> [ [:], item ] } ).index } } // // Uncompress Bowtie2 index or generate from scratch if required // - ch_bowtie2_index = Channel.empty() + ch_bowtie2_index = channel.empty() if (prepare_tool_index == 'bowtie2') { - if (params.bowtie2_index) { - if (params.bowtie2_index.endsWith('.tar.gz')) { - ch_bowtie2_index = UNTAR_BOWTIE2_INDEX ( [ [:], params.bowtie2_index ] ).untar - ch_versions = ch_versions.mix(UNTAR_BOWTIE2_INDEX.out.versions) + if (bowtie2_index) { + if (bowtie2_index.endsWith('.tar.gz')) { + ch_bowtie2_index = UNTAR_BOWTIE2_INDEX ( [ [:], bowtie2_index ] ).untar } else { - ch_bowtie2_index = [ [:], file(params.bowtie2_index) ] + ch_bowtie2_index = [ [:], file(bowtie2_index, checkIfExists: true) ] } } else { - ch_bowtie2_index = BOWTIE2_BUILD ( ch_fasta.map { [ [:], it ] } ).index - ch_versions = ch_versions.mix(BOWTIE2_BUILD.out.versions) + ch_bowtie2_index = BOWTIE2_BUILD ( ch_fasta.map { item -> [ [:], item ] } ).index } } // // Uncompress CHROMAP index or generate from scratch if required // - ch_chromap_index = Channel.empty() + ch_chromap_index = channel.empty() if (prepare_tool_index == 'chromap') { - if (params.chromap_index) { - if (params.chromap_index.endsWith('.tar.gz')) { - ch_chromap_index = UNTAR_CHROMAP_INDEX ( [ [:], params.chromap_index ] ).untar - ch_versions = ch_versions.mix(UNTAR.out.versions) + if (chromap_index) { + if (chromap_index.endsWith('.tar.gz')) { + ch_chromap_index = UNTAR_CHROMAP_INDEX ( [ [:], chromap_index ] ).untar } else { - ch_chromap_index = [ [:], file(params.chromap_index) ] + ch_chromap_index = [ [:], file(chromap_index, checkIfExists: true) ] } } else { - ch_chromap_index = CHROMAP_INDEX ( ch_fasta.map { [ [:], it ] } ).index - ch_versions = ch_versions.mix(CHROMAP_INDEX.out.versions) + ch_chromap_index = CHROMAP_INDEX ( ch_fasta.map { item -> [ [:], item ] } ).index } } // // Uncompress STAR index or generate from scratch if required // - ch_star_index = Channel.empty() + ch_star_index = channel.empty() if (prepare_tool_index == 'star') { - if (params.star_index) { - if (params.star_index.endsWith('.tar.gz')) { - ch_star_index = UNTAR_STAR_INDEX ( [ [:], params.star_index ] ).untar.map{ it[1] } - ch_versions = ch_versions.mix(UNTAR_STAR_INDEX.out.versions) + if (star_index) { + if (star_index.endsWith('.tar.gz')) { + ch_star_index = UNTAR_STAR_INDEX ( [ [:], star_index ] ).untar.map{ tuple -> tuple[1] } } else { - ch_star_index = Channel.value(file(params.star_index)) + ch_star_index = channel.value(file(star_index, checkIfExists: true)) } } else { ch_star_index = STAR_GENOMEGENERATE ( ch_fasta, ch_gtf ).index - ch_versions = ch_versions.mix(STAR_GENOMEGENERATE.out.versions) } } // - // Estimate MACS2 genome size + // Estimate MACS3 genome size // - ch_macs_gsize = params.macs_gsize - if (!params.macs_gsize) { + ch_macs_gsize = macs_gsize + if (!macs_gsize) { KHMER_UNIQUEKMERS ( - ch_fasta, - params.read_length + ch_fasta.map { item -> [ [:], item ] }, + read_length ) - ch_macs_gsize = KHMER_UNIQUEKMERS.out.kmers.map { it.text.trim() } - ch_versions = ch_versions.mix(KHMER_UNIQUEKMERS.out.versions) + ch_macs_gsize = KHMER_UNIQUEKMERS.out.kmers.map { _meta, kmers -> kmers.text.trim() } } emit: @@ -250,7 +242,5 @@ workflow PREPARE_GENOME { chromap_index = ch_chromap_index // path: genome.index star_index = ch_star_index // path: star/index/ autosomes = ch_genome_autosomes // path: *.autosomes.txt - macs_gsize = ch_macs_gsize // integer: MACS2 genome size - - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + macs_gsize = ch_macs_gsize // integer: MACS3 genome size } diff --git a/subworkflows/local/utils_nfcore_atacseq_pipeline/main.nf b/subworkflows/local/utils_nfcore_atacseq_pipeline/main.nf new file mode 100644 index 00000000..96e99eec --- /dev/null +++ b/subworkflows/local/utils_nfcore_atacseq_pipeline/main.nf @@ -0,0 +1,281 @@ +// +// Subworkflow with functionality specific to the nf-core/atacseq pipeline +// + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + IMPORT FUNCTIONS / MODULES / SUBWORKFLOWS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin' +include { paramsSummaryMap } from 'plugin/nf-schema' +include { samplesheetToList } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' +include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' +include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' +include { UTILS_NFCORE_PIPELINE } from '../../nf-core/utils_nfcore_pipeline' +include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipeline' + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + SUBWORKFLOW TO INITIALISE PIPELINE +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +workflow PIPELINE_INITIALISATION { + + take: + version // boolean: Display version and exit + validate_params // boolean: Boolean whether to validate parameters against the schema at runtime + monochrome_logs // boolean: Do not use coloured log outputs + nextflow_cli_args // array: List of positional nextflow CLI args + outdir // string: The output directory where the results will be saved + _input // string: Path to input samplesheet + help // boolean: Display help message and exit + help_full // boolean: Show the full help message + show_hidden // boolean: Show hidden parameters in the help message + + main: + + // + // Print version and exit if required and dump pipeline parameters to JSON file + // + UTILS_NEXTFLOW_PIPELINE ( + version, + true, + outdir, + workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1 + ) + + // + // Validate parameters and generate parameter summary to stdout + // + + def before_text = "" + def after_text = "" + before_text = """ +-\033[2m----------------------------------------------------\033[0m- + \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m +\033[0;34m ___ __ __ __ ___ \033[0;32m/,-._.--~\'\033[0m +\033[0;34m |\\ | |__ __ / ` / \\ |__) |__ \033[0;33m} {\033[0m +\033[0;34m | \\| | \\__, \\__/ | \\ |___ \033[0;32m\\`-._,-`-,\033[0m + \033[0;32m`._,._,\'\033[0m +\033[0;35m nf-core/atacseq ${workflow.manifest.version}\033[0m +-\033[2m----------------------------------------------------\033[0m- +""" + after_text = """${workflow.manifest.doi ? "\n* The pipeline\n" : ""}${workflow.manifest.doi.tokenize(",").collect { doi -> " https://doi.org/${doi.trim().replace('https://doi.org/','')}"}.join("\n")}${workflow.manifest.doi ? "\n" : ""} +* The nf-core framework + https://doi.org/10.1038/s41587-020-0439-x + +* Software dependencies + https://github.com/nf-core/atacseq/blob/master/CITATIONS.md +""" + if (monochrome_logs) { + before_text = before_text.replaceAll(/\033\[[0-9;]*m/, '') + } + + command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " + + UTILS_NFSCHEMA_PLUGIN ( + workflow, + validate_params, + null, + help, + help_full, + show_hidden, + before_text, + after_text, + command + ) + + // + // Check config provided to the pipeline + // + UTILS_NFCORE_PIPELINE ( + nextflow_cli_args + ) + + // + // Custom validation for pipeline parameters + // + + validateInputParameters() + +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + SUBWORKFLOW FOR PIPELINE COMPLETION +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +workflow PIPELINE_COMPLETION { + + take: + email // string: email address + email_on_fail // string: email address sent on pipeline failure + plaintext_email // boolean: Send plain-text email instead of HTML + outdir // path: Path to output directory where results will be published + monochrome_logs // boolean: Disable ANSI colour codes in log output + multiqc_report // string: Path to MultiQC report + + main: + summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") + def multiqc_reports = multiqc_report.toList() + + // + // Completion email and summary + // + workflow.onComplete { + if (email || email_on_fail) { + completionEmail( + summary_params, + email, + email_on_fail, + plaintext_email, + outdir, + monochrome_logs, + multiqc_reports.getVal(), + ) + } + + completionSummary(monochrome_logs) + + } + + workflow.onError { + log.error "Pipeline failed. Please refer to troubleshooting docs for common issues: https://nf-co.re/docs/running/troubleshooting" + } +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + FUNCTIONS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +// +// Check and validate pipeline parameters +// +def validateInputParameters() { + + genomeExistsError() + + if (!params.fasta) { + error("Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file.") + } + + if (!params.gtf && !params.gff) { + error("No GTF or GFF3 annotation specified! The pipeline requires at least one of these files.") + } + + if (params.gtf && params.gff) { + gtfGffWarn(log) + } + + if (!params.macs_gsize) { + macsGsizeWarn(log) + } + + if (!params.read_length && !params.macs_gsize) { + error ("Both '--read_length' and '--macs_gsize' not specified! Please specify either to infer MACS3 genome size for peak calling.") + } +} + +// +// Exit pipeline if incorrect --genome key provided +// +def genomeExistsError() { + if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { + def error_string = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + + " Currently, the available genome keys are:\n" + + " ${params.genomes.keySet().join(", ")}\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + error(error_string) + } +} +// +// Generate methods description for MultiQC +// +def toolCitationText() { + // TODO nf-core: Optionally add in-text citation tools to this list. + // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "Tool (Foo et al. 2023)" : "", + // Uncomment function in methodsDescriptionText to render in MultiQC report + def citation_text = [ + "Tools used in the workflow included:", + "FastQC (Andrews 2010),", + "MultiQC (Ewels et al. 2016)", + "." + ].join(' ').trim() + + return citation_text +} + +def toolBibliographyText() { + // TODO nf-core: Optionally add bibliographic entries to this list. + // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "
  • Author (2023) Pub name, Journal, DOI
  • " : "", + // Uncomment function in methodsDescriptionText to render in MultiQC report + def reference_text = [ + "
  • Andrews S, (2010) FastQC, URL: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/).
  • ", + "
  • Ewels, P., Magnusson, M., Lundin, S., & Käller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics , 32(19), 3047–3048. doi: /10.1093/bioinformatics/btw354
  • " + ].join(' ').trim() + + return reference_text +} + +def methodsDescriptionText(mqc_methods_yaml) { + // Convert to a named map so can be used as with familiar NXF ${workflow} variable syntax in the MultiQC YML file + def meta = [:] + meta.workflow = workflow.toMap() + meta["manifest_map"] = workflow.manifest.toMap() + + // Pipeline DOI + if (meta.manifest_map.doi) { + // Using a loop to handle multiple DOIs + // Removing `https://doi.org/` to handle pipelines using DOIs vs DOI resolvers + // Removing ` ` since the manifest.doi is a string and not a proper list + def temp_doi_ref = "" + def manifest_doi = meta.manifest_map.doi.tokenize(",") + manifest_doi.each { doi_ref -> + temp_doi_ref += "(doi: ${doi_ref.replace("https://doi.org/", "").replace(" ", "")}), " + } + meta["doi_text"] = temp_doi_ref.substring(0, temp_doi_ref.length() - 2) + } else meta["doi_text"] = "" + meta["nodoi_text"] = meta.manifest_map.doi ? "" : "
  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " + + // Tool references + meta["tool_citations"] = "" + meta["tool_bibliography"] = "" + + // TODO nf-core: Only uncomment below if logic in toolCitationText/toolBibliographyText has been filled! + // meta["tool_citations"] = toolCitationText().replaceAll(", \\.", ".").replaceAll("\\. \\.", ".").replaceAll(", \\.", ".") + // meta["tool_bibliography"] = toolBibliographyText() + def methods_text = mqc_methods_yaml.text + + def engine = new groovy.text.SimpleTemplateEngine() + def description_html = engine.createTemplate(methods_text).make(meta) + + return description_html.toString() +} + +// +// Print a warning if both GTF and GFF have been provided +// +def gtfGffWarn(log) { + log.warn "=============================================================================\n" + + " Both '--gtf' and '--gff' parameters have been provided.\n" + + " Using GTF file as priority.\n" + + "===================================================================================" +} + +// +// Print a warning if macs_gsize parameter has not been provided +// +def macsGsizeWarn(log) { + log.warn "=============================================================================\n" + + " --macs_gsize parameter has not been provided.\n" + + " It will be auto-calculated by 'khmer unique-kmers.py' using the '--read_length' parameter.\n" + + " Explicitly provide '--macs_gsize macs3_genome_size' to change this behaviour.\n" + + "===================================================================================" +} diff --git a/subworkflows/nf-core/bam_markduplicates_picard/main.nf b/subworkflows/nf-core/bam_markduplicates_picard/main.nf index 3725ea95..03d7e575 100644 --- a/subworkflows/nf-core/bam_markduplicates_picard/main.nf +++ b/subworkflows/nf-core/bam_markduplicates_picard/main.nf @@ -7,46 +7,34 @@ include { SAMTOOLS_INDEX } from '../../../modules/nf-core/samtools/index/ include { BAM_STATS_SAMTOOLS } from '../bam_stats_samtools/main' workflow BAM_MARKDUPLICATES_PICARD { - take: - ch_bam // channel: [ val(meta), path(bam) ] - ch_fasta // channel: [ path(fasta) ] - ch_fai // channel: [ path(fai) ] + ch_reads // channel: [ val(meta), path(reads) ] + ch_fasta_fai // channel: [ val(meta), path(fasta), path(fai)] main: + PICARD_MARKDUPLICATES(ch_reads, ch_fasta_fai) - ch_versions = Channel.empty() + ch_markdup = PICARD_MARKDUPLICATES.out.bam.mix(PICARD_MARKDUPLICATES.out.cram) - PICARD_MARKDUPLICATES ( ch_bam, ch_fasta.map { [ [:], it ] }, ch_fai.map { [ [:], it ] } ) - ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES.out.versions.first()) + SAMTOOLS_INDEX(ch_markdup) - SAMTOOLS_INDEX ( PICARD_MARKDUPLICATES.out.bam ) - ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions.first()) + ch_reads_index = ch_markdup.join(SAMTOOLS_INDEX.out.index, by: [0]) - ch_bam_bai = PICARD_MARKDUPLICATES.out.bam - .join(SAMTOOLS_INDEX.out.bai, by: [0], remainder: true) - .join(SAMTOOLS_INDEX.out.csi, by: [0], remainder: true) - .map { - meta, bam, bai, csi -> - if (bai) { - [ meta, bam, bai ] - } else { - [ meta, bam, csi ] - } - } + BAM_STATS_SAMTOOLS(ch_reads_index, ch_fasta_fai) - BAM_STATS_SAMTOOLS ( ch_bam_bai, ch_fasta ) - ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) + ch_per_sample_mqc_bundle = BAM_STATS_SAMTOOLS.out.stats + .join(BAM_STATS_SAMTOOLS.out.flagstat, remainder: true) + .join(BAM_STATS_SAMTOOLS.out.idxstats, remainder: true) + .join(PICARD_MARKDUPLICATES.out.metrics, remainder: true) + .map { row -> [row[0], row.drop(1).findAll { f -> f != null }.collectMany { e -> (e instanceof List) ? e : [e] }] } emit: - bam = PICARD_MARKDUPLICATES.out.bam // channel: [ val(meta), path(bam) ] - metrics = PICARD_MARKDUPLICATES.out.metrics // channel: [ val(meta), path(bam) ] - bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), path(bai) ] - csi = SAMTOOLS_INDEX.out.csi // channel: [ val(meta), path(csi) ] - - stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), path(stats) ] - flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), path(flagstat) ] - idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), path(idxstats) ] - - versions = ch_versions // channel: [ versions.yml ] + bam = PICARD_MARKDUPLICATES.out.bam // channel: [ val(meta), path(bam) ] + cram = PICARD_MARKDUPLICATES.out.cram // channel: [ val(meta), path(cram) ] + metrics = PICARD_MARKDUPLICATES.out.metrics // channel: [ val(meta), path(metrics) ] + index = SAMTOOLS_INDEX.out.index // channel: [ val(meta), path(index) ] + stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), path(stats) ] + flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), path(flagstat) ] + idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), path(idxstats) ] + per_sample_mqc_bundle = ch_per_sample_mqc_bundle // channel: [ val(meta), list(files) ] } diff --git a/subworkflows/nf-core/bam_markduplicates_picard/meta.yml b/subworkflows/nf-core/bam_markduplicates_picard/meta.yml index d5e71609..170071e0 100644 --- a/subworkflows/nf-core/bam_markduplicates_picard/meta.yml +++ b/subworkflows/nf-core/bam_markduplicates_picard/meta.yml @@ -6,36 +6,39 @@ keywords: - bam - sam - cram - -modules: +components: - picard/markduplicates - samtools/index - samtools/stats - samtools/idxstats - samtools/flagstat - + - bam_stats_samtools input: - - ch_bam: + - ch_reads: description: | - BAM/CRAM/SAM file - Structure: [ val(meta), path(bam) ] - - ch_fasta: - description: | - Reference genome fasta file - Structure: [ path(fasta) ] - - ch_fasta: + Sequence reads in BAM/CRAM/SAM format + Structure: [ val(meta), path(reads) ] + - ch_fasta_fai: description: | - Index of the reference genome fasta file - Structure: [ path(fai) ] + Reference genome fasta file required for CRAM input + Structure: [ path(fasta), path(fai) ] output: - bam: description: | - processed BAM/CRAM/SAM file + processed BAM/SAM file Structure: [ val(meta), path(bam) ] - bai: description: | - BAM/CRAM/SAM samtools index + BAM/SAM samtools index Structure: [ val(meta), path(bai) ] + - cram: + description: | + processed CRAM file + Structure: [ val(meta), path(cram) ] + - crai: + description: | + CRAM samtools index + Structure: [ val(meta), path(crai) ] - csi: description: | CSI samtools index @@ -52,6 +55,10 @@ output: description: | File containing samtools idxstats output Structure: [ val(meta), path(idxstats) ] + - per_sample_mqc_bundle: + description: | + Per-sample MultiQC-feeding outputs (stats, flagstat, idxstats, metrics) joined on meta. + Structure: [ val(meta), list(files) ] - versions: description: | Files containing software versions @@ -59,3 +66,6 @@ output: authors: - "@dmarron" - "@drpatelh" +maintainers: + - "@dmarron" + - "@drpatelh" diff --git a/subworkflows/nf-core/bam_markduplicates_picard/tests/main.nf.test b/subworkflows/nf-core/bam_markduplicates_picard/tests/main.nf.test new file mode 100644 index 00000000..72510d02 --- /dev/null +++ b/subworkflows/nf-core/bam_markduplicates_picard/tests/main.nf.test @@ -0,0 +1,149 @@ +nextflow_workflow { + + name "Test Workflow BAM_MARKDUPLICATES_PICARD" + script "../main.nf" + workflow "BAM_MARKDUPLICATES_PICARD" + config "./nextflow.config" + + tag "picard" + tag "picard/markduplicates" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "bam_markduplicates_picard" + tag "subworkflows/bam_markduplicates_picard" + tag "subworkflows/bam_stats_samtools" + tag "bam_stats_samtools" + tag "samtools" + tag "samtools/flagstat" + tag "samtools/idxstats" + tag "samtools/index" + tag "samtools/stats" + + test("sarscov2 - bam") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end: false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert path(workflow.out.metrics.get(0).get(1)).getText().contains("97") }, + { assert workflow.out.per_sample_mqc_bundle.size() == 1 }, + { assert workflow.out.per_sample_mqc_bundle[0][0] == [ id:'test', single_end: false ] }, + { assert workflow.out.per_sample_mqc_bundle[0][1].size() == 4 }, + { assert snapshot( + path(workflow.out.bam[0][1]), + path(workflow.out.index[0][1]), + path(workflow.out.flagstat[0][1]), + path(workflow.out.idxstats[0][1]), + path(workflow.out.stats[0][1]) + ).match() } + ) + } + } + + test("homo_sapiens - cram") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert path(workflow.out.metrics.get(0).get(1)).getText().contains("0.999986") }, + { assert workflow.out.per_sample_mqc_bundle.size() == 1 }, + { assert workflow.out.per_sample_mqc_bundle[0][0] == [ id:'test' ] }, + { assert workflow.out.per_sample_mqc_bundle[0][1].size() == 4 }, + { assert snapshot( + file(workflow.out.cram[0][1]).name, + path(workflow.out.index[0][1]), + path(workflow.out.flagstat[0][1]), + path(workflow.out.idxstats[0][1]), + path(workflow.out.stats[0][1]) + ).match() } + ) + } + } + + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end: false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("homo_sapiens - cram - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/bam_markduplicates_picard/tests/main.nf.test.snap b/subworkflows/nf-core/bam_markduplicates_picard/tests/main.nf.test.snap new file mode 100644 index 00000000..7e27bfe1 --- /dev/null +++ b/subworkflows/nf-core/bam_markduplicates_picard/tests/main.nf.test.snap @@ -0,0 +1,322 @@ +{ + "homo_sapiens - cram": { + "content": [ + "test.md.cram", + "test.md.cram.crai:md5,b641c19be42d4841ec7155c686b70f39", + "test.flagstat:md5,93b0ef463df947ede1f42ff60396c34d", + "test.idxstats:md5,e179601fa7b8ebce81ac3765206f6c15", + "test.stats:md5,1240277238efc787316933ff478cb091" + ], + "timestamp": "2026-07-10T08:17:32.087781", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.6" + } + }, + "sarscov2 - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159", + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.md.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.md.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "per_sample_mqc_bundle": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159", + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.md.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "timestamp": "2026-04-20T10:50:34.652754", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "homo_sapiens - cram - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "test.md.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.md.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test" + }, + "test.md.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test" + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test" + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "6": [ + [ + { + "id": "test" + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test" + }, + [ + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159", + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.md.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam": [ + + ], + "cram": [ + [ + { + "id": "test" + }, + "test.md.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "flagstat": [ + [ + { + "id": "test" + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "idxstats": [ + [ + { + "id": "test" + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + [ + { + "id": "test" + }, + "test.md.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "metrics": [ + [ + { + "id": "test" + }, + "test.md.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "per_sample_mqc_bundle": [ + [ + { + "id": "test" + }, + [ + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159", + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.md.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "stats": [ + [ + { + "id": "test" + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "timestamp": "2026-04-20T10:51:10.962305", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "sarscov2 - bam": { + "content": [ + "test.md.bam:md5,8aa8fc57298588fed0b03aacddd7ea77", + "test.md.bam.bai:md5,8973dd987f3ac6c352716ef89139c567", + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783", + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2", + "test.stats:md5,6d81d7a6f2a78b145b878dc1542a2e27" + ], + "timestamp": "2026-07-10T08:17:08.599854", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.6" + } + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/bam_markduplicates_picard/tests/nextflow.config b/subworkflows/nf-core/bam_markduplicates_picard/tests/nextflow.config new file mode 100644 index 00000000..2427cc4a --- /dev/null +++ b/subworkflows/nf-core/bam_markduplicates_picard/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'PICARD_MARKDUPLICATES' { + ext.prefix = { "${meta.id}.md" } + } +} diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/main.nf b/subworkflows/nf-core/bam_sort_stats_samtools/main.nf index fc1c652b..d0cd8c30 100644 --- a/subworkflows/nf-core/bam_sort_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_sort_stats_samtools/main.nf @@ -8,43 +8,24 @@ include { BAM_STATS_SAMTOOLS } from '../bam_stats_samtools/main' workflow BAM_SORT_STATS_SAMTOOLS { take: - ch_bam // channel: [ val(meta), [ bam ] ] - ch_fasta // channel: [ val(meta), path(fasta) ] + ch_bam // channel: [ val(meta), [ bam ] ] + ch_fasta_fai // channel: [ val(meta), path(fasta), path(fai) ] main: + SAMTOOLS_SORT(ch_bam, ch_fasta_fai, '') - ch_versions = Channel.empty() - - SAMTOOLS_SORT ( ch_bam ) - ch_versions = ch_versions.mix(SAMTOOLS_SORT.out.versions.first()) - - SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) - ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions.first()) + SAMTOOLS_INDEX(SAMTOOLS_SORT.out.bam) SAMTOOLS_SORT.out.bam - .join(SAMTOOLS_INDEX.out.bai, by: [0], remainder: true) - .join(SAMTOOLS_INDEX.out.csi, by: [0], remainder: true) - .map { - meta, bam, bai, csi -> - if (bai) { - [ meta, bam, bai ] - } else { - [ meta, bam, csi ] - } - } + .join(SAMTOOLS_INDEX.out.index, by: [0]) .set { ch_bam_bai } - BAM_STATS_SAMTOOLS ( ch_bam_bai, ch_fasta ) - ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) + BAM_STATS_SAMTOOLS(ch_bam_bai, ch_fasta_fai) emit: - bam = SAMTOOLS_SORT.out.bam // channel: [ val(meta), [ bam ] ] - bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] - csi = SAMTOOLS_INDEX.out.csi // channel: [ val(meta), [ csi ] ] - - stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + bam = SAMTOOLS_SORT.out.bam // channel: [ val(meta), [ bam ] ] + index = SAMTOOLS_INDEX.out.index // channel: [ val(meta), [ index ] ] + stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - - versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/meta.yml b/subworkflows/nf-core/bam_sort_stats_samtools/meta.yml index 8dfbd58d..e01f9ccf 100644 --- a/subworkflows/nf-core/bam_sort_stats_samtools/meta.yml +++ b/subworkflows/nf-core/bam_sort_stats_samtools/meta.yml @@ -6,12 +6,13 @@ keywords: - bam - sam - cram -modules: +components: - samtools/sort - samtools/index - samtools/stats - samtools/idxstats - samtools/flagstat + - bam_stats_samtools input: - meta: type: map @@ -64,3 +65,6 @@ output: authors: - "@drpatelh" - "@ewels" +maintainers: + - "@drpatelh" + - "@ewels" diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test b/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test new file mode 100644 index 00000000..2db95965 --- /dev/null +++ b/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test @@ -0,0 +1,136 @@ +nextflow_workflow { + + name "Test Workflow BAM_SORT_STATS_SAMTOOLS" + script "../main.nf" + workflow "BAM_SORT_STATS_SAMTOOLS" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/bam_sort_stats_samtools" + tag "bam_sort_stats_samtools" + tag "subworkflows/bam_stats_samtools" + tag "bam_stats_samtools" + tag "samtools" + tag "samtools/index" + tag "samtools/sort" + tag "samtools/stats" + tag "samtools/idxstats" + tag "samtools/flagstat" + + test("test_bam_sort_stats_samtools_single_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert workflow.out.bam.get(0).get(1) ==~ ".*.bam"}, + { assert workflow.out.index.get(0).get(1) ==~ ".*.bai"}, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats).match() } + ) + } + } + + test("test_bam_sort_stats_samtools_paired_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert workflow.out.bam.get(0).get(1) ==~ ".*.bam"}, + { assert workflow.out.index.get(0).get(1) ==~ ".*.bai"}, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats).match() } + ) + } + } + + test("test_bam_sort_stats_samtools_single_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("test_bam_sort_stats_samtools_paired_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap new file mode 100644 index 00000000..0fc936b2 --- /dev/null +++ b/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap @@ -0,0 +1,276 @@ +{ + "test_bam_sort_stats_samtools_single_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,2191911d72575a2358b08b1df64ccb53" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,613e048487662c694aa4a2f73ca96a20" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,5978c7433373bd9bec33fb2c53688ef2" + ] + ] + ], + "timestamp": "2026-07-10T13:50:51.540506656", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "test_bam_sort_stats_samtools_paired_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d3fd15dd1ac4596da14e9475babab12e" + ] + ] + ], + "timestamp": "2026-07-10T13:51:00.904735627", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "test_bam_sort_stats_samtools_single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "timestamp": "2026-03-12T15:01:02.797853", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + }, + "test_bam_sort_stats_samtools_paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "timestamp": "2026-03-12T15:01:13.722701", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/bam_stats_samtools/main.nf b/subworkflows/nf-core/bam_stats_samtools/main.nf index e80ce43a..14545ba2 100644 --- a/subworkflows/nf-core/bam_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_stats_samtools/main.nf @@ -9,24 +9,17 @@ include { SAMTOOLS_FLAGSTAT } from '../../../modules/nf-core/samtools/flagstat/m workflow BAM_STATS_SAMTOOLS { take: ch_bam_bai // channel: [ val(meta), path(bam), path(bai) ] - ch_fasta // channel: [ val(meta), path(fasta) ] + ch_fasta_fai // channel: [ val(meta), path(fasta) ] main: - ch_versions = Channel.empty() + SAMTOOLS_STATS(ch_bam_bai, ch_fasta_fai) - SAMTOOLS_STATS ( ch_bam_bai, ch_fasta.map { [ [:], it ] } ) - ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions) + SAMTOOLS_FLAGSTAT(ch_bam_bai) - SAMTOOLS_FLAGSTAT ( ch_bam_bai ) - ch_versions = ch_versions.mix(SAMTOOLS_FLAGSTAT.out.versions) - - SAMTOOLS_IDXSTATS ( ch_bam_bai ) - ch_versions = ch_versions.mix(SAMTOOLS_IDXSTATS.out.versions) + SAMTOOLS_IDXSTATS(ch_bam_bai) emit: - stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), path(stats) ] + stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), path(stats) ] flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), path(flagstat) ] idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), path(idxstats) ] - - versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/nf-core/bam_stats_samtools/meta.yml b/subworkflows/nf-core/bam_stats_samtools/meta.yml index b05086bc..809bf736 100644 --- a/subworkflows/nf-core/bam_stats_samtools/meta.yml +++ b/subworkflows/nf-core/bam_stats_samtools/meta.yml @@ -7,7 +7,7 @@ keywords: - bam - sam - cram -modules: +components: - samtools/stats - samtools/idxstats - samtools/flagstat @@ -39,3 +39,5 @@ output: Structure: [ path(versions.yml) ] authors: - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test new file mode 100644 index 00000000..8ec544b9 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test @@ -0,0 +1,191 @@ +nextflow_workflow { + + name "Test Workflow BAM_STATS_SAMTOOLS" + script "../main.nf" + workflow "BAM_STATS_SAMTOOLS" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "bam_stats_samtools" + tag "subworkflows/bam_stats_samtools" + tag "samtools" + tag "samtools/flagstat" + tag "samtools/idxstats" + tag "samtools/stats" + + test("test_bam_stats_samtools_single_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end_cram") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats).match() } + ) + } + } + + test ("test_bam_stats_samtools_single_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end_cram - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap new file mode 100644 index 00000000..994ce9df --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap @@ -0,0 +1,305 @@ +{ + "test_bam_stats_samtools_paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "timestamp": "2026-02-03T11:10:30.076183827", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + } + }, + "test_bam_stats_samtools_single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "timestamp": "2026-02-03T11:10:24.379362883", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + } + }, + "test_bam_stats_samtools_paired_end_cram - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "timestamp": "2026-02-03T11:10:35.91658956", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + } + }, + "test_bam_stats_samtools_single_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,2191911d72575a2358b08b1df64ccb53" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,613e048487662c694aa4a2f73ca96a20" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,6583f1f142c27974ffc924b7fa734767" + ] + ] + ], + "timestamp": "2026-07-10T08:13:24.390328", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.6" + } + }, + "test_bam_stats_samtools_paired_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,c4ca9c9d1415005c80481e6fe4c95f90" + ] + ] + ], + "timestamp": "2026-07-10T08:13:29.123968", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.6" + } + }, + "test_bam_stats_samtools_paired_end_cram": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,a53f3d26e2e9851f7d528442bbfe9781" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,e179601fa7b8ebce81ac3765206f6c15" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,a2a40d6e88c35aa33d4433355f47f217" + ] + ] + ], + "timestamp": "2026-07-10T08:13:33.60771", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.6" + } + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_align_bowtie2/main.nf b/subworkflows/nf-core/fastq_align_bowtie2/main.nf index e77cb2c4..8c1a19f5 100644 --- a/subworkflows/nf-core/fastq_align_bowtie2/main.nf +++ b/subworkflows/nf-core/fastq_align_bowtie2/main.nf @@ -7,39 +7,35 @@ include { BAM_SORT_STATS_SAMTOOLS } from '../bam_sort_stats_samtools/main' workflow FASTQ_ALIGN_BOWTIE2 { take: - ch_reads // channel: [ val(meta), [ reads ] ] - ch_index // channel: /path/to/bowtie2/index/ - save_unaligned // val - sort_bam // val - ch_fasta // channel: /path/to/reference.fasta + ch_reads // channel: [ val(meta), [ reads ] ] + ch_index // channel: /path/to/bowtie2/index/ + save_unaligned // val + sort_bam // val + ch_fasta_fai // channel: [ val(meta), path(fasta), path(fai) ] main: - ch_versions = Channel.empty() + // + // Remap ch_fasta_fai to ch_fasta + ch_fasta = ch_fasta_fai.map{ meta, fasta, _fai -> [ meta, fasta] } // // Map reads with Bowtie2 // - BOWTIE2_ALIGN ( ch_reads, ch_index, save_unaligned, sort_bam ) - ch_versions = ch_versions.mix(BOWTIE2_ALIGN.out.versions.first()) + BOWTIE2_ALIGN(ch_reads, ch_index, ch_fasta, save_unaligned, sort_bam) // // Sort, index BAM file and run samtools stats, flagstat and idxstats // - BAM_SORT_STATS_SAMTOOLS ( BOWTIE2_ALIGN.out.aligned, ch_fasta ) - ch_versions = ch_versions.mix(BAM_SORT_STATS_SAMTOOLS.out.versions) + BAM_SORT_STATS_SAMTOOLS(BOWTIE2_ALIGN.out.bam, ch_fasta_fai) emit: - bam_orig = BOWTIE2_ALIGN.out.aligned // channel: [ val(meta), bam ] - log_out = BOWTIE2_ALIGN.out.log // channel: [ val(meta), log ] - fastq = BOWTIE2_ALIGN.out.fastq // channel: [ val(meta), fastq ] - - bam = BAM_SORT_STATS_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] - bai = BAM_SORT_STATS_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] - csi = BAM_SORT_STATS_SAMTOOLS.out.csi // channel: [ val(meta), [ csi ] ] - stats = BAM_SORT_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_SORT_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_SORT_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - - versions = ch_versions // channel: [ versions.yml ] + bam_orig = BOWTIE2_ALIGN.out.bam // channel: [ val(meta), aligned ] + log_out = BOWTIE2_ALIGN.out.log // channel: [ val(meta), log ] + fastq = BOWTIE2_ALIGN.out.fastq // channel: [ val(meta), fastq ] + bam = BAM_SORT_STATS_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] + index = BAM_SORT_STATS_SAMTOOLS.out.index // channel: [ val(meta), [ index ] ] + stats = BAM_SORT_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_SORT_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_SORT_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] } diff --git a/subworkflows/nf-core/fastq_align_bowtie2/meta.yml b/subworkflows/nf-core/fastq_align_bowtie2/meta.yml index 4900670f..096df347 100644 --- a/subworkflows/nf-core/fastq_align_bowtie2/meta.yml +++ b/subworkflows/nf-core/fastq_align_bowtie2/meta.yml @@ -6,13 +6,14 @@ keywords: - fasta - genome - reference -modules: +components: - bowtie2/align - samtools/sort - samtools/index - samtools/stats - samtools/idxstats - samtools/flagstat + - bam_sort_stats_samtools input: - meta: type: map @@ -36,22 +37,18 @@ input: - sort_bam: type: boolean description: | - Save reads that do not map to the reference (true) or discard them (false) + Use samtools sort (true) or samtools view (false) default: false - - ch_fasta: + - ch_fasta_fai: type: file - description: Reference fasta file - pattern: "*.{fasta,fa}" + description: Reference fasta file and index + pattern: "*.{fasta,fa},*.{fai,fai}" # TODO Update when we decide on a standard for subworkflow docs output: - bam: type: file description: Output BAM file containing read alignments pattern: "*.{bam}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - fastq: type: file description: Unaligned FastQ files @@ -60,6 +57,7 @@ output: type: file description: Alignment log pattern: "*.log" -# TODO Add samtools outputs authors: - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/subworkflows/nf-core/fastq_align_bowtie2/tests/main.nf.test b/subworkflows/nf-core/fastq_align_bowtie2/tests/main.nf.test new file mode 100644 index 00000000..975a2399 --- /dev/null +++ b/subworkflows/nf-core/fastq_align_bowtie2/tests/main.nf.test @@ -0,0 +1,217 @@ +nextflow_workflow { + + name "Test Subworkflow FASTQ_ALIGN_BOWTIE2" + script "../main.nf" + config "./nextflow.config" + workflow "FASTQ_ALIGN_BOWTIE2" + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/fastq_align_bowtie2" + tag "subworkflows/bam_sort_stats_samtools" + tag "bowtie2" + tag "bowtie2/build" + tag "bowtie2/align" + + test("test_align_bowtie2_single_end") { + setup { + run("BOWTIE2_BUILD") { + script "../../../../modules/nf-core/bowtie2/build/main.nf" + process { + """ + input[0] = Channel.value([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + } + when { + workflow { + """ + input[0] = Channel.of([[ id:'test', single_end:true ], [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ]]) + input[1] = BOWTIE2_BUILD.out.index + input[2] = false + input[3] = false + input[4] = Channel.value([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + file(workflow.out.bam_orig[0][1]).name, + workflow.out.fastq, + workflow.out.log_out, + file(workflow.out.bam[0][1]).name, + file(workflow.out.index[0][1]).name, + workflow.out.stats, + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.versions + ).match()} + ) + } + } + + test("test_align_bowtie2_paired_end") { + setup { + run("BOWTIE2_BUILD") { + script "../../../../modules/nf-core/bowtie2/build/main.nf" + process { + """ + input[0] = Channel.value([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + } + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ]]) + input[1] = BOWTIE2_BUILD.out.index + input[2] = false + input[3] = false + input[4] = Channel.value([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + file(workflow.out.bam_orig[0][1]).name, + workflow.out.fastq, + workflow.out.log_out, + file(workflow.out.bam[0][1]).name, + file(workflow.out.index[0][1]).name, + workflow.out.stats, + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.versions + ).match()} + ) + } + } + + test("test_align_bowtie2_single_end - stub") { + + options "-stub" + + setup { + run("BOWTIE2_BUILD") { + script "../../../../modules/nf-core/bowtie2/build/main.nf" + process { + """ + input[0] = Channel.value([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + } + when { + workflow { + """ + input[0] = Channel.of([[ id:'test', single_end:true ], [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ]]) + input[1] = BOWTIE2_BUILD.out.index + input[2] = false + input[3] = false + input[4] = Channel.value([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + file(workflow.out.bam_orig[0][1]).name, + workflow.out.fastq, + workflow.out.log_out, + file(workflow.out.bam[0][1]).name, + file(workflow.out.index[0][1]).name, + workflow.out.stats, + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.versions + ).match()} + ) + } + } + + test("test_align_bowtie2_paired_end - stub") { + + options "-stub" + + setup { + run("BOWTIE2_BUILD") { + script "../../../../modules/nf-core/bowtie2/build/main.nf" + process { + """ + input[0] = Channel.value([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + } + when { + workflow { + """ + input[0] = Channel.of([[ id:'test', single_end:false ], [file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true)]]) + input[1] = BOWTIE2_BUILD.out.index + input[2] = false + input[3] = false + input[4] = Channel.value([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + file(workflow.out.bam_orig[0][1]).name, + workflow.out.fastq, + workflow.out.log_out, + file(workflow.out.bam[0][1]).name, + file(workflow.out.index[0][1]).name, + workflow.out.stats, + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.versions + ).match()} + ) + } + } +} diff --git a/subworkflows/nf-core/fastq_align_bowtie2/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_align_bowtie2/tests/main.nf.test.snap new file mode 100644 index 00000000..d5d94b71 --- /dev/null +++ b/subworkflows/nf-core/fastq_align_bowtie2/tests/main.nf.test.snap @@ -0,0 +1,210 @@ +{ + "test_align_bowtie2_single_end - stub": { + "content": [ + "test.bam", + [ + + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.bowtie2.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "test.sorted.bam", + "test.sorted.bam.bai", + [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + null + ], + "timestamp": "2026-03-12T15:08:47.079633947", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "test_align_bowtie2_single_end": { + "content": [ + "test.bam", + [ + + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.bowtie2.log:md5,7b8a9e61b7646da1089b041333c41a87" + ] + ], + "test.sorted.bam", + "test.sorted.bam.bai", + [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.stats:md5,de68b1a4ae60b97305ae3423e11813ad" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.flagstat:md5,e9ce9093133116bc54fd335cfe698372" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.idxstats:md5,e16eb632f7f462514b0873c7ac8ac905" + ] + ], + null + ], + "timestamp": "2026-04-12T00:04:56.432243", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "test_align_bowtie2_paired_end": { + "content": [ + "test.bam", + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.bowtie2.log:md5,bd89ce1b28c93bf822bae391ffcedd19" + ] + ], + "test.sorted.bam", + "test.sorted.bam.bai", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.stats:md5,4cb22b98cb1bbecb025088f7f5e13e11" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.flagstat:md5,49f3d51a8804ce58fe9cecd2549d279b" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.idxstats:md5,29ff2fa56d35b2a47625b8f517f1a947" + ] + ], + null + ], + "timestamp": "2026-04-12T00:05:09.593942", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "test_align_bowtie2_paired_end - stub": { + "content": [ + "test.bam", + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.bowtie2.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "test.sorted.bam", + "test.sorted.bam.bai", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + null + ], + "timestamp": "2026-03-12T15:08:58.246336497", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_align_bowtie2/tests/nextflow.config b/subworkflows/nf-core/fastq_align_bowtie2/tests/nextflow.config new file mode 100644 index 00000000..9086ebfa --- /dev/null +++ b/subworkflows/nf-core/fastq_align_bowtie2/tests/nextflow.config @@ -0,0 +1,8 @@ +process { + withName: '.*:BAM_SORT_STATS_SAMTOOLS:SAMTOOLS_.*' { + ext.prefix = { "${meta.id}.sorted" } + } + withName: '.*:BAM_SORT_STATS_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}.sorted" } + } +} diff --git a/subworkflows/nf-core/fastq_align_bwa/main.nf b/subworkflows/nf-core/fastq_align_bwa/main.nf index 4ce4f886..eb72bade 100644 --- a/subworkflows/nf-core/fastq_align_bwa/main.nf +++ b/subworkflows/nf-core/fastq_align_bwa/main.nf @@ -7,37 +7,30 @@ include { BAM_SORT_STATS_SAMTOOLS } from '../bam_sort_stats_samtools/main' workflow FASTQ_ALIGN_BWA { take: - ch_reads // channel (mandatory): [ val(meta), [ path(reads) ] ] - ch_index // channel (mandatory): [ val(meta2), path(index) ] - val_sort_bam // boolean (mandatory): true or false - ch_fasta // channel (optional) : [ path(fasta) ] + ch_reads // channel (mandatory): [ val(meta), [ path(reads) ] ] + ch_index // channel (mandatory): [ val(meta2), path(index) ] + val_sort_bam // boolean (mandatory): true or false + ch_fasta_fai // channel (optional) : [ val(meta3), path(fasta), path(fai) ] main: - ch_versions = Channel.empty() // // Map reads with BWA // - - BWA_MEM ( ch_reads, ch_index, val_sort_bam ) - ch_versions = ch_versions.mix(BWA_MEM.out.versions.first()) + ch_fasta = ch_fasta_fai.map { meta, fasta, _fai -> [meta, fasta] } + BWA_MEM(ch_reads, ch_index, ch_fasta, val_sort_bam) // // Sort, index BAM file and run samtools stats, flagstat and idxstats // - BAM_SORT_STATS_SAMTOOLS ( BWA_MEM.out.bam, ch_fasta ) - ch_versions = ch_versions.mix(BAM_SORT_STATS_SAMTOOLS.out.versions) + BAM_SORT_STATS_SAMTOOLS(BWA_MEM.out.bam, ch_fasta_fai) emit: - bam_orig = BWA_MEM.out.bam // channel: [ val(meta), path(bam) ] - - bam = BAM_SORT_STATS_SAMTOOLS.out.bam // channel: [ val(meta), path(bam) ] - bai = BAM_SORT_STATS_SAMTOOLS.out.bai // channel: [ val(meta), path(bai) ] - csi = BAM_SORT_STATS_SAMTOOLS.out.csi // channel: [ val(meta), path(csi) ] - stats = BAM_SORT_STATS_SAMTOOLS.out.stats // channel: [ val(meta), path(stats) ] + bam_orig = BWA_MEM.out.bam // channel: [ val(meta), path(bam) ] + bam = BAM_SORT_STATS_SAMTOOLS.out.bam // channel: [ val(meta), path(bam) ] + index = BAM_SORT_STATS_SAMTOOLS.out.index // channel: [ val(meta), path(index) ] + stats = BAM_SORT_STATS_SAMTOOLS.out.stats // channel: [ val(meta), path(stats) ] flagstat = BAM_SORT_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), path(flagstat) ] idxstats = BAM_SORT_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), path(idxstats) ] - - versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/nf-core/fastq_align_bwa/meta.yml b/subworkflows/nf-core/fastq_align_bwa/meta.yml index 548fec3f..12569fa3 100644 --- a/subworkflows/nf-core/fastq_align_bwa/meta.yml +++ b/subworkflows/nf-core/fastq_align_bwa/meta.yml @@ -6,13 +6,15 @@ keywords: - fasta - genome - reference -modules: +components: + - bwa/mem - bwa/align - samtools/sort - samtools/index - samtools/stats - samtools/idxstats - samtools/flagstat + - bam_sort_stats_samtools input: - ch_reads: description: | @@ -22,17 +24,16 @@ input: - ch_index: description: | BWA genome index files - Structure: [ val(meta2), path(index) ] + Structure: [ val(meta), path(index) ] - val_sort_bam: type: boolean description: If true bwa modules sort resulting bam files pattern: "true|false" - - ch_fasta: + - ch_fasta_fai: type: file description: | - Optional reference fasta file. This only needs to be given if val_sort_bam = true - Structure: [ path(fasta) ] - + Optional reference fasta file and index. This only needs to be given if val_sort_bam = true. + Structure: [ val(meta), path(fasta), path(fai) ] output: - bam_orig: description: | @@ -62,9 +63,7 @@ output: description: | File containing samtools idxstats output Structure: [ val(meta), path(idxstats) ] - - versions: - description: | - Files containing software versions - Structure: [ path(versions.yml) ] authors: - "@JoseEspinosa" +maintainers: + - "@JoseEspinosa" diff --git a/subworkflows/nf-core/fastq_align_bwa/tests/main.nf.test b/subworkflows/nf-core/fastq_align_bwa/tests/main.nf.test new file mode 100644 index 00000000..491c8fdd --- /dev/null +++ b/subworkflows/nf-core/fastq_align_bwa/tests/main.nf.test @@ -0,0 +1,77 @@ +nextflow_workflow { + + name "Test Subworkflow FASTQ_ALIGN_BWA" + script "../main.nf" + config "./nextflow.config" + workflow "FASTQ_ALIGN_BWA" + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/fastq_align_bwa" + tag "subworkflows/bam_sort_stats_samtools" + tag "bwa" + tag "bwa/mem" + tag "bwa/index" + + + test("fastq_align_bwa_single_end") { + setup { + run("BWA_INDEX") { + script "../../../../modules/nf-core/bwa/index/main.nf" + process { + """ + input[0] = Channel.value([ [ id:'genome' ],file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + """ + } + } + } + when { + workflow { + """ + input[0] = Channel.of([[ id:'test', single_end:true ],[ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ]]) + input[1] = BWA_INDEX.out.index + input[2] = false + input[3] = Channel.value([[id: 'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match()} + ) + } + } + + test("fastq_align_bwa_paired_end") { + setup { + run("BWA_INDEX") { + script "../../../../modules/nf-core/bwa/index/main.nf" + process { + """ + input[0] = Channel.value([ [ id:'genome' ],file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + """ + } + } + } + when { + workflow { + """ + input[0] = Channel.of([[ id:'test', single_end:false ], [file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true)] + ] ) + input[1] = BWA_INDEX.out.index + input[2] = false + input[3] = Channel.value([[id: 'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match()} + ) + } + } +} diff --git a/subworkflows/nf-core/fastq_align_bwa/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_align_bwa/tests/main.nf.test.snap new file mode 100644 index 00000000..445876c2 --- /dev/null +++ b/subworkflows/nf-core/fastq_align_bwa/tests/main.nf.test.snap @@ -0,0 +1,240 @@ +{ + "fastq_align_bwa_paired_end": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,5dbdcfdba65fac634dcbb6984cffe2c4" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,8ad8cbe24a043b395cbb49ad3f88cc18" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.bai:md5,4e57a761d8cee868242b4874b95b4691" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.stats:md5,21b91a04b74c3498ebb73d185a2bfc95" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.flagstat:md5,18d602435a02a4d721b78d1812622159" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.idxstats:md5,85d20a901eef23ca50c323638a2eb602" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,8ad8cbe24a043b395cbb49ad3f88cc18" + ] + ], + "bam_orig": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,5dbdcfdba65fac634dcbb6984cffe2c4" + ] + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.flagstat:md5,18d602435a02a4d721b78d1812622159" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.idxstats:md5,85d20a901eef23ca50c323638a2eb602" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.bai:md5,4e57a761d8cee868242b4874b95b4691" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.stats:md5,21b91a04b74c3498ebb73d185a2bfc95" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.1" + }, + "timestamp": "2026-04-29T11:14:26.020303576" + }, + "fastq_align_bwa_single_end": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,f7af092ddd5203f647ba96b926392c3e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam:md5,00b7c143a13d0881b6d0ef0f4f8665ae" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.bai:md5,9257847727b20a8f7288ad6912fbada4" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.stats:md5,28f7879551f22fca1e2c788f1eb712d8" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.flagstat:md5,2191911d72575a2358b08b1df64ccb53" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.idxstats:md5,613e048487662c694aa4a2f73ca96a20" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam:md5,00b7c143a13d0881b6d0ef0f4f8665ae" + ] + ], + "bam_orig": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,f7af092ddd5203f647ba96b926392c3e" + ] + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.flagstat:md5,2191911d72575a2358b08b1df64ccb53" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.idxstats:md5,613e048487662c694aa4a2f73ca96a20" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.bai:md5,9257847727b20a8f7288ad6912fbada4" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.stats:md5,28f7879551f22fca1e2c788f1eb712d8" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.1" + }, + "timestamp": "2026-04-29T11:14:09.893784807" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_align_bwa/tests/nextflow.config b/subworkflows/nf-core/fastq_align_bwa/tests/nextflow.config new file mode 100644 index 00000000..2f85e807 --- /dev/null +++ b/subworkflows/nf-core/fastq_align_bwa/tests/nextflow.config @@ -0,0 +1,8 @@ +process { + withName: '.*:BAM_SORT_STATS_SAMTOOLS:SAMTOOLS_.*' { + ext.prefix = { "${meta.id}.sorted" } + } + withName: '.*:BAM_SORT_STATS_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}.sorted.bam" } + } +} diff --git a/subworkflows/nf-core/fastq_align_chromap/main.nf b/subworkflows/nf-core/fastq_align_chromap/main.nf index 9d706c98..c346adba 100644 --- a/subworkflows/nf-core/fastq_align_chromap/main.nf +++ b/subworkflows/nf-core/fastq_align_chromap/main.nf @@ -2,40 +2,55 @@ * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats */ -include { CHROMAP_CHROMAP } from '../../../modules/nf-core/chromap/chromap/main' -include { BAM_SORT_STATS_SAMTOOLS } from '../bam_sort_stats_samtools/main' +include { CHROMAP_CHROMAP } from '../../../modules/nf-core/chromap/chromap/main' +include { PICARD_ADDORREPLACEREADGROUPS } from '../../../modules/nf-core/picard/addorreplacereadgroups/main' +include { BAM_SORT_STATS_SAMTOOLS } from '../bam_sort_stats_samtools/main' workflow FASTQ_ALIGN_CHROMAP { take: - ch_reads // channel (mandatory): [ val(meta), [ reads ] ] - ch_index // channel (mandatory): [ val(meta2, [ index ] ] - ch_fasta // channel (mandatory): [ val(meta2, [ fasta ] ] - ch_barcodes // channel (optional): [ barcodes ] - ch_whitelist // channel (optional): [ whitelist ] - ch_chr_order // channel (optional): [ chr_order ] + ch_reads // channel (mandatory): [ val(meta), [ reads ] ] + ch_index // channel (mandatory): [ val(meta2, [ index ] ] + ch_fasta_fai // channel (mandatory): [ val(meta2, [ fasta ], [ fai ] ] + ch_barcodes // channel (optional): [ barcodes ] + ch_whitelist // channel (optional): [ whitelist ] + ch_chr_order // channel (optional): [ chr_order ] ch_pairs_chr_order // channel (optional): [ pairs_chr_order ] + update_readgroups // boolean (optional): true or false controls whether readgroups should be updated post alignment main: - ch_versions = Channel.empty() + + ch_bam = channel.empty() + def add_readgroups = update_readgroups ?: false + + // + // Remap ch_fasta_fai to ch_fasta + // + ch_fasta = ch_fasta_fai.map { meta, fasta , _fai -> [ meta, fasta ] } // // Map reads with CHROMAP // CHROMAP_CHROMAP(ch_reads, ch_fasta, ch_index, ch_barcodes, ch_whitelist, ch_chr_order, ch_pairs_chr_order) - ch_versions = ch_versions.mix(CHROMAP_CHROMAP.out.versions) + + // + // If needed update read groups + // + if (add_readgroups) { + PICARD_ADDORREPLACEREADGROUPS(CHROMAP_CHROMAP.out.bam, ch_fasta_fai) + ch_bam = PICARD_ADDORREPLACEREADGROUPS.out.bam + } else { + ch_bam = CHROMAP_CHROMAP.out.bam + } // // Sort, index BAM file and run samtools stats, flagstat and idxstats // - BAM_SORT_STATS_SAMTOOLS(CHROMAP_CHROMAP.out.bam, ch_fasta.map { it[1] }) - ch_versions = ch_versions.mix(BAM_SORT_STATS_SAMTOOLS.out.versions) + BAM_SORT_STATS_SAMTOOLS(ch_bam, ch_fasta_fai) emit: - bam = BAM_SORT_STATS_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] - bai = BAM_SORT_STATS_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] - stats = BAM_SORT_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_SORT_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_SORT_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - - versions = ch_versions // path: versions.yml + bam = BAM_SORT_STATS_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] + index = BAM_SORT_STATS_SAMTOOLS.out.index // channel: [ val(meta), [ index ] ] + stats = BAM_SORT_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_SORT_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_SORT_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] } diff --git a/subworkflows/nf-core/fastq_align_chromap/meta.yml b/subworkflows/nf-core/fastq_align_chromap/meta.yml index d5f59cac..f433cabb 100644 --- a/subworkflows/nf-core/fastq_align_chromap/meta.yml +++ b/subworkflows/nf-core/fastq_align_chromap/meta.yml @@ -1,6 +1,6 @@ # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json name: "fastq_align_chromap" -description: Align high throughput chromatin profiles using Chromap then sort with samtools +description: Align high throughput chromatin profiles using Chromap, updating readgroups if neccessary and then sort with samtools keywords: - align - fasta @@ -10,13 +10,15 @@ keywords: - chip-seq - atac-seq - hic -modules: +components: - chromap/chromap + - picard/addorreplacereadgroups - samtools/sort - samtools/index - samtools/stats - samtools/idxstats - samtools/flagstat + - bam_sort_stats_samtools input: - meta: type: map @@ -40,12 +42,12 @@ input: Structure: [val(meta2), path(index)] Chromap genome index files pattern: "*.index" - - ch_fasta: + - ch_fasta_fai: type: file description: | - Structure: [val(meta2), path(fasta)] - Reference fasta file - pattern: "*.{fasta,fa}" + Structure: [val(meta2), path(fasta), path(fai)] + Reference fasta file and index + pattern: "*.{fasta,fa},*.fai" - ch_barcodes: type: file description: | @@ -66,6 +68,11 @@ input: description: | Structure: [path(pairs_chr_order)] Natural chromosome order for pairs flipping + - update_readgroups: + type: boolean + description: | + Boolean controling whether the readgroups should be added or updated + after chromap alignment output: - meta: type: map @@ -98,3 +105,5 @@ output: pattern: "versions.yml" authors: - "@JoseEspinosa" +maintainers: + - "@JoseEspinosa" diff --git a/subworkflows/nf-core/fastq_align_chromap/tests/main.nf.test b/subworkflows/nf-core/fastq_align_chromap/tests/main.nf.test new file mode 100644 index 00000000..41b2209c --- /dev/null +++ b/subworkflows/nf-core/fastq_align_chromap/tests/main.nf.test @@ -0,0 +1,191 @@ +nextflow_workflow { + + name "Test Workflow FASTQ_ALIGN_CHROMAP" + config "./nextflow.config" + script "../main.nf" + workflow "FASTQ_ALIGN_CHROMAP" + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "chromap" + tag "chromap/chromap" + tag "chromap/index" + tag "picard/addorreplacereadgroups" + tag "fastq_align_chromap" + tag "subworkflows/fastq_align_chromap" + tag "subworkflows/bam_sort_stats_samtools" + + setup { + run("CHROMAP_INDEX") { + script "../../../../modules/nf-core/chromap/index/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists:true) + ]) + """ + } + } + } + + test("test_fastq_align_chromap_single_end") { + when { + workflow { + """ + input[0] = [ + [id:'test', single_end:true], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists:true) + ] + input[1] = CHROMAP_INDEX.out.index + input[2] = Channel.of([ + [id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists:true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists:true) + ]) + input[3] = [] + input[4] = [] + input[5] = [] + input[6] = [] + input[7] = false + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot(sanitizeOutput(workflow.out)).match() } + ) + } + } + + test("test_fastq_align_chromap_paired_end") { + when { + workflow { + """ + input[0] = [ + [id:'test', single_end:false], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists:true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists:true) + ] + ] + input[1] = CHROMAP_INDEX.out.index + input[2] = Channel.of([ + [id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists:true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists:true) + ]) + input[3] = [] + input[4] = [] + input[5] = [] + input[6] = [] + input[7] = false + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot(sanitizeOutput(workflow.out)).match() } + ) + } + } + + test("test_fastq_align_chromap_single_end_add_readgroups") { + when { + workflow { + """ + input[0] = [ + [id:'test', single_end:true], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists:true) + ] + input[1] = CHROMAP_INDEX.out.index + input[2] = Channel.of([ + [id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists:true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists:true) + ]) + input[3] = [] + input[4] = [] + input[5] = [] + input[6] = [] + input[7] = true + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot(sanitizeOutput(workflow.out)).match() } + ) + } + } + + test("test_fastq_align_chromap_paired_end_add_readgroups") { + when { + workflow { + """ + input[0] = [ + [id:'test', single_end:false], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists:true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists:true) + ] + ] + input[1] = CHROMAP_INDEX.out.index + input[2] = Channel.of([ + [id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists:true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists:true) + ]) + input[3] = [] + input[4] = [] + input[5] = [] + input[6] = [] + input[7] = true + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot(sanitizeOutput(workflow.out)).match() } + ) + } + } + + test("test_fastq_align_chromap_paired_end -- stub") { + options "-stub" + when { + workflow { + """ + input[0] = [ + [id:'test', single_end:false], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists:true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists:true) + ] + ] + input[1] = CHROMAP_INDEX.out.index + input[2] = Channel.of([ + [id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists:true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists:true) + ]) + input[3] = [] + input[4] = [] + input[5] = [] + input[6] = [] + input[7] = false + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot(sanitizeOutput(workflow.out)).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/fastq_align_chromap/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_align_chromap/tests/main.nf.test.snap new file mode 100644 index 00000000..37d031ac --- /dev/null +++ b/subworkflows/nf-core/fastq_align_chromap/tests/main.nf.test.snap @@ -0,0 +1,282 @@ +{ + "test_fastq_align_chromap_single_end": { + "content": [ + { + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam:md5,0dee4a081e53f90c6d039824025b6028" + ] + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.flagstat:md5,99698bba57b57c7ab68b32bc368a0cc5" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.idxstats:md5,0ca8c5edb633a2f4c72fb3160cc25abf" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.bai:md5,c91870ca4b40436a0e9ceedad8fbed8c" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.stats:md5,813d8c081cd42fc60c5bda88611e0e6e" + ] + ] + } + ], + "timestamp": "2026-07-15T10:01:46.149093", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "test_fastq_align_chromap_paired_end": { + "content": [ + { + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,284d65dcd5b5061a924d817109bab514" + ] + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.flagstat:md5,2fa0d90162a1b655863796c2a6bd8f45" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.idxstats:md5,1adb27b52d4d64b826f48b59d61dcd4d" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.bai:md5,7cccc7484bcab9060221153fb8ab9143" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.stats:md5,bbe7d1234474cccc926499f7e15744b8" + ] + ] + } + ], + "timestamp": "2026-07-15T10:01:55.610632", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "test_fastq_align_chromap_paired_end_add_readgroups": { + "content": [ + { + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,658b738d37c813b528371a22193cdb68" + ] + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.flagstat:md5,2fa0d90162a1b655863796c2a6bd8f45" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.idxstats:md5,1adb27b52d4d64b826f48b59d61dcd4d" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.bai:md5,e1734249192edb61ec95bcddf8a91f2d" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.stats:md5,bbe7d1234474cccc926499f7e15744b8" + ] + ] + } + ], + "timestamp": "2026-07-15T10:02:36.957514", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "test_fastq_align_chromap_single_end_add_readgroups": { + "content": [ + { + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam:md5,d6ecb02390b4ce23b16f94c9c875196f" + ] + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.flagstat:md5,99698bba57b57c7ab68b32bc368a0cc5" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.idxstats:md5,0ca8c5edb633a2f4c72fb3160cc25abf" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.bai:md5,6b5aff820e930f71408f7404dc043bff" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.stats:md5,813d8c081cd42fc60c5bda88611e0e6e" + ] + ] + } + ], + "timestamp": "2026-07-15T10:02:15.914993", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + }, + "test_fastq_align_chromap_paired_end -- stub": { + "content": [ + { + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.flagstat:md5,67394650dbae96d1a4fcc70484822159" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "timestamp": "2026-07-15T10:04:47.695403", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.0" + } + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_align_chromap/tests/nextflow.config b/subworkflows/nf-core/fastq_align_chromap/tests/nextflow.config new file mode 100644 index 00000000..dc4082d3 --- /dev/null +++ b/subworkflows/nf-core/fastq_align_chromap/tests/nextflow.config @@ -0,0 +1,18 @@ +process { + withName: CHROMAP_CHROMAP { + ext.args = "--SAM" + } + + withName: 'FASTQ_ALIGN_CHROMAP:BAM_SORT_STATS_SAMTOOLS:SAMTOOLS_.*' { + ext.prefix = { "${meta.id}.sorted" } + } + + withName: 'FASTQ_ALIGN_CHROMAP:PICARD_ADDORREPLACEREADGROUPS*' { + ext.prefix = { "${meta.id}.update_rg" } + ext.args = {"--RGID ${meta.id} --RGSM ${meta.id - ~/_T\d+$/} --RGPL ILLUMINA --RGLB ${meta.id} --RGPU 1 --RGCN nf-core"} + } + + withName: 'FASTQ_ALIGN_CHROMAP:BAM_SORT_STATS_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}.sorted.bam" } + } +} diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/main.nf b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/main.nf index db2e5b32..054f60ea 100644 --- a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/main.nf +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/main.nf @@ -14,9 +14,13 @@ def getTrimGaloreReadsAfterFiltering(log_file) { def filtered_reads = 0 log_file.eachLine { line -> def total_reads_matcher = line =~ /([\d\.]+)\ssequences processed in total/ - def filtered_reads_matcher = line =~ /shorter than the length cutoff[^:]+:\s([\d\.]+)/ - if (total_reads_matcher) total_reads = total_reads_matcher[0][1].toFloat() - if (filtered_reads_matcher) filtered_reads = filtered_reads_matcher[0][1].toFloat() + def filtered_reads_matcher = line =~ /shorter than the length cutoff[^:]+:\s*([\d\.]+)/ + if (total_reads_matcher) { + total_reads = total_reads_matcher[0][1].toFloat() + } + if (filtered_reads_matcher) { + filtered_reads = filtered_reads_matcher[0][1].toFloat() + } } return total_reads - filtered_reads } @@ -32,92 +36,81 @@ workflow FASTQ_FASTQC_UMITOOLS_TRIMGALORE { min_trimmed_reads // integer: > 0 main: - ch_versions = Channel.empty() - fastqc_html = Channel.empty() - fastqc_zip = Channel.empty() + ch_fastqc_html = channel.empty() + ch_fastqc_zip = channel.empty() if (!skip_fastqc) { - FASTQC (reads) - fastqc_html = FASTQC.out.html - fastqc_zip = FASTQC.out.zip - ch_versions = ch_versions.mix(FASTQC.out.versions.first()) + FASTQC(reads) + ch_fastqc_html = FASTQC.out.html + ch_fastqc_zip = FASTQC.out.zip } - umi_reads = reads - umi_log = Channel.empty() + ch_trimmer_reads = reads + ch_umi_log = channel.empty() + ch_umi_reads = channel.empty() if (with_umi && !skip_umi_extract) { - UMITOOLS_EXTRACT (reads) - umi_reads = UMITOOLS_EXTRACT.out.reads - umi_log = UMITOOLS_EXTRACT.out.log - ch_versions = ch_versions.mix(UMITOOLS_EXTRACT.out.versions.first()) + UMITOOLS_EXTRACT(reads) + ch_trimmer_reads = UMITOOLS_EXTRACT.out.reads + ch_umi_reads = UMITOOLS_EXTRACT.out.reads + ch_umi_log = UMITOOLS_EXTRACT.out.log - // Discard R1 / R2 if required - if (umi_discard_read in [1,2]) { - UMITOOLS_EXTRACT - .out - .reads - .map { - meta, reads -> - meta.single_end ? [ meta, reads ] : [ meta + ['single_end': true], reads[umi_discard_read % 2] ] - } - .set { umi_reads } - } + // Discard R1 / R2 if required + if (umi_discard_read in [1, 2]) { + UMITOOLS_EXTRACT.out.reads + .map { meta, reads_ -> + meta.single_end ? [meta, reads_] : [meta + ['single_end': true], reads_[umi_discard_read % 2]] + } + .set { ch_trimmer_reads } + } } - trim_reads = umi_reads - trim_unpaired = Channel.empty() - trim_html = Channel.empty() - trim_zip = Channel.empty() - trim_log = Channel.empty() - trim_read_count = Channel.empty() + ch_trim_reads = ch_trimmer_reads + ch_trim_unpaired = channel.empty() + ch_trim_html = channel.empty() + ch_trim_zip = channel.empty() + ch_trim_log = channel.empty() + ch_trim_read_count = channel.empty() if (!skip_trimming) { - TRIMGALORE (umi_reads) - trim_unpaired = TRIMGALORE.out.unpaired - trim_html = TRIMGALORE.out.html - trim_zip = TRIMGALORE.out.zip - trim_log = TRIMGALORE.out.log - ch_versions = ch_versions.mix(TRIMGALORE.out.versions.first()) + TRIMGALORE(ch_trimmer_reads) + ch_trim_unpaired = TRIMGALORE.out.unpaired + ch_trim_html = TRIMGALORE.out.html + ch_trim_zip = TRIMGALORE.out.zip + ch_trim_log = TRIMGALORE.out.log // // Filter FastQ files based on minimum trimmed read count after adapter trimming // - TRIMGALORE - .out - .reads - .join(trim_log, remainder: true) - .map { - meta, reads, trim_log -> - if (trim_log) { - num_reads = getTrimGaloreReadsAfterFiltering(meta.single_end ? trim_log : trim_log[-1]) - [ meta, reads, num_reads ] - } else { - [ meta, reads, min_trimmed_reads.toFloat() + 1 ] - } + TRIMGALORE.out.reads + .join(ch_trim_log, remainder: true) + .map { meta, reads_, trim_log -> + if (trim_log) { + def num_reads = getTrimGaloreReadsAfterFiltering(meta.single_end ? trim_log : trim_log[-1]) + [meta, reads_, num_reads] + } + else { + [meta, reads_, min_trimmed_reads.toFloat() + 1] + } } .set { ch_num_trimmed_reads } ch_num_trimmed_reads - .filter { meta, reads, num_reads -> num_reads >= min_trimmed_reads.toFloat() } - .map { meta, reads, num_reads -> [ meta, reads ] } - .set { trim_reads } + .filter { _meta, _reads, num_reads -> num_reads >= min_trimmed_reads.toFloat() } + .map { meta, reads_, _num_reads -> [meta, reads_] } + .set { ch_trim_reads } ch_num_trimmed_reads - .map { meta, reads, num_reads -> [ meta, num_reads ] } - .set { trim_read_count } + .map { meta, _reads, num_reads -> [meta, num_reads] } + .set { ch_trim_read_count } } emit: - reads = trim_reads // channel: [ val(meta), [ reads ] ] - - fastqc_html // channel: [ val(meta), [ html ] ] - fastqc_zip // channel: [ val(meta), [ zip ] ] - - umi_log // channel: [ val(meta), [ log ] ] - - trim_unpaired // channel: [ val(meta), [ reads ] ] - trim_html // channel: [ val(meta), [ html ] ] - trim_zip // channel: [ val(meta), [ zip ] ] - trim_log // channel: [ val(meta), [ txt ] ] - trim_read_count // channel: [ val(meta), val(count) ] - - versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] + reads = ch_trim_reads // channel: [ val(meta), [ reads ] ] + fastqc_html = ch_fastqc_html // channel: [ val(meta), [ html ] ] + fastqc_zip = ch_fastqc_zip // channel: [ val(meta), [ zip ] ] + umi_log = ch_umi_log // channel: [ val(meta), [ log ] ] + umi_reads = ch_umi_reads // channel: [ val(meta), [ reads ] ] + trim_unpaired = ch_trim_unpaired // channel: [ val(meta), [ reads ] ] + trim_html = ch_trim_html // channel: [ val(meta), [ html ] ] + trim_zip = ch_trim_zip // channel: [ val(meta), [ zip ] ] + trim_log = ch_trim_log // channel: [ val(meta), [ txt ] ] + trim_read_count = ch_trim_read_count // channel: [ val(meta), val(count) ] } diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/meta.yml b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/meta.yml index 3b1a675c..a7df97f7 100644 --- a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/meta.yml +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/meta.yml @@ -8,7 +8,7 @@ keywords: - UMI - trimming - trimgalore -modules: +components: - fastqc - umitools/extract - trimgalore @@ -47,13 +47,14 @@ input: type: integer description: | Inputs with fewer than this reads will be filtered out of the "reads" output channel - output: - reads: type: file description: > - Extracted FASTQ files. | - For single-end reads, pattern is \${prefix}.umi_extract.fastq.gz. | + Extracted FASTQ files. | For single-end reads, pattern is \${prefix}.umi_extract.fastq.gz. | + + + For paired-end reads, pattern is \${prefix}.umi_extract_{1,2}.fastq.gz. pattern: "*.{fastq.gz}" - fastqc_html: @@ -95,3 +96,6 @@ output: authors: - "@drpatelh" - "@KamilMaliszArdigen" +maintainers: + - "@drpatelh" + - "@KamilMaliszArdigen" diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test new file mode 100644 index 00000000..7e1b6af2 --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test @@ -0,0 +1,310 @@ +nextflow_workflow { + + name "Test Subworkflow FASTQ_FASTQC_UMITOOLS_TRIMGALORE" + script "../main.nf" + workflow "FASTQ_FASTQC_UMITOOLS_TRIMGALORE" + config './nextflow.config' + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/fastq_fastqc_umitools_trimgalore" + tag "fastqc" + tag "umitools/extract" + tag "trimgalore" + + tag "FASTQC" + tag "UMITOOLS_EXTRACT" + tag "TRIMGALORE" + + test("test single end read with UMI") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + ]) + input[1] = false // skip_fastqc + input[2] = true // with_umi + input[3] = false // skip_umi_extract + input[4] = false // skip_trimming + input[5] = 1 // umi_discard_read + input[6] = 1 // min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert path(workflow.out.fastqc_html[0][1]).text.contains("File typeConventional base calls") }, + { assert snapshot( + workflow.out.reads, + workflow.out.trim_read_count, + workflow.out.trim_unpaired, +).match() } + ) + } + } + + test("test paired end read with UMI") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = false // skip_fastqc + input[2] = true // with_umi + input[3] = false // skip_umi_extract + input[4] = false // skip_trimming + input[5] = 1 // umi_discard_read + input[6] = 1 // min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.reads, + workflow.out.trim_read_count, + workflow.out.trim_unpaired, +).match() } + ) + } + } + test("test paired end read without UMI") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = false // skip_fastqc + input[2] = false // with_umi + input[3] = false // skip_umi_extract + input[4] = false // skip_trimming + input[5] = 1 // umi_discard_read + input[6] = 1 // min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.reads, + workflow.out.trim_read_count, + workflow.out.trim_unpaired, +).match() } + ) + } + } + + test("test paired end read without UMI - hardtrim5 (no trim log)") { + + config './nextflow-hardtrim.config' + + when { + workflow { + """ + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = true // skip_fastqc + input[2] = false // with_umi + input[3] = true // skip_umi_extract + input[4] = false // skip_trimming + input[5] = 0 // umi_discard_read + input[6] = 1 // min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.reads, + workflow.out.trim_read_count, + workflow.out.trim_unpaired, + ).match() } + ) + } + } + + test("test skip all steps") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = true // skip_fastqc + input[2] = true // with_umi + input[3] = true // skip_umi_extract + input[4] = true // skip_trimming + input[5] = 0 // umi_discard_read + input[6] = 1 // min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.trim_read_count, + workflow.out.trim_unpaired, +).match() } + ) + } + } + + test("test single end read with UMI - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + ]) + input[1] = false // skip_fastqc + input[2] = true // with_umi + input[3] = false // skip_umi_extract + input[4] = false // skip_trimming + input[5] = 1 // umi_discard_read + input[6] = 1 // min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("test paired end read with UMI - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = false // skip_fastqc + input[2] = true // with_umi + input[3] = false // skip_umi_extract + input[4] = false // skip_trimming + input[5] = 1 // umi_discard_read + input[6] = 1 // min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } + test("test paired end read without UMI - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = false // skip_fastqc + input[2] = false // with_umi + input[3] = false // skip_umi_extract + input[4] = false // skip_trimming + input[5] = 1 // umi_discard_read + input[6] = 1 // min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("test skip all steps - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = true // skip_fastqc + input[2] = true // with_umi + input[3] = true // skip_umi_extract + input[4] = true // skip_trimming + input[5] = 0 // umi_discard_read + input[6] = 1 // min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success} + // No snapshot when skipping all as output is input + ) + } + } +} diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test.snap new file mode 100644 index 00000000..0b42ef28 --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test.snap @@ -0,0 +1,560 @@ +{ + "test paired end read with UMI - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.umi_extract.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.umi_extract_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.umi_extract_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "5": [ + + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": true + }, + 0 + ] + ], + "fastqc_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + + ], + "trim_html": [ + + ], + "trim_log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_read_count": [ + [ + { + "id": "test", + "single_end": true + }, + 0 + ] + ], + "trim_unpaired": [ + + ], + "trim_zip": [ + + ], + "umi_log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.umi_extract.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "umi_reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.umi_extract_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.umi_extract_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-03T13:21:45.022632239" + }, + "test paired end read without UMI - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + + ], + "5": [ + + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_2.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": false + }, + 0 + ] + ], + "fastqc_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + + ], + "trim_html": [ + + ], + "trim_log": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_2.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "trim_read_count": [ + [ + { + "id": "test", + "single_end": false + }, + 0 + ] + ], + "trim_unpaired": [ + + ], + "trim_zip": [ + + ], + "umi_log": [ + + ], + "umi_reads": [ + + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-03T13:21:51.075428076" + }, + "test paired end read without UMI": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1_val_1.fq.gz:md5,566d44cca0d22c522d6cf0e50c7165dc", + "test_2_val_2.fq.gz:md5,3c023e8e890b897821df3dc98f48c2b3" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + 100.0 + ] + ], + [ + + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-03T13:21:22.252381045" + }, + "test single end read with UMI": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test_trimmed.fq.gz:md5,faae784affdd7d84e2fa9da9e9425229" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + 100.0 + ] + ], + [ + + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-03T13:21:01.887880112" + }, + "test paired end read with UMI": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test_trimmed.fq.gz:md5,9c58b78ac2c7b5ce9ca6b090eee1d39c" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + 100.0 + ] + ], + [ + + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-03T13:21:13.989761245" + }, + "test skip all steps": { + "content": [ + [ + + ], + [ + + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-03T13:21:27.191712947" + }, + "test single end read with UMI - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": true + }, + "test.umi_extract.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.umi_extract.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "5": [ + + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": true + }, + 0 + ] + ], + "fastqc_html": [ + [ + { + "id": "test", + "single_end": true + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_zip": [ + [ + { + "id": "test", + "single_end": true + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + + ], + "trim_html": [ + + ], + "trim_log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_read_count": [ + [ + { + "id": "test", + "single_end": true + }, + 0 + ] + ], + "trim_unpaired": [ + + ], + "trim_zip": [ + + ], + "umi_log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.umi_extract.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "umi_reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test.umi_extract.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-03T13:21:36.092099503" + }, + "test paired end read without UMI - hardtrim5 (no trim log)": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.8bp_5prime.fq.gz:md5,70f5059c1a54be0cb280ef42ee849122", + "test_2.8bp_5prime.fq.gz:md5,fdec97e9e36ac5f30685f4fa0975dcf7" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + 2.0 + ] + ], + [ + + ] + ], + "timestamp": "2026-04-20T10:04:54.300393835", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/nextflow-hardtrim.config b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/nextflow-hardtrim.config new file mode 100644 index 00000000..3d0ae023 --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/nextflow-hardtrim.config @@ -0,0 +1,11 @@ +process { + withName: UMITOOLS_EXTRACT { + ext.args = '--bc-pattern="NNNN"' + } + withName: TRIMGALORE { + // --hardtrim5 makes trim_galore skip the adapter / quality pass and not emit a + // *_trimming_report.txt, so the trim_log channel join leaves a null element. + // Used to exercise the null-log branch of the read-count map. + ext.args = '--hardtrim5 8' + } +} diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/nextflow.config b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/nextflow.config new file mode 100644 index 00000000..06a7d07a --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: UMITOOLS_EXTRACT { + ext.args = '--bc-pattern="NNNN"' + } +} diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf new file mode 100644 index 00000000..d6e593e8 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf @@ -0,0 +1,126 @@ +// +// Subworkflow with functionality that may be useful for any Nextflow pipeline +// + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + SUBWORKFLOW DEFINITION +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +workflow UTILS_NEXTFLOW_PIPELINE { + take: + print_version // boolean: print version + dump_parameters // boolean: dump parameters + outdir // path: base directory used to publish pipeline results + check_conda_channels // boolean: check conda channels + + main: + + // + // Print workflow version and exit on --version + // + if (print_version) { + log.info("${workflow.manifest.name} ${getWorkflowVersion()}") + System.exit(0) + } + + // + // Dump pipeline parameters to a JSON file + // + if (dump_parameters && outdir) { + dumpParametersToJSON(outdir) + } + + // + // When running with Conda, warn if channels have not been set-up appropriately + // + if (check_conda_channels) { + checkCondaChannels() + } + + emit: + dummy_emit = true +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + FUNCTIONS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +// +// Generate version string +// +def getWorkflowVersion() { + def version_string = "" as String + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } + + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } + + return version_string +} + +// +// Dump pipeline parameters to a JSON file +// +def dumpParametersToJSON(outdir) { + def timestamp = new java.util.Date().format('yyyy-MM-dd_HH-mm-ss') + def filename = "params_${timestamp}.json" + def temp_pf = new File(workflow.launchDir.toString(), ".${filename}") + def jsonStr = groovy.json.JsonOutput.toJson(params) + temp_pf.text = groovy.json.JsonOutput.prettyPrint(jsonStr) + + nextflow.extension.FilesEx.copyTo(temp_pf.toPath(), "${outdir}/pipeline_info/params_${timestamp}.json") + temp_pf.delete() +} + +// +// When running with -profile conda, warn if channels have not been set-up appropriately +// +def checkCondaChannels() { + def parser = new org.yaml.snakeyaml.Yaml() + def channels = [] + try { + def config = parser.load("conda config --show channels".execute().text) + channels = config.channels + } + catch (NullPointerException e) { + log.debug(e) + log.warn("Could not verify conda channel configuration.") + return null + } + catch (IOException e) { + log.debug(e) + log.warn("Could not verify conda channel configuration.") + return null + } + + // Check that all channels are present + // This channel list is ordered by required channel priority. + def required_channels_in_order = ['conda-forge', 'bioconda'] + def channels_missing = ((required_channels_in_order as Set) - (channels as Set)) as Boolean + + // Check that they are in the right order + def channel_priority_violation = required_channels_in_order != channels.findAll { ch -> ch in required_channels_in_order } + + if (channels_missing | channel_priority_violation) { + log.warn """\ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + There is a problem with your Conda configuration! + You will need to set-up the conda-forge and bioconda channels correctly. + Please refer to https://bioconda.github.io/ + The observed channel order is + ${channels} + but the following channel order is required: + ${required_channels_in_order} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + """.stripIndent(true) + } +} diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/meta.yml b/subworkflows/nf-core/utils_nextflow_pipeline/meta.yml new file mode 100644 index 00000000..e5c3a0a8 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/meta.yml @@ -0,0 +1,38 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "UTILS_NEXTFLOW_PIPELINE" +description: Subworkflow with functionality that may be useful for any Nextflow pipeline +keywords: + - utility + - pipeline + - initialise + - version +components: [] +input: + - print_version: + type: boolean + description: | + Print the version of the pipeline and exit + - dump_parameters: + type: boolean + description: | + Dump the parameters of the pipeline to a JSON file + - output_directory: + type: directory + description: Path to output dir to write JSON file to. + pattern: "results/" + - check_conda_channel: + type: boolean + description: | + Check if the conda channel priority is correct. +output: + - dummy_emit: + type: boolean + description: | + Dummy emit to make nf-core subworkflows lint happy +authors: + - "@adamrtalbot" + - "@drpatelh" +maintainers: + - "@adamrtalbot" + - "@drpatelh" + - "@maxulysse" diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test new file mode 100644 index 00000000..68718e4f --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test @@ -0,0 +1,54 @@ + +nextflow_function { + + name "Test Functions" + script "subworkflows/nf-core/utils_nextflow_pipeline/main.nf" + config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" + tag 'subworkflows' + tag 'utils_nextflow_pipeline' + tag 'subworkflows/utils_nextflow_pipeline' + + test("Test Function getWorkflowVersion") { + + function "getWorkflowVersion" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Test Function dumpParametersToJSON") { + + function "dumpParametersToJSON" + + when { + function { + """ + // define inputs of the function here. Example: + input[0] = "$outputDir" + """.stripIndent() + } + } + + then { + assertAll( + { assert function.success } + ) + } + } + + test("Test Function checkCondaChannels") { + + function "checkCondaChannels" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap new file mode 100644 index 00000000..e3f0baf4 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap @@ -0,0 +1,20 @@ +{ + "Test Function getWorkflowVersion": { + "content": [ + "v9.9.9" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:02:05.308243" + }, + "Test Function checkCondaChannels": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:02:12.425833" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test new file mode 100644 index 00000000..02dbf094 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test @@ -0,0 +1,113 @@ +nextflow_workflow { + + name "Test Workflow UTILS_NEXTFLOW_PIPELINE" + script "../main.nf" + config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" + workflow "UTILS_NEXTFLOW_PIPELINE" + tag 'subworkflows' + tag 'utils_nextflow_pipeline' + tag 'subworkflows/utils_nextflow_pipeline' + + test("Should run no inputs") { + + when { + workflow { + """ + print_version = false + dump_parameters = false + outdir = null + check_conda_channels = false + + input[0] = print_version + input[1] = dump_parameters + input[2] = outdir + input[3] = check_conda_channels + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } + + test("Should print version") { + + when { + workflow { + """ + print_version = true + dump_parameters = false + outdir = null + check_conda_channels = false + + input[0] = print_version + input[1] = dump_parameters + input[2] = outdir + input[3] = check_conda_channels + """ + } + } + + then { + expect { + with(workflow) { + assert success + assert "nextflow_workflow v9.9.9" in stdout + } + } + } + } + + test("Should dump params") { + + when { + workflow { + """ + print_version = false + dump_parameters = true + outdir = 'results' + check_conda_channels = false + + input[0] = false + input[1] = true + input[2] = outdir + input[3] = false + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } + + test("Should not create params JSON if no output directory") { + + when { + workflow { + """ + print_version = false + dump_parameters = true + outdir = null + check_conda_channels = false + + input[0] = false + input[1] = true + input[2] = outdir + input[3] = false + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config b/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config new file mode 100644 index 00000000..a09572e5 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config @@ -0,0 +1,9 @@ +manifest { + name = 'nextflow_workflow' + author = """nf-core""" + homePage = 'https://127.0.0.1' + description = """Dummy pipeline""" + nextflowVersion = '!>=23.04.0' + version = '9.9.9' + doi = 'https://doi.org/10.5281/zenodo.5070524' +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf new file mode 100644 index 00000000..afca5439 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -0,0 +1,355 @@ +// +// Subworkflow with utility functions specific to the nf-core pipeline template +// + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + SUBWORKFLOW DEFINITION +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +workflow UTILS_NFCORE_PIPELINE { + take: + nextflow_cli_args + + main: + valid_config = checkConfigProvided() + checkProfileProvided(nextflow_cli_args) + + emit: + valid_config = valid_config +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + FUNCTIONS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +// +// Warn if a -profile or Nextflow config has not been provided to run the pipeline +// +def checkConfigProvided() { + def valid_config = true as Boolean + if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { + log.warn( + "[${workflow.manifest.name}] You are attempting to run the pipeline without any custom configuration!\n\n" + "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + "Please refer to the quick start section and usage docs for the pipeline.\n " + ) + valid_config = false + } + return valid_config +} + +// +// Exit pipeline if --profile contains spaces +// +def checkProfileProvided(nextflow_cli_args) { + if (workflow.profile.endsWith(',')) { + error( + "The `-profile` option cannot end with a trailing comma, please remove it and re-run the pipeline!\n" + "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n" + ) + } + if (nextflow_cli_args[0]) { + log.warn( + "nf-core pipelines do not accept positional arguments. The positional argument `${nextflow_cli_args[0]}` has been detected.\n" + "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n" + ) + } +} + +// +// Generate workflow version string +// +def getWorkflowVersion() { + def version_string = "" as String + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } + + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } + + return version_string +} + +// +// Get software versions for pipeline +// +def processVersionsFromYAML(yaml_file) { + def yaml = new org.yaml.snakeyaml.Yaml() + def versions = yaml.load(yaml_file).collectEntries { k, v -> [k.tokenize(':')[-1], v] } + return yaml.dumpAsMap(versions).trim() +} + +// +// Get workflow version for pipeline +// +def workflowVersionToYAML() { + return """ + Workflow: + ${workflow.manifest.name}: ${getWorkflowVersion()} + Nextflow: ${workflow.nextflow.version} + """.stripIndent().trim() +} + +// +// Get channel of software versions used in pipeline in YAML format +// +def softwareVersionsToYAML(ch_versions) { + return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(channel.of(workflowVersionToYAML())) +} + +// +// Get workflow summary for MultiQC +// +def paramsSummaryMultiqc(summary_params) { + def summary_section = '' + summary_params + .keySet() + .each { group -> + def group_params = summary_params.get(group) + // This gets the parameters of that particular group + if (group_params) { + summary_section += "

    ${group}

    \n" + summary_section += "
    \n" + group_params + .keySet() + .sort() + .each { param -> + summary_section += "
    ${param}
    ${group_params.get(param) ?: 'N/A'}
    \n" + } + summary_section += "
    \n" + } + } + + def yaml_file_text = "id: '${workflow.manifest.name.replace('/', '-')}-summary'\n" as String + yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n" + yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n" + yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n" + yaml_file_text += "plot_type: 'html'\n" + yaml_file_text += "data: |\n" + yaml_file_text += "${summary_section}" + + return yaml_file_text +} + +// +// ANSII colours used for terminal logging +// +def logColours(monochrome_logs=true) { + def colorcodes = [:] as Map + + // Reset / Meta + colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" + colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" + colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" + colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" + colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" + colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" + colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" + + // Regular Colors + colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" + colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" + colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" + colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" + colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" + colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" + colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" + colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" + + // Bold + colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" + colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" + colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" + colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" + colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" + colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" + colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" + colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" + + // Underline + colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" + colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" + colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" + colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" + colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" + colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" + colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" + colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" + + // High Intensity + colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" + colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" + colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" + colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" + colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" + colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" + colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" + colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" + + // Bold High Intensity + colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" + colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" + colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" + colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" + colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" + colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" + colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" + colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" + + return colorcodes +} + +// Return a single report from an object that may be a Path or List +// +def getSingleReport(multiqc_reports) { + if (multiqc_reports instanceof Path) { + return multiqc_reports + } else if (multiqc_reports instanceof List) { + if (multiqc_reports.size() == 0) { + log.warn("[${workflow.manifest.name}] No reports found from process 'MULTIQC'") + return null + } else if (multiqc_reports.size() == 1) { + return multiqc_reports.first() + } else { + log.warn("[${workflow.manifest.name}] Found multiple reports from process 'MULTIQC', will use only one") + return multiqc_reports.first() + } + } else { + return null + } +} + +// +// Construct and send completion email +// +def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdir, monochrome_logs=true, multiqc_report=null) { + + // Set up the e-mail variables + def subject = "[${workflow.manifest.name}] Successful: ${workflow.runName}" + if (!workflow.success) { + subject = "[${workflow.manifest.name}] FAILED: ${workflow.runName}" + } + + def summary = [:] + summary_params + .keySet() + .sort() + .each { group -> + summary << summary_params[group] + } + + def misc_fields = [:] + misc_fields['Date Started'] = workflow.start + misc_fields['Date Completed'] = workflow.complete + misc_fields['Pipeline script file path'] = workflow.scriptFile + misc_fields['Pipeline script hash ID'] = workflow.scriptId + if (workflow.repository) { + misc_fields['Pipeline repository Git URL'] = workflow.repository + } + if (workflow.commitId) { + misc_fields['Pipeline repository Git Commit'] = workflow.commitId + } + if (workflow.revision) { + misc_fields['Pipeline Git branch/tag'] = workflow.revision + } + misc_fields['Nextflow Version'] = workflow.nextflow.version + misc_fields['Nextflow Build'] = workflow.nextflow.build + misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp + + def email_fields = [:] + email_fields['version'] = getWorkflowVersion() + email_fields['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 << misc_fields + + // On success try attach the multiqc report + def mqc_report = getSingleReport(multiqc_report) + + // Check if we are only sending emails on failure + def email_address = email + if (!email && email_on_fail && !workflow.success) { + email_address = email_on_fail + } + + // Render the TXT template + def engine = new groovy.text.GStringTemplateEngine() + def tf = new File("${workflow.projectDir}/assets/email_template.txt") + def txt_template = engine.createTemplate(tf).make(email_fields) + def email_txt = txt_template.toString() + + // Render the HTML template + def hf = new File("${workflow.projectDir}/assets/email_template.html") + def html_template = engine.createTemplate(hf).make(email_fields) + def email_html = html_template.toString() + + // Render the sendmail template + def max_multiqc_email_size = (params.containsKey('max_multiqc_email_size') ? params.max_multiqc_email_size : 0) as MemoryUnit + def smail_fields = [email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "${workflow.projectDir}", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes()] + def sf = new File("${workflow.projectDir}/assets/sendmail_template.txt") + def sendmail_template = engine.createTemplate(sf).make(smail_fields) + def sendmail_html = sendmail_template.toString() + + // Send the HTML e-mail + def colors = logColours(monochrome_logs) as Map + if (email_address) { + try { + if (plaintext_email) { + new org.codehaus.groovy.GroovyException('Send plaintext e-mail, not HTML') + } + // Try to send HTML e-mail using sendmail + def sendmail_tf = new File(workflow.launchDir.toString(), ".sendmail_tmp.html") + sendmail_tf.withWriter { w -> w << sendmail_html } + ['sendmail', '-t'].execute() << sendmail_html + log.info("-${colors.purple}[${workflow.manifest.name}]${colors.green} Sent summary e-mail to ${email_address} (sendmail)-") + } + catch (Exception msg) { + log.debug(msg.toString()) + log.debug("Trying with mail instead of sendmail") + // Catch failures and try with plaintext + def mail_cmd = ['mail', '-s', subject, '--content-type=text/html', email_address] + mail_cmd.execute() << email_html + log.info("-${colors.purple}[${workflow.manifest.name}]${colors.green} Sent summary e-mail to ${email_address} (mail)-") + } + } + + // Write summary e-mail HTML to a file + def output_hf = new File(workflow.launchDir.toString(), ".pipeline_report.html") + output_hf.withWriter { w -> w << email_html } + nextflow.extension.FilesEx.copyTo(output_hf.toPath(), "${outdir}/pipeline_info/pipeline_report.html") + output_hf.delete() + + // Write summary e-mail TXT to a file + def output_tf = new File(workflow.launchDir.toString(), ".pipeline_report.txt") + output_tf.withWriter { w -> w << email_txt } + nextflow.extension.FilesEx.copyTo(output_tf.toPath(), "${outdir}/pipeline_info/pipeline_report.txt") + output_tf.delete() +} + +// +// Print pipeline summary on completion +// +def completionSummary(monochrome_logs=true) { + def colors = logColours(monochrome_logs) as Map + if (workflow.success) { + if (workflow.stats.ignoredCount == 0) { + log.info("-${colors.purple}[${workflow.manifest.name}]${colors.green} Pipeline completed successfully${colors.reset}-") + } + else { + log.info("-${colors.purple}[${workflow.manifest.name}]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-") + } + } + else { + log.info("-${colors.purple}[${workflow.manifest.name}]${colors.red} Pipeline completed with errors${colors.reset}-") + } +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml b/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml new file mode 100644 index 00000000..d08d2434 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml @@ -0,0 +1,24 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "UTILS_NFCORE_PIPELINE" +description: Subworkflow with utility functions specific to the nf-core pipeline template +keywords: + - utility + - pipeline + - initialise + - version +components: [] +input: + - nextflow_cli_args: + type: list + description: | + Nextflow CLI positional arguments +output: + - success: + type: boolean + description: | + Dummy output to indicate success +authors: + - "@adamrtalbot" +maintainers: + - "@adamrtalbot" + - "@maxulysse" diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test new file mode 100644 index 00000000..f117040c --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test @@ -0,0 +1,126 @@ + +nextflow_function { + + name "Test Functions" + script "../main.nf" + config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "utils_nfcore_pipeline" + tag "subworkflows/utils_nfcore_pipeline" + + test("Test Function checkConfigProvided") { + + function "checkConfigProvided" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Test Function checkProfileProvided") { + + function "checkProfileProvided" + + when { + function { + """ + input[0] = [] + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Test Function without logColours") { + + function "logColours" + + when { + function { + """ + input[0] = true + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Test Function with logColours") { + function "logColours" + + when { + function { + """ + input[0] = false + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Test Function getSingleReport with a single file") { + function "getSingleReport" + + when { + function { + """ + input[0] = file(params.modules_testdata_base_path + '/generic/tsv/test.tsv', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert function.result.contains("test.tsv") } + ) + } + } + + test("Test Function getSingleReport with multiple files") { + function "getSingleReport" + + when { + function { + """ + input[0] = [ + file(params.modules_testdata_base_path + '/generic/tsv/test.tsv', checkIfExists: true), + file(params.modules_testdata_base_path + '/generic/tsv/network.tsv', checkIfExists: true), + file(params.modules_testdata_base_path + '/generic/tsv/expression.tsv', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert function.result.contains("test.tsv") }, + { assert !function.result.contains("network.tsv") }, + { assert !function.result.contains("expression.tsv") } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap new file mode 100644 index 00000000..02c67014 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap @@ -0,0 +1,136 @@ +{ + "Test Function checkProfileProvided": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:03.360873" + }, + "Test Function checkConfigProvided": { + "content": [ + true + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:02:59.729647" + }, + "Test Function without logColours": { + "content": [ + { + "reset": "", + "bold": "", + "dim": "", + "underlined": "", + "blink": "", + "reverse": "", + "hidden": "", + "black": "", + "red": "", + "green": "", + "yellow": "", + "blue": "", + "purple": "", + "cyan": "", + "white": "", + "bblack": "", + "bred": "", + "bgreen": "", + "byellow": "", + "bblue": "", + "bpurple": "", + "bcyan": "", + "bwhite": "", + "ublack": "", + "ured": "", + "ugreen": "", + "uyellow": "", + "ublue": "", + "upurple": "", + "ucyan": "", + "uwhite": "", + "iblack": "", + "ired": "", + "igreen": "", + "iyellow": "", + "iblue": "", + "ipurple": "", + "icyan": "", + "iwhite": "", + "biblack": "", + "bired": "", + "bigreen": "", + "biyellow": "", + "biblue": "", + "bipurple": "", + "bicyan": "", + "biwhite": "" + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:17.969323" + }, + "Test Function with logColours": { + "content": [ + { + "reset": "\u001b[0m", + "bold": "\u001b[1m", + "dim": "\u001b[2m", + "underlined": "\u001b[4m", + "blink": "\u001b[5m", + "reverse": "\u001b[7m", + "hidden": "\u001b[8m", + "black": "\u001b[0;30m", + "red": "\u001b[0;31m", + "green": "\u001b[0;32m", + "yellow": "\u001b[0;33m", + "blue": "\u001b[0;34m", + "purple": "\u001b[0;35m", + "cyan": "\u001b[0;36m", + "white": "\u001b[0;37m", + "bblack": "\u001b[1;30m", + "bred": "\u001b[1;31m", + "bgreen": "\u001b[1;32m", + "byellow": "\u001b[1;33m", + "bblue": "\u001b[1;34m", + "bpurple": "\u001b[1;35m", + "bcyan": "\u001b[1;36m", + "bwhite": "\u001b[1;37m", + "ublack": "\u001b[4;30m", + "ured": "\u001b[4;31m", + "ugreen": "\u001b[4;32m", + "uyellow": "\u001b[4;33m", + "ublue": "\u001b[4;34m", + "upurple": "\u001b[4;35m", + "ucyan": "\u001b[4;36m", + "uwhite": "\u001b[4;37m", + "iblack": "\u001b[0;90m", + "ired": "\u001b[0;91m", + "igreen": "\u001b[0;92m", + "iyellow": "\u001b[0;93m", + "iblue": "\u001b[0;94m", + "ipurple": "\u001b[0;95m", + "icyan": "\u001b[0;96m", + "iwhite": "\u001b[0;97m", + "biblack": "\u001b[1;90m", + "bired": "\u001b[1;91m", + "bigreen": "\u001b[1;92m", + "biyellow": "\u001b[1;93m", + "biblue": "\u001b[1;94m", + "bipurple": "\u001b[1;95m", + "bicyan": "\u001b[1;96m", + "biwhite": "\u001b[1;97m" + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:21.714424" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test new file mode 100644 index 00000000..8940d32d --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test @@ -0,0 +1,29 @@ +nextflow_workflow { + + name "Test Workflow UTILS_NFCORE_PIPELINE" + script "../main.nf" + config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" + workflow "UTILS_NFCORE_PIPELINE" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "utils_nfcore_pipeline" + tag "subworkflows/utils_nfcore_pipeline" + + test("Should run without failures") { + + when { + workflow { + """ + input[0] = [] + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test.snap new file mode 100644 index 00000000..859d1030 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test.snap @@ -0,0 +1,19 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + true + ], + "valid_config": [ + true + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:25.726491" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test new file mode 100644 index 00000000..8940d32d --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test @@ -0,0 +1,29 @@ +nextflow_workflow { + + name "Test Workflow UTILS_NFCORE_PIPELINE" + script "../main.nf" + config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" + workflow "UTILS_NFCORE_PIPELINE" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "utils_nfcore_pipeline" + tag "subworkflows/utils_nfcore_pipeline" + + test("Should run without failures") { + + when { + workflow { + """ + input[0] = [] + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap new file mode 100644 index 00000000..859d1030 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap @@ -0,0 +1,19 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + true + ], + "valid_config": [ + true + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:25.726491" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config b/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config new file mode 100644 index 00000000..d0a926bf --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config @@ -0,0 +1,9 @@ +manifest { + name = 'nextflow_workflow' + author = """nf-core""" + homePage = 'https://127.0.0.1' + description = """Dummy pipeline""" + nextflowVersion = '!>=23.04.0' + version = '9.9.9' + doi = 'https://doi.org/10.5281/zenodo.5070524' +} diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf new file mode 100644 index 00000000..1df8b76f --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -0,0 +1,73 @@ +// +// Subworkflow that uses the nf-schema plugin to validate parameters and render the parameter summary +// + +include { paramsSummaryLog } from 'plugin/nf-schema' +include { validateParameters } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' + +workflow UTILS_NFSCHEMA_PLUGIN { + + take: + input_workflow // workflow: the workflow object used by nf-schema to get metadata from the workflow + validate_params // boolean: validate the parameters + parameters_schema // string: path to the parameters JSON schema. + // this has to be the same as the schema given to `validation.parametersSchema` + // when this input is empty it will automatically use the configured schema or + // "${projectDir}/nextflow_schema.json" as default. This input should not be empty + // for meta pipelines + help // boolean: show help message + help_full // boolean: show full help message + show_hidden // boolean: show hidden parameters in help message + before_text // string: text to show before the help message and parameters summary + after_text // string: text to show after the help message and parameters summary + command // string: an example command of the pipeline + + main: + + if(help || help_full) { + help_options = [ + beforeText: before_text, + afterText: after_text, + command: command, + showHidden: show_hidden, + fullHelp: help_full, + ] + if(parameters_schema) { + help_options << [parametersSchema: parameters_schema] + } + log.info paramsHelp( + help_options, + (params.help instanceof String && params.help != "true") ? params.help : "", + ) + exit 0 + } + + // + // Print parameter summary to stdout. This will display the parameters + // that differ from the default given in the JSON schema + // + + summary_options = [:] + if(parameters_schema) { + summary_options << [parametersSchema: parameters_schema] + } + log.info before_text + log.info paramsSummaryLog(summary_options, input_workflow) + log.info after_text + + // + // Validate the parameters using nextflow_schema.json or the schema + // given via the validation.parametersSchema configuration option + // + if(validate_params) { + validateOptions = [:] + if(parameters_schema) { + validateOptions << [parametersSchema: parameters_schema] + } + validateParameters(validateOptions) + } + + emit: + dummy_emit = true +} diff --git a/subworkflows/nf-core/utils_nfschema_plugin/meta.yml b/subworkflows/nf-core/utils_nfschema_plugin/meta.yml new file mode 100644 index 00000000..f7d9f028 --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/meta.yml @@ -0,0 +1,35 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "utils_nfschema_plugin" +description: Run nf-schema to validate parameters and create a summary of changed parameters +keywords: + - validation + - JSON schema + - plugin + - parameters + - summary +components: [] +input: + - input_workflow: + type: object + description: | + The workflow object of the used pipeline. + This object contains meta data used to create the params summary log + - validate_params: + type: boolean + description: Validate the parameters and error if invalid. + - parameters_schema: + type: string + description: | + Path to the parameters JSON schema. + This has to be the same as the schema given to the `validation.parametersSchema` config + option. When this input is empty it will automatically use the configured schema or + "${projectDir}/nextflow_schema.json" as default. The schema should not be given in this way + for meta pipelines. +output: + - dummy_emit: + type: boolean + description: Dummy emit to make nf-core subworkflows lint happy +authors: + - "@nvnieuwk" +maintainers: + - "@nvnieuwk" diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test new file mode 100644 index 00000000..c977917a --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test @@ -0,0 +1,173 @@ +nextflow_workflow { + + name "Test Subworkflow UTILS_NFSCHEMA_PLUGIN" + script "../main.nf" + workflow "UTILS_NFSCHEMA_PLUGIN" + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/utils_nfschema_plugin" + tag "plugin/nf-schema" + + config "./nextflow.config" + + test("Should run nothing") { + + when { + + params { + test_data = '' + } + + workflow { + """ + validate_params = false + input[0] = workflow + input[1] = validate_params + input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } + + test("Should validate params") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" + """ + } + } + + then { + assertAll( + { assert workflow.failed }, + { assert workflow.stdout.any { it.contains('ERROR ~ Validation of pipeline parameters failed!') } } + ) + } + } + + test("Should run nothing - custom schema") { + + when { + + params { + test_data = '' + } + + workflow { + """ + validate_params = false + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } + + test("Should validate params - custom schema") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" + """ + } + } + + then { + assertAll( + { assert workflow.failed }, + { assert workflow.stdout.any { it.contains('ERROR ~ Validation of pipeline parameters failed!') } } + ) + } + } + + test("Should create a help message") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = true + input[4] = false + input[5] = false + input[6] = "Before" + input[7] = "After" + input[8] = "nextflow run test/test" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config new file mode 100644 index 00000000..f6537cc3 --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -0,0 +1,8 @@ +plugins { + id "nf-schema@2.6.1" +} + +validation { + parametersSchema = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + monochromeLogs = true +} diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json new file mode 100644 index 00000000..331e0d2f --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json @@ -0,0 +1,96 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://raw.githubusercontent.com/./master/nextflow_schema.json", + "title": ". pipeline parameters", + "description": "", + "type": "object", + "$defs": { + "input_output_options": { + "title": "Input/output options", + "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Define where the pipeline should find input data and save output data.", + "required": ["outdir"], + "properties": { + "validate_params": { + "type": "boolean", + "description": "Validate parameters?", + "default": true, + "hidden": true + }, + "outdir": { + "type": "string", + "format": "directory-path", + "description": "The output directory where the results will be saved. You have to use absolute paths to storage on Cloud infrastructure.", + "fa_icon": "fas fa-folder-open" + }, + "test_data_base": { + "type": "string", + "default": "https://raw.githubusercontent.com/nf-core/test-datasets/modules", + "description": "Base for test data directory", + "hidden": true + }, + "test_data": { + "type": "string", + "description": "Fake test data param", + "hidden": true + } + } + }, + "generic_options": { + "title": "Generic options", + "type": "object", + "fa_icon": "fas fa-file-import", + "description": "Less common options for the pipeline, typically set in a config file.", + "help_text": "These options are common to all nf-core pipelines and allow you to customise some of the core preferences for how the pipeline runs.\n\nTypically these options would be set in a Nextflow config file loaded for all pipeline runs, such as `~/.nextflow/config`.", + "properties": { + "help": { + "type": "boolean", + "description": "Display help text.", + "fa_icon": "fas fa-question-circle", + "hidden": true + }, + "version": { + "type": "boolean", + "description": "Display version and exit.", + "fa_icon": "fas fa-question-circle", + "hidden": true + }, + "logo": { + "type": "boolean", + "default": true, + "description": "Display nf-core logo in console output.", + "fa_icon": "fas fa-image", + "hidden": true + }, + "singularity_pull_docker_container": { + "type": "boolean", + "description": "Pull Singularity container from Docker?", + "hidden": true + }, + "publish_dir_mode": { + "type": "string", + "default": "copy", + "description": "Method used to save pipeline results to output directory.", + "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", + "fa_icon": "fas fa-copy", + "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], + "hidden": true + }, + "monochrome_logs": { + "type": "boolean", + "description": "Use monochrome_logs", + "hidden": true + } + } + } + }, + "allOf": [ + { + "$ref": "#/$defs/input_output_options" + }, + { + "$ref": "#/$defs/generic_options" + } + ] +} diff --git a/tests/.nftignore b/tests/.nftignore new file mode 100644 index 00000000..cc559757 --- /dev/null +++ b/tests/.nftignore @@ -0,0 +1,100 @@ +# === SYSTEM FILES === +.DS_Store +**/.DS_Store + +# === PIPELINE EXECUTION METADATA === +pipeline_info/*.{html,json,txt,yml} + +# === MULTIQC OUTPUTS === +# MultiQC files contain timestamps, system paths, and run-specific data +multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt +multiqc/multiqc_data/BETA-multiqc.parquet +**/multiqc.log +**/multiqc_data.json +**/multiqc_report.html +**/multiqc_*_deseq2_pca_1-plot.txt +**/multiqc_sources.txt +**/mqc_picard_quality_*.txt +**/mqc_picard_*.txt +**/multiqc_picard*.txt +**/multiqc_samtools*.txt +**/mqc_read_distribution_profile_1.txt +multiqc/multiqc_data/multiqc_software_versions.txt +multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} + +# === QC TOOL OUTPUTS === +fastqc/*_fastqc.{html,zip} +**/*_fastqc.html +**/*_val_*_fastqc.html + +# === BINARY AND COMPRESSED FILES === +**/*.{pdf,png,svg,gz,bam,bai,bigWig,zip,RData,rds} + +# === TOOL-SPECIFIC METRICS FILES === +# Picard metrics +**/*.quality_distribution_metrics +**/*.quality_by_cycle_metrics +**/*.insert_size_metrics +**/*.alignment_summary_metrics +**/*.base_distribution_by_cycle_metrics +**/*.MarkDuplicates.metrics.txt +# Picard MarkDuplicates metrics as renamed by this pipeline's ext.prefix +# (merged library + merged replicate). Their header carries a per-run +# "Started on: " line, so the md5 is not reproducible across runs. +**/*.mkD.sorted.metrics.txt +**/*.mRp.clN.sorted.metrics.txt + +# Samtools +**/*.bam.stats + +# Trimming reports +**/*_trimming_report.txt + +# Generic outputs +**/*.out + +# === ANALYSIS RESULTS (FLOATING-POINT VARIATIONS) === +# DeepTools outputs +**/*.plotFingerprint.raw.txt +**/*.plotFingerprint.qcmetrics.txt +**/*.computeMatrix.vals.mat.tab +**/*.plotHeatmap.mat.tab +**/*.computeMatrix.mat.gz +**/*.plotProfile.tab + +# Peak calling and annotation +**/*.annotatePeaks.txt +**/*.boolean.annotatePeaks.txt +**/macs3_peak.*.summary.txt + + +# Statistical analysis +**/*.pca.vals.txt +**/*.pca.vals_mqc.tsv +**/*.sample.dists.txt +**/*.sample.dists_mqc.tsv + +# Ataqv outputs +**/*.ataqv.json + +# === YAML CONFIGURATION FILES === +**/deeptools_plot_profile_mlib_deeptools.yaml +**/multiqc_deseq2_clustering_1.yaml +**/multiqc_deseq2_pca_1.yaml +**/multiqc_sources.yaml +**/read_distribution_profile.yaml +**/deeptools_fingerprint_plot.yaml +**/deeptools_plot_fingerprint_counts_mlib_deeptools.yaml +**/multiqc_mlib_deseq2_clustering_1-plot.yaml +**/multiqc_mrep_deseq2_clustering_1-plot.yaml + +# === CHIP-SEQ SPECIFIC OUTPUTS === +# PhantomPeakQualTools outputs (contain variable correlation data) +**/*.spp_correlation_mqc.tsv +**/*.spp_nsc_mqc.tsv +**/*.spp_rsc_mqc.tsv + +# === IGV SESSION FILES === +# IGV session files contain absolute paths and timestamps +**/igv_files.txt +**/igv_session.xml diff --git a/tests/bowtie2.nf.test b/tests/bowtie2.nf.test new file mode 100644 index 00000000..bf146091 --- /dev/null +++ b/tests/bowtie2.nf.test @@ -0,0 +1,58 @@ +nextflow_pipeline { + + name "Test pipeline with bowtie2 aligner" + script "../main.nf" + tag "bowtie2" + + test("bowtie2") { + + when { + params { + outdir = "$outputDir" + aligner = "bowtie2" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + + assertAll( + { assert workflow.success }, + { assert snapshot( + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_atacseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) + } + } + + test("bowtie2 with stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + aligner = "bowtie2" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.trace.succeeded().size() + ).match() } + ) + } + } +} diff --git a/tests/bowtie2.nf.test.snap b/tests/bowtie2.nf.test.snap new file mode 100644 index 00000000..12846983 --- /dev/null +++ b/tests/bowtie2.nf.test.snap @@ -0,0 +1,1132 @@ +{ + "bowtie2": { + "content": [ + 264, + { + "BAMTOOLS_FILTER": { + "bamtools": "2.5.2", + "samtools": "1.15.1" + }, + "BAM_REMOVE_ORPHANS": { + "samtools": "1.15.1" + }, + "BEDTOOLS_GENOMECOV": { + "bedtools": "2.31.1", + "sort": "sort (GNU coreutils) 9.5" + }, + "BOWTIE2_ALIGN": { + "bowtie2": "2.5.4", + "pigz": 2.8, + "samtools": 1.21 + }, + "BOWTIE2_BUILD": { + "bowtie2": "2.5.4" + }, + "DEEPTOOLS_COMPUTEMATRIX_REFERENCE_POINT": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_COMPUTEMATRIX_SCALE_REGIONS": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTHEATMAP": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTPROFILE": { + "deeptools": "3.5.6" + }, + "DESEQ2_QC": { + "bioconductor-deseq2": "1.28.0", + "r-base": "4.0.3" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "FRIP_SCORE": { + "bedtools": "2.30.0", + "samtools": "1.15.1" + }, + "GENOME_BLACKLIST_REGIONS": { + "bedtools": "2.30.0" + }, + "GET_AUTOSOMES": { + "python": "3.8.3" + }, + "GTF2BED": { + "perl": "5.26.2" + }, + "HOMER_ANNOTATEPEAKS": { + "homer": 4.11 + }, + "IGV": { + "python": "3.8.3" + }, + "KHMER_UNIQUEKMERS": { + "khmer": "3.0.0a3" + }, + "MACS3_CALLPEAK": { + "macs3": "3.0.4" + }, + "MACS3_CONSENSUS": { + "python": "3.10.0", + "r-base": "4.1.1" + }, + "MERGED_LIBRARY_ATAQV_ATAQV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_ATAQV_MKARV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_DEEPTOOLS_PLOTFINGERPRINT": { + "deeptools": "3.5.6" + }, + "MERGED_LIBRARY_PICARD_COLLECTMULTIPLEMETRICS": { + "picard": "3.4.0" + }, + "MULTIQC_CUSTOM_PEAKS": { + "sed": 4.7 + }, + "PICARD_MARKDUPLICATES": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_LIBRARY": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_REPLICATE": { + "picard": "3.4.0" + }, + "PLOT_HOMER_ANNOTATEPEAKS": { + "r-base": "4.0.3" + }, + "PLOT_MACS3_QC": { + "r-base": "4.0.3" + }, + "SAMPLESHEET_CHECK": { + "python": "3.8.3" + }, + "SAMTOOLS_FAIDX": { + "samtools": "1.23.1" + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": 1.24 + }, + "SAMTOOLS_IDXSTATS": { + "samtools": 1.24 + }, + "SAMTOOLS_INDEX": { + "samtools": 1.24 + }, + "SAMTOOLS_SORT": { + "samtools": 1.24 + }, + "SAMTOOLS_STATS": { + "samtools": 1.24 + }, + "SUBREAD_FEATURECOUNTS": { + "subread": "2.0.1" + }, + "TRIMGALORE": { + "trimgalore": "2.1.0" + }, + "TSS_EXTRACT": { + "sed": 4.7 + }, + "UCSC_BEDGRAPHTOBIGWIG": { + "ucsc": 482 + } + }, + [ + "bowtie2", + "bowtie2/merged_library", + "bowtie2/merged_library/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam", + "bowtie2/merged_library/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.bai", + "bowtie2/merged_library/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam", + "bowtie2/merged_library/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.bai", + "bowtie2/merged_library/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam", + "bowtie2/merged_library/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.bai", + "bowtie2/merged_library/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam", + "bowtie2/merged_library/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.bai", + "bowtie2/merged_library/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam", + "bowtie2/merged_library/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.bai", + "bowtie2/merged_library/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam", + "bowtie2/merged_library/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.bai", + "bowtie2/merged_library/ataqv", + "bowtie2/merged_library/ataqv/broad_peak", + "bowtie2/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.ataqv.json", + "bowtie2/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.ataqv.json", + "bowtie2/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.ataqv.json", + "bowtie2/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.ataqv.json", + "bowtie2/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.ataqv.json", + "bowtie2/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.ataqv.json", + "bowtie2/merged_library/ataqv/broad_peak/html", + "bowtie2/merged_library/ataqv/broad_peak/html/css", + "bowtie2/merged_library/ataqv/broad_peak/html/css/ataqv.css", + "bowtie2/merged_library/ataqv/broad_peak/html/css/datatables.buttons.min.css", + "bowtie2/merged_library/ataqv/broad_peak/html/css/datatables.fontawesome.css", + "bowtie2/merged_library/ataqv/broad_peak/html/css/datatables.min.css", + "bowtie2/merged_library/ataqv/broad_peak/html/css/font-awesome.min.css", + "bowtie2/merged_library/ataqv/broad_peak/html/css/normalize.css", + "bowtie2/merged_library/ataqv/broad_peak/html/data", + "bowtie2/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T0_PE_REP1.json.gz", + "bowtie2/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T0_PE_REP2.json.gz", + "bowtie2/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T100_SE_REP1.json.gz", + "bowtie2/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T100_SE_REP2.json.gz", + "bowtie2/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T150_SE_REP1.json.gz", + "bowtie2/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T15_PE_REP1.json.gz", + "bowtie2/merged_library/ataqv/broad_peak/html/fonts", + "bowtie2/merged_library/ataqv/broad_peak/html/fonts/FontAwesome.otf", + "bowtie2/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.eot", + "bowtie2/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.svg", + "bowtie2/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.ttf", + "bowtie2/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff", + "bowtie2/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff2", + "bowtie2/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regular.woff", + "bowtie2/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regularit.woff", + "bowtie2/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semibold.woff", + "bowtie2/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semiboldit.woff", + "bowtie2/merged_library/ataqv/broad_peak/html/index.html", + "bowtie2/merged_library/ataqv/broad_peak/html/js", + "bowtie2/merged_library/ataqv/broad_peak/html/js/ataqv.js", + "bowtie2/merged_library/ataqv/broad_peak/html/js/configuration.js", + "bowtie2/merged_library/ataqv/broad_peak/html/js/d3.min.js", + "bowtie2/merged_library/ataqv/broad_peak/html/js/datatables.min.js", + "bowtie2/merged_library/ataqv/broad_peak/html/js/jszip.min.js", + "bowtie2/merged_library/bigwig", + "bowtie2/merged_library/bigwig/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.bigWig", + "bowtie2/merged_library/bigwig/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.bigWig", + "bowtie2/merged_library/bigwig/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.bigWig", + "bowtie2/merged_library/bigwig/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.bigWig", + "bowtie2/merged_library/bigwig/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.bigWig", + "bowtie2/merged_library/bigwig/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.bigWig", + "bowtie2/merged_library/bigwig/scale", + "bowtie2/merged_library/bigwig/scale/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_factor.txt", + "bowtie2/merged_library/bigwig/scale/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_factor.txt", + "bowtie2/merged_library/bigwig/scale/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt", + "bowtie2/merged_library/bigwig/scale/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt", + "bowtie2/merged_library/bigwig/scale/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt", + "bowtie2/merged_library/bigwig/scale/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt", + "bowtie2/merged_library/deeptools", + "bowtie2/merged_library/deeptools/plotfingerprint", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.pdf", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.pdf", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.raw.txt", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.pdf", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.pdf", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.raw.txt", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.pdf", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.pdf", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bowtie2/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bowtie2/merged_library/deeptools/plotprofile", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.plotProfile.pdf", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.plotProfile.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.plotProfile.pdf", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.plotProfile.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bowtie2/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bowtie2/merged_library/macs3", + "bowtie2/merged_library/macs3/broad_peak", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.annotatePeaks.txt", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.annotatePeaks.txt", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak", + "bowtie2/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls", + "bowtie2/merged_library/macs3/broad_peak/consensus", + "bowtie2/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.annotatePeaks.txt", + "bowtie2/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.bed", + "bowtie2/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.intersect.plot.pdf", + "bowtie2/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.intersect.txt", + "bowtie2/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.txt", + "bowtie2/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.tsv", + "bowtie2/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.tsv.summary", + "bowtie2/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.saf", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/R_sessionInfo.log", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.dds.RData", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.pca.vals.txt", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.pca.vals_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.plots.pdf", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.rds", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.sample.dists.txt", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.sample.dists_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/size_factors", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt", + "bowtie2/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/consensus_peaks.mLb.clN.size_factors.RData", + "bowtie2/merged_library/macs3/broad_peak/qc", + "bowtie2/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.plots.pdf", + "bowtie2/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary.txt", + "bowtie2/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary_mqc.tsv", + "bowtie2/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.plots.pdf", + "bowtie2/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.summary.txt", + "bowtie2/merged_library/picard_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.metrics.txt", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.metrics.txt", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.metrics.txt", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.metrics.txt", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.metrics.txt", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bowtie2/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.metrics.txt", + "bowtie2/merged_library/picard_metrics/pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bowtie2/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bowtie2/merged_library/samtools_stats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.flagstat", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.idxstats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.stats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.flagstat", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.idxstats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.stats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.flagstat", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.stats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.stats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.flagstat", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.idxstats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.stats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.flagstat", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.idxstats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.stats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.flagstat", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.stats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.stats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.stats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.stats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.stats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats", + "bowtie2/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.stats", + "bowtie2/merged_replicate", + "bowtie2/merged_replicate/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam", + "bowtie2/merged_replicate/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.bai", + "bowtie2/merged_replicate/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam", + "bowtie2/merged_replicate/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.bai", + "bowtie2/merged_replicate/bigwig", + "bowtie2/merged_replicate/bigwig/OSMOTIC_STRESS_T0_PE.mRp.clN.bigWig", + "bowtie2/merged_replicate/bigwig/OSMOTIC_STRESS_T100_SE.mRp.clN.bigWig", + "bowtie2/merged_replicate/bigwig/scale", + "bowtie2/merged_replicate/bigwig/scale/OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt", + "bowtie2/merged_replicate/bigwig/scale/OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt", + "bowtie2/merged_replicate/macs3", + "bowtie2/merged_replicate/macs3/broad_peak", + "bowtie2/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.annotatePeaks.txt", + "bowtie2/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak", + "bowtie2/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak", + "bowtie2/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls", + "bowtie2/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.annotatePeaks.txt", + "bowtie2/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak", + "bowtie2/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak", + "bowtie2/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls", + "bowtie2/merged_replicate/macs3/broad_peak/consensus", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.annotatePeaks.txt", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.bed", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.intersect.plot.pdf", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.intersect.txt", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.txt", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.tsv", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.tsv.summary", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.saf", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/R_sessionInfo.log", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.dds.RData", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.pca.vals.txt", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.pca.vals_mqc.tsv", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.plots.pdf", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.rds", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.sample.dists.txt", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.sample.dists_mqc.tsv", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/consensus_peaks.mRp.clN.size_factors.RData", + "bowtie2/merged_replicate/macs3/broad_peak/qc", + "bowtie2/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv", + "bowtie2/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv", + "bowtie2/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv", + "bowtie2/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv", + "bowtie2/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.plots.pdf", + "bowtie2/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary.txt", + "bowtie2/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary_mqc.tsv", + "bowtie2/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.plots.pdf", + "bowtie2/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.summary.txt", + "bowtie2/merged_replicate/picard_metrics", + "bowtie2/merged_replicate/picard_metrics/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.metrics.txt", + "bowtie2/merged_replicate/picard_metrics/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.metrics.txt", + "bowtie2/merged_replicate/samtools_stats", + "bowtie2/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat", + "bowtie2/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats", + "bowtie2/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.stats", + "bowtie2/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat", + "bowtie2/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats", + "bowtie2/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.stats", + "fastqc", + "fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T100_SE_REP1_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T100_SE_REP2_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T150_SE_REP1_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T150_SE_REP1_T2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_2_fastqc.html", + "fastqc/zips", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T100_SE_REP1_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T100_SE_REP2_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_2_fastqc.zip", + "genome", + "genome/genome.fa", + "genome/genome.fa.fai", + "igv", + "igv/broad_peak", + "igv/broad_peak/igv_files.txt", + "igv/broad_peak/igv_session.xml", + "multiqc", + "multiqc/broad_peak", + "multiqc/broad_peak/multiqc_data", + "multiqc/broad_peak/multiqc_data/deeptools_plot_fingerprint_counts_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/deeptools_plot_profile_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_filtered_reads_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_trimmed_sequences_plot_3_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt", + "multiqc/broad_peak/multiqc_data/mqc_deeptools_fingerprint_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_adapter_content_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_adapter_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_n_content_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_n_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_sequence_quality_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_sequence_quality_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_quality_scores_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_quality_scores_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_counts_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_counts_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_duplication_levels_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_duplication_levels_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_length_distribution_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_featureCounts_assignment_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_featureCounts_assignment_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_readlength_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Adenine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Cytosine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Guanine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Thymine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Undetermined.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_by_cycle_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_score_distribution_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_read_distribution_profile_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-3_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-4_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc.log", + "multiqc/broad_peak/multiqc_data/multiqc_citations.txt", + "multiqc/broad_peak/multiqc_data/multiqc_cutadapt.txt", + "multiqc/broad_peak/multiqc_data/multiqc_data.json", + "multiqc/broad_peak/multiqc_data/multiqc_fastqc.txt", + "multiqc/broad_peak/multiqc_data/multiqc_fastqc_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_featureCounts_mlib_featurecounts.txt", + "multiqc/broad_peak/multiqc_data/multiqc_featureCounts_mrep_featurecounts.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_deseq2_clustering_1-plot.yaml", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_deseq2_pca_1-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_deseq2_clustering_1-plot.yaml", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_deseq2_pca_1-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_AlignmentSummaryMetrics.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_baseContent.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_insertSize.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_by_cycle.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_score_distribution.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_sources.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_2.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_3.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_4.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_5.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_2.txt", + "multiqc/broad_peak/multiqc_plots", + "multiqc/broad_peak/multiqc_plots/pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_filtered_reads_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_filtered_reads_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_deeptools_fingerprint_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_adapter_content_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_adapter_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_n_content_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_n_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_sequence_quality_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_sequence_quality_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_quality_scores_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_quality_scores_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_duplication_levels_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_duplication_levels_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_length_distribution_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_readlength_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Adenine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Cytosine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Guanine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Thymine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Undetermined.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_by_cycle_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_score_distribution_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_read_distribution_profile_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_filtered_reads_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_filtered_reads_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_trimmed_sequences_plot_3_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_deeptools_fingerprint_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_adapter_content_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_adapter_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_n_content_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_n_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_sequence_quality_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_sequence_quality_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_quality_scores_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_quality_scores_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_duplication_levels_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_duplication_levels_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_length_distribution_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_readlength_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Adenine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Cytosine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Guanine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Thymine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Undetermined.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_by_cycle_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_score_distribution_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_read_distribution_profile_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_filtered_reads_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_filtered_reads_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_trimmed_sequences_plot_3_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_deeptools_fingerprint_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_adapter_content_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_adapter_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_n_content_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_n_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_sequence_quality_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_sequence_quality_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_quality_scores_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_quality_scores_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_duplication_levels_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_duplication_levels_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_length_distribution_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_readlength_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Adenine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Cytosine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Guanine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Thymine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Undetermined.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_by_cycle_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_score_distribution_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_read_distribution_profile_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_atacseq_software_mqc_versions.yml", + "pipeline_info/samplesheet.valid.csv", + "trimgalore", + "trimgalore/fastqc", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T100_SE_REP1_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T100_SE_REP2_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T150_SE_REP1_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T150_SE_REP1_T2_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_2_val_2_fastqc.html", + "trimgalore/fastqc/zips", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T100_SE_REP1_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T100_SE_REP2_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T2_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_2_val_2_fastqc.zip", + "trimgalore/logs", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP1_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP1_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP2_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP2_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T100_SE_REP1_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T100_SE_REP2_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T150_SE_REP1_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T150_SE_REP1_T2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T2_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T2_2.fastq.gz_trimming_report.txt" + ], + [ + "ataqv.css:md5,7bb9e18974018dd29bdc12a46a6d6d65", + "datatables.buttons.min.css:md5,675306abc9d3239314f2c66c0e22ef7a", + "datatables.fontawesome.css:md5,716d7a3edd2c75e712b1ffe26f12a861", + "datatables.min.css:md5,00ef3e39d9302618395ab189ec8bcd9f", + "font-awesome.min.css:md5,89916fa773ce96569604016ef25cab50", + "normalize.css:md5,40d20cc85100840580df4346bb99d7ed", + "FontAwesome.otf:md5,9ccfa32dd4cd1b8e83f68899d85bd5e6", + "fontawesome-webfont.eot:md5,404a525502f8e5ba7e93b9f02d9e83a9", + "fontawesome-webfont.ttf:md5,fb650aaf10736ffb9c4173079616bf01", + "fontawesome-webfont.woff:md5,891e3f340c1126b4c7c142e5f6e86816", + "fontawesome-webfont.woff2:md5,926c93d201fe51c8f351e858468980c3", + "sourcesanspro-regular.woff:md5,f7bd788f18b8c4bb93dd37d140348e1e", + "sourcesanspro-regularit.woff:md5,c3638b17f4fd76dae12fe2ae14571e57", + "sourcesanspro-semibold.woff:md5,e7fc8925d9364e9d177d9e1d08bb1855", + "sourcesanspro-semiboldit.woff:md5,f1d255aa459786dfc6aa2e488ac01245", + "index.html:md5,bf7747be761e56ad7c54c842ac88461a", + "ataqv.js:md5,feb291b7839e9e43ed304565e3a605d9", + "configuration.js:md5,afe3f9608e538a5796e6919be7cabbb9", + "d3.min.js:md5,db69fb2626a71a286ee772d673138aca", + "datatables.min.js:md5,e369b872620dadb05e4eb555b81f9112", + "jszip.min.js:md5,09e492cb492ffa75484bbe10f1f721d1", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_factor.txt:md5,931e592897ee0c12682a7d65568669df", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_factor.txt:md5,990df2808373845e0437937892f2d0c5", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt:md5,b764128ab7799892423b19c6ccb4b626", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt:md5,7ed7b206a39780b25a28f11ae1fe2563", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt:md5,ba5d361c216adf49f63b66b00b50ac80", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt:md5,36ea1d92600c535a6b966c4df30f96da", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak:md5,ea09e6f989d568179bb6d4016ce6b05c", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak:md5,91e4852cc182ab06692cb0936a3dfd82", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls:md5,3aa9e3d8b25593fc02b884a808c90b5c", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak:md5,3559a09af9279f20ddabf5b0ca57e5b5", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak:md5,e5a81c1caabc1c71211df97dda992515", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls:md5,8caebfd80d032f2fda0626a943473788", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak:md5,b027f21fdeeab2aded434cdf0662eade", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak:md5,6e64f155827575fb754e213de15a5a12", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls:md5,2a7578415788e84d2ca9d3f99a8be09b", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak:md5,7ed9fb69f2f1eadd70f91217d26fe86c", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak:md5,2678af767301096f6cb5e60a2563df2b", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls:md5,060dcc556290495972cb7e4d80444575", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak:md5,129556575051c20ae6bfc8439f96c01d", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak:md5,0254646bba0c3a10e47055626d647259", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls:md5,e327b95afd2b665f64f44b938ecff4a7", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak:md5,2639ddfabd8ef8ffe1209cd565e32fa1", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak:md5,552bde3429fcda63c6dc8151cd381d40", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls:md5,241fb2b28eef4bee1a259b26d150c9f0", + "consensus_peaks.mLb.clN.bed:md5,2887f1e35b9eea82a9de1c92cb43e7ae", + "consensus_peaks.mLb.clN.boolean.intersect.txt:md5,5a4f92efb0a79bf7fbbd50c5ed5bfbbd", + "consensus_peaks.mLb.clN.boolean.txt:md5,c4499f15dd2f076262a9689785a9e5d4", + "consensus_peaks.mLb.clN.featureCounts.tsv:md5,8f96955dd800632c8f5343a1897a6901", + "consensus_peaks.mLb.clN.featureCounts.tsv.summary:md5,f72c779fba50615978af0582b56190c2", + "consensus_peaks.mLb.clN.saf:md5,add1c0c9dab6be6861c93bd3efce5ecd", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,575217248fd623bf1eb8dd535df3ba11", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,fc1dc5428a67ce1f812f04ebe128eb92", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,994af920ffac65bae6233ecb13b8637e", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,9036c6e9d107e7828bb23af780f0de88", + "OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt:md5,7d35bd13b608e03d40a55e3f3bfd09a8", + "OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt:md5,f4e83fb27d38331f522ad1d17e284b89", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,43cf646f6d45a983082cc3251b9e550c", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,b43f9274c85d0ab50a4f5f1235c5f777", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,12289eeeae627b94423d89b7eba91d01", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,eb861e97fcf6b646626b7ff29e03a4c1", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,ec6195096608607c081601c2b61411cc", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,c04d469e086639581323a44d3dbe217f", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,0f639ade223d89f5f78ff9e43e275e66", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,1b0c0f2fef3c077a67d473f3e09700de", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,d37cbde47fd8224923be52679f5d6b8f", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,d0bf563208c13870fc2b0107063ba879", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,cfe751946da554b4f51518a931d990af", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,a293054721f310bb511bae69d4d541d0", + "macs3_annotatePeaks.mLb.clN.summary.txt:md5,b695a9f109656582187b7db01b176b2f", + "macs3_annotatePeaks.mLb.clN.summary_mqc.tsv:md5,133040831ed7c47490fb9bfc38aa34cb", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,a36a8c1bf7dbdbf8807858d5578a0612", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,bdaa4c2a2264ba3f3ad166d91ce176ef", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,90be54f065cb6ccc358ccb69c56656de", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,44282809be0f563ce40775806e46a424", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.flagstat:md5,faf057f77c4462e02cdfe6cba4f4ddec", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats:md5,5d13ecb3ec023772dd9c5d5e3a7b3bd6", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat:md5,7f0346772ba46532a687aba740594e26", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats:md5,03cc0e84f9e3cb85114473fc32605076", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,e3fc34b1832878b61561bb5c6a46cb23", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,36f417ecb760406071742737bd07cc9b", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,2d8c72f8a3c722c70cb0c10b8aa9dc74", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,62266fef4d33ff44ad1b40589974ece3", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.flagstat:md5,7c76c8f4e7cc207efd7d616f3f287ca1", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats:md5,f3e617c458fb1390759dc18abe693e60", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat:md5,76674907f4cf5dd3e2fda0802c3e8eec", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats:md5,d0364691f61688e2b6cef0b1f28605a8", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,51603ca6d91847e76f1bb397c8939501", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,3eefc8594c35d6a521d748aa68a06159", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,102c8a7d777971bca5d740d510131926", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,895ed98fe85013ee878aa22dbc2ce385", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,392118e7c3deb0cd108d146f660392e0", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,73c076dbdf8d523529412dc0a08bac03", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,7f245915cacdc9253ca89b83b76181a2", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,91dc7ae22676a472506f41b3a77d8cda", + "OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt:md5,63a6d38b1880deb834410ba489a290dc", + "OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt:md5,15269ddf149c62c9aa22a75a774f1a55", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak:md5,252f711057f3c782105e5511f6422d97", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak:md5,16f1c00483106202f7922115a37bafd4", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls:md5,640076e941c4b71ffe9d9c3dedccd81e", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak:md5,2dc1c575b4dc03e20fd2680cc9b04b88", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak:md5,e05c7ef694608aa2d63e0f2057270d2e", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls:md5,db177400e0402a3bad2657d171ef47ff", + "consensus_peaks.mRp.clN.bed:md5,b29a19860b56b6d33cddf37d99a23891", + "consensus_peaks.mRp.clN.boolean.intersect.txt:md5,a594441b7196b3e84c9b834e9566931d", + "consensus_peaks.mRp.clN.boolean.txt:md5,e655d0af796a8d2599b3492be2d2454f", + "consensus_peaks.mRp.clN.featureCounts.tsv:md5,df145c73c03d99fb3db6b47f214f270c", + "consensus_peaks.mRp.clN.featureCounts.tsv.summary:md5,ee1054c488d5d0f70d8b616dc91f6e1b", + "consensus_peaks.mRp.clN.saf:md5,76c841ae13edf75ba7f5b0fd306ed142", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,42a2f7eb49ffc240c2312f32edb05b9a", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,8393cdf9977f80429e4b8efb5f06f404", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,68fffdc01fd148ffa4ea30a53632eb6b", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,6944ba21c188164bc64983e3c6683f3b", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv:md5,862582629bf4b2d0b604a1b55b00b8fc", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv:md5,ca9b57ac3e220d160e872720c4104743", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv:md5,6739406cd76451c426cd082c9ab42481", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv:md5,be0f2b534a3f40cb5f33c4094ac11243", + "macs3_annotatePeaks.mRp.clN.summary.txt:md5,6ed4acc31e584f5976e020adb0c2c8f8", + "macs3_annotatePeaks.mRp.clN.summary_mqc.tsv:md5,0c7441ea33d970ec39db6410db33641f", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat:md5,44795ed8fe210ebfdde5a16690dcabd2", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats:md5,656c6de519c345a2e517ea7cf8ef82ce", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat:md5,27be28a3a20502b2e535adba7d2519c8", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats:md5,f8d5bd0d5ae20ea09384ddd9d9f6875f", + "genome.fa:md5,4bad9f4b18056156a81f7f952abbe125", + "genome.fa.fai:md5,6f4c0ce5258e6948135ad006e1f9ee1b", + "deeptools_plot_fingerprint_counts_mlib_deeptools.txt:md5,7bc385cf49df27f4ff287e75ed4223d2", + "deeptools_plot_profile_mlib_deeptools.txt:md5,3c74002bc0bc18921860ef381f97ae77", + "mqc_cutadapt_filtered_reads_plot_1.txt:md5,b78f69173122f2cacf8121eaeb815382", + "mqc_cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,157073209c492b89badba367b1c57d83", + "mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,b04ae8b2ec27d71817ae7cb666888b9b", + "mqc_deeptools_fingerprint_plot_1.txt:md5,eb5bbc83c5602c300899c419a2e71a76", + "mqc_fastqc_adapter_content_plot-2_1.txt:md5,3560a22f94aea25e27d97e056fb478ed", + "mqc_fastqc_adapter_content_plot_1.txt:md5,66f3e2f6ba14599b0d6c20144df60777", + "mqc_fastqc_per_base_n_content_plot-2_1.txt:md5,d79e95d36d955edee3e4bfb139dce967", + "mqc_fastqc_per_base_n_content_plot_1.txt:md5,8d9cdd0463193b7e10332e2ca0273aca", + "mqc_fastqc_per_base_sequence_quality_plot-2_1.txt:md5,3bb6cad69480846e4003b9f0f3511caa", + "mqc_fastqc_per_base_sequence_quality_plot_1.txt:md5,821cb87b0ae8bd61cd445d153b8f371a", + "mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt:md5,88fb0e924094b5dd57f4003ac13fd1f4", + "mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt:md5,a4b37bca5e61bf595c4532ffbc8b8f93", + "mqc_fastqc_per_sequence_gc_content_plot_Counts.txt:md5,3fa7f0c0858d12cae8700e21774da86d", + "mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,a2d0c3ec413894e4dafa62ebdf44a06c", + "mqc_fastqc_per_sequence_quality_scores_plot-2_1.txt:md5,841ccc3da246bd197fc966e9f8c5ca57", + "mqc_fastqc_per_sequence_quality_scores_plot_1.txt:md5,3bfe1c94f710975829e2c1e3b5f16ea7", + "mqc_fastqc_sequence_counts_plot-2_1.txt:md5,c734a06e1f3e3afc1486a0b45be880e1", + "mqc_fastqc_sequence_counts_plot_1.txt:md5,d0cf8d64e742b5f446e6b602d86913b9", + "mqc_fastqc_sequence_duplication_levels_plot-2_1.txt:md5,d7ada8561d521eaf645073f7cccf7b82", + "mqc_fastqc_sequence_duplication_levels_plot_1.txt:md5,23c4883ed6c22212b0c3e07a863745d1", + "mqc_fastqc_sequence_length_distribution_plot_1.txt:md5,bc3acb40acbf620b237d0f2fa8c8a1ab", + "mqc_featureCounts_assignment_plot-2_1.txt:md5,2963815b8e8e8469a917dc0ddc3375d2", + "mqc_featureCounts_assignment_plot_1.txt:md5,86d1ec8a28848e38fb3cd7236fbffa1b", + "mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt:md5,9276bae8c9042ef2a1e4a7b7a8c2f231", + "mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt:md5,a33a1311653dc054f0056792705689e0", + "mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt:md5,4a615bbabd9fa9ff406274a2ccee4c06", + "mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt:md5,3df55334fea3eba5e1c635df6f066551", + "mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt:md5,bd70bdcb1cc7d51a262612653e49c440", + "mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt:md5,da21fd52db4b66a25b31dc1352bb49d9", + "mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt:md5,165bb5085b09efc73f817bd82981484d", + "mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt:md5,a45c3970069d4a5966f1491bb50d9123", + "mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt:md5,082f7ad53081c5a93690c73e8e4e35c3", + "mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,3fb1fdf70cf1ee3bed5aa8e81cce138e", + "mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,a6543459060e08acd7d4789e8a61ae19", + "mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,00e38ea9b252b3051396e7b915bb6669", + "mqc_samtools_alignment_plot-2_1.txt:md5,787c34f92b66c4495dd87e209a7ffada", + "mqc_samtools_alignment_plot-3_1.txt:md5,8a6a2e8ed5d0e1f43384bbdeb7220ea1", + "mqc_samtools_alignment_plot-4_1.txt:md5,0603c3a513fe04133c5f6bd41d84578e", + "mqc_samtools_alignment_plot_1.txt:md5,97a71616918d50f20e439bdda2aa9cec", + "multiqc_citations.txt:md5,34da9f7497d275274f6dfd3b89831edb", + "multiqc_cutadapt.txt:md5,926fcf7c5a9c5dc0a105a439c85a5f58", + "multiqc_fastqc.txt:md5,a9a7484add8120fc3cf3d5626a92973b", + "multiqc_fastqc_1.txt:md5,58ab2bbd2d19745e5975742c6d1335d7", + "multiqc_featureCounts_mlib_featurecounts.txt:md5,e4dad0f69a56aebc7b3d1674a6a0c9f2", + "multiqc_featureCounts_mrep_featurecounts.txt:md5,dbd3c88a1d6c5b5bd4efe0c5ad2493f9", + "multiqc_mlib_frip_score-plot.txt:md5,15e8e48bb609bcd103b3df769d6116e7", + "multiqc_mlib_peak_annotation-plot.txt:md5,5cf8a13eb9f4ad773e7281cb64f29859", + "multiqc_mlib_peak_count-plot.txt:md5,9451e9c6f55bb70114f04646c89e438f", + "multiqc_mrep_frip_score-plot.txt:md5,42185bd6a72d2990d39520c29f0f1711", + "multiqc_mrep_peak_annotation-plot.txt:md5,f036fbc63ba4500feb72cd0ffee3a2fa", + "multiqc_mrep_peak_count-plot.txt:md5,be2301d29256b03f159053e1b9f7775d", + "picard_histogram.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_3.txt:md5,fc2b0821fed14da8f161b48a6f04947b", + "picard_histogram_4.txt:md5,7cdffefa11196ef758cbdfe357ff5c9e", + "picard_histogram_5.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "samplesheet.valid.csv:md5,51b046b55592e95949824f21b12c7e49" + ] + ], + "timestamp": "2026-07-25T08:45:05.289955508", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "bowtie2 with stub": { + "content": [ + 26 + ], + "timestamp": "2026-03-20T22:48:53.767667318", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + } + } +} \ No newline at end of file diff --git a/tests/chromap.nf.test b/tests/chromap.nf.test new file mode 100644 index 00000000..59d71acc --- /dev/null +++ b/tests/chromap.nf.test @@ -0,0 +1,61 @@ +nextflow_pipeline { + + name "Test pipeline with chromap aligner" + script "../main.nf" + tag "chromap" + + test("chromap") { + + when { + params { + outdir = "$outputDir" + aligner = "chromap" + // Deliberately contains whitespace: seq_center is free text and reaches + // Picard AddOrReplaceReadGroups as --RGCN. Unquoted, Picard reads only the + // first word and rejects the rest as a positional argument. + seq_center = "Broad Institute" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success }, + { assert snapshot( + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_atacseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) + } + } + + test("chromap with stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + aligner = "chromap" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.trace.succeeded().size() + ).match() } + ) + } + } +} diff --git a/tests/chromap.nf.test.snap b/tests/chromap.nf.test.snap new file mode 100644 index 00000000..8f1c9036 --- /dev/null +++ b/tests/chromap.nf.test.snap @@ -0,0 +1,1138 @@ +{ + "chromap": { + "content": [ + 272, + { + "BAMTOOLS_FILTER": { + "bamtools": "2.5.2", + "samtools": "1.15.1" + }, + "BAM_REMOVE_ORPHANS": { + "samtools": "1.15.1" + }, + "BEDTOOLS_GENOMECOV": { + "bedtools": "2.31.1", + "sort": "sort (GNU coreutils) 9.5" + }, + "CHROMAP_CHROMAP": { + "chromap": "0.3.2-r518", + "samtools": "1.23.1" + }, + "CHROMAP_INDEX": { + "chromap": "0.3.2-r518" + }, + "DEEPTOOLS_COMPUTEMATRIX_REFERENCE_POINT": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_COMPUTEMATRIX_SCALE_REGIONS": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTHEATMAP": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTPROFILE": { + "deeptools": "3.5.6" + }, + "DESEQ2_QC": { + "bioconductor-deseq2": "1.28.0", + "r-base": "4.0.3" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "FRIP_SCORE": { + "bedtools": "2.30.0", + "samtools": "1.15.1" + }, + "GENOME_BLACKLIST_REGIONS": { + "bedtools": "2.30.0" + }, + "GET_AUTOSOMES": { + "python": "3.8.3" + }, + "GTF2BED": { + "perl": "5.26.2" + }, + "HOMER_ANNOTATEPEAKS": { + "homer": 4.11 + }, + "IGV": { + "python": "3.8.3" + }, + "KHMER_UNIQUEKMERS": { + "khmer": "3.0.0a3" + }, + "MACS3_CALLPEAK": { + "macs3": "3.0.4" + }, + "MACS3_CONSENSUS": { + "python": "3.10.0", + "r-base": "4.1.1" + }, + "MERGED_LIBRARY_ATAQV_ATAQV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_ATAQV_MKARV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_DEEPTOOLS_PLOTFINGERPRINT": { + "deeptools": "3.5.6" + }, + "MERGED_LIBRARY_PICARD_COLLECTMULTIPLEMETRICS": { + "picard": "3.4.0" + }, + "MULTIQC_CUSTOM_PEAKS": { + "sed": 4.7 + }, + "PICARD_ADDORREPLACEREADGROUPS": { + "picard": "3.4.0" + }, + "PICARD_MARKDUPLICATES": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_LIBRARY": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_REPLICATE": { + "picard": "3.4.0" + }, + "PLOT_HOMER_ANNOTATEPEAKS": { + "r-base": "4.0.3" + }, + "PLOT_MACS3_QC": { + "r-base": "4.0.3" + }, + "SAMPLESHEET_CHECK": { + "python": "3.8.3" + }, + "SAMTOOLS_FAIDX": { + "samtools": "1.23.1" + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": 1.24 + }, + "SAMTOOLS_IDXSTATS": { + "samtools": 1.24 + }, + "SAMTOOLS_INDEX": { + "samtools": 1.24 + }, + "SAMTOOLS_SORT": { + "samtools": 1.24 + }, + "SAMTOOLS_STATS": { + "samtools": 1.24 + }, + "SUBREAD_FEATURECOUNTS": { + "subread": "2.0.1" + }, + "TRIMGALORE": { + "trimgalore": "2.1.0" + }, + "TSS_EXTRACT": { + "sed": 4.7 + }, + "UCSC_BEDGRAPHTOBIGWIG": { + "ucsc": 482 + } + }, + [ + "chromap", + "chromap/merged_library", + "chromap/merged_library/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam", + "chromap/merged_library/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.bai", + "chromap/merged_library/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam", + "chromap/merged_library/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.bai", + "chromap/merged_library/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam", + "chromap/merged_library/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.bai", + "chromap/merged_library/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam", + "chromap/merged_library/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.bai", + "chromap/merged_library/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam", + "chromap/merged_library/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.bai", + "chromap/merged_library/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam", + "chromap/merged_library/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.bai", + "chromap/merged_library/ataqv", + "chromap/merged_library/ataqv/broad_peak", + "chromap/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.ataqv.json", + "chromap/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.ataqv.json", + "chromap/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.ataqv.json", + "chromap/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.ataqv.json", + "chromap/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.ataqv.json", + "chromap/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.ataqv.json", + "chromap/merged_library/ataqv/broad_peak/html", + "chromap/merged_library/ataqv/broad_peak/html/css", + "chromap/merged_library/ataqv/broad_peak/html/css/ataqv.css", + "chromap/merged_library/ataqv/broad_peak/html/css/datatables.buttons.min.css", + "chromap/merged_library/ataqv/broad_peak/html/css/datatables.fontawesome.css", + "chromap/merged_library/ataqv/broad_peak/html/css/datatables.min.css", + "chromap/merged_library/ataqv/broad_peak/html/css/font-awesome.min.css", + "chromap/merged_library/ataqv/broad_peak/html/css/normalize.css", + "chromap/merged_library/ataqv/broad_peak/html/data", + "chromap/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T0_PE_REP1.json.gz", + "chromap/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T0_PE_REP2.json.gz", + "chromap/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T100_SE_REP1.json.gz", + "chromap/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T100_SE_REP2.json.gz", + "chromap/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T150_SE_REP1.json.gz", + "chromap/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T15_PE_REP1.json.gz", + "chromap/merged_library/ataqv/broad_peak/html/fonts", + "chromap/merged_library/ataqv/broad_peak/html/fonts/FontAwesome.otf", + "chromap/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.eot", + "chromap/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.svg", + "chromap/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.ttf", + "chromap/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff", + "chromap/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff2", + "chromap/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regular.woff", + "chromap/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regularit.woff", + "chromap/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semibold.woff", + "chromap/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semiboldit.woff", + "chromap/merged_library/ataqv/broad_peak/html/index.html", + "chromap/merged_library/ataqv/broad_peak/html/js", + "chromap/merged_library/ataqv/broad_peak/html/js/ataqv.js", + "chromap/merged_library/ataqv/broad_peak/html/js/configuration.js", + "chromap/merged_library/ataqv/broad_peak/html/js/d3.min.js", + "chromap/merged_library/ataqv/broad_peak/html/js/datatables.min.js", + "chromap/merged_library/ataqv/broad_peak/html/js/jszip.min.js", + "chromap/merged_library/bigwig", + "chromap/merged_library/bigwig/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.bigWig", + "chromap/merged_library/bigwig/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.bigWig", + "chromap/merged_library/bigwig/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.bigWig", + "chromap/merged_library/bigwig/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.bigWig", + "chromap/merged_library/bigwig/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.bigWig", + "chromap/merged_library/bigwig/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.bigWig", + "chromap/merged_library/bigwig/scale", + "chromap/merged_library/bigwig/scale/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_factor.txt", + "chromap/merged_library/bigwig/scale/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_factor.txt", + "chromap/merged_library/bigwig/scale/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt", + "chromap/merged_library/bigwig/scale/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt", + "chromap/merged_library/bigwig/scale/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt", + "chromap/merged_library/bigwig/scale/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt", + "chromap/merged_library/deeptools", + "chromap/merged_library/deeptools/plotfingerprint", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.pdf", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.raw.txt", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.pdf", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.raw.txt", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.pdf", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.raw.txt", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.pdf", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.raw.txt", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.pdf", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.raw.txt", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.pdf", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "chromap/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.raw.txt", + "chromap/merged_library/deeptools/plotprofile", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.plotProfile.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.plotProfile.pdf", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.plotProfile.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.plotProfile.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.plotProfile.pdf", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.plotProfile.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.plotProfile.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.plotProfile.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "chromap/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "chromap/merged_library/macs3", + "chromap/merged_library/macs3/broad_peak", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.annotatePeaks.txt", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.annotatePeaks.txt", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak", + "chromap/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls", + "chromap/merged_library/macs3/broad_peak/consensus", + "chromap/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.annotatePeaks.txt", + "chromap/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.bed", + "chromap/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.intersect.plot.pdf", + "chromap/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.intersect.txt", + "chromap/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.txt", + "chromap/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.tsv", + "chromap/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.tsv.summary", + "chromap/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.saf", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/R_sessionInfo.log", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.dds.RData", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.pca.vals.txt", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.pca.vals_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.plots.pdf", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.rds", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.sample.dists.txt", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.sample.dists_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/size_factors", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt", + "chromap/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/consensus_peaks.mLb.clN.size_factors.RData", + "chromap/merged_library/macs3/broad_peak/qc", + "chromap/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.count_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.count_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.count_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.plots.pdf", + "chromap/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary.txt", + "chromap/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary_mqc.tsv", + "chromap/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.plots.pdf", + "chromap/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.summary.txt", + "chromap/merged_library/picard_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.metrics.txt", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.metrics.txt", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.metrics.txt", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.metrics.txt", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.metrics.txt", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "chromap/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.metrics.txt", + "chromap/merged_library/picard_metrics/pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "chromap/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "chromap/merged_library/samtools_stats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.flagstat", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.idxstats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.stats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.flagstat", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.idxstats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.stats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.flagstat", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.stats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.stats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.flagstat", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.idxstats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.stats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.flagstat", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.idxstats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.stats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.flagstat", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.stats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.stats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.stats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.stats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.stats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats", + "chromap/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.stats", + "chromap/merged_replicate", + "chromap/merged_replicate/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam", + "chromap/merged_replicate/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.bai", + "chromap/merged_replicate/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam", + "chromap/merged_replicate/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.bai", + "chromap/merged_replicate/bigwig", + "chromap/merged_replicate/bigwig/OSMOTIC_STRESS_T0_PE.mRp.clN.bigWig", + "chromap/merged_replicate/bigwig/OSMOTIC_STRESS_T100_SE.mRp.clN.bigWig", + "chromap/merged_replicate/bigwig/scale", + "chromap/merged_replicate/bigwig/scale/OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt", + "chromap/merged_replicate/bigwig/scale/OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt", + "chromap/merged_replicate/macs3", + "chromap/merged_replicate/macs3/broad_peak", + "chromap/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.annotatePeaks.txt", + "chromap/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak", + "chromap/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak", + "chromap/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls", + "chromap/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.annotatePeaks.txt", + "chromap/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak", + "chromap/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak", + "chromap/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls", + "chromap/merged_replicate/macs3/broad_peak/consensus", + "chromap/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.annotatePeaks.txt", + "chromap/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.bed", + "chromap/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.intersect.plot.pdf", + "chromap/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.intersect.txt", + "chromap/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.txt", + "chromap/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.tsv", + "chromap/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.tsv.summary", + "chromap/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.saf", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/R_sessionInfo.log", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.dds.RData", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.pca.vals.txt", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.pca.vals_mqc.tsv", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.plots.pdf", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.rds", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.sample.dists.txt", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.sample.dists_mqc.tsv", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt", + "chromap/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/consensus_peaks.mRp.clN.size_factors.RData", + "chromap/merged_replicate/macs3/broad_peak/qc", + "chromap/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv", + "chromap/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv", + "chromap/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv", + "chromap/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv", + "chromap/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.plots.pdf", + "chromap/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary.txt", + "chromap/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary_mqc.tsv", + "chromap/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.plots.pdf", + "chromap/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.summary.txt", + "chromap/merged_replicate/picard_metrics", + "chromap/merged_replicate/picard_metrics/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.metrics.txt", + "chromap/merged_replicate/picard_metrics/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.metrics.txt", + "chromap/merged_replicate/samtools_stats", + "chromap/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat", + "chromap/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats", + "chromap/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.stats", + "chromap/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat", + "chromap/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats", + "chromap/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.stats", + "fastqc", + "fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T100_SE_REP1_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T100_SE_REP2_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T150_SE_REP1_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T150_SE_REP1_T2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_2_fastqc.html", + "fastqc/zips", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T100_SE_REP1_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T100_SE_REP2_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_2_fastqc.zip", + "genome", + "genome/chromap", + "genome/chromap/index", + "genome/chromap/index/genome.index", + "genome/genome.fa", + "genome/genome.fa.fai", + "igv", + "igv/broad_peak", + "igv/broad_peak/igv_files.txt", + "igv/broad_peak/igv_session.xml", + "multiqc", + "multiqc/broad_peak", + "multiqc/broad_peak/multiqc_data", + "multiqc/broad_peak/multiqc_data/deeptools_plot_fingerprint_counts_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/deeptools_plot_profile_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_filtered_reads_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_trimmed_sequences_plot_3_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt", + "multiqc/broad_peak/multiqc_data/mqc_deeptools_fingerprint_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_adapter_content_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_adapter_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_n_content_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_n_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_sequence_quality_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_sequence_quality_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_quality_scores_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_quality_scores_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_counts_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_counts_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_duplication_levels_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_duplication_levels_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_length_distribution_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_featureCounts_assignment_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_featureCounts_assignment_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_readlength_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Adenine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Cytosine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Guanine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Thymine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Undetermined.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_by_cycle_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_score_distribution_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_read_distribution_profile_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-3_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-4_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc.log", + "multiqc/broad_peak/multiqc_data/multiqc_citations.txt", + "multiqc/broad_peak/multiqc_data/multiqc_cutadapt.txt", + "multiqc/broad_peak/multiqc_data/multiqc_data.json", + "multiqc/broad_peak/multiqc_data/multiqc_fastqc.txt", + "multiqc/broad_peak/multiqc_data/multiqc_fastqc_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_featureCounts_mlib_featurecounts.txt", + "multiqc/broad_peak/multiqc_data/multiqc_featureCounts_mrep_featurecounts.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_deseq2_clustering_1-plot.yaml", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_deseq2_pca_1-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_deseq2_clustering_1-plot.yaml", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_deseq2_pca_1-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_AlignmentSummaryMetrics.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_baseContent.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_insertSize.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_by_cycle.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_score_distribution.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_sources.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_2.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_3.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_4.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_5.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_2.txt", + "multiqc/broad_peak/multiqc_plots", + "multiqc/broad_peak/multiqc_plots/pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_filtered_reads_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_filtered_reads_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_deeptools_fingerprint_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_adapter_content_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_adapter_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_n_content_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_n_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_sequence_quality_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_sequence_quality_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_quality_scores_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_quality_scores_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_duplication_levels_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_duplication_levels_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_length_distribution_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_readlength_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Adenine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Cytosine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Guanine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Thymine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Undetermined.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_by_cycle_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_score_distribution_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_read_distribution_profile_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_filtered_reads_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_filtered_reads_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_trimmed_sequences_plot_3_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_deeptools_fingerprint_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_adapter_content_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_adapter_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_n_content_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_n_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_sequence_quality_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_sequence_quality_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_quality_scores_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_quality_scores_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_duplication_levels_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_duplication_levels_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_length_distribution_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_readlength_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Adenine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Cytosine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Guanine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Thymine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Undetermined.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_by_cycle_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_score_distribution_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_read_distribution_profile_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_filtered_reads_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_filtered_reads_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_trimmed_sequences_plot_3_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_deeptools_fingerprint_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_adapter_content_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_adapter_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_n_content_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_n_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_sequence_quality_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_sequence_quality_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_quality_scores_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_quality_scores_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_duplication_levels_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_duplication_levels_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_length_distribution_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_readlength_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Adenine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Cytosine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Guanine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Thymine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Undetermined.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_by_cycle_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_score_distribution_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_read_distribution_profile_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_atacseq_software_mqc_versions.yml", + "pipeline_info/samplesheet.valid.csv", + "trimgalore", + "trimgalore/fastqc", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T100_SE_REP1_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T100_SE_REP2_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T150_SE_REP1_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T150_SE_REP1_T2_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_2_val_2_fastqc.html", + "trimgalore/fastqc/zips", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T100_SE_REP1_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T100_SE_REP2_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T2_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_2_val_2_fastqc.zip", + "trimgalore/logs", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP1_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP1_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP2_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP2_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T100_SE_REP1_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T100_SE_REP2_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T150_SE_REP1_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T150_SE_REP1_T2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T2_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T2_2.fastq.gz_trimming_report.txt" + ], + [ + "ataqv.css:md5,7bb9e18974018dd29bdc12a46a6d6d65", + "datatables.buttons.min.css:md5,675306abc9d3239314f2c66c0e22ef7a", + "datatables.fontawesome.css:md5,716d7a3edd2c75e712b1ffe26f12a861", + "datatables.min.css:md5,00ef3e39d9302618395ab189ec8bcd9f", + "font-awesome.min.css:md5,89916fa773ce96569604016ef25cab50", + "normalize.css:md5,40d20cc85100840580df4346bb99d7ed", + "FontAwesome.otf:md5,9ccfa32dd4cd1b8e83f68899d85bd5e6", + "fontawesome-webfont.eot:md5,404a525502f8e5ba7e93b9f02d9e83a9", + "fontawesome-webfont.ttf:md5,fb650aaf10736ffb9c4173079616bf01", + "fontawesome-webfont.woff:md5,891e3f340c1126b4c7c142e5f6e86816", + "fontawesome-webfont.woff2:md5,926c93d201fe51c8f351e858468980c3", + "sourcesanspro-regular.woff:md5,f7bd788f18b8c4bb93dd37d140348e1e", + "sourcesanspro-regularit.woff:md5,c3638b17f4fd76dae12fe2ae14571e57", + "sourcesanspro-semibold.woff:md5,e7fc8925d9364e9d177d9e1d08bb1855", + "sourcesanspro-semiboldit.woff:md5,f1d255aa459786dfc6aa2e488ac01245", + "index.html:md5,bf7747be761e56ad7c54c842ac88461a", + "ataqv.js:md5,feb291b7839e9e43ed304565e3a605d9", + "configuration.js:md5,684c73eb292dc3b2595570008c036609", + "d3.min.js:md5,db69fb2626a71a286ee772d673138aca", + "datatables.min.js:md5,e369b872620dadb05e4eb555b81f9112", + "jszip.min.js:md5,09e492cb492ffa75484bbe10f1f721d1", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_factor.txt:md5,ca79e177b8ebab51ed983c36004a459f", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_factor.txt:md5,39a0f4b1f8fa8c1acf7265c3a35e8ee4", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt:md5,1409efd63e2cf79517e9218c99ee8620", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt:md5,8bf3890ea7ef038d581c27aeec57d5eb", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt:md5,bf969eb74e12aef075c645c44966af3b", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt:md5,8ab7fcdd89af8338d502e07f25deb3c7", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak:md5,ee0c43ccbb1ed621a9d08b8f87a416a7", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak:md5,f0f11a43be9480d3e1d7e5604259da68", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls:md5,2c5c1ce24163051e3a7bff13f7900c2e", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak:md5,9394827d568a98e3162d9ce1d5fa304c", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak:md5,dae9f0497e4f339ae024e75cbb40caed", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls:md5,7a54dab83588ce3cdb1538ed31595158", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak:md5,3fb92a851db5c787e4a657ccd9d556e4", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak:md5,7d7772acdcd8a2fa52b52a7c2771299c", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls:md5,3f8669434ca2aafdc6fe1f5d7f9375ab", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak:md5,7ee185ce4fd3ef274209b31ad0f9d7ee", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak:md5,0564473f0c79f8979e00cc2dd9419a08", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls:md5,a6e8225dcf10287873cb8f15d1abb22a", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak:md5,6e68db07975f6fe14f37220b76e14822", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak:md5,d0f580449025b4333a3d72857fed38ea", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls:md5,dff49ec46af329c8d14b763b18866702", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak:md5,6b5a3913db3ec34c060c52b6b73f0efa", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak:md5,701f9ac9db24043278ed5d87e79dc5c4", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls:md5,d85fb13dabce6fbdf1bee1672344fdfb", + "consensus_peaks.mLb.clN.bed:md5,aa5fed9ae95ee61b18488b4e839ef5dc", + "consensus_peaks.mLb.clN.boolean.intersect.txt:md5,ce169274438ffbb1061198612883b4a1", + "consensus_peaks.mLb.clN.boolean.txt:md5,45066504acfe6923ea5d9fc922497fd5", + "consensus_peaks.mLb.clN.featureCounts.tsv:md5,5fcc269364c052a0627cf6b788b4031e", + "consensus_peaks.mLb.clN.featureCounts.tsv.summary:md5,162dbcf965e5b86a676ecd77254b14bf", + "consensus_peaks.mLb.clN.saf:md5,aa96dd28634ca5e98491a1c848b3d5a1", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,7c504b2d3d73f80791d1ca444c02b732", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,2a181f6e948849f3fc0e0908fa9d8f20", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,e8ddcb9f1687bb0a8708ccf4a27bfff5", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,9db95b1d3d2d8910891f9472553c7243", + "OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt:md5,8cd37fa184f780422189378ae03b547a", + "OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt:md5,e2f33d4f274ccedbe2b0a610dcc363ad", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,7a0f8b2194f50c721fa78e5da3458377", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,d7b55e13ea81febb4023538a0a1968a8", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,a3311a62d8c25be0abb0cbeadc466a35", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,a0138351c242ce97ddacad726da309b0", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,55dd59cab13242d80cf0a1ead247ba5a", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,8cee4f482045efad4ff25f2d69766f7c", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,88375a8e7a06c7ebd974706ae33d344a", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,25be36adabceb7f2cb60bb2a26585a76", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,c0beb141740546e84cb2161bd34285c2", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,5a5e44e107f569e5ad1a823f01c02386", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,8a429863f471688f46571f1777b508d8", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,2cda788185a23ae4fbfa1bb3ba8f8ecd", + "macs3_annotatePeaks.mLb.clN.summary.txt:md5,5f704595f241ed0c252794c3079faf90", + "macs3_annotatePeaks.mLb.clN.summary_mqc.tsv:md5,19eea45ba9270a8702fcfe55ba4b9ffa", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,53f3e02317be3d6ac6a109ed21a81cde", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,4e8e5575f2ac3581f4634ce3baa80ccb", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,9bdaf5a84146206f7741c86537815373", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,7fa5e58c48a0de0152bf51f0aedc3019", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.flagstat:md5,60f6c8264d331733acd20e10be9d306d", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats:md5,f1b57d957661a0d582a06dce0e1e9fb6", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat:md5,d4599f0c2a2662f5c2bd96f2f1ad800e", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats:md5,fe47f1ba4cfcd19d40af52af2ea99087", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,f79b2e78fc995cd485d9d8bf2c7d3aae", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,b234c4cf3c04ecf00b5e9cd709cdd780", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,2a91c722fcd00da5c636f71ace1536f2", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,d56c567ae1eb1efa01f6d65a3e0a17b2", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.flagstat:md5,6fbe5e9dbabe868f7ceee8b2bf367809", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats:md5,652f9a50f85c9034cd4afc1258132514", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat:md5,346dc01ca5aaa40722497707172b8155", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats:md5,242afc4b5345a39b4dc357d65108ce0c", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,e40d3cfb9b0321d50ee6269bf3d21157", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,781508ccd860200a793cebdca69dd53e", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,a2ceb4afabd4b375f613c09d04a0bcdf", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,806bff980078dd43e01b98c09e0cd3ba", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,af57a9df0ecde05141926d4758662504", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,579f1b952c9ba06c2749ab3bd3c87752", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,ce1585aae3abe3afe927ea393cd2720f", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,140ccad1666e8b14f7ae4a522524ce39", + "OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt:md5,a55d999d95f29fc5a8dbe3f40cdb2d58", + "OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt:md5,c9e9a9b9a391257f0c8fbc1b7da344ee", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak:md5,377bc55e55706012764bda953f9cebc7", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak:md5,3368514aa3be280eab93902237fe3507", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls:md5,2fac52fa475fb2a60f34deb4a7c304ce", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak:md5,67f20d45d96ff47070568b45b883bc5e", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak:md5,f33b4e71a762263dd1827ba907d92cad", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls:md5,b2226352c2663a60ac25f70788cafcdb", + "consensus_peaks.mRp.clN.bed:md5,ae4b2196a02d7edb33cd94694bb424ad", + "consensus_peaks.mRp.clN.boolean.intersect.txt:md5,135fb013616f09a1d37d6c63e373342c", + "consensus_peaks.mRp.clN.boolean.txt:md5,1a337d666b1288ffdbacc55fb314eeb3", + "consensus_peaks.mRp.clN.featureCounts.tsv:md5,30b89c9770fa1b2b8e734885a0108ba4", + "consensus_peaks.mRp.clN.featureCounts.tsv.summary:md5,769d0e19a17df7672a76d284f65dabfd", + "consensus_peaks.mRp.clN.saf:md5,9bb4e99f9236c5a90317f17af0522ecc", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,f050ae7b44de9df86a74dd446dd9bdda", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,d47907a311f3a640f48612cdcc4c8f2c", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,3d8fbca310c7f8d8e0da2c705c628b1c", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,59493498942904d6c3efaf4ab668da71", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv:md5,47b098c759774e50bc044c6299b6319e", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv:md5,089329406279a49e07d126de1f52a806", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv:md5,14c46830dcc267d6f531b22bffb734c8", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv:md5,c9eeabff803c9bbc33fabf14867437b7", + "macs3_annotatePeaks.mRp.clN.summary.txt:md5,6c0c13d00df15867c58c1857d11a8416", + "macs3_annotatePeaks.mRp.clN.summary_mqc.tsv:md5,c83351e7dd31ee97b40f04355a243d69", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat:md5,acb44fb90bc18366ec8efa3881dc9255", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats:md5,15e882e2417a6d82771bc63c92f69b5e", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat:md5,b245ff26bef6fd4d1c0c7a46149813ca", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats:md5,610213c2af6135d930122bdc1c5d28ea", + "genome.index:md5,377432ea6242989cae4dabb60859f6bd", + "genome.fa:md5,4bad9f4b18056156a81f7f952abbe125", + "genome.fa.fai:md5,6f4c0ce5258e6948135ad006e1f9ee1b", + "deeptools_plot_fingerprint_counts_mlib_deeptools.txt:md5,1a024a72bbc5dd0e1493e6025c9b980a", + "deeptools_plot_profile_mlib_deeptools.txt:md5,3c74002bc0bc18921860ef381f97ae77", + "mqc_cutadapt_filtered_reads_plot_1.txt:md5,b78f69173122f2cacf8121eaeb815382", + "mqc_cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,157073209c492b89badba367b1c57d83", + "mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,b04ae8b2ec27d71817ae7cb666888b9b", + "mqc_deeptools_fingerprint_plot_1.txt:md5,e57d508028bbfa194483f9943d652a8c", + "mqc_fastqc_adapter_content_plot-2_1.txt:md5,3560a22f94aea25e27d97e056fb478ed", + "mqc_fastqc_adapter_content_plot_1.txt:md5,66f3e2f6ba14599b0d6c20144df60777", + "mqc_fastqc_per_base_n_content_plot-2_1.txt:md5,d79e95d36d955edee3e4bfb139dce967", + "mqc_fastqc_per_base_n_content_plot_1.txt:md5,8d9cdd0463193b7e10332e2ca0273aca", + "mqc_fastqc_per_base_sequence_quality_plot-2_1.txt:md5,3bb6cad69480846e4003b9f0f3511caa", + "mqc_fastqc_per_base_sequence_quality_plot_1.txt:md5,821cb87b0ae8bd61cd445d153b8f371a", + "mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt:md5,88fb0e924094b5dd57f4003ac13fd1f4", + "mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt:md5,a4b37bca5e61bf595c4532ffbc8b8f93", + "mqc_fastqc_per_sequence_gc_content_plot_Counts.txt:md5,3fa7f0c0858d12cae8700e21774da86d", + "mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,a2d0c3ec413894e4dafa62ebdf44a06c", + "mqc_fastqc_per_sequence_quality_scores_plot-2_1.txt:md5,841ccc3da246bd197fc966e9f8c5ca57", + "mqc_fastqc_per_sequence_quality_scores_plot_1.txt:md5,3bfe1c94f710975829e2c1e3b5f16ea7", + "mqc_fastqc_sequence_counts_plot-2_1.txt:md5,c734a06e1f3e3afc1486a0b45be880e1", + "mqc_fastqc_sequence_counts_plot_1.txt:md5,d0cf8d64e742b5f446e6b602d86913b9", + "mqc_fastqc_sequence_duplication_levels_plot-2_1.txt:md5,d7ada8561d521eaf645073f7cccf7b82", + "mqc_fastqc_sequence_duplication_levels_plot_1.txt:md5,23c4883ed6c22212b0c3e07a863745d1", + "mqc_fastqc_sequence_length_distribution_plot_1.txt:md5,bc3acb40acbf620b237d0f2fa8c8a1ab", + "mqc_featureCounts_assignment_plot-2_1.txt:md5,bd718f0666b016938108cdc74d76c069", + "mqc_featureCounts_assignment_plot_1.txt:md5,3b901781a08316ab42c57ac0834acbd3", + "mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt:md5,e725a2de503055125c8d5d901efd4b14", + "mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt:md5,36e03b26566ca8e12a72f7ed9aab0b65", + "mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt:md5,a08f22af3690395698152683d7006975", + "mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt:md5,703a09d4e182d18d81bc7905c43bb7f2", + "mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt:md5,8b00ebd52efc76bc507085d1bfc20074", + "mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt:md5,f8ddc235848098306e52b33c1df88bda", + "mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt:md5,0b232912de2116fb5d788f7fa21f1791", + "mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt:md5,524be815f13b5d5825ec82ff1715a4bc", + "mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt:md5,d34b4d89c97558f7c7299a949f56c0e6", + "mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,f9297280f0ccb8fcc02797b7edc9ad4a", + "mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,cb6543c55824e16105e5d8efe5d01efb", + "mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,3232f9925bb18b6fdc083892874e819c", + "mqc_samtools_alignment_plot-2_1.txt:md5,12fcb21d336c8c293e7deae61bac55e0", + "mqc_samtools_alignment_plot-3_1.txt:md5,e4c904e31cda8c109ad83e5dabe3ff68", + "mqc_samtools_alignment_plot-4_1.txt:md5,eceb66c56cea0a701c1430b615c9687c", + "mqc_samtools_alignment_plot_1.txt:md5,3a231661574252e63ee3f1501fca0b17", + "multiqc_citations.txt:md5,34da9f7497d275274f6dfd3b89831edb", + "multiqc_cutadapt.txt:md5,926fcf7c5a9c5dc0a105a439c85a5f58", + "multiqc_fastqc.txt:md5,a9a7484add8120fc3cf3d5626a92973b", + "multiqc_fastqc_1.txt:md5,58ab2bbd2d19745e5975742c6d1335d7", + "multiqc_featureCounts_mlib_featurecounts.txt:md5,5466a4b734b69cd19b90851f067a24ff", + "multiqc_featureCounts_mrep_featurecounts.txt:md5,9b89410fa6a54b56e168995bd71bf256", + "multiqc_mlib_frip_score-plot.txt:md5,4e69a1c964ffa2fc190a45e9dc6a0abb", + "multiqc_mlib_peak_annotation-plot.txt:md5,7b5a0a0032656221335c4f5f05ab8f36", + "multiqc_mlib_peak_count-plot.txt:md5,12775a5f90d680f5b859f6a503679bd0", + "multiqc_mrep_frip_score-plot.txt:md5,b47c1097a56ffe3451728dfef68f4a16", + "multiqc_mrep_peak_annotation-plot.txt:md5,9edd2eb70a7bfdbf9eafc86d0dfd0f1e", + "multiqc_mrep_peak_count-plot.txt:md5,0e859a8abcd4974d48eda655eb7bd53f", + "picard_histogram.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_3.txt:md5,fc2b0821fed14da8f161b48a6f04947b", + "picard_histogram_4.txt:md5,7cdffefa11196ef758cbdfe357ff5c9e", + "picard_histogram_5.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "samplesheet.valid.csv:md5,51b046b55592e95949824f21b12c7e49" + ] + ], + "timestamp": "2026-07-25T08:45:00.353178521", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "chromap with stub": { + "content": [ + 26 + ], + "timestamp": "2026-03-20T23:04:44.979984419", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + } + } +} \ No newline at end of file diff --git a/tests/controls.nf.test b/tests/controls.nf.test new file mode 100644 index 00000000..4b54e868 --- /dev/null +++ b/tests/controls.nf.test @@ -0,0 +1,36 @@ +nextflow_pipeline { + + name "Test pipeline" + script "../main.nf" + tag "pipeline" + profile "test_controls" + + test("-profile test_controls") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success}, + { assert snapshot( + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_atacseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) + } + } +} diff --git a/tests/controls.nf.test.snap b/tests/controls.nf.test.snap new file mode 100644 index 00000000..6da9e13a --- /dev/null +++ b/tests/controls.nf.test.snap @@ -0,0 +1,1102 @@ +{ + "-profile test_controls": { + "content": [ + 253, + { + "BAMTOOLS_FILTER": { + "bamtools": "2.5.2", + "samtools": "1.15.1" + }, + "BAM_REMOVE_ORPHANS": { + "samtools": "1.15.1" + }, + "BEDTOOLS_GENOMECOV": { + "bedtools": "2.31.1", + "sort": "sort (GNU coreutils) 9.5" + }, + "BWA_INDEX": { + "bwa": "0.7.19-r1273" + }, + "BWA_MEM": { + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" + }, + "DEEPTOOLS_COMPUTEMATRIX_REFERENCE_POINT": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_COMPUTEMATRIX_SCALE_REGIONS": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTHEATMAP": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTPROFILE": { + "deeptools": "3.5.6" + }, + "DESEQ2_QC": { + "bioconductor-deseq2": "1.28.0", + "r-base": "4.0.3" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "FRIP_SCORE": { + "bedtools": "2.30.0", + "samtools": "1.15.1" + }, + "GENOME_BLACKLIST_REGIONS": { + "bedtools": "2.30.0" + }, + "GET_AUTOSOMES": { + "python": "3.8.3" + }, + "GTF2BED": { + "perl": "5.26.2" + }, + "HOMER_ANNOTATEPEAKS": { + "homer": 4.11 + }, + "IGV": { + "python": "3.8.3" + }, + "KHMER_UNIQUEKMERS": { + "khmer": "3.0.0a3" + }, + "MACS3_CALLPEAK": { + "macs3": "3.0.4" + }, + "MACS3_CONSENSUS": { + "python": "3.10.0", + "r-base": "4.1.1" + }, + "MERGED_LIBRARY_ATAQV_ATAQV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_ATAQV_MKARV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_DEEPTOOLS_PLOTFINGERPRINT": { + "deeptools": "3.5.6" + }, + "MERGED_LIBRARY_PICARD_COLLECTMULTIPLEMETRICS": { + "picard": "3.4.0" + }, + "MULTIQC_CUSTOM_PEAKS": { + "sed": 4.7 + }, + "PICARD_MARKDUPLICATES": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_LIBRARY": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_REPLICATE": { + "picard": "3.4.0" + }, + "PLOT_HOMER_ANNOTATEPEAKS": { + "r-base": "4.0.3" + }, + "PLOT_MACS3_QC": { + "r-base": "4.0.3" + }, + "SAMPLESHEET_CHECK": { + "python": "3.8.3" + }, + "SAMTOOLS_FAIDX": { + "samtools": "1.23.1" + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": 1.24 + }, + "SAMTOOLS_IDXSTATS": { + "samtools": 1.24 + }, + "SAMTOOLS_INDEX": { + "samtools": 1.24 + }, + "SAMTOOLS_SORT": { + "samtools": 1.24 + }, + "SAMTOOLS_STATS": { + "samtools": 1.24 + }, + "SUBREAD_FEATURECOUNTS": { + "subread": "2.0.1" + }, + "TRIMGALORE": { + "trimgalore": "2.1.0" + }, + "TSS_EXTRACT": { + "sed": 4.7 + }, + "UCSC_BEDGRAPHTOBIGWIG": { + "ucsc": 482 + } + }, + [ + "bwa", + "bwa/merged_library", + "bwa/merged_library/SPT5_INPUT_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/SPT5_INPUT_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/SPT5_INPUT_REP2.mLb.clN.sorted.bam", + "bwa/merged_library/SPT5_INPUT_REP2.mLb.clN.sorted.bam.bai", + "bwa/merged_library/SPT5_T0_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/SPT5_T0_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/SPT5_T0_REP2.mLb.clN.sorted.bam", + "bwa/merged_library/SPT5_T0_REP2.mLb.clN.sorted.bam.bai", + "bwa/merged_library/SPT5_T15_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/SPT5_T15_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/SPT5_T15_REP2.mLb.clN.sorted.bam", + "bwa/merged_library/SPT5_T15_REP2.mLb.clN.sorted.bam.bai", + "bwa/merged_library/ataqv", + "bwa/merged_library/ataqv/broad_peak", + "bwa/merged_library/ataqv/broad_peak/SPT5_T0_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/SPT5_T0_REP2.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/SPT5_T15_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/SPT5_T15_REP2.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/html", + "bwa/merged_library/ataqv/broad_peak/html/css", + "bwa/merged_library/ataqv/broad_peak/html/css/ataqv.css", + "bwa/merged_library/ataqv/broad_peak/html/css/datatables.buttons.min.css", + "bwa/merged_library/ataqv/broad_peak/html/css/datatables.fontawesome.css", + "bwa/merged_library/ataqv/broad_peak/html/css/datatables.min.css", + "bwa/merged_library/ataqv/broad_peak/html/css/font-awesome.min.css", + "bwa/merged_library/ataqv/broad_peak/html/css/normalize.css", + "bwa/merged_library/ataqv/broad_peak/html/data", + "bwa/merged_library/ataqv/broad_peak/html/data/SPT5_T0_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/SPT5_T0_REP2.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/SPT5_T15_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/SPT5_T15_REP2.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/fonts", + "bwa/merged_library/ataqv/broad_peak/html/fonts/FontAwesome.otf", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.eot", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.svg", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.ttf", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff2", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regular.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regularit.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semibold.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semiboldit.woff", + "bwa/merged_library/ataqv/broad_peak/html/index.html", + "bwa/merged_library/ataqv/broad_peak/html/js", + "bwa/merged_library/ataqv/broad_peak/html/js/ataqv.js", + "bwa/merged_library/ataqv/broad_peak/html/js/configuration.js", + "bwa/merged_library/ataqv/broad_peak/html/js/d3.min.js", + "bwa/merged_library/ataqv/broad_peak/html/js/datatables.min.js", + "bwa/merged_library/ataqv/broad_peak/html/js/jszip.min.js", + "bwa/merged_library/bigwig", + "bwa/merged_library/bigwig/SPT5_INPUT_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/SPT5_INPUT_REP2.mLb.clN.bigWig", + "bwa/merged_library/bigwig/SPT5_T0_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/SPT5_T0_REP2.mLb.clN.bigWig", + "bwa/merged_library/bigwig/SPT5_T15_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/SPT5_T15_REP2.mLb.clN.bigWig", + "bwa/merged_library/bigwig/scale", + "bwa/merged_library/bigwig/scale/SPT5_INPUT_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/SPT5_INPUT_REP2.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/SPT5_T0_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/SPT5_T0_REP2.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/SPT5_T15_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/SPT5_T15_REP2.mLb.clN.scale_factor.txt", + "bwa/merged_library/deeptools", + "bwa/merged_library/deeptools/plotfingerprint", + "bwa/merged_library/deeptools/plotfingerprint/SPT5_T0_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/SPT5_T0_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/SPT5_T0_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/SPT5_T0_REP2.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/SPT5_T0_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/SPT5_T0_REP2.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/SPT5_T15_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/SPT5_T15_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/SPT5_T15_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/SPT5_T15_REP2.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/SPT5_T15_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/SPT5_T15_REP2.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotprofile", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP2.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP2.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_INPUT_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP2.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP2.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T0_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP2.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP2.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/SPT5_T15_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/macs3", + "bwa/merged_library/macs3/broad_peak", + "bwa/merged_library/macs3/broad_peak/SPT5_T0_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/SPT5_T0_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/SPT5_T0_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/SPT5_T0_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/SPT5_T0_REP2.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/SPT5_T0_REP2.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/SPT5_T0_REP2.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/SPT5_T0_REP2.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/SPT5_T15_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/SPT5_T15_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/SPT5_T15_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/SPT5_T15_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/SPT5_T15_REP2.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/SPT5_T15_REP2.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/SPT5_T15_REP2.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/SPT5_T15_REP2.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/consensus", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.bed", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.intersect.plot.pdf", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.intersect.txt", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.txt", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.tsv", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.tsv.summary", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.saf", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/R_sessionInfo.log", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.dds.RData", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.pca.vals.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.pca.vals_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.plots.pdf", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.rds", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.sample.dists.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.sample.dists_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/SPT5_T0_REP1.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/SPT5_T0_REP2.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/SPT5_T15_REP1.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/SPT5_T15_REP2.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/consensus_peaks.mLb.clN.size_factors.RData", + "bwa/merged_library/macs3/broad_peak/qc", + "bwa/merged_library/macs3/broad_peak/qc/SPT5_T0_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/SPT5_T0_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/SPT5_T0_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/SPT5_T0_REP2.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/SPT5_T15_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/SPT5_T15_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/SPT5_T15_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/SPT5_T15_REP2.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.plots.pdf", + "bwa/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary.txt", + "bwa/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.plots.pdf", + "bwa/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.summary.txt", + "bwa/merged_library/picard_metrics", + "bwa/merged_library/picard_metrics/SPT5_INPUT_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/SPT5_INPUT_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/SPT5_INPUT_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/SPT5_INPUT_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/SPT5_INPUT_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/SPT5_INPUT_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/SPT5_INPUT_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/SPT5_INPUT_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/SPT5_INPUT_REP2.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/SPT5_INPUT_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/SPT5_INPUT_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/SPT5_INPUT_REP2.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/SPT5_T0_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/SPT5_T0_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/SPT5_T0_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/SPT5_T0_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/SPT5_T0_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/SPT5_T0_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/SPT5_T0_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/SPT5_T0_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/SPT5_T0_REP2.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/SPT5_T0_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/SPT5_T0_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/SPT5_T0_REP2.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/SPT5_T15_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/SPT5_T15_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/SPT5_T15_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/SPT5_T15_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/SPT5_T15_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/SPT5_T15_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/SPT5_T15_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/SPT5_T15_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/SPT5_T15_REP2.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/SPT5_T15_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/SPT5_T15_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/SPT5_T15_REP2.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_INPUT_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_INPUT_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_INPUT_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_INPUT_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_INPUT_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_INPUT_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_INPUT_REP2.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_INPUT_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_INPUT_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_INPUT_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T0_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T0_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T0_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T0_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T0_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T0_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T0_REP2.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T0_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T0_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T0_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T15_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T15_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T15_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T15_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T15_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T15_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T15_REP2.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T15_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T15_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/SPT5_T15_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/samtools_stats", + "bwa/merged_library/samtools_stats/SPT5_INPUT_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/SPT5_INPUT_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/SPT5_INPUT_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/SPT5_INPUT_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/SPT5_INPUT_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/SPT5_INPUT_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/SPT5_INPUT_REP2.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/SPT5_INPUT_REP2.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/SPT5_INPUT_REP2.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/SPT5_INPUT_REP2.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/SPT5_INPUT_REP2.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/SPT5_INPUT_REP2.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/SPT5_T0_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/SPT5_T0_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/SPT5_T0_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/SPT5_T0_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/SPT5_T0_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/SPT5_T0_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/SPT5_T0_REP2.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/SPT5_T0_REP2.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/SPT5_T0_REP2.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/SPT5_T0_REP2.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/SPT5_T0_REP2.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/SPT5_T0_REP2.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/SPT5_T15_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/SPT5_T15_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/SPT5_T15_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/SPT5_T15_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/SPT5_T15_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/SPT5_T15_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/SPT5_T15_REP2.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/SPT5_T15_REP2.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/SPT5_T15_REP2.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/SPT5_T15_REP2.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/SPT5_T15_REP2.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/SPT5_T15_REP2.mLb.mkD.sorted.bam.stats", + "bwa/merged_replicate", + "bwa/merged_replicate/SPT5_INPUT.mRp.clN.sorted.bam", + "bwa/merged_replicate/SPT5_INPUT.mRp.clN.sorted.bam.bai", + "bwa/merged_replicate/SPT5_T0.mRp.clN.sorted.bam", + "bwa/merged_replicate/SPT5_T0.mRp.clN.sorted.bam.bai", + "bwa/merged_replicate/SPT5_T15.mRp.clN.sorted.bam", + "bwa/merged_replicate/SPT5_T15.mRp.clN.sorted.bam.bai", + "bwa/merged_replicate/bigwig", + "bwa/merged_replicate/bigwig/SPT5_INPUT.mRp.clN.bigWig", + "bwa/merged_replicate/bigwig/SPT5_T0.mRp.clN.bigWig", + "bwa/merged_replicate/bigwig/SPT5_T15.mRp.clN.bigWig", + "bwa/merged_replicate/bigwig/scale", + "bwa/merged_replicate/bigwig/scale/SPT5_INPUT.mRp.clN.scale_factor.txt", + "bwa/merged_replicate/bigwig/scale/SPT5_T0.mRp.clN.scale_factor.txt", + "bwa/merged_replicate/bigwig/scale/SPT5_T15.mRp.clN.scale_factor.txt", + "bwa/merged_replicate/macs3", + "bwa/merged_replicate/macs3/broad_peak", + "bwa/merged_replicate/macs3/broad_peak/SPT5_T0.mRp.clN_peaks.annotatePeaks.txt", + "bwa/merged_replicate/macs3/broad_peak/SPT5_T0.mRp.clN_peaks.broadPeak", + "bwa/merged_replicate/macs3/broad_peak/SPT5_T0.mRp.clN_peaks.gappedPeak", + "bwa/merged_replicate/macs3/broad_peak/SPT5_T0.mRp.clN_peaks.xls", + "bwa/merged_replicate/macs3/broad_peak/SPT5_T15.mRp.clN_peaks.annotatePeaks.txt", + "bwa/merged_replicate/macs3/broad_peak/SPT5_T15.mRp.clN_peaks.broadPeak", + "bwa/merged_replicate/macs3/broad_peak/SPT5_T15.mRp.clN_peaks.gappedPeak", + "bwa/merged_replicate/macs3/broad_peak/SPT5_T15.mRp.clN_peaks.xls", + "bwa/merged_replicate/macs3/broad_peak/consensus", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.annotatePeaks.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.bed", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.intersect.plot.pdf", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.intersect.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.tsv", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.tsv.summary", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.saf", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/R_sessionInfo.log", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.dds.RData", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.pca.vals.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.pca.vals_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.plots.pdf", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.rds", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.sample.dists.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.sample.dists_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/SPT5_T0_REP1.size_factors.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/SPT5_T0_REP2.size_factors.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/SPT5_T15_REP1.size_factors.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/SPT5_T15_REP2.size_factors.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/consensus_peaks.mRp.clN.size_factors.RData", + "bwa/merged_replicate/macs3/broad_peak/qc", + "bwa/merged_replicate/macs3/broad_peak/qc/SPT5_T0.mRp.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/SPT5_T0.mRp.clN_peaks.count_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/SPT5_T15.mRp.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/SPT5_T15.mRp.clN_peaks.count_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.plots.pdf", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary.txt", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.plots.pdf", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.summary.txt", + "bwa/merged_replicate/picard_metrics", + "bwa/merged_replicate/picard_metrics/SPT5_INPUT.mRp.clN.sorted.metrics.txt", + "bwa/merged_replicate/picard_metrics/SPT5_T0.mRp.clN.sorted.metrics.txt", + "bwa/merged_replicate/picard_metrics/SPT5_T15.mRp.clN.sorted.metrics.txt", + "bwa/merged_replicate/samtools_stats", + "bwa/merged_replicate/samtools_stats/SPT5_INPUT.mRp.clN.sorted.bam.flagstat", + "bwa/merged_replicate/samtools_stats/SPT5_INPUT.mRp.clN.sorted.bam.idxstats", + "bwa/merged_replicate/samtools_stats/SPT5_INPUT.mRp.clN.sorted.bam.stats", + "bwa/merged_replicate/samtools_stats/SPT5_T0.mRp.clN.sorted.bam.flagstat", + "bwa/merged_replicate/samtools_stats/SPT5_T0.mRp.clN.sorted.bam.idxstats", + "bwa/merged_replicate/samtools_stats/SPT5_T0.mRp.clN.sorted.bam.stats", + "bwa/merged_replicate/samtools_stats/SPT5_T15.mRp.clN.sorted.bam.flagstat", + "bwa/merged_replicate/samtools_stats/SPT5_T15.mRp.clN.sorted.bam.idxstats", + "bwa/merged_replicate/samtools_stats/SPT5_T15.mRp.clN.sorted.bam.stats", + "fastqc", + "fastqc/SPT5_INPUT_REP1_T1_1_fastqc.html", + "fastqc/SPT5_INPUT_REP1_T1_2_fastqc.html", + "fastqc/SPT5_INPUT_REP2_T1_1_fastqc.html", + "fastqc/SPT5_INPUT_REP2_T1_2_fastqc.html", + "fastqc/SPT5_T0_REP1_T1_1_fastqc.html", + "fastqc/SPT5_T0_REP1_T1_2_fastqc.html", + "fastqc/SPT5_T0_REP2_T1_1_fastqc.html", + "fastqc/SPT5_T0_REP2_T1_2_fastqc.html", + "fastqc/SPT5_T15_REP1_T1_1_fastqc.html", + "fastqc/SPT5_T15_REP1_T1_2_fastqc.html", + "fastqc/SPT5_T15_REP2_T1_1_fastqc.html", + "fastqc/SPT5_T15_REP2_T1_2_fastqc.html", + "fastqc/zips", + "fastqc/zips/SPT5_INPUT_REP1_T1_1_fastqc.zip", + "fastqc/zips/SPT5_INPUT_REP1_T1_2_fastqc.zip", + "fastqc/zips/SPT5_INPUT_REP2_T1_1_fastqc.zip", + "fastqc/zips/SPT5_INPUT_REP2_T1_2_fastqc.zip", + "fastqc/zips/SPT5_T0_REP1_T1_1_fastqc.zip", + "fastqc/zips/SPT5_T0_REP1_T1_2_fastqc.zip", + "fastqc/zips/SPT5_T0_REP2_T1_1_fastqc.zip", + "fastqc/zips/SPT5_T0_REP2_T1_2_fastqc.zip", + "fastqc/zips/SPT5_T15_REP1_T1_1_fastqc.zip", + "fastqc/zips/SPT5_T15_REP1_T1_2_fastqc.zip", + "fastqc/zips/SPT5_T15_REP2_T1_1_fastqc.zip", + "fastqc/zips/SPT5_T15_REP2_T1_2_fastqc.zip", + "genome", + "genome/genome.fa", + "genome/genome.fa.fai", + "igv", + "igv/broad_peak", + "igv/broad_peak/igv_files.txt", + "igv/broad_peak/igv_session.xml", + "multiqc", + "multiqc/broad_peak", + "multiqc/broad_peak/multiqc_data", + "multiqc/broad_peak/multiqc_data/deeptools_plot_fingerprint_counts_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/deeptools_plot_profile_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_filtered_reads_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_trimmed_sequences_plot_3_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt", + "multiqc/broad_peak/multiqc_data/mqc_deeptools_fingerprint_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_adapter_content_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_adapter_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_n_content_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_n_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_sequence_quality_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_sequence_quality_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_quality_scores_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_quality_scores_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_counts_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_counts_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_duplication_levels_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_duplication_levels_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_length_distribution_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_featureCounts_assignment_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_featureCounts_assignment_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_readlength_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Adenine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Cytosine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Guanine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Thymine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Undetermined.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_by_cycle_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_score_distribution_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_read_distribution_profile_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-3_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-4_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc.log", + "multiqc/broad_peak/multiqc_data/multiqc_citations.txt", + "multiqc/broad_peak/multiqc_data/multiqc_cutadapt.txt", + "multiqc/broad_peak/multiqc_data/multiqc_data.json", + "multiqc/broad_peak/multiqc_data/multiqc_fastqc.txt", + "multiqc/broad_peak/multiqc_data/multiqc_fastqc_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_featureCounts_mlib_featurecounts.txt", + "multiqc/broad_peak/multiqc_data/multiqc_featureCounts_mrep_featurecounts.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_deseq2_clustering_1-plot.yaml", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_deseq2_pca_1-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_deseq2_clustering_1-plot.yaml", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_deseq2_pca_1-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_AlignmentSummaryMetrics.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_baseContent.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_insertSize.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_by_cycle.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_score_distribution.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_sources.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_2.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_3.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_4.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_5.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_2.txt", + "multiqc/broad_peak/multiqc_plots", + "multiqc/broad_peak/multiqc_plots/pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_filtered_reads_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_filtered_reads_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_deeptools_fingerprint_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_adapter_content_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_adapter_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_n_content_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_n_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_sequence_quality_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_sequence_quality_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_quality_scores_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_quality_scores_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_duplication_levels_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_duplication_levels_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_length_distribution_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_readlength_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Adenine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Cytosine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Guanine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Thymine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Undetermined.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_by_cycle_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_score_distribution_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_read_distribution_profile_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_filtered_reads_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_filtered_reads_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_trimmed_sequences_plot_3_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_deeptools_fingerprint_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_adapter_content_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_adapter_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_n_content_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_n_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_sequence_quality_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_sequence_quality_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_quality_scores_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_quality_scores_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_duplication_levels_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_duplication_levels_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_length_distribution_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_readlength_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Adenine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Cytosine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Guanine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Thymine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Undetermined.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_by_cycle_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_score_distribution_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_read_distribution_profile_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_filtered_reads_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_filtered_reads_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_trimmed_sequences_plot_3_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_deeptools_fingerprint_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_adapter_content_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_adapter_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_n_content_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_n_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_sequence_quality_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_sequence_quality_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_quality_scores_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_quality_scores_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_duplication_levels_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_duplication_levels_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_length_distribution_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_readlength_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Adenine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Cytosine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Guanine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Thymine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Undetermined.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_by_cycle_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_score_distribution_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_read_distribution_profile_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_atacseq_software_mqc_versions.yml", + "pipeline_info/samplesheet.valid.csv", + "trimgalore", + "trimgalore/fastqc", + "trimgalore/fastqc/SPT5_INPUT_REP1_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/SPT5_INPUT_REP1_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/SPT5_INPUT_REP2_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/SPT5_INPUT_REP2_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/SPT5_T0_REP1_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/SPT5_T0_REP1_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/SPT5_T0_REP2_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/SPT5_T0_REP2_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/SPT5_T15_REP1_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/SPT5_T15_REP1_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/SPT5_T15_REP2_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/SPT5_T15_REP2_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/zips", + "trimgalore/fastqc/zips/SPT5_INPUT_REP1_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/SPT5_INPUT_REP1_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/SPT5_INPUT_REP2_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/SPT5_INPUT_REP2_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/SPT5_T0_REP1_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/SPT5_T0_REP1_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/SPT5_T0_REP2_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/SPT5_T0_REP2_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/SPT5_T15_REP1_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/SPT5_T15_REP1_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/SPT5_T15_REP2_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/SPT5_T15_REP2_T1_2_val_2_fastqc.zip", + "trimgalore/logs", + "trimgalore/logs/SPT5_INPUT_REP1_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/SPT5_INPUT_REP1_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/SPT5_INPUT_REP2_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/SPT5_INPUT_REP2_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/SPT5_T0_REP1_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/SPT5_T0_REP1_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/SPT5_T0_REP2_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/SPT5_T0_REP2_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/SPT5_T15_REP1_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/SPT5_T15_REP1_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/SPT5_T15_REP2_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/SPT5_T15_REP2_T1_2.fastq.gz_trimming_report.txt" + ], + [ + "ataqv.css:md5,7bb9e18974018dd29bdc12a46a6d6d65", + "datatables.buttons.min.css:md5,675306abc9d3239314f2c66c0e22ef7a", + "datatables.fontawesome.css:md5,716d7a3edd2c75e712b1ffe26f12a861", + "datatables.min.css:md5,00ef3e39d9302618395ab189ec8bcd9f", + "font-awesome.min.css:md5,89916fa773ce96569604016ef25cab50", + "normalize.css:md5,40d20cc85100840580df4346bb99d7ed", + "FontAwesome.otf:md5,9ccfa32dd4cd1b8e83f68899d85bd5e6", + "fontawesome-webfont.eot:md5,404a525502f8e5ba7e93b9f02d9e83a9", + "fontawesome-webfont.ttf:md5,fb650aaf10736ffb9c4173079616bf01", + "fontawesome-webfont.woff:md5,891e3f340c1126b4c7c142e5f6e86816", + "fontawesome-webfont.woff2:md5,926c93d201fe51c8f351e858468980c3", + "sourcesanspro-regular.woff:md5,f7bd788f18b8c4bb93dd37d140348e1e", + "sourcesanspro-regularit.woff:md5,c3638b17f4fd76dae12fe2ae14571e57", + "sourcesanspro-semibold.woff:md5,e7fc8925d9364e9d177d9e1d08bb1855", + "sourcesanspro-semiboldit.woff:md5,f1d255aa459786dfc6aa2e488ac01245", + "index.html:md5,bf7747be761e56ad7c54c842ac88461a", + "ataqv.js:md5,feb291b7839e9e43ed304565e3a605d9", + "configuration.js:md5,c33ff5f529f55c5a40d7704abfe0bc16", + "d3.min.js:md5,db69fb2626a71a286ee772d673138aca", + "datatables.min.js:md5,e369b872620dadb05e4eb555b81f9112", + "jszip.min.js:md5,09e492cb492ffa75484bbe10f1f721d1", + "SPT5_INPUT_REP1.mLb.clN.scale_factor.txt:md5,f57aa3f8e15985ab2859e95129b90f2f", + "SPT5_INPUT_REP2.mLb.clN.scale_factor.txt:md5,afb582c3289d038d3d51b5348c7cfa21", + "SPT5_T0_REP1.mLb.clN.scale_factor.txt:md5,5afe7d16ac432b483454d7406dd4b72e", + "SPT5_T0_REP2.mLb.clN.scale_factor.txt:md5,816f20d069360ccb44e8e565b6b0a4e6", + "SPT5_T15_REP1.mLb.clN.scale_factor.txt:md5,ffdfff9aae190ca4da64dc5c0127ee7d", + "SPT5_T15_REP2.mLb.clN.scale_factor.txt:md5,21f0dba35887dff60f95550f29652f09", + "SPT5_T0_REP1.mLb.clN_peaks.broadPeak:md5,e6009fdf0e3435cf85520023a97a3b60", + "SPT5_T0_REP1.mLb.clN_peaks.gappedPeak:md5,1b00ca51db4b360b8f549c7af2f1c2c7", + "SPT5_T0_REP1.mLb.clN_peaks.xls:md5,b63a797093f19716d369b623bd55afd2", + "SPT5_T0_REP2.mLb.clN_peaks.broadPeak:md5,372c3e85cf44473837ec64b5e83bfba5", + "SPT5_T0_REP2.mLb.clN_peaks.gappedPeak:md5,8e74290c0efbb7f49d4df63a992cd786", + "SPT5_T0_REP2.mLb.clN_peaks.xls:md5,6ea82a75e316434b3e8c09cfe638e7cc", + "SPT5_T15_REP1.mLb.clN_peaks.broadPeak:md5,78fcd01fe584022f6b849b15cd23575c", + "SPT5_T15_REP1.mLb.clN_peaks.gappedPeak:md5,9e2291955855a4126251a103a7365707", + "SPT5_T15_REP1.mLb.clN_peaks.xls:md5,53290786c3d7a02d6a4ccd09d861512c", + "SPT5_T15_REP2.mLb.clN_peaks.broadPeak:md5,f061039cfcd741247f14747a0a5123c7", + "SPT5_T15_REP2.mLb.clN_peaks.gappedPeak:md5,00887d14f2e868809ab736a3b9066f3f", + "SPT5_T15_REP2.mLb.clN_peaks.xls:md5,60aec7b70cec711229b2b144a8cd0628", + "consensus_peaks.mLb.clN.bed:md5,26c9848ef234abf3fea0148dcdaafeab", + "consensus_peaks.mLb.clN.boolean.intersect.txt:md5,9a2626b82682f8eb00e9fb6d04d88a28", + "consensus_peaks.mLb.clN.boolean.txt:md5,0ac64dffdefd211b346f0abc17ff1d60", + "consensus_peaks.mLb.clN.featureCounts.tsv:md5,1154842a9c52df99f5c91c18361eb733", + "consensus_peaks.mLb.clN.featureCounts.tsv.summary:md5,c303c40581bff201e66f757a63f811b9", + "consensus_peaks.mLb.clN.saf:md5,0579c7b25c54456b04db69df25ebf0b8", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "SPT5_T0_REP1.size_factors.txt:md5,4bfd60c93a50adf1e1040f84b54ecac9", + "SPT5_T0_REP2.size_factors.txt:md5,769b3054db6a519a502f53af889738c6", + "SPT5_T15_REP1.size_factors.txt:md5,94e57aca5531f650406a6c51cdef63c3", + "SPT5_T15_REP2.size_factors.txt:md5,ab7e2bb4d1b02fe6b5ada32f241b71f9", + "SPT5_T0_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,53e0520edd232b504d4faece8432c1aa", + "SPT5_T0_REP1.mLb.clN_peaks.count_mqc.tsv:md5,696c8df5c311c6744dbc2602a33cb0da", + "SPT5_T0_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,63cf08a833334bf8a3c1100d9adf2201", + "SPT5_T0_REP2.mLb.clN_peaks.count_mqc.tsv:md5,3a31fd92931dcc9afc2c2f578235d29c", + "SPT5_T15_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,570b9c95896e14d350b71848b2c56303", + "SPT5_T15_REP1.mLb.clN_peaks.count_mqc.tsv:md5,32bea3d784886e9ec586a6ddde491ccb", + "SPT5_T15_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,89ede2380b8fb91e1177a5188079f691", + "SPT5_T15_REP2.mLb.clN_peaks.count_mqc.tsv:md5,6fa0cda3ebddb455ff438783d887ddd2", + "macs3_annotatePeaks.mLb.clN.summary.txt:md5,f9334eba6983b14929fbaf77572fe034", + "macs3_annotatePeaks.mLb.clN.summary_mqc.tsv:md5,d6724cd4e054573138a21943a5d6e93b", + "SPT5_INPUT_REP1.mLb.clN.sorted.bam.flagstat:md5,497dbe658c6a44d7527f78c2ed593747", + "SPT5_INPUT_REP1.mLb.clN.sorted.bam.idxstats:md5,3db8bcb3764a36a735226de3e791557d", + "SPT5_INPUT_REP1.mLb.mkD.sorted.bam.flagstat:md5,f8918c990c1ad5f72dd63bad208c4669", + "SPT5_INPUT_REP1.mLb.mkD.sorted.bam.idxstats:md5,554ec590c62b31d994dba451b572e4be", + "SPT5_INPUT_REP2.mLb.clN.sorted.bam.flagstat:md5,90ccc2d3e8f00ffb796c7ac076ff70f8", + "SPT5_INPUT_REP2.mLb.clN.sorted.bam.idxstats:md5,2b5a203d7d1fe66115ecc29a44c3d433", + "SPT5_INPUT_REP2.mLb.mkD.sorted.bam.flagstat:md5,f631512d9959d72f73030a9ecb7c5f3e", + "SPT5_INPUT_REP2.mLb.mkD.sorted.bam.idxstats:md5,c82694207e6ff529bc0d38136f0ae8d3", + "SPT5_T0_REP1.mLb.clN.sorted.bam.flagstat:md5,35b6851dd4960fbcf0353b2b998ee467", + "SPT5_T0_REP1.mLb.clN.sorted.bam.idxstats:md5,dda689aa8a4b89be95e687ecdd03827b", + "SPT5_T0_REP1.mLb.mkD.sorted.bam.flagstat:md5,828f11cb1790a805192dc31281ad2e3f", + "SPT5_T0_REP1.mLb.mkD.sorted.bam.idxstats:md5,140d6011382f7f47396bfe3c922fe91c", + "SPT5_T0_REP2.mLb.clN.sorted.bam.flagstat:md5,69f9e83c32e2a3fadf59188e3ef3e894", + "SPT5_T0_REP2.mLb.clN.sorted.bam.idxstats:md5,678fa8d9637a41488ac97ddf818d8b36", + "SPT5_T0_REP2.mLb.mkD.sorted.bam.flagstat:md5,fcd2c20d6fc99776693a143d5b932ca5", + "SPT5_T0_REP2.mLb.mkD.sorted.bam.idxstats:md5,d3ceb83f80afec7154fe635a0028b4d8", + "SPT5_T15_REP1.mLb.clN.sorted.bam.flagstat:md5,6891c10f1154ed8fa0fb9a51a29efd15", + "SPT5_T15_REP1.mLb.clN.sorted.bam.idxstats:md5,59b460f7d62e85693de7e16e1b6dd2fb", + "SPT5_T15_REP1.mLb.mkD.sorted.bam.flagstat:md5,dc1d87f112c542cdd16c7586d98f54c8", + "SPT5_T15_REP1.mLb.mkD.sorted.bam.idxstats:md5,f9b29bd0bc2fce1931363d00d305ccce", + "SPT5_T15_REP2.mLb.clN.sorted.bam.flagstat:md5,a32beef1f64dec9ef1383d5bf43a6d56", + "SPT5_T15_REP2.mLb.clN.sorted.bam.idxstats:md5,c0b21543d841200e873b58149806842c", + "SPT5_T15_REP2.mLb.mkD.sorted.bam.flagstat:md5,5a090318ad09a7ff29d268075ad51476", + "SPT5_T15_REP2.mLb.mkD.sorted.bam.idxstats:md5,1ba8101d227926dc75b6791ea589c169", + "SPT5_INPUT.mRp.clN.scale_factor.txt:md5,51a53844bdd40cc4460c37e43414cff2", + "SPT5_T0.mRp.clN.scale_factor.txt:md5,e1ce0e8f48a0df9bfc61b0c614d7bb9c", + "SPT5_T15.mRp.clN.scale_factor.txt:md5,91db8a99954d4096bdb48be8c20fc4be", + "SPT5_T0.mRp.clN_peaks.broadPeak:md5,dafcf1074b7ae15b169c286c8a107acc", + "SPT5_T0.mRp.clN_peaks.gappedPeak:md5,ca83ca9228d02a0d91e7f9ddd7734c95", + "SPT5_T0.mRp.clN_peaks.xls:md5,9b5b1629d393c7b598bf8a2d97bb2798", + "SPT5_T15.mRp.clN_peaks.broadPeak:md5,245efaa7696bd7bd7c28f48f54d24ccf", + "SPT5_T15.mRp.clN_peaks.gappedPeak:md5,cf463ea6530889668d5d5011aaf0ed2f", + "SPT5_T15.mRp.clN_peaks.xls:md5,48fc38458ffb90430be063fa10eab615", + "consensus_peaks.mRp.clN.bed:md5,ab501cefb0b282ccd14f01e53f6d6e51", + "consensus_peaks.mRp.clN.boolean.intersect.txt:md5,3fa1ed94fdc4305e082d9e089639b978", + "consensus_peaks.mRp.clN.boolean.txt:md5,d6863f401400aabecb5760a81513cfd9", + "consensus_peaks.mRp.clN.featureCounts.tsv:md5,a79e6c4e86c4bdf345324bda381d9b75", + "consensus_peaks.mRp.clN.featureCounts.tsv.summary:md5,31c819e86e50c1dba4ab6df44f7ba466", + "consensus_peaks.mRp.clN.saf:md5,7e6ee19c7d44eecaf7d6c0fceb04a10e", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "SPT5_T0_REP1.size_factors.txt:md5,1a371bfe15e9bcc61fead0654e590062", + "SPT5_T0_REP2.size_factors.txt:md5,2ad9ebaf47f1a914de93b61b4ce7b2a1", + "SPT5_T15_REP1.size_factors.txt:md5,c27c1949cec645aa1868f23c859a37ec", + "SPT5_T15_REP2.size_factors.txt:md5,dcfdb22a71d87ccd093529546f31e60f", + "SPT5_T0.mRp.clN_peaks.FRiP_mqc.tsv:md5,0069f85555fd4002932045da46295389", + "SPT5_T0.mRp.clN_peaks.count_mqc.tsv:md5,a03a6789ea271c2db3b80a0b9ecbabfb", + "SPT5_T15.mRp.clN_peaks.FRiP_mqc.tsv:md5,c092b67f51f5a48c25f10867e3b0d8ee", + "SPT5_T15.mRp.clN_peaks.count_mqc.tsv:md5,28309de6f5a26647e9cd89bebd6aa11b", + "macs3_annotatePeaks.mRp.clN.summary.txt:md5,1350a5beb61e0a8dff9ca355f5aff1cb", + "macs3_annotatePeaks.mRp.clN.summary_mqc.tsv:md5,e7fd68ed325f894ce18dc972dc8103b4", + "SPT5_INPUT.mRp.clN.sorted.bam.flagstat:md5,20b5189649c3a852cc483ca187706641", + "SPT5_INPUT.mRp.clN.sorted.bam.idxstats:md5,6785580073da77a0e1a75ed8bdf4e7b8", + "SPT5_T0.mRp.clN.sorted.bam.flagstat:md5,d560f3c4988251fdbf1cb35da841d39d", + "SPT5_T0.mRp.clN.sorted.bam.idxstats:md5,34b61f771aad4d82cdd747ffba62474c", + "SPT5_T15.mRp.clN.sorted.bam.flagstat:md5,eb12ff8695703161276da457c9c30de5", + "SPT5_T15.mRp.clN.sorted.bam.idxstats:md5,bbff2deab1453874a3afa52e1677901d", + "genome.fa:md5,4bad9f4b18056156a81f7f952abbe125", + "genome.fa.fai:md5,6f4c0ce5258e6948135ad006e1f9ee1b", + "deeptools_plot_fingerprint_counts_mlib_deeptools.txt:md5,eb7174990379d2e4437fec7309ec6482", + "deeptools_plot_profile_mlib_deeptools.txt:md5,ce9753779c7d797152e99fdefe253330", + "mqc_cutadapt_filtered_reads_plot_1.txt:md5,bd5ff9c6b87ca2f294273dbe6aa23bc5", + "mqc_cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,fd0d5c7a0eb4dae2a4820032a32a4811", + "mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,9f04a47013ee8c5ab558ef60d2542d87", + "mqc_deeptools_fingerprint_plot_1.txt:md5,5dc80564b41800f294d4a4aeff934632", + "mqc_fastqc_adapter_content_plot-2_1.txt:md5,1bd5ff7987eb0f44677755c64e1882ad", + "mqc_fastqc_adapter_content_plot_1.txt:md5,1b157e08d1583960b7ae3baf3aa21fc2", + "mqc_fastqc_per_base_n_content_plot-2_1.txt:md5,0d69579a86a37d761aa2ac88a50942dd", + "mqc_fastqc_per_base_n_content_plot_1.txt:md5,65a1d0e835082f821697947c2291b219", + "mqc_fastqc_per_base_sequence_quality_plot-2_1.txt:md5,fb11b70d41ad26140efbacaab3c93ab8", + "mqc_fastqc_per_base_sequence_quality_plot_1.txt:md5,cff6f85dd9429cfd7bc4a4e27d2075a6", + "mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt:md5,20c00771546a2c8c2a9fe6533178e865", + "mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt:md5,051670bdc6580e3b194cf8f3cde6ed50", + "mqc_fastqc_per_sequence_gc_content_plot_Counts.txt:md5,a60b320928a46ac25b330791e85c2973", + "mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,3a2c81d6f97fdde2e27be7fc6da5dc44", + "mqc_fastqc_per_sequence_quality_scores_plot-2_1.txt:md5,75eafb402c4389a14394af55ae4f6117", + "mqc_fastqc_per_sequence_quality_scores_plot_1.txt:md5,773071453aa0a2d6834bfe5e78bd0abd", + "mqc_fastqc_sequence_counts_plot-2_1.txt:md5,160d21eabdd8b0acb73005296a8053d4", + "mqc_fastqc_sequence_counts_plot_1.txt:md5,7d9ffa37c36375f13e55095cb585c327", + "mqc_fastqc_sequence_duplication_levels_plot-2_1.txt:md5,ac86929b31cc81d4f9841a6a223f487c", + "mqc_fastqc_sequence_duplication_levels_plot_1.txt:md5,6fdbd179eb4f21571b3d98a79065efc1", + "mqc_fastqc_sequence_length_distribution_plot_1.txt:md5,fe73bef291acab264b7148855054d014", + "mqc_featureCounts_assignment_plot-2_1.txt:md5,f6c91c9dad58a3c69a3b99891d134aa5", + "mqc_featureCounts_assignment_plot_1.txt:md5,41e719e2c442e1937dd8f9bde3bb3b08", + "mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt:md5,da2ef2ffbbe638c46bdcbac5f8811421", + "mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt:md5,4ad9aaeaa4b02e2b68961955ecd00eb0", + "mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt:md5,a74fcf8b09ed25c0b78ae71c4946344c", + "mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt:md5,dd1813bdb3259fe926d48e1a32acd5fc", + "mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt:md5,c810bee1d291c3252e771dfad637c07f", + "mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt:md5,fa226c04b6d621e55e797db2cb0b5010", + "mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt:md5,d25c45d99db9874a8c4406963f31adae", + "mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt:md5,eb88419c68142f5730de9b606da69052", + "mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt:md5,2257050d6d18c54745939d2274793a26", + "mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,28183b9b678535910e5e495f8a3e77c0", + "mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,f7b05254fdbf952139f84afd5cf7b8e3", + "mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,8694d29455224aea2d2f64063407c35b", + "mqc_samtools_alignment_plot-2_1.txt:md5,7602eb200f42f3fb2a350530dc38ca43", + "mqc_samtools_alignment_plot-3_1.txt:md5,d9b365e1b9e11775a8a227e276adfb45", + "mqc_samtools_alignment_plot-4_1.txt:md5,1d72f11431739f6a1f8f660d0989d177", + "mqc_samtools_alignment_plot_1.txt:md5,8dddc8888b3261c2acaca2423537042a", + "multiqc_citations.txt:md5,34da9f7497d275274f6dfd3b89831edb", + "multiqc_cutadapt.txt:md5,0712486d17e3ac9aae098e0806ae8c52", + "multiqc_fastqc.txt:md5,bce9e7180b769741e703d92c6f583755", + "multiqc_fastqc_1.txt:md5,2052d087efacc3d416669a567d9223c9", + "multiqc_featureCounts_mlib_featurecounts.txt:md5,262346048af2ef1367563396dc07e3ed", + "multiqc_featureCounts_mrep_featurecounts.txt:md5,4cd9f312db5657b065cc19c1359b4a03", + "multiqc_mlib_frip_score-plot.txt:md5,c56b056f63181bd28659f04d461d7e1d", + "multiqc_mlib_peak_annotation-plot.txt:md5,919db7d665243f0e8005f1db53b3f391", + "multiqc_mlib_peak_count-plot.txt:md5,8d5130ed1466998f3d6aca02026c9886", + "multiqc_mrep_frip_score-plot.txt:md5,da31f7d3b7855cba3863f0853ce93368", + "multiqc_mrep_peak_annotation-plot.txt:md5,8227d4626ccab3280fc84f41354d32ad", + "multiqc_mrep_peak_count-plot.txt:md5,e7168b68a261df2419ea3d2f8a7cb32d", + "picard_histogram.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_3.txt:md5,8523e3151bf5c0b9508db1784a57991c", + "picard_histogram_4.txt:md5,2157bcbfc69f305ff33fb135a7978fb2", + "picard_histogram_5.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "samplesheet.valid.csv:md5,96f76cc909ae82328fbdcbe940c04400" + ] + ], + "timestamp": "2026-10-06T16:50:34.653875", + "meta": { + "nf-test": "0.9.4", + "nextflow": "26.04.4" + } + } +} \ No newline at end of file diff --git a/tests/default.nf.test b/tests/default.nf.test new file mode 100644 index 00000000..15421c16 --- /dev/null +++ b/tests/default.nf.test @@ -0,0 +1,35 @@ +nextflow_pipeline { + + name "Test pipeline" + script "../main.nf" + tag "pipeline" + + test("-profile test") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success}, + { assert snapshot( + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_atacseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) + } + } +} diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap new file mode 100644 index 00000000..2a4203e2 --- /dev/null +++ b/tests/default.nf.test.snap @@ -0,0 +1,1121 @@ +{ + "-profile test": { + "content": [ + 264, + { + "BAMTOOLS_FILTER": { + "bamtools": "2.5.2", + "samtools": "1.15.1" + }, + "BAM_REMOVE_ORPHANS": { + "samtools": "1.15.1" + }, + "BEDTOOLS_GENOMECOV": { + "bedtools": "2.31.1", + "sort": "sort (GNU coreutils) 9.5" + }, + "BWA_INDEX": { + "bwa": "0.7.19-r1273" + }, + "BWA_MEM": { + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" + }, + "DEEPTOOLS_COMPUTEMATRIX_REFERENCE_POINT": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_COMPUTEMATRIX_SCALE_REGIONS": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTHEATMAP": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTPROFILE": { + "deeptools": "3.5.6" + }, + "DESEQ2_QC": { + "bioconductor-deseq2": "1.28.0", + "r-base": "4.0.3" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "FRIP_SCORE": { + "bedtools": "2.30.0", + "samtools": "1.15.1" + }, + "GENOME_BLACKLIST_REGIONS": { + "bedtools": "2.30.0" + }, + "GET_AUTOSOMES": { + "python": "3.8.3" + }, + "GTF2BED": { + "perl": "5.26.2" + }, + "HOMER_ANNOTATEPEAKS": { + "homer": 4.11 + }, + "IGV": { + "python": "3.8.3" + }, + "KHMER_UNIQUEKMERS": { + "khmer": "3.0.0a3" + }, + "MACS3_CALLPEAK": { + "macs3": "3.0.4" + }, + "MACS3_CONSENSUS": { + "python": "3.10.0", + "r-base": "4.1.1" + }, + "MERGED_LIBRARY_ATAQV_ATAQV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_ATAQV_MKARV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_DEEPTOOLS_PLOTFINGERPRINT": { + "deeptools": "3.5.6" + }, + "MERGED_LIBRARY_PICARD_COLLECTMULTIPLEMETRICS": { + "picard": "3.4.0" + }, + "MULTIQC_CUSTOM_PEAKS": { + "sed": 4.7 + }, + "PICARD_MARKDUPLICATES": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_LIBRARY": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_REPLICATE": { + "picard": "3.4.0" + }, + "PLOT_HOMER_ANNOTATEPEAKS": { + "r-base": "4.0.3" + }, + "PLOT_MACS3_QC": { + "r-base": "4.0.3" + }, + "SAMPLESHEET_CHECK": { + "python": "3.8.3" + }, + "SAMTOOLS_FAIDX": { + "samtools": "1.23.1" + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": 1.24 + }, + "SAMTOOLS_IDXSTATS": { + "samtools": 1.24 + }, + "SAMTOOLS_INDEX": { + "samtools": 1.24 + }, + "SAMTOOLS_SORT": { + "samtools": 1.24 + }, + "SAMTOOLS_STATS": { + "samtools": 1.24 + }, + "SUBREAD_FEATURECOUNTS": { + "subread": "2.0.1" + }, + "TRIMGALORE": { + "trimgalore": "2.1.0" + }, + "TSS_EXTRACT": { + "sed": 4.7 + }, + "UCSC_BEDGRAPHTOBIGWIG": { + "ucsc": 482 + } + }, + [ + "bwa", + "bwa/merged_library", + "bwa/merged_library/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/ataqv", + "bwa/merged_library/ataqv/broad_peak", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/html", + "bwa/merged_library/ataqv/broad_peak/html/css", + "bwa/merged_library/ataqv/broad_peak/html/css/ataqv.css", + "bwa/merged_library/ataqv/broad_peak/html/css/datatables.buttons.min.css", + "bwa/merged_library/ataqv/broad_peak/html/css/datatables.fontawesome.css", + "bwa/merged_library/ataqv/broad_peak/html/css/datatables.min.css", + "bwa/merged_library/ataqv/broad_peak/html/css/font-awesome.min.css", + "bwa/merged_library/ataqv/broad_peak/html/css/normalize.css", + "bwa/merged_library/ataqv/broad_peak/html/data", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T0_PE_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T0_PE_REP2.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T100_SE_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T100_SE_REP2.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T150_SE_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T15_PE_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/fonts", + "bwa/merged_library/ataqv/broad_peak/html/fonts/FontAwesome.otf", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.eot", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.svg", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.ttf", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff2", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regular.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regularit.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semibold.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semiboldit.woff", + "bwa/merged_library/ataqv/broad_peak/html/index.html", + "bwa/merged_library/ataqv/broad_peak/html/js", + "bwa/merged_library/ataqv/broad_peak/html/js/ataqv.js", + "bwa/merged_library/ataqv/broad_peak/html/js/configuration.js", + "bwa/merged_library/ataqv/broad_peak/html/js/d3.min.js", + "bwa/merged_library/ataqv/broad_peak/html/js/datatables.min.js", + "bwa/merged_library/ataqv/broad_peak/html/js/jszip.min.js", + "bwa/merged_library/bigwig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/scale", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/deeptools", + "bwa/merged_library/deeptools/plotfingerprint", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotprofile", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/macs3", + "bwa/merged_library/macs3/broad_peak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/consensus", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.bed", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.intersect.plot.pdf", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.intersect.txt", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.txt", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.tsv", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.tsv.summary", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.saf", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/R_sessionInfo.log", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.dds.RData", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.pca.vals.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.pca.vals_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.plots.pdf", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.rds", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.sample.dists.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.sample.dists_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/consensus_peaks.mLb.clN.size_factors.RData", + "bwa/merged_library/macs3/broad_peak/qc", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.plots.pdf", + "bwa/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary.txt", + "bwa/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.plots.pdf", + "bwa/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.summary.txt", + "bwa/merged_library/picard_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/samtools_stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_replicate", + "bwa/merged_replicate/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam", + "bwa/merged_replicate/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.bai", + "bwa/merged_replicate/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam", + "bwa/merged_replicate/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.bai", + "bwa/merged_replicate/bigwig", + "bwa/merged_replicate/bigwig/OSMOTIC_STRESS_T0_PE.mRp.clN.bigWig", + "bwa/merged_replicate/bigwig/OSMOTIC_STRESS_T100_SE.mRp.clN.bigWig", + "bwa/merged_replicate/bigwig/scale", + "bwa/merged_replicate/bigwig/scale/OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt", + "bwa/merged_replicate/bigwig/scale/OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt", + "bwa/merged_replicate/macs3", + "bwa/merged_replicate/macs3/broad_peak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.annotatePeaks.txt", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.annotatePeaks.txt", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls", + "bwa/merged_replicate/macs3/broad_peak/consensus", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.annotatePeaks.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.bed", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.intersect.plot.pdf", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.intersect.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.tsv", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.tsv.summary", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.saf", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/R_sessionInfo.log", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.dds.RData", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.pca.vals.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.pca.vals_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.plots.pdf", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.rds", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.sample.dists.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.sample.dists_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/consensus_peaks.mRp.clN.size_factors.RData", + "bwa/merged_replicate/macs3/broad_peak/qc", + "bwa/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.plots.pdf", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary.txt", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.plots.pdf", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.summary.txt", + "bwa/merged_replicate/picard_metrics", + "bwa/merged_replicate/picard_metrics/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.metrics.txt", + "bwa/merged_replicate/picard_metrics/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.metrics.txt", + "bwa/merged_replicate/samtools_stats", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.stats", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.stats", + "fastqc", + "fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T100_SE_REP1_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T100_SE_REP2_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T150_SE_REP1_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T150_SE_REP1_T2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_2_fastqc.html", + "fastqc/zips", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T100_SE_REP1_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T100_SE_REP2_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_2_fastqc.zip", + "genome", + "genome/genome.fa", + "genome/genome.fa.fai", + "igv", + "igv/broad_peak", + "igv/broad_peak/igv_files.txt", + "igv/broad_peak/igv_session.xml", + "multiqc", + "multiqc/broad_peak", + "multiqc/broad_peak/multiqc_data", + "multiqc/broad_peak/multiqc_data/deeptools_plot_fingerprint_counts_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/deeptools_plot_profile_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_filtered_reads_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_trimmed_sequences_plot_3_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt", + "multiqc/broad_peak/multiqc_data/mqc_deeptools_fingerprint_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_adapter_content_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_adapter_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_n_content_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_n_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_sequence_quality_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_sequence_quality_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_quality_scores_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_quality_scores_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_counts_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_counts_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_duplication_levels_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_duplication_levels_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_length_distribution_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_featureCounts_assignment_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_featureCounts_assignment_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_readlength_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Adenine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Cytosine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Guanine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Thymine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Undetermined.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_by_cycle_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_score_distribution_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_read_distribution_profile_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-3_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-4_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc.log", + "multiqc/broad_peak/multiqc_data/multiqc_citations.txt", + "multiqc/broad_peak/multiqc_data/multiqc_cutadapt.txt", + "multiqc/broad_peak/multiqc_data/multiqc_data.json", + "multiqc/broad_peak/multiqc_data/multiqc_fastqc.txt", + "multiqc/broad_peak/multiqc_data/multiqc_fastqc_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_featureCounts_mlib_featurecounts.txt", + "multiqc/broad_peak/multiqc_data/multiqc_featureCounts_mrep_featurecounts.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_deseq2_clustering_1-plot.yaml", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_deseq2_pca_1-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_deseq2_clustering_1-plot.yaml", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_deseq2_pca_1-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_AlignmentSummaryMetrics.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_baseContent.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_insertSize.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_by_cycle.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_score_distribution.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_sources.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_2.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_3.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_4.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_5.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_2.txt", + "multiqc/broad_peak/multiqc_plots", + "multiqc/broad_peak/multiqc_plots/pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_filtered_reads_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_filtered_reads_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_deeptools_fingerprint_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_adapter_content_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_adapter_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_n_content_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_n_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_sequence_quality_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_sequence_quality_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_quality_scores_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_quality_scores_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_duplication_levels_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_duplication_levels_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_length_distribution_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_readlength_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Adenine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Cytosine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Guanine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Thymine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Undetermined.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_by_cycle_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_score_distribution_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_read_distribution_profile_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_filtered_reads_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_filtered_reads_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_trimmed_sequences_plot_3_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_deeptools_fingerprint_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_adapter_content_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_adapter_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_n_content_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_n_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_sequence_quality_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_sequence_quality_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_quality_scores_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_quality_scores_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_duplication_levels_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_duplication_levels_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_length_distribution_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_readlength_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Adenine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Cytosine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Guanine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Thymine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Undetermined.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_by_cycle_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_score_distribution_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_read_distribution_profile_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_filtered_reads_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_filtered_reads_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_trimmed_sequences_plot_3_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_deeptools_fingerprint_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_adapter_content_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_adapter_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_n_content_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_n_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_sequence_quality_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_sequence_quality_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_quality_scores_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_quality_scores_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_duplication_levels_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_duplication_levels_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_length_distribution_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_readlength_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Adenine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Cytosine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Guanine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Thymine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Undetermined.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_by_cycle_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_score_distribution_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_read_distribution_profile_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_atacseq_software_mqc_versions.yml", + "pipeline_info/samplesheet.valid.csv", + "trimgalore", + "trimgalore/fastqc", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T100_SE_REP1_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T100_SE_REP2_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T150_SE_REP1_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T150_SE_REP1_T2_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_2_val_2_fastqc.html", + "trimgalore/fastqc/zips", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T100_SE_REP1_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T100_SE_REP2_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T2_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_2_val_2_fastqc.zip", + "trimgalore/logs", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP1_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP1_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP2_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP2_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T100_SE_REP1_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T100_SE_REP2_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T150_SE_REP1_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T150_SE_REP1_T2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T2_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T2_2.fastq.gz_trimming_report.txt" + ], + [ + "ataqv.css:md5,7bb9e18974018dd29bdc12a46a6d6d65", + "datatables.buttons.min.css:md5,675306abc9d3239314f2c66c0e22ef7a", + "datatables.fontawesome.css:md5,716d7a3edd2c75e712b1ffe26f12a861", + "datatables.min.css:md5,00ef3e39d9302618395ab189ec8bcd9f", + "font-awesome.min.css:md5,89916fa773ce96569604016ef25cab50", + "normalize.css:md5,40d20cc85100840580df4346bb99d7ed", + "FontAwesome.otf:md5,9ccfa32dd4cd1b8e83f68899d85bd5e6", + "fontawesome-webfont.eot:md5,404a525502f8e5ba7e93b9f02d9e83a9", + "fontawesome-webfont.ttf:md5,fb650aaf10736ffb9c4173079616bf01", + "fontawesome-webfont.woff:md5,891e3f340c1126b4c7c142e5f6e86816", + "fontawesome-webfont.woff2:md5,926c93d201fe51c8f351e858468980c3", + "sourcesanspro-regular.woff:md5,f7bd788f18b8c4bb93dd37d140348e1e", + "sourcesanspro-regularit.woff:md5,c3638b17f4fd76dae12fe2ae14571e57", + "sourcesanspro-semibold.woff:md5,e7fc8925d9364e9d177d9e1d08bb1855", + "sourcesanspro-semiboldit.woff:md5,f1d255aa459786dfc6aa2e488ac01245", + "index.html:md5,bf7747be761e56ad7c54c842ac88461a", + "ataqv.js:md5,feb291b7839e9e43ed304565e3a605d9", + "configuration.js:md5,5fa99e6c27050fed09c3764512c56c96", + "d3.min.js:md5,db69fb2626a71a286ee772d673138aca", + "datatables.min.js:md5,e369b872620dadb05e4eb555b81f9112", + "jszip.min.js:md5,09e492cb492ffa75484bbe10f1f721d1", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_factor.txt:md5,5afe7d16ac432b483454d7406dd4b72e", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_factor.txt:md5,816f20d069360ccb44e8e565b6b0a4e6", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt:md5,a9b555d96448f5ac9bdb6f4526f86341", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt:md5,618690cf55da217e9cd1324f38aab6de", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt:md5,e2a4023f321415738eb727cd3bcbce5b", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt:md5,91db8a99954d4096bdb48be8c20fc4be", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak:md5,c5b53511f764fb205886daa4f2ab00ec", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak:md5,adca40deef4439d757f656ceb2d434e4", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls:md5,f3e47ff619d7b4c0e2d543d1609927a4", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak:md5,3e8ae758c789ca16094a3d96718f7be3", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak:md5,da2909b11601c515cc1d431a5ef67bcb", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls:md5,9e9ca58826c2ab3e70c06a533e7dbae1", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak:md5,171bbf48bda913bf702954c20dd57fcb", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak:md5,6ac2f1603586b83ba2591f9c90fd13c9", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls:md5,ec811f9a7b8f5a517caf7b3a2f4988b8", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak:md5,d61e6f9675514a5b3c343e78b96c9111", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak:md5,fb8556e521d4c254f57ae3fdb67c9b64", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls:md5,3f415d834d3f9e5939dc8601ff0898b5", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak:md5,8f44ebfeb1ce0f3d01e915f3759b7a4f", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak:md5,fec3059e1a1b77fa791119d8a4d6d4c5", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls:md5,7df7f8827964cf1a29855e4c91f67246", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak:md5,72db339e1a71e9bce5be245aab548a76", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak:md5,7a10a324776281b675922de41c21e9f7", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls:md5,d10e9cad50ff99d58776f6b198f65936", + "consensus_peaks.mLb.clN.bed:md5,6a7d64f82769ab09538bbca05c0de568", + "consensus_peaks.mLb.clN.boolean.intersect.txt:md5,acb006189a63e3ab725c394f363d81de", + "consensus_peaks.mLb.clN.boolean.txt:md5,3be6c0c02305279fc537161e5af2971c", + "consensus_peaks.mLb.clN.featureCounts.tsv:md5,ff129fb9efef15f310b42484f5984476", + "consensus_peaks.mLb.clN.featureCounts.tsv.summary:md5,7e07db1f0f10c296c17e437c96812f63", + "consensus_peaks.mLb.clN.saf:md5,8e7b6b455fc3da0928de3a0f0b935022", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,ec773a4eac08fcf592fe2ef5364c719b", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,f69e4de537ce488dd91feb107d2df8bf", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,5eaf69e0d03d4a1a7f542d8cab107f0c", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,59a12137dcec77f3340915494e76f31c", + "OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt:md5,71e53fdbc0add5e91ddb41f2cb0fbf0f", + "OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt:md5,1284216c615d68a6dcf3131585eac9dc", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,085031e28b891cef205a81c9b6f34df4", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,01eada7dd6240d2af66efaf0105f801e", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,602c8df9e26c8e057d76eaa1a133f513", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,5de4f043eb01162f21c21e0cdf608f91", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,e1c3ca6628ab103b34063f0bc0fd6fa1", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,d9f63fd5f5f535c5c62bdbee9b9095aa", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,e3940e03c0309b06e25d412e22078f57", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,c584070f8983b196453026b463a6bffd", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,582520ff525281336452eb4761b52e78", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,aeb72fa43a2bf33c6799ba5e6f030273", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,876ec6709a7ec06e1ec7d2f502af0ac5", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,6718411a3dd59b2e62e9758c401b14a2", + "macs3_annotatePeaks.mLb.clN.summary.txt:md5,3ff8d12f5eae22308bb3afe873ccc8c9", + "macs3_annotatePeaks.mLb.clN.summary_mqc.tsv:md5,7faa6ca1d6da087f456f92921e769989", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,35b6851dd4960fbcf0353b2b998ee467", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,dda689aa8a4b89be95e687ecdd03827b", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,828f11cb1790a805192dc31281ad2e3f", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,140d6011382f7f47396bfe3c922fe91c", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.flagstat:md5,69f9e83c32e2a3fadf59188e3ef3e894", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats:md5,678fa8d9637a41488ac97ddf818d8b36", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat:md5,fcd2c20d6fc99776693a143d5b932ca5", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats:md5,d3ceb83f80afec7154fe635a0028b4d8", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,f9f155991b027ae0009c110884f5abf9", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,3d31ff2b94710969f532b1734480b92b", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,e3d0421cc9477abb16c32d9b3cf02387", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,c216287572279f13283dcdf22a4bc8e4", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.flagstat:md5,839440ef66553433166e265e79db6eae", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats:md5,466be87abe64ed73a9714fa5fac6a137", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat:md5,c4cd9237f8373b8f7a84851d7d0530f4", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats:md5,acdc7649de86409b0fbcf6052b64ba1e", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,86ba63b9e1d2fbc3d95488557315105a", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,dc506bc379328fcbc34558931e21bbe3", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,00a9eb297b29c4b43095ddb2d5a06df3", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,e765400df8443db2d29a7f9c4c7e1b97", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,eb12ff8695703161276da457c9c30de5", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,bbff2deab1453874a3afa52e1677901d", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,8d4a49f8a3fe5a36b38e17e4afd1f5d3", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,9bab2110046e1ed7ab2111303e7db5c0", + "OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt:md5,e1ce0e8f48a0df9bfc61b0c614d7bb9c", + "OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt:md5,af2d967e796c5129231b8d632dfdda87", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak:md5,45336ce2d31d67ea8c56f03e18ec76f6", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak:md5,edb44531ce01afae39d5dc36133c03ce", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls:md5,63fd7e3cf43aa388246e677a8a87d151", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak:md5,eb29b262e9e2cda7bfe967ffc0869de1", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak:md5,c13f1e4c898425a3fc63bbfa3bbbbdcb", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls:md5,fbb3d89ecc4ae841147fe2b8c853aa80", + "consensus_peaks.mRp.clN.bed:md5,9d05ae155aa59ab54d5270c3a2da7459", + "consensus_peaks.mRp.clN.boolean.intersect.txt:md5,a87fffa46d4050a48119917bbcf5252d", + "consensus_peaks.mRp.clN.boolean.txt:md5,b85796c31be5360eb3793056de6f7854", + "consensus_peaks.mRp.clN.featureCounts.tsv:md5,f7cd02d491452d79ae394b1c8610259d", + "consensus_peaks.mRp.clN.featureCounts.tsv.summary:md5,9fbdd1837a87efc1d41618c08d2ee234", + "consensus_peaks.mRp.clN.saf:md5,f7a135cd076a0409c53bc8165ecd4ff8", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,4110a9af22815faaec345fb07e729ed3", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,f279abbc922be5bb568acbf569df5b40", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,150b7b30d8e5a679e0728e5dd04ef309", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,173ca08a46a73f6332d475c19c9155cb", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv:md5,2620209e4e6419d8545d9842acddb645", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv:md5,1b0ed83d8a0b7b7248fd8da81816bcb9", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv:md5,97a4086d0ca0e6fe96c4bf6864323f53", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv:md5,31e2de1f288e4e8191bcd0267d63828e", + "macs3_annotatePeaks.mRp.clN.summary.txt:md5,96beab08431b5025c3a0c1c6efdde1ee", + "macs3_annotatePeaks.mRp.clN.summary_mqc.tsv:md5,6c689c7ea46d435473766db948fe02c5", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat:md5,d560f3c4988251fdbf1cb35da841d39d", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats:md5,34b61f771aad4d82cdd747ffba62474c", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat:md5,34cf6a70329ac5f0038d9900673f9fea", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats:md5,7e45d1561601ad26823656ccb784dbc6", + "genome.fa:md5,4bad9f4b18056156a81f7f952abbe125", + "genome.fa.fai:md5,6f4c0ce5258e6948135ad006e1f9ee1b", + "deeptools_plot_fingerprint_counts_mlib_deeptools.txt:md5,15274f0c41d58f14d454fb0fb983e6fd", + "deeptools_plot_profile_mlib_deeptools.txt:md5,3c74002bc0bc18921860ef381f97ae77", + "mqc_cutadapt_filtered_reads_plot_1.txt:md5,b78f69173122f2cacf8121eaeb815382", + "mqc_cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,157073209c492b89badba367b1c57d83", + "mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,b04ae8b2ec27d71817ae7cb666888b9b", + "mqc_deeptools_fingerprint_plot_1.txt:md5,c0dc7eb479f572b51b7c1aea7f08a241", + "mqc_fastqc_adapter_content_plot-2_1.txt:md5,3560a22f94aea25e27d97e056fb478ed", + "mqc_fastqc_adapter_content_plot_1.txt:md5,66f3e2f6ba14599b0d6c20144df60777", + "mqc_fastqc_per_base_n_content_plot-2_1.txt:md5,d79e95d36d955edee3e4bfb139dce967", + "mqc_fastqc_per_base_n_content_plot_1.txt:md5,8d9cdd0463193b7e10332e2ca0273aca", + "mqc_fastqc_per_base_sequence_quality_plot-2_1.txt:md5,3bb6cad69480846e4003b9f0f3511caa", + "mqc_fastqc_per_base_sequence_quality_plot_1.txt:md5,821cb87b0ae8bd61cd445d153b8f371a", + "mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt:md5,88fb0e924094b5dd57f4003ac13fd1f4", + "mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt:md5,a4b37bca5e61bf595c4532ffbc8b8f93", + "mqc_fastqc_per_sequence_gc_content_plot_Counts.txt:md5,3fa7f0c0858d12cae8700e21774da86d", + "mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,a2d0c3ec413894e4dafa62ebdf44a06c", + "mqc_fastqc_per_sequence_quality_scores_plot-2_1.txt:md5,841ccc3da246bd197fc966e9f8c5ca57", + "mqc_fastqc_per_sequence_quality_scores_plot_1.txt:md5,3bfe1c94f710975829e2c1e3b5f16ea7", + "mqc_fastqc_sequence_counts_plot-2_1.txt:md5,c734a06e1f3e3afc1486a0b45be880e1", + "mqc_fastqc_sequence_counts_plot_1.txt:md5,d0cf8d64e742b5f446e6b602d86913b9", + "mqc_fastqc_sequence_duplication_levels_plot-2_1.txt:md5,d7ada8561d521eaf645073f7cccf7b82", + "mqc_fastqc_sequence_duplication_levels_plot_1.txt:md5,23c4883ed6c22212b0c3e07a863745d1", + "mqc_fastqc_sequence_length_distribution_plot_1.txt:md5,bc3acb40acbf620b237d0f2fa8c8a1ab", + "mqc_featureCounts_assignment_plot-2_1.txt:md5,f658af85abdd9e46b2d4529328cc6cf3", + "mqc_featureCounts_assignment_plot_1.txt:md5,db0ee8a6b7802a57874f7a5d73a87db7", + "mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt:md5,24e8c9cb2e7d0bbfc49022717c84fa85", + "mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt:md5,99f9513a0d3239097a3b4454c6d78768", + "mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt:md5,04f8cb2c8855798e4ce61258ff0e14ec", + "mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt:md5,a40196c909d5326637e526c800e33fc2", + "mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt:md5,c811c90bee0900f8e8906e29567f29cd", + "mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt:md5,a8befb9b95ad2e76a57d84772450e99b", + "mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt:md5,3af943c8019d9eee42b4f40791a74c3f", + "mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt:md5,585e7aa5faf61c669ca5fb106340c6f4", + "mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt:md5,2687336b51d0fde9d2192ba48be4d319", + "mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,bec101bc6ee3766454189e3ab65166c2", + "mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,b27f1cb75fdc333d8a494dc8350d4351", + "mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,532caa74ae554bd7fdd40421c2ee7b51", + "mqc_samtools_alignment_plot-2_1.txt:md5,9c86235254e6f9598f62df2eec42ed45", + "mqc_samtools_alignment_plot-3_1.txt:md5,bff8cb7e31bc1221ddc08a1ab10faf91", + "mqc_samtools_alignment_plot-4_1.txt:md5,20f6f039fbf4b8c76b2309c97ad6e074", + "mqc_samtools_alignment_plot_1.txt:md5,afaffbac4a382f0e96d132f52d104fb1", + "multiqc_citations.txt:md5,34da9f7497d275274f6dfd3b89831edb", + "multiqc_cutadapt.txt:md5,926fcf7c5a9c5dc0a105a439c85a5f58", + "multiqc_fastqc.txt:md5,a9a7484add8120fc3cf3d5626a92973b", + "multiqc_fastqc_1.txt:md5,58ab2bbd2d19745e5975742c6d1335d7", + "multiqc_featureCounts_mlib_featurecounts.txt:md5,50b13438ebd046821e6cd1592512eac3", + "multiqc_featureCounts_mrep_featurecounts.txt:md5,686d0f56254e37f8f5af9497643d256d", + "multiqc_mlib_frip_score-plot.txt:md5,07ae10450e52b7eaa14901cf4ee11071", + "multiqc_mlib_peak_annotation-plot.txt:md5,49177a2691f14d6d1dcb9cb9cda11940", + "multiqc_mlib_peak_count-plot.txt:md5,884c5b0b366376214407bd58ae1ac29c", + "multiqc_mrep_frip_score-plot.txt:md5,16c5819f17332b50c64558ea9f31d870", + "multiqc_mrep_peak_annotation-plot.txt:md5,06918eae76d769b41471460676e02afb", + "multiqc_mrep_peak_count-plot.txt:md5,e5019374d8964473ca648859cca797fc", + "picard_histogram.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_3.txt:md5,fc2b0821fed14da8f161b48a6f04947b", + "picard_histogram_4.txt:md5,7cdffefa11196ef758cbdfe357ff5c9e", + "picard_histogram_5.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "samplesheet.valid.csv:md5,51b046b55592e95949824f21b12c7e49" + ] + ], + "timestamp": "2026-07-25T08:39:03.048237993", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 00000000..9db9e2f8 --- /dev/null +++ b/tests/nextflow.config @@ -0,0 +1,26 @@ +/* +======================================================================================== + Nextflow config file for running nf-test tests +======================================================================================== +*/ + +// Impose sensible resource limits for testing +process { + withName: '.*' { + cpus = 2 + memory = 6.GB + time = 2.h + } + withName: 'BWA_INDEX' { + memory = 16.GB + } +} + +// TODO nf-core: Specify any additional parameters here +// Or any resources requirements +params { + modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/atacseq/' +} + +aws.client.anonymous = true // fixes S3 access issues on self-hosted runners diff --git a/tests/skip_consensus_peaks.nf.test b/tests/skip_consensus_peaks.nf.test new file mode 100644 index 00000000..50db34ea --- /dev/null +++ b/tests/skip_consensus_peaks.nf.test @@ -0,0 +1,57 @@ +nextflow_pipeline { + + name "Test pipeline with --skip_consensus_peaks" + script "../main.nf" + tag "skip_consensus_peaks" + + test("skip_consensus_peaks") { + + when { + params { + outdir = "$outputDir" + skip_consensus_peaks = true + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success }, + { assert snapshot( + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_atacseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) + } + } + + test("skip_consensus_peaks with stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + skip_consensus_peaks = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.trace.succeeded().size() + ).match() } + ) + } + } +} diff --git a/tests/skip_consensus_peaks.nf.test.snap b/tests/skip_consensus_peaks.nf.test.snap new file mode 100644 index 00000000..e48ef39f --- /dev/null +++ b/tests/skip_consensus_peaks.nf.test.snap @@ -0,0 +1,1022 @@ +{ + "skip_consensus_peaks with stub": { + "content": [ + 26 + ], + "timestamp": "2026-03-20T23:13:57.511221102", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + } + }, + "skip_consensus_peaks": { + "content": [ + 256, + { + "BAMTOOLS_FILTER": { + "bamtools": "2.5.2", + "samtools": "1.15.1" + }, + "BAM_REMOVE_ORPHANS": { + "samtools": "1.15.1" + }, + "BEDTOOLS_GENOMECOV": { + "bedtools": "2.31.1", + "sort": "sort (GNU coreutils) 9.5" + }, + "BWA_INDEX": { + "bwa": "0.7.19-r1273" + }, + "BWA_MEM": { + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" + }, + "DEEPTOOLS_COMPUTEMATRIX_REFERENCE_POINT": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_COMPUTEMATRIX_SCALE_REGIONS": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTHEATMAP": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTPROFILE": { + "deeptools": "3.5.6" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "FRIP_SCORE": { + "bedtools": "2.30.0", + "samtools": "1.15.1" + }, + "GENOME_BLACKLIST_REGIONS": { + "bedtools": "2.30.0" + }, + "GET_AUTOSOMES": { + "python": "3.8.3" + }, + "GTF2BED": { + "perl": "5.26.2" + }, + "HOMER_ANNOTATEPEAKS": { + "homer": 4.11 + }, + "IGV": { + "python": "3.8.3" + }, + "KHMER_UNIQUEKMERS": { + "khmer": "3.0.0a3" + }, + "MACS3_CALLPEAK": { + "macs3": "3.0.4" + }, + "MERGED_LIBRARY_ATAQV_ATAQV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_ATAQV_MKARV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_DEEPTOOLS_PLOTFINGERPRINT": { + "deeptools": "3.5.6" + }, + "MERGED_LIBRARY_PICARD_COLLECTMULTIPLEMETRICS": { + "picard": "3.4.0" + }, + "MULTIQC_CUSTOM_PEAKS": { + "sed": 4.7 + }, + "PICARD_MARKDUPLICATES": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_LIBRARY": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_REPLICATE": { + "picard": "3.4.0" + }, + "PLOT_HOMER_ANNOTATEPEAKS": { + "r-base": "4.0.3" + }, + "PLOT_MACS3_QC": { + "r-base": "4.0.3" + }, + "SAMPLESHEET_CHECK": { + "python": "3.8.3" + }, + "SAMTOOLS_FAIDX": { + "samtools": "1.23.1" + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": 1.24 + }, + "SAMTOOLS_IDXSTATS": { + "samtools": 1.24 + }, + "SAMTOOLS_INDEX": { + "samtools": 1.24 + }, + "SAMTOOLS_SORT": { + "samtools": 1.24 + }, + "SAMTOOLS_STATS": { + "samtools": 1.24 + }, + "TRIMGALORE": { + "trimgalore": "2.1.0" + }, + "TSS_EXTRACT": { + "sed": 4.7 + }, + "UCSC_BEDGRAPHTOBIGWIG": { + "ucsc": 482 + } + }, + [ + "bwa", + "bwa/merged_library", + "bwa/merged_library/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/ataqv", + "bwa/merged_library/ataqv/broad_peak", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/html", + "bwa/merged_library/ataqv/broad_peak/html/css", + "bwa/merged_library/ataqv/broad_peak/html/css/ataqv.css", + "bwa/merged_library/ataqv/broad_peak/html/css/datatables.buttons.min.css", + "bwa/merged_library/ataqv/broad_peak/html/css/datatables.fontawesome.css", + "bwa/merged_library/ataqv/broad_peak/html/css/datatables.min.css", + "bwa/merged_library/ataqv/broad_peak/html/css/font-awesome.min.css", + "bwa/merged_library/ataqv/broad_peak/html/css/normalize.css", + "bwa/merged_library/ataqv/broad_peak/html/data", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T0_PE_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T0_PE_REP2.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T100_SE_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T100_SE_REP2.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T150_SE_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T15_PE_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/fonts", + "bwa/merged_library/ataqv/broad_peak/html/fonts/FontAwesome.otf", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.eot", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.svg", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.ttf", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff2", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regular.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regularit.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semibold.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semiboldit.woff", + "bwa/merged_library/ataqv/broad_peak/html/index.html", + "bwa/merged_library/ataqv/broad_peak/html/js", + "bwa/merged_library/ataqv/broad_peak/html/js/ataqv.js", + "bwa/merged_library/ataqv/broad_peak/html/js/configuration.js", + "bwa/merged_library/ataqv/broad_peak/html/js/d3.min.js", + "bwa/merged_library/ataqv/broad_peak/html/js/datatables.min.js", + "bwa/merged_library/ataqv/broad_peak/html/js/jszip.min.js", + "bwa/merged_library/bigwig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/scale", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/deeptools", + "bwa/merged_library/deeptools/plotfingerprint", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotprofile", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/macs3", + "bwa/merged_library/macs3/broad_peak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/qc", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.plots.pdf", + "bwa/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary.txt", + "bwa/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.plots.pdf", + "bwa/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.summary.txt", + "bwa/merged_library/picard_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/samtools_stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_replicate", + "bwa/merged_replicate/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam", + "bwa/merged_replicate/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.bai", + "bwa/merged_replicate/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam", + "bwa/merged_replicate/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.bai", + "bwa/merged_replicate/bigwig", + "bwa/merged_replicate/bigwig/OSMOTIC_STRESS_T0_PE.mRp.clN.bigWig", + "bwa/merged_replicate/bigwig/OSMOTIC_STRESS_T100_SE.mRp.clN.bigWig", + "bwa/merged_replicate/bigwig/scale", + "bwa/merged_replicate/bigwig/scale/OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt", + "bwa/merged_replicate/bigwig/scale/OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt", + "bwa/merged_replicate/macs3", + "bwa/merged_replicate/macs3/broad_peak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.annotatePeaks.txt", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.annotatePeaks.txt", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls", + "bwa/merged_replicate/macs3/broad_peak/qc", + "bwa/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.plots.pdf", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary.txt", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.plots.pdf", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.summary.txt", + "bwa/merged_replicate/picard_metrics", + "bwa/merged_replicate/picard_metrics/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.metrics.txt", + "bwa/merged_replicate/picard_metrics/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.metrics.txt", + "bwa/merged_replicate/samtools_stats", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.stats", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.stats", + "fastqc", + "fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T100_SE_REP1_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T100_SE_REP2_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T150_SE_REP1_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T150_SE_REP1_T2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_2_fastqc.html", + "fastqc/zips", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T100_SE_REP1_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T100_SE_REP2_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_2_fastqc.zip", + "genome", + "genome/genome.fa", + "genome/genome.fa.fai", + "igv", + "igv/broad_peak", + "igv/broad_peak/igv_files.txt", + "igv/broad_peak/igv_session.xml", + "multiqc", + "multiqc/broad_peak", + "multiqc/broad_peak/multiqc_data", + "multiqc/broad_peak/multiqc_data/deeptools_plot_fingerprint_counts_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/deeptools_plot_profile_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_filtered_reads_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_trimmed_sequences_plot_3_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt", + "multiqc/broad_peak/multiqc_data/mqc_deeptools_fingerprint_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_adapter_content_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_adapter_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_n_content_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_n_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_sequence_quality_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_sequence_quality_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_quality_scores_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_quality_scores_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_counts_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_counts_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_duplication_levels_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_duplication_levels_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_length_distribution_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_readlength_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Adenine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Cytosine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Guanine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Thymine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Undetermined.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_by_cycle_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_score_distribution_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_read_distribution_profile_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-3_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-4_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc.log", + "multiqc/broad_peak/multiqc_data/multiqc_citations.txt", + "multiqc/broad_peak/multiqc_data/multiqc_cutadapt.txt", + "multiqc/broad_peak/multiqc_data/multiqc_data.json", + "multiqc/broad_peak/multiqc_data/multiqc_fastqc.txt", + "multiqc/broad_peak/multiqc_data/multiqc_fastqc_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_AlignmentSummaryMetrics.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_baseContent.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_insertSize.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_by_cycle.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_score_distribution.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_sources.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_2.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_3.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_4.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_5.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_2.txt", + "multiqc/broad_peak/multiqc_plots", + "multiqc/broad_peak/multiqc_plots/pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_filtered_reads_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_filtered_reads_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_deeptools_fingerprint_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_adapter_content_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_adapter_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_n_content_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_n_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_sequence_quality_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_sequence_quality_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_quality_scores_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_quality_scores_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_duplication_levels_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_duplication_levels_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_length_distribution_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_readlength_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Adenine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Cytosine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Guanine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Thymine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Undetermined.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_by_cycle_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_score_distribution_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_read_distribution_profile_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_filtered_reads_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_filtered_reads_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_trimmed_sequences_plot_3_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_deeptools_fingerprint_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_adapter_content_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_adapter_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_n_content_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_n_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_sequence_quality_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_sequence_quality_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_quality_scores_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_quality_scores_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_duplication_levels_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_duplication_levels_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_length_distribution_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_readlength_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Adenine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Cytosine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Guanine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Thymine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Undetermined.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_by_cycle_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_score_distribution_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_read_distribution_profile_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_filtered_reads_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_filtered_reads_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_trimmed_sequences_plot_3_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_deeptools_fingerprint_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_adapter_content_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_adapter_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_n_content_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_n_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_sequence_quality_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_sequence_quality_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_quality_scores_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_quality_scores_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_duplication_levels_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_duplication_levels_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_length_distribution_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_readlength_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Adenine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Cytosine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Guanine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Thymine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Undetermined.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_by_cycle_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_score_distribution_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_read_distribution_profile_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_atacseq_software_mqc_versions.yml", + "pipeline_info/samplesheet.valid.csv", + "trimgalore", + "trimgalore/fastqc", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T100_SE_REP1_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T100_SE_REP2_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T150_SE_REP1_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T150_SE_REP1_T2_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_2_val_2_fastqc.html", + "trimgalore/fastqc/zips", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T100_SE_REP1_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T100_SE_REP2_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T2_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_2_val_2_fastqc.zip", + "trimgalore/logs", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP1_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP1_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP2_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP2_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T100_SE_REP1_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T100_SE_REP2_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T150_SE_REP1_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T150_SE_REP1_T2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T2_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T2_2.fastq.gz_trimming_report.txt" + ], + [ + "ataqv.css:md5,7bb9e18974018dd29bdc12a46a6d6d65", + "datatables.buttons.min.css:md5,675306abc9d3239314f2c66c0e22ef7a", + "datatables.fontawesome.css:md5,716d7a3edd2c75e712b1ffe26f12a861", + "datatables.min.css:md5,00ef3e39d9302618395ab189ec8bcd9f", + "font-awesome.min.css:md5,89916fa773ce96569604016ef25cab50", + "normalize.css:md5,40d20cc85100840580df4346bb99d7ed", + "FontAwesome.otf:md5,9ccfa32dd4cd1b8e83f68899d85bd5e6", + "fontawesome-webfont.eot:md5,404a525502f8e5ba7e93b9f02d9e83a9", + "fontawesome-webfont.ttf:md5,fb650aaf10736ffb9c4173079616bf01", + "fontawesome-webfont.woff:md5,891e3f340c1126b4c7c142e5f6e86816", + "fontawesome-webfont.woff2:md5,926c93d201fe51c8f351e858468980c3", + "sourcesanspro-regular.woff:md5,f7bd788f18b8c4bb93dd37d140348e1e", + "sourcesanspro-regularit.woff:md5,c3638b17f4fd76dae12fe2ae14571e57", + "sourcesanspro-semibold.woff:md5,e7fc8925d9364e9d177d9e1d08bb1855", + "sourcesanspro-semiboldit.woff:md5,f1d255aa459786dfc6aa2e488ac01245", + "index.html:md5,bf7747be761e56ad7c54c842ac88461a", + "ataqv.js:md5,feb291b7839e9e43ed304565e3a605d9", + "configuration.js:md5,5fa99e6c27050fed09c3764512c56c96", + "d3.min.js:md5,db69fb2626a71a286ee772d673138aca", + "datatables.min.js:md5,e369b872620dadb05e4eb555b81f9112", + "jszip.min.js:md5,09e492cb492ffa75484bbe10f1f721d1", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_factor.txt:md5,5afe7d16ac432b483454d7406dd4b72e", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_factor.txt:md5,816f20d069360ccb44e8e565b6b0a4e6", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt:md5,a9b555d96448f5ac9bdb6f4526f86341", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt:md5,618690cf55da217e9cd1324f38aab6de", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt:md5,e2a4023f321415738eb727cd3bcbce5b", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt:md5,91db8a99954d4096bdb48be8c20fc4be", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak:md5,c5b53511f764fb205886daa4f2ab00ec", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak:md5,adca40deef4439d757f656ceb2d434e4", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls:md5,f3e47ff619d7b4c0e2d543d1609927a4", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak:md5,3e8ae758c789ca16094a3d96718f7be3", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak:md5,da2909b11601c515cc1d431a5ef67bcb", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls:md5,9e9ca58826c2ab3e70c06a533e7dbae1", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak:md5,171bbf48bda913bf702954c20dd57fcb", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak:md5,6ac2f1603586b83ba2591f9c90fd13c9", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls:md5,ec811f9a7b8f5a517caf7b3a2f4988b8", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak:md5,d61e6f9675514a5b3c343e78b96c9111", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak:md5,fb8556e521d4c254f57ae3fdb67c9b64", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls:md5,3f415d834d3f9e5939dc8601ff0898b5", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak:md5,8f44ebfeb1ce0f3d01e915f3759b7a4f", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak:md5,fec3059e1a1b77fa791119d8a4d6d4c5", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls:md5,7df7f8827964cf1a29855e4c91f67246", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak:md5,72db339e1a71e9bce5be245aab548a76", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak:md5,7a10a324776281b675922de41c21e9f7", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls:md5,d10e9cad50ff99d58776f6b198f65936", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,085031e28b891cef205a81c9b6f34df4", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,01eada7dd6240d2af66efaf0105f801e", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,602c8df9e26c8e057d76eaa1a133f513", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,5de4f043eb01162f21c21e0cdf608f91", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,e1c3ca6628ab103b34063f0bc0fd6fa1", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,d9f63fd5f5f535c5c62bdbee9b9095aa", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,e3940e03c0309b06e25d412e22078f57", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,c584070f8983b196453026b463a6bffd", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,582520ff525281336452eb4761b52e78", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,aeb72fa43a2bf33c6799ba5e6f030273", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,876ec6709a7ec06e1ec7d2f502af0ac5", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,6718411a3dd59b2e62e9758c401b14a2", + "macs3_annotatePeaks.mLb.clN.summary.txt:md5,3ff8d12f5eae22308bb3afe873ccc8c9", + "macs3_annotatePeaks.mLb.clN.summary_mqc.tsv:md5,7faa6ca1d6da087f456f92921e769989", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,35b6851dd4960fbcf0353b2b998ee467", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,dda689aa8a4b89be95e687ecdd03827b", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,828f11cb1790a805192dc31281ad2e3f", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,140d6011382f7f47396bfe3c922fe91c", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.flagstat:md5,69f9e83c32e2a3fadf59188e3ef3e894", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats:md5,678fa8d9637a41488ac97ddf818d8b36", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat:md5,fcd2c20d6fc99776693a143d5b932ca5", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats:md5,d3ceb83f80afec7154fe635a0028b4d8", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,f9f155991b027ae0009c110884f5abf9", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,3d31ff2b94710969f532b1734480b92b", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,e3d0421cc9477abb16c32d9b3cf02387", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,c216287572279f13283dcdf22a4bc8e4", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.flagstat:md5,839440ef66553433166e265e79db6eae", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats:md5,466be87abe64ed73a9714fa5fac6a137", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat:md5,c4cd9237f8373b8f7a84851d7d0530f4", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats:md5,acdc7649de86409b0fbcf6052b64ba1e", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,86ba63b9e1d2fbc3d95488557315105a", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,dc506bc379328fcbc34558931e21bbe3", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,00a9eb297b29c4b43095ddb2d5a06df3", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,e765400df8443db2d29a7f9c4c7e1b97", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,eb12ff8695703161276da457c9c30de5", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,bbff2deab1453874a3afa52e1677901d", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,8d4a49f8a3fe5a36b38e17e4afd1f5d3", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,9bab2110046e1ed7ab2111303e7db5c0", + "OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt:md5,e1ce0e8f48a0df9bfc61b0c614d7bb9c", + "OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt:md5,af2d967e796c5129231b8d632dfdda87", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak:md5,45336ce2d31d67ea8c56f03e18ec76f6", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak:md5,edb44531ce01afae39d5dc36133c03ce", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls:md5,63fd7e3cf43aa388246e677a8a87d151", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak:md5,eb29b262e9e2cda7bfe967ffc0869de1", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak:md5,c13f1e4c898425a3fc63bbfa3bbbbdcb", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls:md5,fbb3d89ecc4ae841147fe2b8c853aa80", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv:md5,2620209e4e6419d8545d9842acddb645", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv:md5,1b0ed83d8a0b7b7248fd8da81816bcb9", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv:md5,97a4086d0ca0e6fe96c4bf6864323f53", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv:md5,31e2de1f288e4e8191bcd0267d63828e", + "macs3_annotatePeaks.mRp.clN.summary.txt:md5,96beab08431b5025c3a0c1c6efdde1ee", + "macs3_annotatePeaks.mRp.clN.summary_mqc.tsv:md5,6c689c7ea46d435473766db948fe02c5", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat:md5,d560f3c4988251fdbf1cb35da841d39d", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats:md5,34b61f771aad4d82cdd747ffba62474c", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat:md5,34cf6a70329ac5f0038d9900673f9fea", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats:md5,7e45d1561601ad26823656ccb784dbc6", + "genome.fa:md5,4bad9f4b18056156a81f7f952abbe125", + "genome.fa.fai:md5,6f4c0ce5258e6948135ad006e1f9ee1b", + "deeptools_plot_fingerprint_counts_mlib_deeptools.txt:md5,15274f0c41d58f14d454fb0fb983e6fd", + "deeptools_plot_profile_mlib_deeptools.txt:md5,3c74002bc0bc18921860ef381f97ae77", + "mqc_cutadapt_filtered_reads_plot_1.txt:md5,b78f69173122f2cacf8121eaeb815382", + "mqc_cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,157073209c492b89badba367b1c57d83", + "mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,b04ae8b2ec27d71817ae7cb666888b9b", + "mqc_deeptools_fingerprint_plot_1.txt:md5,c0dc7eb479f572b51b7c1aea7f08a241", + "mqc_fastqc_adapter_content_plot-2_1.txt:md5,3560a22f94aea25e27d97e056fb478ed", + "mqc_fastqc_adapter_content_plot_1.txt:md5,66f3e2f6ba14599b0d6c20144df60777", + "mqc_fastqc_per_base_n_content_plot-2_1.txt:md5,d79e95d36d955edee3e4bfb139dce967", + "mqc_fastqc_per_base_n_content_plot_1.txt:md5,8d9cdd0463193b7e10332e2ca0273aca", + "mqc_fastqc_per_base_sequence_quality_plot-2_1.txt:md5,3bb6cad69480846e4003b9f0f3511caa", + "mqc_fastqc_per_base_sequence_quality_plot_1.txt:md5,821cb87b0ae8bd61cd445d153b8f371a", + "mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt:md5,88fb0e924094b5dd57f4003ac13fd1f4", + "mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt:md5,a4b37bca5e61bf595c4532ffbc8b8f93", + "mqc_fastqc_per_sequence_gc_content_plot_Counts.txt:md5,3fa7f0c0858d12cae8700e21774da86d", + "mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,a2d0c3ec413894e4dafa62ebdf44a06c", + "mqc_fastqc_per_sequence_quality_scores_plot-2_1.txt:md5,841ccc3da246bd197fc966e9f8c5ca57", + "mqc_fastqc_per_sequence_quality_scores_plot_1.txt:md5,3bfe1c94f710975829e2c1e3b5f16ea7", + "mqc_fastqc_sequence_counts_plot-2_1.txt:md5,c734a06e1f3e3afc1486a0b45be880e1", + "mqc_fastqc_sequence_counts_plot_1.txt:md5,d0cf8d64e742b5f446e6b602d86913b9", + "mqc_fastqc_sequence_duplication_levels_plot-2_1.txt:md5,d7ada8561d521eaf645073f7cccf7b82", + "mqc_fastqc_sequence_duplication_levels_plot_1.txt:md5,23c4883ed6c22212b0c3e07a863745d1", + "mqc_fastqc_sequence_length_distribution_plot_1.txt:md5,bc3acb40acbf620b237d0f2fa8c8a1ab", + "mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt:md5,24e8c9cb2e7d0bbfc49022717c84fa85", + "mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt:md5,99f9513a0d3239097a3b4454c6d78768", + "mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt:md5,04f8cb2c8855798e4ce61258ff0e14ec", + "mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt:md5,a40196c909d5326637e526c800e33fc2", + "mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt:md5,c811c90bee0900f8e8906e29567f29cd", + "mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt:md5,a8befb9b95ad2e76a57d84772450e99b", + "mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt:md5,3af943c8019d9eee42b4f40791a74c3f", + "mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt:md5,585e7aa5faf61c669ca5fb106340c6f4", + "mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt:md5,2687336b51d0fde9d2192ba48be4d319", + "mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,bec101bc6ee3766454189e3ab65166c2", + "mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,b27f1cb75fdc333d8a494dc8350d4351", + "mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,532caa74ae554bd7fdd40421c2ee7b51", + "mqc_samtools_alignment_plot-2_1.txt:md5,9c86235254e6f9598f62df2eec42ed45", + "mqc_samtools_alignment_plot-3_1.txt:md5,bff8cb7e31bc1221ddc08a1ab10faf91", + "mqc_samtools_alignment_plot-4_1.txt:md5,20f6f039fbf4b8c76b2309c97ad6e074", + "mqc_samtools_alignment_plot_1.txt:md5,afaffbac4a382f0e96d132f52d104fb1", + "multiqc_citations.txt:md5,380946add69d6b34db956b1565820d2c", + "multiqc_cutadapt.txt:md5,926fcf7c5a9c5dc0a105a439c85a5f58", + "multiqc_fastqc.txt:md5,a9a7484add8120fc3cf3d5626a92973b", + "multiqc_fastqc_1.txt:md5,58ab2bbd2d19745e5975742c6d1335d7", + "multiqc_mlib_frip_score-plot.txt:md5,07ae10450e52b7eaa14901cf4ee11071", + "multiqc_mlib_peak_annotation-plot.txt:md5,49177a2691f14d6d1dcb9cb9cda11940", + "multiqc_mlib_peak_count-plot.txt:md5,884c5b0b366376214407bd58ae1ac29c", + "multiqc_mrep_frip_score-plot.txt:md5,16c5819f17332b50c64558ea9f31d870", + "multiqc_mrep_peak_annotation-plot.txt:md5,06918eae76d769b41471460676e02afb", + "multiqc_mrep_peak_count-plot.txt:md5,e5019374d8964473ca648859cca797fc", + "picard_histogram.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_3.txt:md5,fc2b0821fed14da8f161b48a6f04947b", + "picard_histogram_4.txt:md5,7cdffefa11196ef758cbdfe357ff5c9e", + "picard_histogram_5.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "samplesheet.valid.csv:md5,51b046b55592e95949824f21b12c7e49" + ] + ], + "timestamp": "2026-07-25T08:46:04.91051952", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/tests/skip_trimming.nf.test b/tests/skip_trimming.nf.test new file mode 100644 index 00000000..a8b1b8fb --- /dev/null +++ b/tests/skip_trimming.nf.test @@ -0,0 +1,57 @@ +nextflow_pipeline { + + name "Test pipeline with --skip_trimming" + script "../main.nf" + tag "skip_trimming" + + test("skip_trimming") { + + when { + params { + outdir = "$outputDir" + skip_trimming = true + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success }, + { assert snapshot( + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_atacseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) + } + } + + test("skip_trimming with stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + skip_trimming = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.trace.succeeded().size() + ).match() } + ) + } + } +} diff --git a/tests/skip_trimming.nf.test.snap b/tests/skip_trimming.nf.test.snap new file mode 100644 index 00000000..833db6a0 --- /dev/null +++ b/tests/skip_trimming.nf.test.snap @@ -0,0 +1,1018 @@ +{ + "skip_trimming": { + "content": [ + 256, + { + "BAMTOOLS_FILTER": { + "bamtools": "2.5.2", + "samtools": "1.15.1" + }, + "BAM_REMOVE_ORPHANS": { + "samtools": "1.15.1" + }, + "BEDTOOLS_GENOMECOV": { + "bedtools": "2.31.1", + "sort": "sort (GNU coreutils) 9.5" + }, + "BWA_INDEX": { + "bwa": "0.7.19-r1273" + }, + "BWA_MEM": { + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" + }, + "DEEPTOOLS_COMPUTEMATRIX_REFERENCE_POINT": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_COMPUTEMATRIX_SCALE_REGIONS": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTHEATMAP": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTPROFILE": { + "deeptools": "3.5.6" + }, + "DESEQ2_QC": { + "bioconductor-deseq2": "1.28.0", + "r-base": "4.0.3" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "FRIP_SCORE": { + "bedtools": "2.30.0", + "samtools": "1.15.1" + }, + "GENOME_BLACKLIST_REGIONS": { + "bedtools": "2.30.0" + }, + "GET_AUTOSOMES": { + "python": "3.8.3" + }, + "GTF2BED": { + "perl": "5.26.2" + }, + "HOMER_ANNOTATEPEAKS": { + "homer": 4.11 + }, + "IGV": { + "python": "3.8.3" + }, + "KHMER_UNIQUEKMERS": { + "khmer": "3.0.0a3" + }, + "MACS3_CALLPEAK": { + "macs3": "3.0.4" + }, + "MACS3_CONSENSUS": { + "python": "3.10.0", + "r-base": "4.1.1" + }, + "MERGED_LIBRARY_ATAQV_ATAQV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_ATAQV_MKARV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_DEEPTOOLS_PLOTFINGERPRINT": { + "deeptools": "3.5.6" + }, + "MERGED_LIBRARY_PICARD_COLLECTMULTIPLEMETRICS": { + "picard": "3.4.0" + }, + "MULTIQC_CUSTOM_PEAKS": { + "sed": 4.7 + }, + "PICARD_MARKDUPLICATES": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_LIBRARY": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_REPLICATE": { + "picard": "3.4.0" + }, + "PLOT_HOMER_ANNOTATEPEAKS": { + "r-base": "4.0.3" + }, + "PLOT_MACS3_QC": { + "r-base": "4.0.3" + }, + "SAMPLESHEET_CHECK": { + "python": "3.8.3" + }, + "SAMTOOLS_FAIDX": { + "samtools": "1.23.1" + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": 1.24 + }, + "SAMTOOLS_IDXSTATS": { + "samtools": 1.24 + }, + "SAMTOOLS_INDEX": { + "samtools": 1.24 + }, + "SAMTOOLS_SORT": { + "samtools": 1.24 + }, + "SAMTOOLS_STATS": { + "samtools": 1.24 + }, + "SUBREAD_FEATURECOUNTS": { + "subread": "2.0.1" + }, + "TSS_EXTRACT": { + "sed": 4.7 + }, + "UCSC_BEDGRAPHTOBIGWIG": { + "ucsc": 482 + } + }, + [ + "bwa", + "bwa/merged_library", + "bwa/merged_library/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam", + "bwa/merged_library/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.bai", + "bwa/merged_library/ataqv", + "bwa/merged_library/ataqv/broad_peak", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.ataqv.json", + "bwa/merged_library/ataqv/broad_peak/html", + "bwa/merged_library/ataqv/broad_peak/html/css", + "bwa/merged_library/ataqv/broad_peak/html/css/ataqv.css", + "bwa/merged_library/ataqv/broad_peak/html/css/datatables.buttons.min.css", + "bwa/merged_library/ataqv/broad_peak/html/css/datatables.fontawesome.css", + "bwa/merged_library/ataqv/broad_peak/html/css/datatables.min.css", + "bwa/merged_library/ataqv/broad_peak/html/css/font-awesome.min.css", + "bwa/merged_library/ataqv/broad_peak/html/css/normalize.css", + "bwa/merged_library/ataqv/broad_peak/html/data", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T0_PE_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T0_PE_REP2.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T100_SE_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T100_SE_REP2.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T150_SE_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T15_PE_REP1.json.gz", + "bwa/merged_library/ataqv/broad_peak/html/fonts", + "bwa/merged_library/ataqv/broad_peak/html/fonts/FontAwesome.otf", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.eot", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.svg", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.ttf", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff2", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regular.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regularit.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semibold.woff", + "bwa/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semiboldit.woff", + "bwa/merged_library/ataqv/broad_peak/html/index.html", + "bwa/merged_library/ataqv/broad_peak/html/js", + "bwa/merged_library/ataqv/broad_peak/html/js/ataqv.js", + "bwa/merged_library/ataqv/broad_peak/html/js/configuration.js", + "bwa/merged_library/ataqv/broad_peak/html/js/d3.min.js", + "bwa/merged_library/ataqv/broad_peak/html/js/datatables.min.js", + "bwa/merged_library/ataqv/broad_peak/html/js/jszip.min.js", + "bwa/merged_library/bigwig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.bigWig", + "bwa/merged_library/bigwig/scale", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/bigwig/scale/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt", + "bwa/merged_library/deeptools", + "bwa/merged_library/deeptools/plotfingerprint", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.pdf", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "bwa/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.raw.txt", + "bwa/merged_library/deeptools/plotprofile", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.plotProfile.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "bwa/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "bwa/merged_library/macs3", + "bwa/merged_library/macs3/broad_peak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak", + "bwa/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls", + "bwa/merged_library/macs3/broad_peak/consensus", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.annotatePeaks.txt", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.bed", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.intersect.plot.pdf", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.intersect.txt", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.txt", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.tsv", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.tsv.summary", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.saf", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/R_sessionInfo.log", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.dds.RData", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.pca.vals.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.pca.vals_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.plots.pdf", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.rds", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.sample.dists.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.sample.dists_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt", + "bwa/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/consensus_peaks.mLb.clN.size_factors.RData", + "bwa/merged_library/macs3/broad_peak/qc", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.plots.pdf", + "bwa/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary.txt", + "bwa/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary_mqc.tsv", + "bwa/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.plots.pdf", + "bwa/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.summary.txt", + "bwa/merged_library/picard_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "bwa/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.metrics.txt", + "bwa/merged_library/picard_metrics/pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "bwa/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "bwa/merged_library/samtools_stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.stats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats", + "bwa/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.stats", + "bwa/merged_replicate", + "bwa/merged_replicate/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam", + "bwa/merged_replicate/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.bai", + "bwa/merged_replicate/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam", + "bwa/merged_replicate/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.bai", + "bwa/merged_replicate/bigwig", + "bwa/merged_replicate/bigwig/OSMOTIC_STRESS_T0_PE.mRp.clN.bigWig", + "bwa/merged_replicate/bigwig/OSMOTIC_STRESS_T100_SE.mRp.clN.bigWig", + "bwa/merged_replicate/bigwig/scale", + "bwa/merged_replicate/bigwig/scale/OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt", + "bwa/merged_replicate/bigwig/scale/OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt", + "bwa/merged_replicate/macs3", + "bwa/merged_replicate/macs3/broad_peak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.annotatePeaks.txt", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.annotatePeaks.txt", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak", + "bwa/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls", + "bwa/merged_replicate/macs3/broad_peak/consensus", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.annotatePeaks.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.bed", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.intersect.plot.pdf", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.intersect.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.tsv", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.tsv.summary", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.saf", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/R_sessionInfo.log", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.dds.RData", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.pca.vals.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.pca.vals_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.plots.pdf", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.rds", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.sample.dists.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.sample.dists_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/consensus_peaks.mRp.clN.size_factors.RData", + "bwa/merged_replicate/macs3/broad_peak/qc", + "bwa/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.plots.pdf", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary.txt", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary_mqc.tsv", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.plots.pdf", + "bwa/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.summary.txt", + "bwa/merged_replicate/picard_metrics", + "bwa/merged_replicate/picard_metrics/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.metrics.txt", + "bwa/merged_replicate/picard_metrics/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.metrics.txt", + "bwa/merged_replicate/samtools_stats", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.stats", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats", + "bwa/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.stats", + "fastqc", + "fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T100_SE_REP1_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T100_SE_REP2_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T150_SE_REP1_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T150_SE_REP1_T2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_2_fastqc.html", + "fastqc/zips", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T100_SE_REP1_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T100_SE_REP2_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_2_fastqc.zip", + "genome", + "genome/genome.fa", + "genome/genome.fa.fai", + "igv", + "igv/broad_peak", + "igv/broad_peak/igv_files.txt", + "igv/broad_peak/igv_session.xml", + "multiqc", + "multiqc/broad_peak", + "multiqc/broad_peak/multiqc_data", + "multiqc/broad_peak/multiqc_data/deeptools_plot_fingerprint_counts_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/deeptools_plot_profile_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/mqc_deeptools_fingerprint_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_adapter_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_n_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_sequence_quality_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_quality_scores_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_counts_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_duplication_levels_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_featureCounts_assignment_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_featureCounts_assignment_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_readlength_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Adenine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Cytosine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Guanine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Thymine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Undetermined.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_by_cycle_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_score_distribution_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_read_distribution_profile_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-3_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-4_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc.log", + "multiqc/broad_peak/multiqc_data/multiqc_citations.txt", + "multiqc/broad_peak/multiqc_data/multiqc_data.json", + "multiqc/broad_peak/multiqc_data/multiqc_fastqc.txt", + "multiqc/broad_peak/multiqc_data/multiqc_featureCounts_mlib_featurecounts.txt", + "multiqc/broad_peak/multiqc_data/multiqc_featureCounts_mrep_featurecounts.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_deseq2_clustering_1-plot.yaml", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_deseq2_pca_1-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_deseq2_clustering_1-plot.yaml", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_deseq2_pca_1-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_AlignmentSummaryMetrics.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_baseContent.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_insertSize.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_by_cycle.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_score_distribution.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_sources.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_2.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_3.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_4.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_5.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_2.txt", + "multiqc/broad_peak/multiqc_plots", + "multiqc/broad_peak/multiqc_plots/pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_deeptools_fingerprint_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_adapter_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_n_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_sequence_quality_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_quality_scores_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_duplication_levels_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_readlength_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Adenine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Cytosine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Guanine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Thymine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Undetermined.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_by_cycle_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_score_distribution_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_read_distribution_profile_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/png", + "multiqc/broad_peak/multiqc_plots/png/mqc_deeptools_fingerprint_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_adapter_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_n_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_sequence_quality_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_quality_scores_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_duplication_levels_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_readlength_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Adenine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Cytosine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Guanine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Thymine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Undetermined.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_by_cycle_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_score_distribution_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_read_distribution_profile_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_deeptools_fingerprint_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_adapter_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_n_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_sequence_quality_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_quality_scores_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_duplication_levels_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_readlength_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Adenine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Cytosine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Guanine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Thymine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Undetermined.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_by_cycle_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_score_distribution_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_read_distribution_profile_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_atacseq_software_mqc_versions.yml", + "pipeline_info/samplesheet.valid.csv" + ], + [ + "ataqv.css:md5,7bb9e18974018dd29bdc12a46a6d6d65", + "datatables.buttons.min.css:md5,675306abc9d3239314f2c66c0e22ef7a", + "datatables.fontawesome.css:md5,716d7a3edd2c75e712b1ffe26f12a861", + "datatables.min.css:md5,00ef3e39d9302618395ab189ec8bcd9f", + "font-awesome.min.css:md5,89916fa773ce96569604016ef25cab50", + "normalize.css:md5,40d20cc85100840580df4346bb99d7ed", + "FontAwesome.otf:md5,9ccfa32dd4cd1b8e83f68899d85bd5e6", + "fontawesome-webfont.eot:md5,404a525502f8e5ba7e93b9f02d9e83a9", + "fontawesome-webfont.ttf:md5,fb650aaf10736ffb9c4173079616bf01", + "fontawesome-webfont.woff:md5,891e3f340c1126b4c7c142e5f6e86816", + "fontawesome-webfont.woff2:md5,926c93d201fe51c8f351e858468980c3", + "sourcesanspro-regular.woff:md5,f7bd788f18b8c4bb93dd37d140348e1e", + "sourcesanspro-regularit.woff:md5,c3638b17f4fd76dae12fe2ae14571e57", + "sourcesanspro-semibold.woff:md5,e7fc8925d9364e9d177d9e1d08bb1855", + "sourcesanspro-semiboldit.woff:md5,f1d255aa459786dfc6aa2e488ac01245", + "index.html:md5,bf7747be761e56ad7c54c842ac88461a", + "ataqv.js:md5,feb291b7839e9e43ed304565e3a605d9", + "configuration.js:md5,0620bf9d816e02c38ccfc6e2e6b23e06", + "d3.min.js:md5,db69fb2626a71a286ee772d673138aca", + "datatables.min.js:md5,e369b872620dadb05e4eb555b81f9112", + "jszip.min.js:md5,09e492cb492ffa75484bbe10f1f721d1", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_factor.txt:md5,bce30ee219d74a200e7ea59d39370fa5", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_factor.txt:md5,56910d1ea71799021a3dc98ff0f5d906", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt:md5,0a5e5d168546102bb02dd6bd52b39349", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt:md5,59f1d46e141e928e8cccc7185b23c880", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt:md5,68373452427c1fb3e0f20d959c5aa6c7", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt:md5,04928308175458f7e21957a4c9dc7afb", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak:md5,59c977277ba11ab4c8b9b7bafc6e0e7e", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak:md5,714d8e5d201e0129a55b202c1d4b437f", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls:md5,ea2e33a31b189c3c56a1051354b7797d", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak:md5,2465ec263cd50577995418413d7dce42", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak:md5,1dca72a0859ee67414c4a39c2949dfe8", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls:md5,e18ce783c58c18296d58912b19cc679f", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak:md5,d58ac509e5955ef11e78166a8398caa7", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak:md5,9b44b06e78444813c2ba290507b92c04", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls:md5,a3c0974e169e886b6194e484023e6026", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak:md5,989551d20b0cc0ab1b856cf41a878ed9", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak:md5,3bdc0b6179e3a8b85c6db82b1b656d1c", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls:md5,7571b5649fbd9e2dfcec9325950f8177", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak:md5,a454e4af57c9af7085d936d9fcc96f1e", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak:md5,92a70848190df2cca16a4914646669ab", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls:md5,667ce2000c304985dee64b4700d761ba", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak:md5,d83276ebd8c6c594038fdceb519929ac", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak:md5,6334a6581878cf93a39dd76b56794ad0", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls:md5,c5d4d3843a6cf331de01ba5443f82720", + "consensus_peaks.mLb.clN.bed:md5,7e645855322eff59ea58446857e05c1e", + "consensus_peaks.mLb.clN.boolean.intersect.txt:md5,27e105619c6e9bb7aac7dc9a84a70395", + "consensus_peaks.mLb.clN.boolean.txt:md5,7ca3fc47837d64951401ca58d79ebe88", + "consensus_peaks.mLb.clN.featureCounts.tsv:md5,2a5c4ee37d61e7f5fccd8e8512209705", + "consensus_peaks.mLb.clN.featureCounts.tsv.summary:md5,06b8b756c6babe6483ff15c2fd96b950", + "consensus_peaks.mLb.clN.saf:md5,9f7d7bcc1ee838d8ecfc3d0bdd1f4b25", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,5f6946d1361c195398acbeaa4c8f6f32", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,da6f73d953067d9ed95a9d1f76f6857d", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,ae62c3b6ed44f27242bb98a788d0840b", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,56587a5eb44694182225af0e6a4e240b", + "OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt:md5,a2ea196cbe165939f1bacac8032aa43c", + "OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt:md5,cc8dd33ae987cf72226e998261189914", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,16cde0c4529f30a00f58e86b6734f4a9", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,35dd002bc26673fb9a3e5be9c66c6247", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,36b151cedf83dfe947cf3a6df7d24939", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,d80b896bb6b1e837043735f30eaf852e", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,6f13d3859b6b3fc141828cc09aba98ed", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,75c606fd7714aefa41c0ed5f7761d851", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,f57b6917e44ced51312f38aea4d5046c", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,de7adbe624dd43750429182bd7aaac07", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,33597ba90b885ba8e486deaa61321c14", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,416407a06ee3e656458993f84dc0a37f", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,ffcda6d8b8e8d31cb9d86e22a2f38f50", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,27334ec0c4587225a5999526acc33a9a", + "macs3_annotatePeaks.mLb.clN.summary.txt:md5,9602ca24aa3991fd3a00b4296a018ab5", + "macs3_annotatePeaks.mLb.clN.summary_mqc.tsv:md5,20e0dd55cf6b11879121b98dc02fe587", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,19ed87218e2575ae44e662e2209aeeb1", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,cf5a0560aaae7bc6a72025fa82f7b25b", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,49083fd892294847a1248d42e6743139", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,2cbc1cb8abf4d39c5c8467e5189ce273", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.flagstat:md5,3323869278a6d82035c41d5dbf4f446a", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats:md5,47ba804e818417f56ed03335d13172e9", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat:md5,2338ca056a7f822b0cff1956a6211a8e", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats:md5,8498444a1f18d42f67f1590dcbb09316", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,581b3fa18f6a79fb6de6cecc75391150", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,1504e56638ec27a12e90bfeed86092ce", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,d443508972a49a4c0b741778ee925452", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,59d186e070bea17483612145228e0be9", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.flagstat:md5,19da69cbc95595910efbd9251e6e0119", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats:md5,99cc7672fb68ef8b279773f3bca681f6", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat:md5,a2d9d0bb6028fe9d5ca1085717c12751", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats:md5,cca7fe3a42d0a541d5e91bf6e29e9170", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,eb5b54d45cf98a45b670311b41faf23c", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,a44ca3bc7fc47144ba9eeeeb84b87259", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,18923aea6b24827ef30b654dac0bd22b", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,63b3ebac80cd6f6914350efb139fab87", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,f6fa282f33b73c13320a007f4a36b31a", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,9e672bfe038fe550f46a4ea1166db4d2", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,73af4b16facaf0fd7b3701a055a23a98", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,f5f90790fc93e3362e5e96e9abe1a890", + "OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt:md5,585485db7da5ff4fd27b5007514947d8", + "OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt:md5,cb999ab5df67d6d99ce162d05d4ef7eb", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak:md5,6559863f0b1d4c4e5ffd2f84c02982b1", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak:md5,7f007ca9b3a7b9d28ce77cdb1b2646f8", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls:md5,c195339765b3d9a8f8163108a6f16183", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak:md5,35709d3fc707f53628e0ccab6b464d83", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak:md5,ced7d5fe0af52b238f05422b2d3185af", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls:md5,101d2313d93c121eb53e0e8644df37d3", + "consensus_peaks.mRp.clN.bed:md5,c9408cce53d821e215368a553c9f1a08", + "consensus_peaks.mRp.clN.boolean.intersect.txt:md5,3d2c2f1597c7c30cb6089e934c6c031a", + "consensus_peaks.mRp.clN.boolean.txt:md5,c9c5842fea9750535cf50890e2da0c13", + "consensus_peaks.mRp.clN.featureCounts.tsv:md5,1d3de5bef00a3cc323d04967c760fd1d", + "consensus_peaks.mRp.clN.featureCounts.tsv.summary:md5,f3c3783a0b57eb73a38b4313a56aecb4", + "consensus_peaks.mRp.clN.saf:md5,ea5c6c818aff4142c9cbaea5c3d7fc1c", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,9fd5e3e7ef3904cfc797a403423f29b3", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,177685c72564208be5b536a3facaba4f", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,537692bd1216294c51fc88a32777525c", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,898ddce7aed8b8707237752061e30685", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv:md5,2b0e88d15db45b363b715979d588f923", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv:md5,af4f984d2bac50202af335e32b19a408", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv:md5,711ffae78f6ca931144d2bba47a988a1", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv:md5,b404403d2826c95f7541d077f8cb840d", + "macs3_annotatePeaks.mRp.clN.summary.txt:md5,2cf57f7ecf2bb6cc0c79a0a5985960da", + "macs3_annotatePeaks.mRp.clN.summary_mqc.tsv:md5,5046fe88ecc86f1fcff84b0cc7cfe8b6", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat:md5,eb0d0acaf035e4935b07a93250eb9d0e", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats:md5,f34449e5e549595dd2497a07ffcb39ff", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat:md5,d3c1c3f3ee5dcb204ab6c162964da4ff", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats:md5,284c189e49eb4a91fc0aed00d869e1c4", + "genome.fa:md5,4bad9f4b18056156a81f7f952abbe125", + "genome.fa.fai:md5,6f4c0ce5258e6948135ad006e1f9ee1b", + "deeptools_plot_fingerprint_counts_mlib_deeptools.txt:md5,b3aefd736ba3dc078560c541558aa8a9", + "deeptools_plot_profile_mlib_deeptools.txt:md5,3c74002bc0bc18921860ef381f97ae77", + "mqc_deeptools_fingerprint_plot_1.txt:md5,0b18beabfb07348950cfdb14e8caaa53", + "mqc_fastqc_adapter_content_plot_1.txt:md5,66f3e2f6ba14599b0d6c20144df60777", + "mqc_fastqc_per_base_n_content_plot_1.txt:md5,8d9cdd0463193b7e10332e2ca0273aca", + "mqc_fastqc_per_base_sequence_quality_plot_1.txt:md5,821cb87b0ae8bd61cd445d153b8f371a", + "mqc_fastqc_per_sequence_gc_content_plot_Counts.txt:md5,3fa7f0c0858d12cae8700e21774da86d", + "mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,a2d0c3ec413894e4dafa62ebdf44a06c", + "mqc_fastqc_per_sequence_quality_scores_plot_1.txt:md5,3bfe1c94f710975829e2c1e3b5f16ea7", + "mqc_fastqc_sequence_counts_plot_1.txt:md5,d0cf8d64e742b5f446e6b602d86913b9", + "mqc_fastqc_sequence_duplication_levels_plot_1.txt:md5,23c4883ed6c22212b0c3e07a863745d1", + "mqc_featureCounts_assignment_plot-2_1.txt:md5,af94642e4a499a424f9bab6ea2884f44", + "mqc_featureCounts_assignment_plot_1.txt:md5,f70e1de16046ccc2c9fd5a1b6b8c6b0d", + "mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt:md5,20bef4426162e964c2214b09dfa90fc7", + "mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt:md5,d545b4ef8f4a8c7078dbf307713d7b14", + "mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt:md5,a1a87603c22be8d3f3d71b4fb146a4b1", + "mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt:md5,5d1c5eb7e44689b9d94a49f499d091a5", + "mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt:md5,5967973b49fb4d9649e58d77c00c9987", + "mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt:md5,d4d9187e688d0a1f9ea6d89a670b8c83", + "mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt:md5,71573e62e8ffa729a64873ff10ae8c02", + "mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt:md5,4f029c6ba1a3fa32459beff912ca3ab5", + "mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt:md5,c3c8c0c2ad9beef115c4fd78f253bd23", + "mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,61e923cef705d22b952f6ab0d8ef64c1", + "mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,85d9acd2068e64ac8eb6c3a0d5c0a755", + "mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,36d77f56a9d8915c15ed91f699e5bc4b", + "mqc_samtools_alignment_plot-2_1.txt:md5,6f9776dd6a2f58e3f526ce79917d7e1c", + "mqc_samtools_alignment_plot-3_1.txt:md5,593dfe2ed377052678abf335f1bc84c0", + "mqc_samtools_alignment_plot-4_1.txt:md5,d80ed8c3f0ca3ae21dc77ad1d44b0cb6", + "mqc_samtools_alignment_plot_1.txt:md5,79cc672992798f7f0f1a7a6380b1f275", + "multiqc_citations.txt:md5,666622de72cd728286d41118b986c243", + "multiqc_fastqc.txt:md5,a9a7484add8120fc3cf3d5626a92973b", + "multiqc_featureCounts_mlib_featurecounts.txt:md5,563f1bab93754c13ba016328048e1821", + "multiqc_featureCounts_mrep_featurecounts.txt:md5,644af943658660e910e9872480631b63", + "multiqc_mlib_frip_score-plot.txt:md5,2c04017d8b96d7e4a14284519517417a", + "multiqc_mlib_peak_annotation-plot.txt:md5,4a2e5fb6cbb98803c42f1c4f3a3f8fd6", + "multiqc_mlib_peak_count-plot.txt:md5,aa48ff9d5acad349ceda2fc62a62bdad", + "multiqc_mrep_frip_score-plot.txt:md5,0336be8553111af9db077f946023e4c5", + "multiqc_mrep_peak_annotation-plot.txt:md5,5b4eb21ccbd2ff38273745be3bd17e41", + "multiqc_mrep_peak_count-plot.txt:md5,dd9bebb172fe35a0ee12f6fd549a6f40", + "picard_histogram.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_3.txt:md5,fc2b0821fed14da8f161b48a6f04947b", + "picard_histogram_4.txt:md5,7cdffefa11196ef758cbdfe357ff5c9e", + "picard_histogram_5.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "samplesheet.valid.csv:md5,51b046b55592e95949824f21b12c7e49" + ] + ], + "timestamp": "2026-07-25T08:39:31.169940442", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "skip_trimming with stub": { + "content": [ + 213 + ], + "timestamp": "2025-11-03T13:33:27.997860306", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + } + } +} \ No newline at end of file diff --git a/tests/star.nf.test b/tests/star.nf.test new file mode 100644 index 00000000..f2b2703f --- /dev/null +++ b/tests/star.nf.test @@ -0,0 +1,58 @@ +nextflow_pipeline { + + name "Test pipeline with STAR aligner" + script "../main.nf" + tag "star" + + test("star") { + + when { + params { + outdir = "$outputDir" + aligner = "star" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + + assertAll( + { assert workflow.success }, + { assert snapshot( + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_atacseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) + } + } + + test("star with stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + aligner = "star" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.trace.succeeded().size() + ).match() } + ) + } + } +} diff --git a/tests/star.nf.test.snap b/tests/star.nf.test.snap new file mode 100644 index 00000000..66c4dec9 --- /dev/null +++ b/tests/star.nf.test.snap @@ -0,0 +1,1172 @@ +{ + "star": { + "content": [ + 264, + { + "BAMTOOLS_FILTER": { + "bamtools": "2.5.2", + "samtools": "1.15.1" + }, + "BAM_REMOVE_ORPHANS": { + "samtools": "1.15.1" + }, + "BEDTOOLS_GENOMECOV": { + "bedtools": "2.31.1", + "sort": "sort (GNU coreutils) 9.5" + }, + "DEEPTOOLS_COMPUTEMATRIX_REFERENCE_POINT": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_COMPUTEMATRIX_SCALE_REGIONS": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTHEATMAP": { + "deeptools": "3.5.6" + }, + "DEEPTOOLS_PLOTPROFILE": { + "deeptools": "3.5.6" + }, + "DESEQ2_QC": { + "bioconductor-deseq2": "1.28.0", + "r-base": "4.0.3" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "FRIP_SCORE": { + "bedtools": "2.30.0", + "samtools": "1.15.1" + }, + "GENOME_BLACKLIST_REGIONS": { + "bedtools": "2.30.0" + }, + "GET_AUTOSOMES": { + "python": "3.8.3" + }, + "GTF2BED": { + "perl": "5.26.2" + }, + "HOMER_ANNOTATEPEAKS": { + "homer": 4.11 + }, + "IGV": { + "python": "3.8.3" + }, + "KHMER_UNIQUEKMERS": { + "khmer": "3.0.0a3" + }, + "MACS3_CALLPEAK": { + "macs3": "3.0.4" + }, + "MACS3_CONSENSUS": { + "python": "3.10.0", + "r-base": "4.1.1" + }, + "MERGED_LIBRARY_ATAQV_ATAQV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_ATAQV_MKARV": { + "ataqv": "1.3.1" + }, + "MERGED_LIBRARY_DEEPTOOLS_PLOTFINGERPRINT": { + "deeptools": "3.5.6" + }, + "MERGED_LIBRARY_PICARD_COLLECTMULTIPLEMETRICS": { + "picard": "3.4.0" + }, + "MULTIQC_CUSTOM_PEAKS": { + "sed": 4.7 + }, + "PICARD_MARKDUPLICATES": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_LIBRARY": { + "picard": "3.4.0" + }, + "PICARD_MERGESAMFILES_REPLICATE": { + "picard": "3.4.0" + }, + "PLOT_HOMER_ANNOTATEPEAKS": { + "r-base": "4.0.3" + }, + "PLOT_MACS3_QC": { + "r-base": "4.0.3" + }, + "SAMPLESHEET_CHECK": { + "python": "3.8.3" + }, + "SAMTOOLS_FAIDX": { + "samtools": "1.23.1" + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": 1.24 + }, + "SAMTOOLS_IDXSTATS": { + "samtools": 1.24 + }, + "SAMTOOLS_INDEX": { + "samtools": 1.24 + }, + "SAMTOOLS_SORT": { + "samtools": 1.24 + }, + "SAMTOOLS_STATS": { + "samtools": 1.24 + }, + "STAR_ALIGN": { + "star": "2.6.1d" + }, + "STAR_GENOMEGENERATE": { + "star": "2.6.1d" + }, + "SUBREAD_FEATURECOUNTS": { + "subread": "2.0.1" + }, + "TRIMGALORE": { + "trimgalore": "2.1.0" + }, + "TSS_EXTRACT": { + "sed": 4.7 + }, + "UCSC_BEDGRAPHTOBIGWIG": { + "ucsc": 482 + } + }, + [ + "fastqc", + "fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T100_SE_REP1_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T100_SE_REP2_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T150_SE_REP1_T1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T150_SE_REP1_T2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_2_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_1_fastqc.html", + "fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_2_fastqc.html", + "fastqc/zips", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T100_SE_REP1_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T100_SE_REP2_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_2_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_1_fastqc.zip", + "fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_2_fastqc.zip", + "genome", + "genome/genome.fa", + "genome/genome.fa.fai", + "igv", + "igv/broad_peak", + "igv/broad_peak/igv_files.txt", + "igv/broad_peak/igv_session.xml", + "multiqc", + "multiqc/broad_peak", + "multiqc/broad_peak/multiqc_data", + "multiqc/broad_peak/multiqc_data/deeptools_plot_fingerprint_counts_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/deeptools_plot_profile_mlib_deeptools.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_filtered_reads_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_trimmed_sequences_plot_3_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt", + "multiqc/broad_peak/multiqc_data/mqc_deeptools_fingerprint_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_adapter_content_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_adapter_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_n_content_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_n_content_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_sequence_quality_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_base_sequence_quality_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_quality_scores_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_per_sequence_quality_scores_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_counts_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_counts_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_duplication_levels_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_duplication_levels_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_fastqc_sequence_length_distribution_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_featureCounts_assignment_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_featureCounts_assignment_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_readlength_plot_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Adenine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Cytosine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Guanine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Thymine.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_base_distribution_by_cycle__Undetermined.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_deduplication_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_insert_size_Percentages.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_by_cycle_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_picard_quality_score_distribution_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_read_distribution_profile_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-2_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-3_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot-4_1.txt", + "multiqc/broad_peak/multiqc_data/mqc_samtools_alignment_plot_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc.log", + "multiqc/broad_peak/multiqc_data/multiqc_citations.txt", + "multiqc/broad_peak/multiqc_data/multiqc_cutadapt.txt", + "multiqc/broad_peak/multiqc_data/multiqc_data.json", + "multiqc/broad_peak/multiqc_data/multiqc_fastqc.txt", + "multiqc/broad_peak/multiqc_data/multiqc_fastqc_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_featureCounts_mlib_featurecounts.txt", + "multiqc/broad_peak/multiqc_data/multiqc_featureCounts_mrep_featurecounts.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_deseq2_clustering_1-plot.yaml", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_deseq2_pca_1-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mlib_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_deseq2_clustering_1-plot.yaml", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_deseq2_pca_1-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_frip_score-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_annotation-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_mrep_peak_count-plot.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_AlignmentSummaryMetrics.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_baseContent.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_dups_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_insertSize.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_by_cycle.txt", + "multiqc/broad_peak/multiqc_data/multiqc_picard_quality_score_distribution.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_flagstat_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_idxstats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_1.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_2.txt", + "multiqc/broad_peak/multiqc_data/multiqc_samtools_stats_3.txt", + "multiqc/broad_peak/multiqc_data/multiqc_sources.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_2.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_3.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_4.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_5.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_1.txt", + "multiqc/broad_peak/multiqc_data/picard_histogram_mrep_picard_2.txt", + "multiqc/broad_peak/multiqc_plots", + "multiqc/broad_peak/multiqc_plots/pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_filtered_reads_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_filtered_reads_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_deeptools_fingerprint_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_adapter_content_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_adapter_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_n_content_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_n_content_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_sequence_quality_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_base_sequence_quality_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_quality_scores_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_per_sequence_quality_scores_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_counts_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_duplication_levels_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_duplication_levels_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_fastqc_sequence_length_distribution_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_featureCounts_assignment_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mlib_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_frip_score-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_annotation-plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_mrep_peak_count-plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_readlength_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Adenine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Cytosine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Guanine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Thymine.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_base_distribution_by_cycle__Undetermined.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_deduplication_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_insert_size_Percentages.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_by_cycle_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_picard_quality_score_distribution_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_read_distribution_profile_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-2_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-3_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot-4_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1.pdf", + "multiqc/broad_peak/multiqc_plots/pdf/mqc_samtools_alignment_plot_1_pc.pdf", + "multiqc/broad_peak/multiqc_plots/png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_filtered_reads_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_filtered_reads_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_trimmed_sequences_plot_3_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_deeptools_fingerprint_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_adapter_content_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_adapter_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_n_content_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_n_content_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_sequence_quality_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_base_sequence_quality_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_quality_scores_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_per_sequence_quality_scores_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_counts_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_duplication_levels_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_duplication_levels_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_fastqc_sequence_length_distribution_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_featureCounts_assignment_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mlib_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_frip_score-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_annotation-plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_mrep_peak_count-plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_readlength_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Adenine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Cytosine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Guanine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Thymine.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_base_distribution_by_cycle__Undetermined.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_deduplication_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_insert_size_Percentages.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_by_cycle_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_picard_quality_score_distribution_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_read_distribution_profile_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-2_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-3_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot-4_1_pc.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1.png", + "multiqc/broad_peak/multiqc_plots/png/mqc_samtools_alignment_plot_1_pc.png", + "multiqc/broad_peak/multiqc_plots/svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_filtered_reads_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_filtered_reads_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_trimmed_sequences_plot_3_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_deeptools_fingerprint_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_adapter_content_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_adapter_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_n_content_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_n_content_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_sequence_quality_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_base_sequence_quality_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot-2_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_quality_scores_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_per_sequence_quality_scores_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_counts_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_duplication_levels_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_duplication_levels_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_fastqc_sequence_length_distribution_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_featureCounts_assignment_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mlib_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_frip_score-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_annotation-plot_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_mrep_peak_count-plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_readlength_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Bases_ylab_Bases_cpswitch_counts_label_Number_of_Bases__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads_.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_alignment_summary__name_Aligned_Reads_ylab_Reads_cpswitch_counts_label_Number_of_Reads__pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Adenine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Cytosine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Guanine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Thymine.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_base_distribution_by_cycle__Undetermined.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_deduplication_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_insert_size_Percentages.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_by_cycle_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_picard_quality_score_distribution_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_read_distribution_profile_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-2_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-3_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot-4_1_pc.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1.svg", + "multiqc/broad_peak/multiqc_plots/svg/mqc_samtools_alignment_plot_1_pc.svg", + "multiqc/broad_peak/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_atacseq_software_mqc_versions.yml", + "pipeline_info/samplesheet.valid.csv", + "star", + "star/library", + "star/library/log", + "star/library/log/OSMOTIC_STRESS_T0_PE_REP1_T1.Log.final.out", + "star/library/log/OSMOTIC_STRESS_T0_PE_REP1_T1.Log.out", + "star/library/log/OSMOTIC_STRESS_T0_PE_REP1_T1.Log.progress.out", + "star/library/log/OSMOTIC_STRESS_T0_PE_REP1_T1.SJ.out.tab", + "star/library/log/OSMOTIC_STRESS_T0_PE_REP2_T1.Log.final.out", + "star/library/log/OSMOTIC_STRESS_T0_PE_REP2_T1.Log.out", + "star/library/log/OSMOTIC_STRESS_T0_PE_REP2_T1.Log.progress.out", + "star/library/log/OSMOTIC_STRESS_T0_PE_REP2_T1.SJ.out.tab", + "star/library/log/OSMOTIC_STRESS_T100_SE_REP1_T1.Log.final.out", + "star/library/log/OSMOTIC_STRESS_T100_SE_REP1_T1.Log.out", + "star/library/log/OSMOTIC_STRESS_T100_SE_REP1_T1.Log.progress.out", + "star/library/log/OSMOTIC_STRESS_T100_SE_REP1_T1.SJ.out.tab", + "star/library/log/OSMOTIC_STRESS_T100_SE_REP2_T1.Log.final.out", + "star/library/log/OSMOTIC_STRESS_T100_SE_REP2_T1.Log.out", + "star/library/log/OSMOTIC_STRESS_T100_SE_REP2_T1.Log.progress.out", + "star/library/log/OSMOTIC_STRESS_T100_SE_REP2_T1.SJ.out.tab", + "star/library/log/OSMOTIC_STRESS_T150_SE_REP1_T1.Log.final.out", + "star/library/log/OSMOTIC_STRESS_T150_SE_REP1_T1.Log.out", + "star/library/log/OSMOTIC_STRESS_T150_SE_REP1_T1.Log.progress.out", + "star/library/log/OSMOTIC_STRESS_T150_SE_REP1_T1.SJ.out.tab", + "star/library/log/OSMOTIC_STRESS_T150_SE_REP1_T2.Log.final.out", + "star/library/log/OSMOTIC_STRESS_T150_SE_REP1_T2.Log.out", + "star/library/log/OSMOTIC_STRESS_T150_SE_REP1_T2.Log.progress.out", + "star/library/log/OSMOTIC_STRESS_T150_SE_REP1_T2.SJ.out.tab", + "star/library/log/OSMOTIC_STRESS_T15_PE_REP1_T1.Log.final.out", + "star/library/log/OSMOTIC_STRESS_T15_PE_REP1_T1.Log.out", + "star/library/log/OSMOTIC_STRESS_T15_PE_REP1_T1.Log.progress.out", + "star/library/log/OSMOTIC_STRESS_T15_PE_REP1_T1.SJ.out.tab", + "star/library/log/OSMOTIC_STRESS_T15_PE_REP1_T2.Log.final.out", + "star/library/log/OSMOTIC_STRESS_T15_PE_REP1_T2.Log.out", + "star/library/log/OSMOTIC_STRESS_T15_PE_REP1_T2.Log.progress.out", + "star/library/log/OSMOTIC_STRESS_T15_PE_REP1_T2.SJ.out.tab", + "star/merged_library", + "star/merged_library/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam", + "star/merged_library/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.bai", + "star/merged_library/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam", + "star/merged_library/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.bai", + "star/merged_library/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam", + "star/merged_library/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.bai", + "star/merged_library/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam", + "star/merged_library/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.bai", + "star/merged_library/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam", + "star/merged_library/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.bai", + "star/merged_library/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam", + "star/merged_library/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.bai", + "star/merged_library/ataqv", + "star/merged_library/ataqv/broad_peak", + "star/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.ataqv.json", + "star/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.ataqv.json", + "star/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.ataqv.json", + "star/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.ataqv.json", + "star/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.ataqv.json", + "star/merged_library/ataqv/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.ataqv.json", + "star/merged_library/ataqv/broad_peak/html", + "star/merged_library/ataqv/broad_peak/html/css", + "star/merged_library/ataqv/broad_peak/html/css/ataqv.css", + "star/merged_library/ataqv/broad_peak/html/css/datatables.buttons.min.css", + "star/merged_library/ataqv/broad_peak/html/css/datatables.fontawesome.css", + "star/merged_library/ataqv/broad_peak/html/css/datatables.min.css", + "star/merged_library/ataqv/broad_peak/html/css/font-awesome.min.css", + "star/merged_library/ataqv/broad_peak/html/css/normalize.css", + "star/merged_library/ataqv/broad_peak/html/data", + "star/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T0_PE_REP1.json.gz", + "star/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T0_PE_REP2.json.gz", + "star/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T100_SE_REP1.json.gz", + "star/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T100_SE_REP2.json.gz", + "star/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T150_SE_REP1.json.gz", + "star/merged_library/ataqv/broad_peak/html/data/OSMOTIC_STRESS_T15_PE_REP1.json.gz", + "star/merged_library/ataqv/broad_peak/html/fonts", + "star/merged_library/ataqv/broad_peak/html/fonts/FontAwesome.otf", + "star/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.eot", + "star/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.svg", + "star/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.ttf", + "star/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff", + "star/merged_library/ataqv/broad_peak/html/fonts/fontawesome-webfont.woff2", + "star/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regular.woff", + "star/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-regularit.woff", + "star/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semibold.woff", + "star/merged_library/ataqv/broad_peak/html/fonts/sourcesanspro-semiboldit.woff", + "star/merged_library/ataqv/broad_peak/html/index.html", + "star/merged_library/ataqv/broad_peak/html/js", + "star/merged_library/ataqv/broad_peak/html/js/ataqv.js", + "star/merged_library/ataqv/broad_peak/html/js/configuration.js", + "star/merged_library/ataqv/broad_peak/html/js/d3.min.js", + "star/merged_library/ataqv/broad_peak/html/js/datatables.min.js", + "star/merged_library/ataqv/broad_peak/html/js/jszip.min.js", + "star/merged_library/bigwig", + "star/merged_library/bigwig/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.bigWig", + "star/merged_library/bigwig/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.bigWig", + "star/merged_library/bigwig/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.bigWig", + "star/merged_library/bigwig/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.bigWig", + "star/merged_library/bigwig/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.bigWig", + "star/merged_library/bigwig/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.bigWig", + "star/merged_library/bigwig/scale", + "star/merged_library/bigwig/scale/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_factor.txt", + "star/merged_library/bigwig/scale/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_factor.txt", + "star/merged_library/bigwig/scale/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt", + "star/merged_library/bigwig/scale/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt", + "star/merged_library/bigwig/scale/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt", + "star/merged_library/bigwig/scale/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt", + "star/merged_library/deeptools", + "star/merged_library/deeptools/plotfingerprint", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.pdf", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.plotFingerprint.raw.txt", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.pdf", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.plotFingerprint.raw.txt", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.pdf", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.plotFingerprint.raw.txt", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.pdf", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.qcmetrics.txt", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.plotFingerprint.raw.txt", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.pdf", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.plotFingerprint.raw.txt", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.pdf", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.qcmetrics.txt", + "star/merged_library/deeptools/plotfingerprint/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.plotFingerprint.raw.txt", + "star/merged_library/deeptools/plotprofile", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.reference_point.plotProfile.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.plotProfile.pdf", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.reference_point.plotProfile.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.reference_point.plotProfile.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.computeMatrix.mat.gz", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.plotProfile.pdf", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.reference_point.plotProfile.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.computeMatrix.mat.gz", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_regions.plotHeatmap.pdf", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.reference_point.plotProfile.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.computeMatrix.mat.gz", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.computeMatrix.vals.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.plotProfile.pdf", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.reference_point.plotProfile.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.computeMatrix.mat.gz", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.computeMatrix.vals.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.plotHeatmap.mat.tab", + "star/merged_library/deeptools/plotprofile/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_regions.plotHeatmap.pdf", + "star/merged_library/macs3", + "star/merged_library/macs3/broad_peak", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.annotatePeaks.txt", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.annotatePeaks.txt", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.annotatePeaks.txt", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak", + "star/merged_library/macs3/broad_peak/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls", + "star/merged_library/macs3/broad_peak/consensus", + "star/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.annotatePeaks.txt", + "star/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.bed", + "star/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.intersect.plot.pdf", + "star/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.intersect.txt", + "star/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.boolean.txt", + "star/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.tsv", + "star/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.tsv.summary", + "star/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.saf", + "star/merged_library/macs3/broad_peak/consensus/deseq2", + "star/merged_library/macs3/broad_peak/consensus/deseq2/R_sessionInfo.log", + "star/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.dds.RData", + "star/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.pca.vals.txt", + "star/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.pca.vals_mqc.tsv", + "star/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.plots.pdf", + "star/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.rds", + "star/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.sample.dists.txt", + "star/merged_library/macs3/broad_peak/consensus/deseq2/consensus_peaks.mLb.clN.sample.dists_mqc.tsv", + "star/merged_library/macs3/broad_peak/consensus/deseq2/size_factors", + "star/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt", + "star/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt", + "star/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt", + "star/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt", + "star/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt", + "star/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt", + "star/merged_library/macs3/broad_peak/consensus/deseq2/size_factors/consensus_peaks.mLb.clN.size_factors.RData", + "star/merged_library/macs3/broad_peak/qc", + "star/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "star/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.count_mqc.tsv", + "star/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "star/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv", + "star/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "star/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.count_mqc.tsv", + "star/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.FRiP_mqc.tsv", + "star/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv", + "star/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "star/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.count_mqc.tsv", + "star/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv", + "star/merged_library/macs3/broad_peak/qc/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv", + "star/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.plots.pdf", + "star/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary.txt", + "star/merged_library/macs3/broad_peak/qc/macs3_annotatePeaks.mLb.clN.summary_mqc.tsv", + "star/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.plots.pdf", + "star/merged_library/macs3/broad_peak/qc/macs3_peak.mLb.clN.summary.txt", + "star/merged_library/picard_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.metrics.txt", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.metrics.txt", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.metrics.txt", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.metrics.txt", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.metrics.txt", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.alignment_summary_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution_metrics", + "star/merged_library/picard_metrics/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.metrics.txt", + "star/merged_library/picard_metrics/pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.base_distribution_by_cycle.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.insert_size_histogram.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_by_cycle.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.quality_distribution.pdf", + "star/merged_library/picard_metrics/pdf/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.CollectMultipleMetrics.read_length_histogram.pdf", + "star/merged_library/samtools_stats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.flagstat", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.idxstats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.stats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.flagstat", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.idxstats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.stats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.flagstat", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.stats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.stats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.flagstat", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.idxstats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.stats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.flagstat", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.idxstats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.stats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.flagstat", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.stats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.stats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.stats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.stats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.stats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats", + "star/merged_library/samtools_stats/OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.stats", + "star/merged_replicate", + "star/merged_replicate/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam", + "star/merged_replicate/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.bai", + "star/merged_replicate/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam", + "star/merged_replicate/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.bai", + "star/merged_replicate/bigwig", + "star/merged_replicate/bigwig/OSMOTIC_STRESS_T0_PE.mRp.clN.bigWig", + "star/merged_replicate/bigwig/OSMOTIC_STRESS_T100_SE.mRp.clN.bigWig", + "star/merged_replicate/bigwig/scale", + "star/merged_replicate/bigwig/scale/OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt", + "star/merged_replicate/bigwig/scale/OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt", + "star/merged_replicate/macs3", + "star/merged_replicate/macs3/broad_peak", + "star/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.annotatePeaks.txt", + "star/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak", + "star/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak", + "star/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls", + "star/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.annotatePeaks.txt", + "star/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak", + "star/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak", + "star/merged_replicate/macs3/broad_peak/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls", + "star/merged_replicate/macs3/broad_peak/consensus", + "star/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.annotatePeaks.txt", + "star/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.bed", + "star/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.intersect.plot.pdf", + "star/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.intersect.txt", + "star/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.boolean.txt", + "star/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.tsv", + "star/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.tsv.summary", + "star/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.saf", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/R_sessionInfo.log", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.dds.RData", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.pca.vals.txt", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.pca.vals_mqc.tsv", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.plots.pdf", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.rds", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.sample.dists.txt", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/consensus_peaks.mRp.clN.sample.dists_mqc.tsv", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt", + "star/merged_replicate/macs3/broad_peak/consensus/deseq2/size_factors/consensus_peaks.mRp.clN.size_factors.RData", + "star/merged_replicate/macs3/broad_peak/qc", + "star/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv", + "star/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv", + "star/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv", + "star/merged_replicate/macs3/broad_peak/qc/OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv", + "star/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.plots.pdf", + "star/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary.txt", + "star/merged_replicate/macs3/broad_peak/qc/macs3_annotatePeaks.mRp.clN.summary_mqc.tsv", + "star/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.plots.pdf", + "star/merged_replicate/macs3/broad_peak/qc/macs3_peak.mRp.clN.summary.txt", + "star/merged_replicate/picard_metrics", + "star/merged_replicate/picard_metrics/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.metrics.txt", + "star/merged_replicate/picard_metrics/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.metrics.txt", + "star/merged_replicate/samtools_stats", + "star/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat", + "star/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats", + "star/merged_replicate/samtools_stats/OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.stats", + "star/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat", + "star/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats", + "star/merged_replicate/samtools_stats/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.stats", + "trimgalore", + "trimgalore/fastqc", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP1_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T0_PE_REP2_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T100_SE_REP1_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T100_SE_REP2_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T150_SE_REP1_T1_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T150_SE_REP1_T2_trimmed_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T1_2_val_2_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_1_val_1_fastqc.html", + "trimgalore/fastqc/OSMOTIC_STRESS_T15_PE_REP1_T2_2_val_2_fastqc.html", + "trimgalore/fastqc/zips", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP1_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T0_PE_REP2_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T100_SE_REP1_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T100_SE_REP2_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T1_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T150_SE_REP1_T2_trimmed_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T1_2_val_2_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_1_val_1_fastqc.zip", + "trimgalore/fastqc/zips/OSMOTIC_STRESS_T15_PE_REP1_T2_2_val_2_fastqc.zip", + "trimgalore/logs", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP1_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP1_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP2_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T0_PE_REP2_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T100_SE_REP1_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T100_SE_REP2_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T150_SE_REP1_T1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T150_SE_REP1_T2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T1_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T1_2.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T2_1.fastq.gz_trimming_report.txt", + "trimgalore/logs/OSMOTIC_STRESS_T15_PE_REP1_T2_2.fastq.gz_trimming_report.txt" + ], + [ + "genome.fa:md5,4bad9f4b18056156a81f7f952abbe125", + "genome.fa.fai:md5,6f4c0ce5258e6948135ad006e1f9ee1b", + "deeptools_plot_fingerprint_counts_mlib_deeptools.txt:md5,f5cba95d6871907b4ff7d78f6362c71a", + "deeptools_plot_profile_mlib_deeptools.txt:md5,3c74002bc0bc18921860ef381f97ae77", + "mqc_cutadapt_filtered_reads_plot_1.txt:md5,b78f69173122f2cacf8121eaeb815382", + "mqc_cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,157073209c492b89badba367b1c57d83", + "mqc_cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,b04ae8b2ec27d71817ae7cb666888b9b", + "mqc_deeptools_fingerprint_plot_1.txt:md5,492578b77b8df68c48e5254d3de4cbf6", + "mqc_fastqc_adapter_content_plot-2_1.txt:md5,3560a22f94aea25e27d97e056fb478ed", + "mqc_fastqc_adapter_content_plot_1.txt:md5,66f3e2f6ba14599b0d6c20144df60777", + "mqc_fastqc_per_base_n_content_plot-2_1.txt:md5,d79e95d36d955edee3e4bfb139dce967", + "mqc_fastqc_per_base_n_content_plot_1.txt:md5,8d9cdd0463193b7e10332e2ca0273aca", + "mqc_fastqc_per_base_sequence_quality_plot-2_1.txt:md5,3bb6cad69480846e4003b9f0f3511caa", + "mqc_fastqc_per_base_sequence_quality_plot_1.txt:md5,821cb87b0ae8bd61cd445d153b8f371a", + "mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt:md5,88fb0e924094b5dd57f4003ac13fd1f4", + "mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt:md5,a4b37bca5e61bf595c4532ffbc8b8f93", + "mqc_fastqc_per_sequence_gc_content_plot_Counts.txt:md5,3fa7f0c0858d12cae8700e21774da86d", + "mqc_fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,a2d0c3ec413894e4dafa62ebdf44a06c", + "mqc_fastqc_per_sequence_quality_scores_plot-2_1.txt:md5,841ccc3da246bd197fc966e9f8c5ca57", + "mqc_fastqc_per_sequence_quality_scores_plot_1.txt:md5,3bfe1c94f710975829e2c1e3b5f16ea7", + "mqc_fastqc_sequence_counts_plot-2_1.txt:md5,c734a06e1f3e3afc1486a0b45be880e1", + "mqc_fastqc_sequence_counts_plot_1.txt:md5,d0cf8d64e742b5f446e6b602d86913b9", + "mqc_fastqc_sequence_duplication_levels_plot-2_1.txt:md5,d7ada8561d521eaf645073f7cccf7b82", + "mqc_fastqc_sequence_duplication_levels_plot_1.txt:md5,23c4883ed6c22212b0c3e07a863745d1", + "mqc_fastqc_sequence_length_distribution_plot_1.txt:md5,bc3acb40acbf620b237d0f2fa8c8a1ab", + "mqc_featureCounts_assignment_plot-2_1.txt:md5,f847e2716bb540d892f6c345cfc53884", + "mqc_featureCounts_assignment_plot_1.txt:md5,335d36db1736424e295cdb1c11df7acb", + "mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt:md5,4d253d5b204dd399d825bab5f7ff4b04", + "mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt:md5,7be3b0f84ad7dcb907abf11cd7681eeb", + "mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt:md5,d48215c49cf31af13d24d0ef8475d72b", + "mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt:md5,40ab2e9370ce0e9cb7b97ab43a037bfe", + "mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt:md5,e9a3f537970b47dc2797ee82b36e3995", + "mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt:md5,50fc6341d6d28d1f7684ebaa26bbdde3", + "mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt:md5,b020bc14cb13559c5ae8a906ab616051", + "mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt:md5,4a57c2b875a3d42af34289e71edb9751", + "mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt:md5,cb6ee731c07b0a03dc9c526e21483677", + "mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,0e2d5e76c8fa3626f9f15292eac64c36", + "mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,13bfa6c90bac9810790089c035c52a66", + "mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,5dab6ad8e2b091ea2ebbaff3813b447b", + "mqc_samtools_alignment_plot-2_1.txt:md5,f7b34db9abc4e09f6045b2618b618f5d", + "mqc_samtools_alignment_plot-3_1.txt:md5,b3fc8b725a3ec77d86062d87c4849897", + "mqc_samtools_alignment_plot-4_1.txt:md5,d5db3b7eb13353b1c35793dc2bf4a78b", + "mqc_samtools_alignment_plot_1.txt:md5,046d3410e6e5884e5d54aa0754523f85", + "multiqc_citations.txt:md5,34da9f7497d275274f6dfd3b89831edb", + "multiqc_cutadapt.txt:md5,926fcf7c5a9c5dc0a105a439c85a5f58", + "multiqc_fastqc.txt:md5,a9a7484add8120fc3cf3d5626a92973b", + "multiqc_fastqc_1.txt:md5,58ab2bbd2d19745e5975742c6d1335d7", + "multiqc_featureCounts_mlib_featurecounts.txt:md5,5d6e8599c381a9b1f235b75ee652e272", + "multiqc_featureCounts_mrep_featurecounts.txt:md5,3366c77a3a09892f4e569be746ee576b", + "multiqc_mlib_frip_score-plot.txt:md5,172b8632976472eb78ded2270c3470fc", + "multiqc_mlib_peak_annotation-plot.txt:md5,38d611236d82efa626c8dcac8b359d2e", + "multiqc_mlib_peak_count-plot.txt:md5,69a8217b8bcb6c162b9f874f6a83e844", + "multiqc_mrep_frip_score-plot.txt:md5,bdd1045251499f6bafeed38aaeb0b5a3", + "multiqc_mrep_peak_annotation-plot.txt:md5,0fb5e026e299e3886df9da17ada0b47c", + "multiqc_mrep_peak_count-plot.txt:md5,2589ea10775ac06069b0f933dd2f2f93", + "picard_histogram.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_3.txt:md5,fc2b0821fed14da8f161b48a6f04947b", + "picard_histogram_4.txt:md5,7cdffefa11196ef758cbdfe357ff5c9e", + "picard_histogram_5.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_1.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "picard_histogram_mrep_picard_2.txt:md5,c9aa8a5ac6841ffb3a6cc2de45b44797", + "samplesheet.valid.csv:md5,51b046b55592e95949824f21b12c7e49", + "OSMOTIC_STRESS_T0_PE_REP1_T1.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "OSMOTIC_STRESS_T0_PE_REP2_T1.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "OSMOTIC_STRESS_T100_SE_REP1_T1.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "OSMOTIC_STRESS_T100_SE_REP2_T1.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "OSMOTIC_STRESS_T150_SE_REP1_T1.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "OSMOTIC_STRESS_T150_SE_REP1_T2.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "OSMOTIC_STRESS_T15_PE_REP1_T1.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "OSMOTIC_STRESS_T15_PE_REP1_T2.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "ataqv.css:md5,7bb9e18974018dd29bdc12a46a6d6d65", + "datatables.buttons.min.css:md5,675306abc9d3239314f2c66c0e22ef7a", + "datatables.fontawesome.css:md5,716d7a3edd2c75e712b1ffe26f12a861", + "datatables.min.css:md5,00ef3e39d9302618395ab189ec8bcd9f", + "font-awesome.min.css:md5,89916fa773ce96569604016ef25cab50", + "normalize.css:md5,40d20cc85100840580df4346bb99d7ed", + "FontAwesome.otf:md5,9ccfa32dd4cd1b8e83f68899d85bd5e6", + "fontawesome-webfont.eot:md5,404a525502f8e5ba7e93b9f02d9e83a9", + "fontawesome-webfont.ttf:md5,fb650aaf10736ffb9c4173079616bf01", + "fontawesome-webfont.woff:md5,891e3f340c1126b4c7c142e5f6e86816", + "fontawesome-webfont.woff2:md5,926c93d201fe51c8f351e858468980c3", + "sourcesanspro-regular.woff:md5,f7bd788f18b8c4bb93dd37d140348e1e", + "sourcesanspro-regularit.woff:md5,c3638b17f4fd76dae12fe2ae14571e57", + "sourcesanspro-semibold.woff:md5,e7fc8925d9364e9d177d9e1d08bb1855", + "sourcesanspro-semiboldit.woff:md5,f1d255aa459786dfc6aa2e488ac01245", + "index.html:md5,bf7747be761e56ad7c54c842ac88461a", + "ataqv.js:md5,feb291b7839e9e43ed304565e3a605d9", + "configuration.js:md5,a2a6eed9dd615d38b4f6ad6ef414b2c4", + "d3.min.js:md5,db69fb2626a71a286ee772d673138aca", + "datatables.min.js:md5,e369b872620dadb05e4eb555b81f9112", + "jszip.min.js:md5,09e492cb492ffa75484bbe10f1f721d1", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.scale_factor.txt:md5,dea4ef85fe1a9d5db4e4b4947e52d870", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_factor.txt:md5,1bc9d496c2222cd46074357f6841fbcc", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt:md5,cf0e1529b9f498207ef0c094a8fb9ed7", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt:md5,f6dd1bfcaf56d3382ceb3d96de8e7649", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt:md5,342949ce24f97daf630349f097f84a08", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt:md5,0def6ba07a525bbabca4edcf76ac8215", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak:md5,eb5d3f535c02ce0520a8c720339ebb62", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak:md5,04d93e076f7501cd3758e9c6145646ca", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls:md5,768352413ff1d74f676e06039f8567db", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak:md5,25819461437436c7871b4185f96c7e75", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak:md5,1bbb5d99cb5f49d5f8270ffebbba1ee2", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls:md5,cff9a65484b11c40864f382f3571b226", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak:md5,7e0b0dbe055cc7553be6b0bb29ae477f", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak:md5,480dccb044dc9f672cbeb2f1810982bc", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls:md5,6bf6c4812c08e09a08674993da40cf21", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak:md5,1f64ae03be3ac6ea6a65bb398d6ee830", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak:md5,6c15baf6b940f23860b8dabfa740e21f", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls:md5,1f5d3f459c95a5fb8ff4ebfc641b748a", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak:md5,4d412496ee6f4e918c4c6f49b3de2538", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak:md5,ca313c9a193f91084464fdc425e32262", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls:md5,ca663098945296d31365351c02af2d00", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak:md5,1416515aa0cbe28a34ab89c4e25936eb", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak:md5,8096a430d12770cf14532e221eee9fb7", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls:md5,dbcefceedd33b613cb728c3e9247c4d5", + "consensus_peaks.mLb.clN.bed:md5,5389e3cd737a7f4b7aba15f8412240ee", + "consensus_peaks.mLb.clN.boolean.intersect.txt:md5,6733240f0bd75eea4f72cad459c8ec97", + "consensus_peaks.mLb.clN.boolean.txt:md5,e6192c22cc938c4190836c3ca5ac714f", + "consensus_peaks.mLb.clN.featureCounts.tsv:md5,036d3d1dbd96d80b0ad4cbe9dbf51b2a", + "consensus_peaks.mLb.clN.featureCounts.tsv.summary:md5,ee842e92bccf4c4888477b67881c5194", + "consensus_peaks.mLb.clN.saf:md5,f4a50c8a32bb50e6329a3101d042845e", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,7396695041220150697b92848990d328", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,be0948c331ae39c3908520c6372dedc4", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,7e03dc276aaef64d5741717cfa07838a", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,4ee88005115246af84940504b319b947", + "OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt:md5,528b0e80f9c42150577d67c33440836d", + "OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt:md5,445604037d2b3a15f6a17b83a862b16d", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,b7e15478014f9f23548c9b751e7a074e", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,ad7820a642434f5df39670c52ffac69c", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,d912f185b2b7846272a101ab58b75812", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,57eadcb0e74c599279ed0fc8b9d24cc7", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,f8f8d3b80d1e0f513b7a2ef882d55ce2", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,ea421a851ce7a999430fe1ba08f4d42a", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.FRiP_mqc.tsv:md5,d1290fa3b94a12f9205475ac626c2668", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,7c7d22115bf19f41e1178af62e57b600", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,8365e7ac9191ad3d9f9e8facd9b9c44d", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,c1ecd3d24f2a87f42ce76adc66c4f873", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,e8f4186761ca698195e6824fa42e925b", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,ea8632e1afc1aa1bdd6848cc85c84066", + "macs3_annotatePeaks.mLb.clN.summary.txt:md5,014caaed9f3285ce5fec78896c85e303", + "macs3_annotatePeaks.mLb.clN.summary_mqc.tsv:md5,df95adbdc9e2323f186a0598bd6b0a84", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,53b58ad9e3d9a01ddb7646019ba26360", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,59c9fbccc4656d9ba5f8ff023ee78151", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,86b038a5e714d80822693fd4bd93cda0", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,91b35f66c0c0b3b32190026424292eb3", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.flagstat:md5,b5f91d02dfa2e7506e527c4824a63c12", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats:md5,cf15b56eb317dc50147f02057a47f4d6", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat:md5,2668e3b1725de6cc4e48b8d304e39a5e", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats:md5,1557274d222c7854109a890a5dd73175", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,5e7c270fcd8eb467953d484bb1733f54", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,857efe419afc3092b88766991e29a359", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,fe378bc0507b6bab43658bac68318170", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,6c67ab527245e7f9c0673531c4d6bc18", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.flagstat:md5,9b1a4fbd2f07fed57772939e1824ec3c", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats:md5,373ba1b3229cb8badc681040d89732d2", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat:md5,b63a557ee45d93a3a6d6652bf53ce0b1", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats:md5,7bd135bf4add8e58db314be935d9dd04", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,f1acb9c6985cf637b23dd92bc2f96f56", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,227eab48d2449d79dd91909fb8914e23", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,bd32f154d5bf8bd4851fc43bd4d76462", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,a5934bacd5678da9fbec1e1aca6ee5c7", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,8c32adbe735a4dc97dbf87730d547e96", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,ae7f563848ef672536da7f158e1414a6", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,86e1620c870ef4375833a6c05d3a09fc", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,7057a94a521cf1a4019b88d310737d95", + "OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt:md5,8a5eaabf9d8e31cf9bea82c581b712e7", + "OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt:md5,b5f2d038356da25711e016317ef6135f", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak:md5,8c81de493b6da8912c0366337949a986", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak:md5,ac9ae211d59e3c8d5a07637fcb5f2e90", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls:md5,9561df64e813da8f86de5ec3e52eea10", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak:md5,6a0167a9715da2470d3ffb3670cb3b5f", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak:md5,ffe30696d3e468998583ee57ac3c95c7", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls:md5,d871487cf7aed92b064914d00b472f3c", + "consensus_peaks.mRp.clN.bed:md5,67afb66a825827fc3e10d2f27412d20d", + "consensus_peaks.mRp.clN.boolean.intersect.txt:md5,7679e1db16b523318d4930c8f0207936", + "consensus_peaks.mRp.clN.boolean.txt:md5,0e8ae4eae99f2f5655d2d9c67ebef80d", + "consensus_peaks.mRp.clN.featureCounts.tsv:md5,55ff56c082941dc2bb3bcffefce3d958", + "consensus_peaks.mRp.clN.featureCounts.tsv.summary:md5,808e6a9ea690a36d4f58f0ef2fec8dc9", + "consensus_peaks.mRp.clN.saf:md5,c5a5f9db859c83e74ee27112b045b7e6", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,05d2e5f9bbb2c364cdf5ee76e78c62ad", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,d47907a311f3a640f48612cdcc4c8f2c", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,db8b4d2ea2b2b1d3c71afbcd80b6f6b3", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,c8bca9d92a092da122a5de14d8e9a0e7", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv:md5,e316fc50bd5a8a88a067c9b9be7bb8f0", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv:md5,f1362a3c63d2c94fa2f2fadca032dbba", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv:md5,a1deb279f6b442fd0a871a8d1e988cb3", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv:md5,29d619c7a2e3ba2164f8c764a49f0296", + "macs3_annotatePeaks.mRp.clN.summary.txt:md5,28f0ecd999941332e8c87b78fe6db589", + "macs3_annotatePeaks.mRp.clN.summary_mqc.tsv:md5,23fd1535843c9b24fd0f765475f9cbde", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat:md5,f86547e70772d7e5c29b839a5079b4a0", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats:md5,7126b4aa716d10c1e19d997fdc64d5b9", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat:md5,dc21331f6afd6d646dc65b6596c64ad7", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats:md5,14ae61b4381b88b505a76ff6c87f5676" + ] + ], + "timestamp": "2026-07-25T08:41:27.150042262", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "star with stub": { + "content": [ + 26 + ], + "timestamp": "2026-03-20T23:41:33.115193909", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + } + } +} \ No newline at end of file diff --git a/tower.yml b/tower.yml index c8bb670c..4e2a149e 100644 --- a/tower.yml +++ b/tower.yml @@ -3,13 +3,13 @@ reports: display: "MultiQC HTML report" samplesheet.csv: display: "Auto-created samplesheet with collated metadata and FASTQ paths" - macs2_peak.mLb.clN.plots.pdf: - display: "Merged library all samples MACS2 peak QC PDF plots" - macs2_peak.mRp.clN.plots.pdf: - display: "Merged replicate all samples MACS2 peak QC PDF plots" - macs2_annotatePeaks.mLb.clN.plots.pdf: + macs3_peak.mLb.clN.plots.pdf: + display: "Merged library all samples MACS3 peak QC PDF plots" + macs3_peak.mRp.clN.plots.pdf: + display: "Merged replicate all samples MACS3 peak QC PDF plots" + macs3_annotatePeaks.mLb.clN.plots.pdf: display: "Merged library all samples HOMER annotatePeaks.pl QC PDF plots" - macs2_annotatePeaks.mRp.clN.plots.pdf: + macs3_annotatePeaks.mRp.clN.plots.pdf: display: "Merged replicate all samples HOMER annotatePeaks.pl QC PDF plots" consensus_peaks.mLb.clN.plots.pdf: display: "Merged library consensus peaks DESeq2 QC PDF plots" @@ -26,10 +26,10 @@ reports: "*.plotHeatmap.pdf": display: "Merged library per-sample deepTools plotHeatmap PDF plots" "*mLb.clN_peaks.broadPeak": - display: "Merged library per-sample MACS2 broadPeak file" + display: "Merged library per-sample MACS3 broadPeak file" "*mRp.clN_peaks.broadPeak": - display: "Merged replicate per-sample MACS2 broadPeak file" + display: "Merged replicate per-sample MACS3 broadPeak file" "*mLb.clN_peaks.narrowPeak": - display: "Merged library per-sample MACS2 narrowPeak file" + display: "Merged library per-sample MACS3 narrowPeak file" "*mRp.clN_peaks.narrowPeak": - display: "Merged replicate per-sample MACS2 narrowPeak file" + display: "Merged replicate per-sample MACS3 narrowPeak file" diff --git a/workflows/atacseq.nf b/workflows/atacseq.nf index d4da4778..66139567 100644 --- a/workflows/atacseq.nf +++ b/workflows/atacseq.nf @@ -1,85 +1,32 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - VALIDATE INPUTS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -def valid_params = [ - aligners : [ 'bwa', 'bowtie2', 'chromap', 'star' ] -] - -def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) - -// Validate input parameters -WorkflowAtacseq.initialise(params, log, valid_params) - -// Check input path parameters to see if they exist -def checkPathParamList = [ - params.input, params.multiqc_config, - params.fasta, - params.gtf, params.gff, params.gene_bed, params.tss_bed, - params.bwa_index, params.bowtie2_index, params.chromap_index, params.star_index, - params.blacklist, - params.bamtools_filter_pe_config, params.bamtools_filter_se_config -] -for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } - -// Check mandatory parameters -if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - CONFIG FILES -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) -ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath( params.multiqc_config, checkIfExists: true ) : Channel.empty() -ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath( params.multiqc_logo, checkIfExists: true ) : Channel.empty() -ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - - -// JSON files required by BAMTools for alignment filtering -ch_bamtools_filter_se_config = file(params.bamtools_filter_se_config, checkIfExists: true) -ch_bamtools_filter_pe_config = file(params.bamtools_filter_pe_config, checkIfExists: true) - -// Header files for MultiQC -ch_multiqc_merged_library_peak_count_header = file("$projectDir/assets/multiqc/merged_library_peak_count_header.txt", checkIfExists: true) -ch_multiqc_merged_library_frip_score_header = file("$projectDir/assets/multiqc/merged_library_frip_score_header.txt", checkIfExists: true) -ch_multiqc_merged_library_peak_annotation_header = file("$projectDir/assets/multiqc/merged_library_peak_annotation_header.txt", checkIfExists: true) -ch_multiqc_merged_library_deseq2_pca_header = file("$projectDir/assets/multiqc/merged_library_deseq2_pca_header.txt", checkIfExists: true) -ch_multiqc_merged_library_deseq2_clustering_header = file("$projectDir/assets/multiqc/merged_library_deseq2_clustering_header.txt", checkIfExists: true) - -ch_multiqc_merged_replicate_peak_count_header = file("$projectDir/assets/multiqc/merged_replicate_peak_count_header.txt", checkIfExists: true) -ch_multiqc_merged_replicate_frip_score_header = file("$projectDir/assets/multiqc/merged_replicate_frip_score_header.txt", checkIfExists: true) -ch_multiqc_merged_replicate_peak_annotation_header = file("$projectDir/assets/multiqc/merged_replicate_peak_annotation_header.txt", checkIfExists: true) -ch_multiqc_merged_replicate_deseq2_pca_header = file("$projectDir/assets/multiqc/merged_replicate_deseq2_pca_header.txt", checkIfExists: true) -ch_multiqc_merged_replicate_deseq2_clustering_header = file("$projectDir/assets/multiqc/merged_replicate_deseq2_clustering_header.txt", checkIfExists: true) - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT LOCAL MODULES/SUBWORKFLOWS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +// +// MODULE: Loaded from modules/local/ +// include { IGV } from '../modules/local/igv' include { MULTIQC } from '../modules/local/multiqc' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -include { INPUT_CHECK } from '../subworkflows/local/input_check' -include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' -include { ALIGN_STAR } from '../subworkflows/local/align_star' -include { BAM_SHIFT_READS as MERGED_LIBRARY_BAM_SHIFT_READS } from '../subworkflows/local/bam_shift_reads' -include { BAM_SHIFT_READS as MERGED_REPLICATE_BAM_SHIFT_READS } from '../subworkflows/local/bam_shift_reads' +include { paramsSummaryMap } from 'plugin/nf-schema' +include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' +include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_atacseq_pipeline' +include { INPUT_CHECK } from '../subworkflows/local/input_check' +include { ALIGN_STAR } from '../subworkflows/local/align_star' +include { BAM_SHIFT_READS as MERGED_LIBRARY_BAM_SHIFT_READS } from '../subworkflows/local/bam_shift_reads' +include { BAM_SHIFT_READS as MERGED_REPLICATE_BAM_SHIFT_READS } from '../subworkflows/local/bam_shift_reads' include { BIGWIG_PLOT_DEEPTOOLS as MERGED_LIBRARY_BIGWIG_PLOT_DEEPTOOLS } from '../subworkflows/local/bigwig_plot_deeptools' include { BAM_FILTER_BAMTOOLS as MERGED_LIBRARY_FILTER_BAM } from '../subworkflows/local/bam_filter_bamtools' include { BAM_BEDGRAPH_BIGWIG_BEDTOOLS_UCSC as MERGED_LIBRARY_BAM_TO_BIGWIG } from '../subworkflows/local/bam_bedgraph_bigwig_bedtools_ucsc' include { BAM_BEDGRAPH_BIGWIG_BEDTOOLS_UCSC as MERGED_REPLICATE_BAM_TO_BIGWIG } from '../subworkflows/local/bam_bedgraph_bigwig_bedtools_ucsc' -include { BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER as MERGED_LIBRARY_CALL_ANNOTATE_PEAKS } from '../subworkflows/local/bam_peaks_call_qc_annotate_macs2_homer.nf' -include { BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER as MERGED_REPLICATE_CALL_ANNOTATE_PEAKS } from '../subworkflows/local/bam_peaks_call_qc_annotate_macs2_homer.nf' +include { BAM_PEAKS_CALL_QC_ANNOTATE_MACS3_HOMER as MERGED_LIBRARY_CALL_ANNOTATE_PEAKS } from '../subworkflows/local/bam_peaks_call_qc_annotate_macs3_homer.nf' +include { BAM_PEAKS_CALL_QC_ANNOTATE_MACS3_HOMER as MERGED_REPLICATE_CALL_ANNOTATE_PEAKS } from '../subworkflows/local/bam_peaks_call_qc_annotate_macs3_homer.nf' include { BED_CONSENSUS_QUANTIFY_QC_BEDTOOLS_FEATURECOUNTS_DESEQ2 as MERGED_LIBRARY_CONSENSUS_PEAKS } from '../subworkflows/local/bed_consensus_quantify_qc_bedtools_featurecounts_deseq2.nf' include { BED_CONSENSUS_QUANTIFY_QC_BEDTOOLS_FEATURECOUNTS_DESEQ2 as MERGED_REPLICATE_CONSENSUS_PEAKS } from '../subworkflows/local/bed_consensus_quantify_qc_bedtools_featurecounts_deseq2.nf' @@ -92,13 +39,11 @@ include { BED_CONSENSUS_QUANTIFY_QC_BEDTOOLS_FEATURECOUNTS_DESEQ2 as MERGED_REPL // // MODULE: Installed directly from nf-core/modules // -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' include { PICARD_COLLECTMULTIPLEMETRICS as MERGED_LIBRARY_PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/picard/collectmultiplemetrics/main' include { PRESEQ_LCEXTRAP as MERGED_LIBRARY_PRESEQ_LCEXTRAP } from '../modules/nf-core/preseq/lcextrap/main' include { DEEPTOOLS_PLOTFINGERPRINT as MERGED_LIBRARY_DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/deeptools/plotfingerprint/main' include { ATAQV_ATAQV as MERGED_LIBRARY_ATAQV_ATAQV } from '../modules/nf-core/ataqv/ataqv/main' include { ATAQV_MKARV as MERGED_LIBRARY_ATAQV_MKARV } from '../modules/nf-core/ataqv/mkarv/main' -include { SAMTOOLS_INDEX } from '../modules/nf-core/samtools/index/main' include { PICARD_MERGESAMFILES as PICARD_MERGESAMFILES_LIBRARY } from '../modules/nf-core/picard/mergesamfiles/main' include { PICARD_MERGESAMFILES as PICARD_MERGESAMFILES_REPLICATE } from '../modules/nf-core/picard/mergesamfiles/main' @@ -120,30 +65,66 @@ include { BAM_MARKDUPLICATES_PICARD as MERGED_REPLICATE_MARKDUPLICATES_PICARD } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -// Info required for completion email and summary -def multiqc_report = [] - workflow ATACSEQ { - ch_versions = Channel.empty() + take: + ch_samplesheet // channel: path(sample_sheet.csv) + ch_fasta // channel: path(genome.fa) + ch_fai // channel: path(genome.fai) + ch_gtf // channel: path(genome.gtf) + ch_gene_bed // channel: path(gene.beds) + ch_tss_bed // channel: path(genome.tss.bed) + ch_chrom_sizes // channel: path(chrom.sizes) + ch_filtered_bed // channel: path(filtered.bed) + ch_bwa_index // channel: path(bwa/index/) + ch_bowtie2_index // channel: path(bowtie2/index) + ch_chromap_index // channel: path(chromap.index) + ch_star_index // channel: path(star/index/) + ch_autosomes // channel: path(autosomes.txt) + ch_macs_gsize // channel: integer + multiqc_config // string: path to MultiQC config file or list of paths if multiple config files + multiqc_logo // string: path to MultiQC logo file + multiqc_methods_description // string: path to MultiQC methods description file + outdir // path: output directory + + main: + + // JSON files required by BAMTools for alignment filtering + ch_bamtools_filter_se_config = file(params.bamtools_filter_se_config) + ch_bamtools_filter_pe_config = file(params.bamtools_filter_pe_config) + + // Header files for MultiQC + ch_multiqc_merged_library_peak_count_header = file("$projectDir/assets/multiqc/merged_library_peak_count_header.txt", checkIfExists: true) + ch_multiqc_merged_library_frip_score_header = file("$projectDir/assets/multiqc/merged_library_frip_score_header.txt", checkIfExists: true) + ch_multiqc_merged_library_peak_annotation_header = file("$projectDir/assets/multiqc/merged_library_peak_annotation_header.txt", checkIfExists: true) + ch_multiqc_merged_library_deseq2_pca_header = file("$projectDir/assets/multiqc/merged_library_deseq2_pca_header.txt", checkIfExists: true) + ch_multiqc_merged_library_deseq2_clustering_header = file("$projectDir/assets/multiqc/merged_library_deseq2_clustering_header.txt", checkIfExists: true) + + ch_multiqc_merged_replicate_peak_count_header = file("$projectDir/assets/multiqc/merged_replicate_peak_count_header.txt", checkIfExists: true) + ch_multiqc_merged_replicate_frip_score_header = file("$projectDir/assets/multiqc/merged_replicate_frip_score_header.txt", checkIfExists: true) + ch_multiqc_merged_replicate_peak_annotation_header = file("$projectDir/assets/multiqc/merged_replicate_peak_annotation_header.txt", checkIfExists: true) + ch_multiqc_merged_replicate_deseq2_pca_header = file("$projectDir/assets/multiqc/merged_replicate_deseq2_pca_header.txt", checkIfExists: true) + ch_multiqc_merged_replicate_deseq2_clustering_header = file("$projectDir/assets/multiqc/merged_replicate_deseq2_clustering_header.txt", checkIfExists: true) + + // Check ataqv_mito_reference parameter + ataqv_mito_reference = params.ataqv_mito_reference + if (!params.ataqv_mito_reference && params.mito_name) { + ataqv_mito_reference = params.mito_name + } - // - // SUBWORKFLOW: Uncompress and prepare reference genome files - // - PREPARE_GENOME ( - params.aligner - ) - ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) + def ch_multiqc_files = channel.empty() // // SUBWORKFLOW: Read in samplesheet, validate and stage input files // INPUT_CHECK ( - ch_input, + ch_samplesheet, params.seq_center, params.with_control ) - ch_versions = ch_versions.mix(INPUT_CHECK.out.versions) + // TODO: OPTIONAL, you can use nf-validation plugin to create an input channel from the samplesheet with channel.fromSamplesheet("input") + // See the documentation https://nextflow-io.github.io/nf-validation/samplesheets/fromSamplesheet/ + // ! There is currently no tooling to help you write a sample sheet schema // // Check if reads are all paired-end if 'shift_reads' parameter is set @@ -151,12 +132,10 @@ workflow ATACSEQ { if (params.shift_reads) { INPUT_CHECK .out - .reads - .filter { meta, reads -> meta.single_end } + .filter { meta, _reads -> meta.single_end } .collect() - .map { - it -> - def count = it.size() + .map { item -> + def count = item.size() if (count > 0) { exit 1, 'The parameter --shift_reads can only be applied if all samples are paired-end.' } @@ -167,7 +146,7 @@ workflow ATACSEQ { // SUBWORKFLOW: Read QC and trim adapters // FASTQ_FASTQC_UMITOOLS_TRIMGALORE ( - INPUT_CHECK.out.reads, + INPUT_CHECK.out, params.skip_fastqc || params.skip_qc, false, false, @@ -175,29 +154,32 @@ workflow ATACSEQ { 0, params.min_trimmed_reads ) - ch_versions = ch_versions.mix(FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.versions) // // SUBWORKFLOW: Alignment with BWA & BAM QC // - ch_genome_bam = Channel.empty() - ch_genome_bam_index = Channel.empty() - ch_samtools_stats = Channel.empty() - ch_samtools_flagstat = Channel.empty() - ch_samtools_idxstats = Channel.empty() + ch_genome_bam = channel.empty() + ch_samtools_stats = channel.empty() + ch_samtools_flagstat = channel.empty() + ch_samtools_idxstats = channel.empty() + + // Broadcast the singleton [ meta, fasta, fai ] reference tuple to per-sample consumers. + ch_fasta_fai = ch_fasta + .combine(ch_fai) + .map { fasta, fai -> [ [:], fasta, fai ] } + .first() + if (params.aligner == 'bwa') { FASTQ_ALIGN_BWA ( FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.reads, - PREPARE_GENOME.out.bwa_index, + ch_bwa_index, false, - PREPARE_GENOME.out.fasta + ch_fasta_fai ) ch_genome_bam = FASTQ_ALIGN_BWA.out.bam - ch_genome_bam_index = FASTQ_ALIGN_BWA.out.bai ch_samtools_stats = FASTQ_ALIGN_BWA.out.stats ch_samtools_flagstat = FASTQ_ALIGN_BWA.out.flagstat ch_samtools_idxstats = FASTQ_ALIGN_BWA.out.idxstats - ch_versions = ch_versions.mix(FASTQ_ALIGN_BWA.out.versions) } // @@ -206,91 +188,53 @@ workflow ATACSEQ { if (params.aligner == 'bowtie2') { FASTQ_ALIGN_BOWTIE2 ( FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.reads, - PREPARE_GENOME.out.bowtie2_index, + ch_bowtie2_index, params.save_unaligned, false, - PREPARE_GENOME.out.fasta + ch_fasta_fai ) ch_genome_bam = FASTQ_ALIGN_BOWTIE2.out.bam - ch_genome_bam_index = FASTQ_ALIGN_BOWTIE2.out.bai ch_samtools_stats = FASTQ_ALIGN_BOWTIE2.out.stats ch_samtools_flagstat = FASTQ_ALIGN_BOWTIE2.out.flagstat ch_samtools_idxstats = FASTQ_ALIGN_BOWTIE2.out.idxstats - ch_versions = ch_versions.mix(FASTQ_ALIGN_BOWTIE2.out.versions) } // // SUBWORKFLOW: Alignment with CHROMAP & BAM QC // if (params.aligner == 'chromap') { - - // Filter out paired-end reads until the issue below is fixed - // https://github.com/nf-core/chipseq/issues/291 - FASTQ_FASTQC_UMITOOLS_TRIMGALORE - .out - .reads - .branch { - meta, reads -> - single_end: meta.single_end - return [ meta, reads ] - paired_end: !meta.single_end - return [ meta, reads ] - } - .set { ch_reads_chromap } - - ch_reads_chromap - .paired_end - .collect() - .map { - it -> - def count = it.size() - if (count > 0) { - log.warn "=============================================================================\n" + - " Paired-end files produced by chromap cannot be used by some downstream tools due to the issue below:\n" + - " https://github.com/nf-core/chipseq/issues/291\n" + - " They will be excluded from the analysis. Consider using a different aligner\n" + - "===================================================================================" - } - } - FASTQ_ALIGN_CHROMAP ( - ch_reads_chromap.single_end, - PREPARE_GENOME.out.chromap_index, - PREPARE_GENOME.out.fasta - .map { - [ [:], it ] - }, + FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.reads, + ch_chromap_index, + ch_fasta_fai, [], [], [], - [] + [], + true ) - ch_genome_bam_index = FASTQ_ALIGN_CHROMAP.out.bai ch_genome_bam = FASTQ_ALIGN_CHROMAP.out.bam ch_samtools_stats = FASTQ_ALIGN_CHROMAP.out.stats ch_samtools_flagstat = FASTQ_ALIGN_CHROMAP.out.flagstat ch_samtools_idxstats = FASTQ_ALIGN_CHROMAP.out.idxstats - ch_versions = ch_versions.mix(FASTQ_ALIGN_CHROMAP.out.versions) } // // SUBWORKFLOW: Alignment with STAR & BAM QC // - ch_star_multiqc = Channel.empty() + ch_star_multiqc = channel.empty() if (params.aligner == 'star') { ALIGN_STAR ( FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.reads, - PREPARE_GENOME.out.star_index, - PREPARE_GENOME.out.fasta, + ch_star_index, + ch_fasta_fai, params.seq_center ?: '' ) ch_genome_bam = ALIGN_STAR.out.bam - ch_genome_bam_index = ALIGN_STAR.out.bai ch_samtools_stats = ALIGN_STAR.out.stats ch_samtools_flagstat = ALIGN_STAR.out.flagstat ch_samtools_idxstats = ALIGN_STAR.out.idxstats ch_star_multiqc = ALIGN_STAR.out.log_final - ch_versions = ch_versions.mix(ALIGN_STAR.out.versions) } // Create channels: [ meta, [bam] ] @@ -315,172 +259,163 @@ workflow ATACSEQ { PICARD_MERGESAMFILES_LIBRARY ( ch_sort_bam ) - ch_versions = ch_versions.mix(PICARD_MERGESAMFILES_LIBRARY.out.versions.first()) // // SUBWORKFLOW: Mark duplicates in BAM files // MERGED_LIBRARY_MARKDUPLICATES_PICARD ( PICARD_MERGESAMFILES_LIBRARY.out.bam, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai + ch_fasta_fai ) - ch_versions = ch_versions.mix(MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.versions) // // SUBWORKFLOW: Filter BAM file // MERGED_LIBRARY_FILTER_BAM ( - MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.bam.join(MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.bai, by: [0]), - PREPARE_GENOME.out.filtered_bed.first(), - PREPARE_GENOME.out.fasta, + MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.bam + .join(MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.index, by: [0]), + ch_filtered_bed.first(), + ch_fasta_fai, ch_bamtools_filter_se_config, ch_bamtools_filter_pe_config ) - ch_versions = ch_versions.mix(MERGED_LIBRARY_FILTER_BAM.out.versions) // // MODULE: Preseq coverage analysis // - ch_preseq_multiqc = Channel.empty() + ch_preseq_multiqc = channel.empty() if (!params.skip_preseq) { MERGED_LIBRARY_PRESEQ_LCEXTRAP ( MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.bam ) ch_preseq_multiqc = MERGED_LIBRARY_PRESEQ_LCEXTRAP.out.lc_extrap - ch_versions = ch_versions.mix(MERGED_LIBRARY_PRESEQ_LCEXTRAP.out.versions.first()) } // // MODULE: Picard post alignment QC // - ch_picardcollectmultiplemetrics_multiqc = Channel.empty() + ch_picardcollectmultiplemetrics_multiqc = channel.empty() if (!params.skip_picard_metrics) { MERGED_LIBRARY_PICARD_COLLECTMULTIPLEMETRICS ( MERGED_LIBRARY_FILTER_BAM .out .bam - .map { - [ it[0], it[1], [] ] + .map { item -> + [ item[0], item[1], [] ] }, - PREPARE_GENOME - .out - .fasta - .map { - [ [:], it ] + ch_fasta + .map { item -> + [ [:], item ] }, - PREPARE_GENOME - .out - .fai - .map { - [ [:], it ] + ch_fai + .map { item -> + [ [:], item ] } ) ch_picardcollectmultiplemetrics_multiqc = MERGED_LIBRARY_PICARD_COLLECTMULTIPLEMETRICS.out.metrics - ch_versions = ch_versions.mix(MERGED_LIBRARY_PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) } // // SUBWORKFLOW: Shift paired-end reads // - ch_merged_library_filter_bam = MERGED_LIBRARY_FILTER_BAM.out.bam - ch_merged_library_filter_bai = MERGED_LIBRARY_FILTER_BAM.out.bai + ch_merged_library_filter_bam = MERGED_LIBRARY_FILTER_BAM.out.bam + ch_merged_library_filter_index = MERGED_LIBRARY_FILTER_BAM.out.index ch_merged_library_filter_flagstat = MERGED_LIBRARY_FILTER_BAM.out.flagstat if (params.shift_reads && params.aligner != 'chromap' ) { MERGED_LIBRARY_BAM_SHIFT_READS ( - ch_merged_library_filter_bam.join(ch_merged_library_filter_bai, by: [0]), + ch_merged_library_filter_bam.join(ch_merged_library_filter_index, by: [0]), + ch_fasta_fai ) - ch_versions = ch_versions.mix(MERGED_LIBRARY_BAM_SHIFT_READS.out.versions) - ch_merged_library_filter_bam = MERGED_LIBRARY_BAM_SHIFT_READS.out.bam - ch_merged_library_filter_bai = MERGED_LIBRARY_BAM_SHIFT_READS.out.bai + ch_merged_library_filter_bam = MERGED_LIBRARY_BAM_SHIFT_READS.out.bam + ch_merged_library_filter_index = MERGED_LIBRARY_BAM_SHIFT_READS.out.index ch_merged_library_filter_flagstat = MERGED_LIBRARY_BAM_SHIFT_READS.out.flagstat + } // // SUBWORKFLOW: Normalised bigWig coverage tracks // MERGED_LIBRARY_BAM_TO_BIGWIG ( + // MERGED_LIBRARY_FILTER_BAM.out.bam.join(MERGED_LIBRARY_FILTER_BAM.out.flagstat, by: [0]), + // ch_chrom_sizes ch_merged_library_filter_bam.join(ch_merged_library_filter_flagstat, by: [0]), - PREPARE_GENOME.out.chrom_sizes + ch_chrom_sizes ) - ch_versions = ch_versions.mix(MERGED_LIBRARY_BAM_TO_BIGWIG.out.versions) // // SUBWORKFLOW: Plot coverage across annotation with deepTools // - ch_deeptoolsplotprofile_multiqc = Channel.empty() + ch_deeptoolsplotprofile_multiqc = channel.empty() if (!params.skip_plot_profile) { MERGED_LIBRARY_BIGWIG_PLOT_DEEPTOOLS ( MERGED_LIBRARY_BAM_TO_BIGWIG.out.bigwig, - PREPARE_GENOME.out.gene_bed, - PREPARE_GENOME.out.tss_bed + ch_gene_bed, + ch_tss_bed ) ch_deeptoolsplotprofile_multiqc = MERGED_LIBRARY_BIGWIG_PLOT_DEEPTOOLS.out.plotprofile_table - ch_versions = ch_versions.mix(MERGED_LIBRARY_BIGWIG_PLOT_DEEPTOOLS.out.versions) } - // Create channels: [ meta, [bam], [bai] ] or [ meta, [ bam, control_bam ] [ bai, control_bai ] ] + // Create channels: [ meta, [ bam ], [ index ] ] or [ meta, [ bam, control_bam ], [ index, control_index ] ] ch_merged_library_filter_bam - .join(ch_merged_library_filter_bai, by: [0]) - .set { ch_bam_bai } + .join(ch_merged_library_filter_index, by: [0]) + .set { ch_bam_index } if (params.with_control) { - ch_bam_bai + ch_bam_index .map { - meta, bam, bai -> - meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] + meta, bam, index -> + meta.control ? null : [ meta.id, [ bam ] , [ index ] ] } - .set { ch_control_bam_bai } + .set { ch_control_bam_index } - ch_bam_bai + ch_bam_index .map { - meta, bam, bai -> - meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null + meta, bam, index -> + meta.control ? [ meta.control, meta, [ bam ], [ index ] ] : null } - .combine(ch_control_bam_bai, by: 0) - .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } - .set { ch_bam_bai } + .combine(ch_control_bam_index, by: 0) + .map { item -> [ item[1] , item[2] + item[4], item[3] + item[5] ] } + .set { ch_bam_index } } // // MODULE: deepTools plotFingerprint QC // - ch_deeptoolsplotfingerprint_multiqc = Channel.empty() + ch_deeptoolsplotfingerprint_multiqc = channel.empty() if (!params.skip_plot_fingerprint) { MERGED_LIBRARY_DEEPTOOLS_PLOTFINGERPRINT ( - ch_bam_bai + ch_bam_index ) ch_deeptoolsplotfingerprint_multiqc = MERGED_LIBRARY_DEEPTOOLS_PLOTFINGERPRINT.out.matrix - ch_versions = ch_versions.mix(MERGED_LIBRARY_DEEPTOOLS_PLOTFINGERPRINT.out.versions.first()) } // Create channel: [ val(meta), bam, control_bam ] if (params.with_control) { - ch_bam_bai + ch_bam_index .map { - meta, bams, bais -> + meta, bams, _indexes -> [ meta , bams[0], bams[1] ] } .set { ch_bam_library } } else { - ch_bam_bai + ch_bam_index .map { - meta, bam, bai -> + meta, bam, _index -> [ meta , bam, [] ] } .set { ch_bam_library } } // - // SUBWORKFLOW: Call peaks with MACS2, annotate with HOMER and perform downstream QC + // SUBWORKFLOW: Call peaks with MACS3, annotate with HOMER and perform downstream QC // MERGED_LIBRARY_CALL_ANNOTATE_PEAKS ( ch_bam_library, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.gtf, - PREPARE_GENOME.out.macs_gsize, + ch_fasta, + ch_gtf, + ch_macs_gsize, ".mLb.clN_peaks.annotatePeaks.txt", ch_multiqc_merged_library_peak_count_header, ch_multiqc_merged_library_frip_score_header, @@ -489,39 +424,37 @@ workflow ATACSEQ { params.skip_peak_annotation, params.skip_peak_qc ) - ch_versions = ch_versions.mix(MERGED_LIBRARY_CALL_ANNOTATE_PEAKS.out.versions) // // SUBWORKFLOW: Consensus peaks analysis // - ch_macs2_consensus_library_bed = Channel.empty() - ch_featurecounts_library_multiqc = Channel.empty() - ch_deseq2_pca_library_multiqc = Channel.empty() - ch_deseq2_clustering_library_multiqc = Channel.empty() + ch_macs3_consensus_library_bed = channel.empty() + ch_featurecounts_library_multiqc = channel.empty() + ch_deseq2_pca_library_multiqc = channel.empty() + ch_deseq2_clustering_library_multiqc = channel.empty() if (!params.skip_consensus_peaks) { MERGED_LIBRARY_CONSENSUS_PEAKS ( MERGED_LIBRARY_CALL_ANNOTATE_PEAKS.out.peaks, ch_bam_library, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.gtf, + ch_fasta, + ch_gtf, ch_multiqc_merged_library_deseq2_pca_header, ch_multiqc_merged_library_deseq2_clustering_header, params.narrow_peak, params.skip_peak_annotation, params.skip_deseq2_qc ) - ch_macs2_consensus_library_bed = MERGED_LIBRARY_CONSENSUS_PEAKS.out.consensus_bed + ch_macs3_consensus_library_bed = MERGED_LIBRARY_CONSENSUS_PEAKS.out.consensus_bed ch_featurecounts_library_multiqc = MERGED_LIBRARY_CONSENSUS_PEAKS.out.featurecounts_summary ch_deseq2_pca_library_multiqc = MERGED_LIBRARY_CONSENSUS_PEAKS.out.deseq2_qc_pca_multiqc ch_deseq2_clustering_library_multiqc = MERGED_LIBRARY_CONSENSUS_PEAKS.out.deseq2_qc_dists_multiqc - ch_versions = ch_versions.mix(MERGED_LIBRARY_CONSENSUS_PEAKS.out.versions) } // Create channels: [ meta, bam, bai, peak_file ] MERGED_LIBRARY_MARKDUPLICATES_PICARD .out .bam - .join(MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.bai, by: [0]) + .join(MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.index, by: [0]) .join(MERGED_LIBRARY_CALL_ANNOTATE_PEAKS.out.peaks, by: [0]) .set { ch_bam_peaks } @@ -532,35 +465,33 @@ workflow ATACSEQ { MERGED_LIBRARY_ATAQV_ATAQV ( ch_bam_peaks, 'NA', - params.mito_name ?: '', - PREPARE_GENOME.out.tss_bed, + ataqv_mito_reference ?: '', + ch_tss_bed, [], - PREPARE_GENOME.out.autosomes + ch_autosomes ) - ch_versions = ch_versions.mix(MERGED_LIBRARY_ATAQV_ATAQV.out.versions.first()) MERGED_LIBRARY_ATAQV_MKARV ( - MERGED_LIBRARY_ATAQV_ATAQV.out.json.collect{it[1]} + MERGED_LIBRARY_ATAQV_ATAQV.out.json.collect { item -> item[1] } ) - ch_versions = ch_versions.mix(MERGED_LIBRARY_ATAQV_MKARV.out.versions) } // // Merged replicate analysis // - ch_markduplicates_replicate_stats = Channel.empty() - ch_markduplicates_replicate_flagstat = Channel.empty() - ch_markduplicates_replicate_idxstats = Channel.empty() - ch_markduplicates_replicate_metrics = Channel.empty() - ch_ucsc_bedgraphtobigwig_replicate_bigwig = Channel.empty() - ch_macs2_replicate_peaks = Channel.empty() - ch_macs2_frip_replicate_multiqc = Channel.empty() - ch_macs2_peak_count_replicate_multiqc = Channel.empty() - ch_macs2_plot_homer_annotatepeaks_replicate_multiqc = Channel.empty() - ch_macs2_consensus_replicate_bed = Channel.empty() - ch_featurecounts_replicate_multiqc = Channel.empty() - ch_deseq2_pca_replicate_multiqc = Channel.empty() - ch_deseq2_clustering_replicate_multiqc = Channel.empty() + ch_markduplicates_replicate_stats = channel.empty() + ch_markduplicates_replicate_flagstat = channel.empty() + ch_markduplicates_replicate_idxstats = channel.empty() + ch_markduplicates_replicate_metrics = channel.empty() + ch_ucsc_bedgraphtobigwig_replicate_bigwig = channel.empty() + ch_macs3_replicate_peaks = channel.empty() + ch_macs3_frip_replicate_multiqc = channel.empty() + ch_macs3_peak_count_replicate_multiqc = channel.empty() + ch_macs3_plot_homer_annotatepeaks_replicate_multiqc = channel.empty() + ch_macs3_consensus_replicate_bed = channel.empty() + ch_featurecounts_replicate_multiqc = channel.empty() + ch_deseq2_pca_replicate_multiqc = channel.empty() + ch_deseq2_clustering_replicate_multiqc = channel.empty() if (!params.skip_merge_replicates) { // Check if we have multiple replicates @@ -576,7 +507,7 @@ workflow ATACSEQ { } .groupTuple() .map { - id, metas, bams -> + _id, metas, bams -> if (bams.size() > 1) { return [ metas[0], bams ] } @@ -589,50 +520,47 @@ workflow ATACSEQ { PICARD_MERGESAMFILES_REPLICATE ( ch_merged_library_replicate_bam ) - ch_versions = ch_versions.mix(PICARD_MERGESAMFILES_REPLICATE.out.versions.first()) // // SUBWORKFLOW: Mark duplicates & filter BAM files after merging // MERGED_REPLICATE_MARKDUPLICATES_PICARD ( PICARD_MERGESAMFILES_REPLICATE.out.bam, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai + ch_fasta_fai ) ch_markduplicates_replicate_stats = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.stats ch_markduplicates_replicate_flagstat = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.flagstat ch_markduplicates_replicate_idxstats = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.idxstats ch_markduplicates_replicate_metrics = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.metrics - ch_versions = ch_versions.mix(MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.versions) // // SUBWORKFLOW: Shift paired-end reads // Shift again, as ch_merged_library_replicate_bam is generated out of unshifted reads // - ch_merged_replicate_markduplicate_bam = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.bam - ch_merged_replicate_markduplicate_bai = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.bai + ch_merged_replicate_markduplicate_bam = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.bam + ch_merged_replicate_markduplicate_index = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.index ch_merged_replicate_markduplicate_flagstat = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.flagstat if (params.shift_reads && params.aligner != 'chromap' ) { MERGED_REPLICATE_BAM_SHIFT_READS ( - ch_merged_replicate_markduplicate_bam.join(ch_merged_replicate_markduplicate_bai, by: [0]), + ch_merged_replicate_markduplicate_bam.join(ch_merged_replicate_markduplicate_index, by: [0]), + ch_fasta_fai ) - ch_versions = ch_versions.mix(MERGED_REPLICATE_BAM_SHIFT_READS.out.versions) - ch_merged_replicate_markduplicate_bam = MERGED_REPLICATE_BAM_SHIFT_READS.out.bam - ch_merged_replicate_markduplicate_bai = MERGED_REPLICATE_BAM_SHIFT_READS.out.bai + ch_merged_replicate_markduplicate_bam = MERGED_REPLICATE_BAM_SHIFT_READS.out.bam + ch_merged_replicate_markduplicate_index = MERGED_REPLICATE_BAM_SHIFT_READS.out.index ch_merged_replicate_markduplicate_flagstat = MERGED_REPLICATE_BAM_SHIFT_READS.out.flagstat } - - // SUBWORKFLOW: Normalised bigWig coverage tracks - // - MERGED_REPLICATE_BAM_TO_BIGWIG ( - ch_merged_replicate_markduplicate_bam.join(ch_merged_replicate_markduplicate_flagstat, by: [0]), - PREPARE_GENOME.out.chrom_sizes - ) - ch_ucsc_bedgraphtobigwig_replicate_bigwig = MERGED_REPLICATE_BAM_TO_BIGWIG.out.bigwig - ch_versions = ch_versions.mix(MERGED_REPLICATE_BAM_TO_BIGWIG.out.versions) - + if (!params.skip_merged_replicate_bigwig) { + // + // SUBWORKFLOW: Normalised bigWig coverage tracks + // + MERGED_REPLICATE_BAM_TO_BIGWIG ( + ch_merged_replicate_markduplicate_bam.join(ch_merged_replicate_markduplicate_flagstat, by: [0]), + ch_chrom_sizes + ) + ch_ucsc_bedgraphtobigwig_replicate_bigwig = MERGED_REPLICATE_BAM_TO_BIGWIG.out.bigwig + } // Create channels: [ meta, bam, ([] for control_bam) ] if (params.with_control) { ch_merged_replicate_markduplicate_bam @@ -648,7 +576,7 @@ workflow ATACSEQ { meta.control ? [ meta.control, meta, bam ] : null } .combine( ch_bam_merged_control, by: 0) - .map { it -> [ it[1] , it[2], it[3] ] } + .map { item -> [ item[1] , item[2], item[3] ] } .set { ch_bam_replicate } } else { ch_merged_replicate_markduplicate_bam @@ -660,13 +588,13 @@ workflow ATACSEQ { } // - // SUBWORKFLOW: Call peaks with MACS2, annotate with HOMER and perform downstream QC + // SUBWORKFLOW: Call peaks with MACS3, annotate with HOMER and perform downstream QC // MERGED_REPLICATE_CALL_ANNOTATE_PEAKS ( ch_bam_replicate, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.gtf, - PREPARE_GENOME.out.macs_gsize, + ch_fasta, + ch_gtf, + ch_macs_gsize, ".mRp.clN_peaks.annotatePeaks.txt", ch_multiqc_merged_replicate_peak_count_header, ch_multiqc_merged_replicate_frip_score_header, @@ -675,11 +603,10 @@ workflow ATACSEQ { params.skip_peak_annotation, params.skip_peak_qc ) - ch_macs2_replicate_peaks = MERGED_REPLICATE_CALL_ANNOTATE_PEAKS.out.peaks - ch_macs2_frip_replicate_multiqc = MERGED_REPLICATE_CALL_ANNOTATE_PEAKS.out.frip_multiqc - ch_macs2_peak_count_replicate_multiqc = MERGED_REPLICATE_CALL_ANNOTATE_PEAKS.out.peak_count_multiqc - ch_macs2_plot_homer_annotatepeaks_replicate_multiqc = MERGED_REPLICATE_CALL_ANNOTATE_PEAKS.out.plot_homer_annotatepeaks_tsv - ch_versions = ch_versions.mix(MERGED_REPLICATE_CALL_ANNOTATE_PEAKS.out.versions) + ch_macs3_replicate_peaks = MERGED_REPLICATE_CALL_ANNOTATE_PEAKS.out.peaks + ch_macs3_frip_replicate_multiqc = MERGED_REPLICATE_CALL_ANNOTATE_PEAKS.out.frip_multiqc + ch_macs3_peak_count_replicate_multiqc = MERGED_REPLICATE_CALL_ANNOTATE_PEAKS.out.peak_count_multiqc + ch_macs3_plot_homer_annotatepeaks_replicate_multiqc = MERGED_REPLICATE_CALL_ANNOTATE_PEAKS.out.plot_homer_annotatepeaks_tsv // // SUBWORKFLOW: Consensus peaks analysis @@ -688,19 +615,18 @@ workflow ATACSEQ { MERGED_REPLICATE_CONSENSUS_PEAKS ( MERGED_REPLICATE_CALL_ANNOTATE_PEAKS.out.peaks, ch_merged_library_replicate_bam, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.gtf, + ch_fasta, + ch_gtf, ch_multiqc_merged_replicate_deseq2_pca_header, ch_multiqc_merged_replicate_deseq2_clustering_header, params.narrow_peak, params.skip_peak_annotation, params.skip_deseq2_qc ) - ch_macs2_consensus_replicate_bed = MERGED_REPLICATE_CONSENSUS_PEAKS.out.consensus_bed + ch_macs3_consensus_replicate_bed = MERGED_REPLICATE_CONSENSUS_PEAKS.out.consensus_bed ch_featurecounts_replicate_multiqc = MERGED_REPLICATE_CONSENSUS_PEAKS.out.featurecounts_summary ch_deseq2_pca_replicate_multiqc = MERGED_REPLICATE_CONSENSUS_PEAKS.out.deseq2_qc_pca_multiqc ch_deseq2_clustering_replicate_multiqc = MERGED_REPLICATE_CONSENSUS_PEAKS.out.deseq2_qc_dists_multiqc - ch_versions = ch_versions.mix(MERGED_REPLICATE_CONSENSUS_PEAKS.out.versions) } } @@ -709,120 +635,123 @@ workflow ATACSEQ { // if (!params.skip_igv) { IGV ( - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai, - MERGED_LIBRARY_BAM_TO_BIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), - MERGED_LIBRARY_CALL_ANNOTATE_PEAKS.out.peaks.collect{it[1]}.ifEmpty([]), - ch_macs2_consensus_library_bed.collect{it[1]}.ifEmpty([]), - ch_ucsc_bedgraphtobigwig_replicate_bigwig.collect{it[1]}.ifEmpty([]), - ch_macs2_replicate_peaks.collect{it[1]}.ifEmpty([]), - ch_macs2_consensus_replicate_bed.collect{it[1]}.ifEmpty([]), + ch_fasta, + ch_fai, + MERGED_LIBRARY_BAM_TO_BIGWIG.out.bigwig.collect { item -> item[1] }.ifEmpty([]), + MERGED_LIBRARY_CALL_ANNOTATE_PEAKS.out.peaks.collect { item -> item[1] }.ifEmpty([]), + ch_macs3_consensus_library_bed.collect { item -> item[1] }.ifEmpty([]), + ch_ucsc_bedgraphtobigwig_replicate_bigwig.collect { item -> item[1] }.ifEmpty([]), + ch_macs3_replicate_peaks.collect { item -> item[1] }.ifEmpty([]), + ch_macs3_consensus_replicate_bed.collect { item -> item[1] }.ifEmpty([]), "${params.aligner}/merged_library/bigwig", - { ["${params.aligner}/merged_library/macs2", + { ["${params.aligner}/merged_library/macs3", params.narrow_peak? '/narrow_peak' : '/broad_peak' ].join('') }, - { ["${params.aligner}/merged_library/macs2", + { ["${params.aligner}/merged_library/macs3", params.narrow_peak? '/narrow_peak' : '/broad_peak', "/consensus" ].join('') }, "${params.aligner}/merged_replicate/bigwig", - { ["${params.aligner}/merged_replicate/macs2", + { ["${params.aligner}/merged_replicate/macs3", params.narrow_peak? '/narrow_peak' : '/broad_peak' ].join('') }, - { ["${params.aligner}/merged_replicate/macs2", + { ["${params.aligner}/merged_replicate/macs3", params.narrow_peak? '/narrow_peak' : '/broad_peak', "/consensus" ].join('') }, ) - ch_versions = ch_versions.mix(IGV.out.versions) } // - // MODULE: Pipeline reporting + // Collate and save software versions // - CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_versions.unique().collectFile(name: 'collated_versions.yml') - ) + def ch_collated_versions = channel.topic('versions') + .map { process, tool, version -> + [ process[process.lastIndexOf(':') + 1..-1], " ${tool}: ${version}" ] + } + .groupTuple(by: 0) + .map { process, tool_versions -> + def dedup = tool_versions.unique().sort() + "${process}:\n${dedup.join('\n')}" + } + .collectFile( + name: 'nf_core_atacseq_software_mqc_versions.yml', + storeDir: "${outdir}/pipeline_info", + sort: true, + newLine: true, + ) // // MODULE: MultiQC // - if (!params.skip_multiqc) { - workflow_summary = WorkflowAtacseq.paramsSummaryMultiqc(workflow, summary_params) - ch_workflow_summary = Channel.value(workflow_summary) + def ch_multiqc_report = channel.empty() - methods_description = WorkflowAtacseq.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description) - ch_methods_description = Channel.value(methods_description) + if (!params.skip_multiqc) { + def ch_multiqc_config = channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) + def ch_multiqc_custom_config = multiqc_config ? channel.fromPath(multiqc_config) : channel.empty() + def ch_multiqc_logo = multiqc_logo ? channel.fromPath(multiqc_logo) : channel.empty() + def ch_summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") + def ch_workflow_summary = channel.value(paramsSummaryMultiqc(ch_summary_params)) + def ch_multiqc_custom_methods_description = multiqc_methods_description ? file(multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) + def ch_methods_description = channel.value(methodsDescriptionText(ch_multiqc_custom_methods_description)) + ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) + ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml', sort: false)) MULTIQC ( - ch_multiqc_config, - ch_multiqc_custom_config.collect().ifEmpty([]), - CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect(), - ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), + ch_multiqc_files.collect(), + ch_multiqc_config.toList(), + ch_multiqc_custom_config.toList(), + ch_multiqc_logo.toList(), - FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.fastqc_zip.collect{it[1]}.ifEmpty([]), - FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_zip.collect{it[1]}.ifEmpty([]), - FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_log.collect{it[1]}.ifEmpty([]), + FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.fastqc_zip.collect { item -> item[1] }.ifEmpty([]), + FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_zip.collect { item -> item[1] }.ifEmpty([]), + FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_log.collect { item -> item[1] }.ifEmpty([]), - ch_samtools_stats.collect{it[1]}.ifEmpty([]), - ch_samtools_flagstat.collect{it[1]}.ifEmpty([]), - ch_samtools_idxstats.collect{it[1]}.ifEmpty([]), + ch_samtools_stats.collect { item -> item[1] }.ifEmpty([]), + ch_samtools_flagstat.collect { item -> item[1] }.ifEmpty([]), + ch_samtools_idxstats.collect { item -> item[1] }.ifEmpty([]), - MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.stats.collect{it[1]}.ifEmpty([]), - MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.flagstat.collect{it[1]}.ifEmpty([]), - MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.idxstats.collect{it[1]}.ifEmpty([]), - MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.metrics.collect{it[1]}.ifEmpty([]), + MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.stats.collect { item -> item[1] }.ifEmpty([]), + MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.flagstat.collect { item -> item[1] }.ifEmpty([]), + MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.idxstats.collect { item -> item[1] }.ifEmpty([]), + MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.metrics.collect { item -> item[1] }.ifEmpty([]), - MERGED_LIBRARY_FILTER_BAM.out.stats.collect{it[1]}.ifEmpty([]), - MERGED_LIBRARY_FILTER_BAM.out.flagstat.collect{it[1]}.ifEmpty([]), - MERGED_LIBRARY_FILTER_BAM.out.idxstats.collect{it[1]}.ifEmpty([]), - ch_picardcollectmultiplemetrics_multiqc.collect{it[1]}.ifEmpty([]), + MERGED_LIBRARY_FILTER_BAM.out.stats.collect { item -> item[1] }.ifEmpty([]), + MERGED_LIBRARY_FILTER_BAM.out.flagstat.collect { item -> item[1] }.ifEmpty([]), + MERGED_LIBRARY_FILTER_BAM.out.idxstats.collect { item -> item[1] }.ifEmpty([]), + ch_picardcollectmultiplemetrics_multiqc.collect { item -> item[1] }.ifEmpty([]), - ch_preseq_multiqc.collect{it[1]}.ifEmpty([]), + ch_preseq_multiqc.collect { item -> item[1] }.ifEmpty([]), - ch_deeptoolsplotprofile_multiqc.collect{it[1]}.ifEmpty([]), - ch_deeptoolsplotfingerprint_multiqc.collect{it[1]}.ifEmpty([]), + ch_deeptoolsplotprofile_multiqc.collect { item -> item[1] }.ifEmpty([]), + ch_deeptoolsplotfingerprint_multiqc.collect { item -> item[1] }.ifEmpty([]), - MERGED_LIBRARY_CALL_ANNOTATE_PEAKS.out.frip_multiqc.collect{it[1]}.ifEmpty([]), - MERGED_LIBRARY_CALL_ANNOTATE_PEAKS.out.peak_count_multiqc.collect{it[1]}.ifEmpty([]), + MERGED_LIBRARY_CALL_ANNOTATE_PEAKS.out.frip_multiqc.collect { item -> item[1] }.ifEmpty([]), + MERGED_LIBRARY_CALL_ANNOTATE_PEAKS.out.peak_count_multiqc.collect { item -> item[1] }.ifEmpty([]), MERGED_LIBRARY_CALL_ANNOTATE_PEAKS.out.plot_homer_annotatepeaks_tsv.collect().ifEmpty([]), - ch_featurecounts_library_multiqc.collect{it[1]}.ifEmpty([]), + ch_featurecounts_library_multiqc.collect { item -> item[1] }.ifEmpty([]), - ch_markduplicates_replicate_stats.collect{it[1]}.ifEmpty([]), - ch_markduplicates_replicate_flagstat.collect{it[1]}.ifEmpty([]), - ch_markduplicates_replicate_idxstats.collect{it[1]}.ifEmpty([]), - ch_markduplicates_replicate_metrics.collect{it[1]}.ifEmpty([]), + ch_markduplicates_replicate_stats.collect { item -> item[1] }.ifEmpty([]), + ch_markduplicates_replicate_flagstat.collect { item -> item[1] }.ifEmpty([]), + ch_markduplicates_replicate_idxstats.collect { item -> item[1] }.ifEmpty([]), + ch_markduplicates_replicate_metrics.collect { item -> item[1] }.ifEmpty([]), - ch_macs2_frip_replicate_multiqc.collect{it[1]}.ifEmpty([]), - ch_macs2_peak_count_replicate_multiqc.collect{it[1]}.ifEmpty([]), - ch_macs2_plot_homer_annotatepeaks_replicate_multiqc.collect().ifEmpty([]), - ch_featurecounts_replicate_multiqc.collect{it[1]}.ifEmpty([]), + ch_macs3_frip_replicate_multiqc.collect { item -> item[1] }.ifEmpty([]), + ch_macs3_peak_count_replicate_multiqc.collect { item -> item[1] }.ifEmpty([]), + ch_macs3_plot_homer_annotatepeaks_replicate_multiqc.collect().ifEmpty([]), + ch_featurecounts_replicate_multiqc.collect { item -> item[1] }.ifEmpty([]), ch_deseq2_pca_library_multiqc.collect().ifEmpty([]), ch_deseq2_clustering_library_multiqc.collect().ifEmpty([]), ch_deseq2_pca_replicate_multiqc.collect().ifEmpty([]), ch_deseq2_clustering_replicate_multiqc.collect().ifEmpty([]) ) - multiqc_report = MULTIQC.out.report.toList() - } -} - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - COMPLETION EMAIL AND SUMMARY -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -workflow.onComplete { - if (params.email || params.email_on_fail) { - NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) - } - - if (params.hook_url) { - NfcoreTemplate.IM_notification(workflow, params, summary_params, projectDir, log) + ch_multiqc_report = MULTIQC.out.report } - NfcoreTemplate.summary(workflow, params, log) + emit: + ch_multiqc_report.toList() // channel: /path/to/multiqc_report.html } /*