diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ea27a584..97c8c97f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,27 +1,20 @@ { "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 index 2691b6ca..9f424019 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,4 +1,4 @@ -# nf-core/atacseq: Contributing Guidelines +# `nf-core/atacseq`: Contributing Guidelines Hi there! Many thanks for taking an interest in improving nf-core/atacseq. @@ -9,6 +9,7 @@ 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 ;) +> [!NOTE] > 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 @@ -18,13 +19,19 @@ If you'd like to write some code for nf-core/atacseq, the standard workflow is a 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). +4. Use `nf-core pipelines 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 +You have the option to test your changes locally by running the pipeline. For receiving warnings about process selectors and other `debug` information, it is recommended to use the debug profile. Execute all the tests with the following command: + +```bash +nf-test test --profile debug,test,docker --verbose +``` + 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. @@ -33,7 +40,7 @@ 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. +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 pipelines lint ` command. If any failures or warnings are encountered, please follow the listed URL for more documentation. @@ -48,9 +55,9 @@ These tests are run both with the latest available version of `Nextflow` and als :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`. +- On your own fork, make a new branch `patch` based on `upstream/main` or `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. +- Open a pull-request from `patch` to `main`/`master` with the changes. ## Getting help @@ -58,34 +65,34 @@ For further information/help, please consult the [nf-core/atacseq documentation] ## 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. +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 +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). +5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core pipelines 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`. +8. If applicable, add a new test in the `tests` directory. 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. +Parameters should be initialised / defined with default values within the `params` scope in `nextflow.config`. -Once there, use `nf-core schema build` to add to `nextflow_schema.json`. +Once there, use `nf-core pipelines 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. +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/main/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. +The process resources can be passed on to the tool dynamically within the process with the `${task.cpus}` and `${task.memory}` variables in the `script:` block. ### Naming schemes @@ -96,7 +103,7 @@ Please use the following naming schemes, to make it easy to understand what is g ### 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]` +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 pipelines bump-version --nextflow . [min-nf-version]` ### Images and figures @@ -116,4 +123,3 @@ To get started: 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..e74fb8ed 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -17,8 +17,9 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/atac - [ ] 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 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..34085279 --- /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@v1 + 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..bf44d961 --- /dev/null +++ b/.github/actions/nf-test/action.yml @@ -0,0 +1,109 @@ +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@v2 + with: + version: "${{ env.NXF_VERSION }}" + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + with: + python-version: "3.13" + + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 + with: + version: "${{ env.NFT_VER }}" + install-pdiff: true + + - name: Setup apptainer + if: contains(inputs.profile, 'singularity') + uses: eWaterCycle/setup-apptainer@main + + - 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@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3 + with: + auto-update-conda: true + conda-solver: libmamba + 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..6c7d4a08 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -1,35 +1,48 @@ 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@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 }} parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/atacseq/results-${{ github.sha }}" - "aligner": "${{ matrix.aligner }}" + "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", + "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@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 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..82969c64 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@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@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 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..e01ab95b 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -1,15 +1,17 @@ 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] + branches: + - main + - master jobs: test: runs-on: ubuntu-latest steps: - # PRs to the nf-core repo master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches + # 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' run: | @@ -19,10 +21,10 @@ jobs: # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets - name: Post PR comment if: failure() - uses: mshick/add-pr-comment@v1 + uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2 with: message: | - ## This PR is against the `master` branch :x: + ## This PR is against the `${{github.event.pull_request.base.ref}}` branch :x: * Do not close this PR * Click _Edit_ and change the `base` to `dev` @@ -32,9 +34,9 @@ jobs: Hi @${{ github.event.pull_request.user.login }}, - It looks like this pull-request is has been made against the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `master` branch. - The `master` branch on nf-core repositories should always contain code from the latest release. - Because of this, PRs to `master` are only allowed if they come from the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `dev` branch. + It looks like this pull-request is has been made against the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) ${{github.event.pull_request.base.ref}} branch. + The ${{github.event.pull_request.base.ref}} branch on nf-core repositories should always contain code from the latest release. + Because of this, PRs to ${{github.event.pull_request.base.ref}} are only allowed if they come from the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `dev` branch. You do not need to close this PR, you can change the target branch to `dev` by clicking the _"Edit"_ button at the top of this page. Note that even after this, the test will continue to show as failing until you push a new commit. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100755 index 023de16d..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,102 +0,0 @@ -name: nf-core CI -# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors -on: - push: - branches: - - dev - pull_request: - release: - types: [published] - -env: - NXF_ANSI_LOG: false - -concurrency: - group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" - cancel-in-progress: true - -jobs: - test: - name: Run pipeline with test data - # Only run on push if this is the nf-core dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/atacseq') }}" - runs-on: ubuntu-latest - strategy: - matrix: - NXF_VER: - - "22.10.1" - - "latest-everything" - steps: - - name: Check out pipeline code - uses: actions/checkout@v3 - - - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 - with: - version: "${{ matrix.NXF_VER }}" - - - name: Run pipeline with test data - run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results - - test_controls: - name: Run pipeline with test data and controls - # Only run on push if this is the nf-core dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/atacseq') }}" - runs-on: ubuntu-latest - steps: - - name: Check out pipeline code - uses: actions/checkout@v3 - - - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 - - - name: Run pipeline with test data and controls - run: | - nextflow run ${GITHUB_WORKSPACE} -profile test_controls,docker --outdir ./results - - parameters: - name: Test workflow parameters - if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/atacseq') }} - runs-on: ubuntu-latest - strategy: - matrix: - parameters: - - "--skip_trimming" - - "--skip_merge_replicates" - - "--skip_consensus_peaks" - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 - - - name: Install Nextflow - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ - - - name: Run pipeline with various parameters - run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker ${{ matrix.parameters }} --outdir ./results - - aligners: - name: Test available aligners - if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/atacseq') }} - runs-on: ubuntu-latest - strategy: - matrix: - aligner: - - "bowtie2" - - "chromap" - - "star" - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 - - - name: Install Nextflow - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ - - - name: Run pipeline with the different aligners available - run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker --aligner ${{ matrix.aligner }} --outdir ./results diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index 694e90ec..6adb0fff 100644 --- a/.github/workflows/clean-up.yml +++ b/.github/workflows/clean-up.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@v7 + - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10 with: stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml new file mode 100644 index 00000000..45884ff9 --- /dev/null +++ b/.github/workflows/download_pipeline.yml @@ -0,0 +1,134 @@ +name: Test successful pipeline download with 'nf-core pipelines download' + +# Run the workflow when: +# - dispatched manually +# - when a PR is opened or reopened to main/master branch +# - the head branch of the pull request is updated, i.e. if fixes for a release are pushed last minute to dev. +on: + workflow_dispatch: + inputs: + testbranch: + description: "The specific branch you wish to utilize for the test execution of nf-core pipelines download." + required: true + default: "dev" + pull_request: + branches: + - main + - master + +env: + NXF_ANSI_LOG: false + +jobs: + configure: + runs-on: ubuntu-latest + outputs: + REPO_LOWERCASE: ${{ steps.get_repo_properties.outputs.REPO_LOWERCASE }} + REPOTITLE_LOWERCASE: ${{ steps.get_repo_properties.outputs.REPOTITLE_LOWERCASE }} + REPO_BRANCH: ${{ steps.get_repo_properties.outputs.REPO_BRANCH }} + steps: + - name: Get the repository name and current branch + id: get_repo_properties + run: | + echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> "$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: Install Nextflow + uses: nf-core/setup-nextflow@v2 + + - name: Disk space cleanup + uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 + + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # 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: Install dependencies + run: | + python -m pip install --upgrade pip + pip install git+https://github.com/nf-core/tools.git + + - 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@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 + 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..c8ae40c6 --- /dev/null +++ b/.github/workflows/fix_linting.yml @@ -0,0 +1,89 @@ +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@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + 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 }} + + # Install and run pre-commit + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 + with: + python-version: "3.14" + + - name: Install pre-commit + run: pip install pre-commit + + - name: Run pre-commit + id: pre-commit + run: pre-commit run --all-files + continue-on-error: true + + # indication that the linting has finished + - name: react if linting finished succesfully + if: steps.pre-commit.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.pre-commit.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..7a527a34 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -1,97 +1,69 @@ 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@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - - 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 + - name: Set up Python 3.14 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 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 .` + python-version: "3.14" - Once you push these changes the test should pass, and you can hide this comment :+1: + - name: Install pre-commit + run: pip install pre-commit - 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! - - Thanks again for your contribution! - repo-token: ${{ secrets.GITHUB_TOKEN }} - allow-repeats: false + - name: Run pre-commit + run: pre-commit run --all-files nf-core: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@v3 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 + uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.8" + python-version: "3.14" architecture: "x64" + - 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 + pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} + + - name: Run nf-core pipelines lint + if: ${{ github.base_ref != 'master' }} + 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 --dir ${GITHUB_WORKSPACE} --markdown lint_results.md - - name: Run nf-core lint + - name: Run nf-core pipelines lint --release + if: ${{ github.base_ref == 'master' }} 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 --release --dir ${GITHUB_WORKSPACE} --markdown lint_results.md - name: Save PR number if: ${{ always() }} @@ -99,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 0bbcd30f..e6e9bc26 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@v2 + uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11 with: workflow: linting.yml workflow_conclusion: completed @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@v2 + uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml new file mode 100644 index 00000000..55f9a34c --- /dev/null +++ b/.github/workflows/nf-test.yml @@ -0,0 +1,143 @@ +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.2" + 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@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + 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 + 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.04.0" + - "latest-everything" + env: + NXF_ANSI_LOG: false + TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} + + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + 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 }} + 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 + + 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::" diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml new file mode 100644 index 00000000..431d3d44 --- /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@master + 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@6461056ea355ea43b977e149f7bf76aaa572e5e8 # v0.3.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..e8560fc7 --- /dev/null +++ b/.github/workflows/template-version-comment.yml @@ -0,0 +1,46 @@ +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_target + +jobs: + template_version: + runs-on: ubuntu-latest + steps: + - name: Check out pipeline code + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + 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==${{ steps.read_yml.outputs['nf_core_version'] }} + + - name: Check nf-core outdated + id: nf_core_outdated + run: echo "OUTPUT=$(pip list --outdated | grep nf-core)" >> ${GITHUB_ENV} + + - name: Post nf-core template version comment + uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2 + if: | + contains(env.OUTPUT, 'nf-core') + with: + repo-token: ${{ secrets.NF_CORE_BOT_AUTH_TOKEN }} + allow-repeats: false + message: | + > [!WARNING] + > Newer version of the nf-core template is available. + > + > Your pipeline is using an old version of the nf-core template: ${{ steps.read_yml.outputs['nf_core_version'] }}. + > Please update your pipeline to the latest version. + > + > For more documentation on how to update your pipeline, please see the [nf-core documentation](https://github.com/nf-core/tools?tab=readme-ov-file#sync-a-pipeline-with-the-template) and [Synchronisation documentation](https://nf-co.re/docs/contributing/sync). + # diff --git a/.gitignore b/.gitignore index 5124c9ac..23b0c7de 100755 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ results/ testing/ testing* *.pyc +null/ +.nf-test* 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..dbc0165e 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1 +1,16 @@ +lint: + nextflow_config: + - config_defaults: + - params.bamtools_filter_se_config + - params.bamtools_filter_pe_config +nf_core_version: 3.5.1 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..d06777a8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,27 @@ repos: - repo: https://github.com/pre-commit/mirrors-prettier - rev: "v2.7.1" + rev: "v3.1.0" hooks: - id: prettier + additional_dependencies: + - prettier@3.6.2 + - 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/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ + - id: end-of-file-fixer + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ diff --git a/.prettierignore b/.prettierignore index 437d763d..dd749d43 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,3 +10,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..cdb98bb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,30 +3,115 @@ 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 +- [[#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/issues/437)] - Fix strick 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. + +### 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 | +| ---------- | ----------- | ----------- | +| `macs2` | 2.2.7.1 | | +| `macs3` | | 3.0.1 | + +## [[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 +294,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..008d250b 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.04.0-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-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1) [![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/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. 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/usage/getting_started/configuration#custom-configuration-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). 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 index 043d02f2..051db865 100644 --- a/assets/slackreport.json +++ b/assets/slackreport.json @@ -3,7 +3,7 @@ { "fallback": "Plain-text summary of the attachment.", "color": "<% if (success) { %>good<% } else { %>danger<%} %>", - "author_name": "sanger-tol/readmapping v${version} - ${runName}", + "author_name": "nf-core/atacseq ${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": [ 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..d6b22bc8 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) ? '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/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..5c4f5c42 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' - ] - } } // @@ -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,7 @@ if (params.aligner == 'chromap') { ] } } -} -if (params.aligner == 'star') { process { withName: 'STAR_ALIGN' { ext.args = [ @@ -334,7 +326,6 @@ if (params.aligner == 'star') { ] } } -} process { withName: 'PICARD_MERGESAMFILES_LIBRARY' { @@ -460,7 +451,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 +486,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 +512,6 @@ process { } } -if (!params.skip_picard_metrics) { process { withName: 'MERGED_LIBRARY_PICARD_COLLECTMULTIPLEMETRICS' { ext.args = '--VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp' @@ -540,9 +530,7 @@ if (!params.skip_picard_metrics) { ] } } -} -if (!params.skip_preseq) { process { withName: 'MERGED_LIBRARY_PRESEQ_LCEXTRAP' { ext.args = '-verbose -bam -seed 1' @@ -554,9 +542,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 +582,7 @@ if (!params.skip_plot_profile) { ] } } -} -if (!params.skip_plot_fingerprint) { process { withName: 'MERGED_LIBRARY_DEEPTOOLS_PLOTFINGERPRINT' { ext.args = { @@ -616,24 +600,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 +622,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 +630,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 +661,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 +685,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 +702,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 +817,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 +846,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 +855,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 +864,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 +872,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 +903,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 +926,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 +943,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 +978,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_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/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,14 +199,14 @@ 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. @@ -234,7 +234,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 +243,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 +337,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 +357,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..eccafacd 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/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: ```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,13 +251,13 @@ 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. ### 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. @@ -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..3334a0fb 100644 --- a/main.nf +++ b/main.nf @@ -9,62 +9,171 @@ ---------------------------------------------------------------------------------------- */ -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: + ch_versions = Channel.empty() + + // 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 + ) + ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) + + // + // WORKFLOW: Run nf-core/atacseq workflow + // + ch_samplesheet = Channel.value(file(params.input, checkIfExists: true)) + + ATACSEQ ( + ch_samplesheet, + ch_versions, + 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 + ) + emit: + multiqc_report = ATACSEQ.out.multiqc_report // channel: /path/to/multiqc_report.html + versions = ch_versions // channel: [version1, version2, ...] } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 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, + params.hook_url, + NFCORE_ATACSEQ.out.multiqc_report + ) +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 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..ccb857c8 100644 --- a/modules.json +++ b/modules.json @@ -7,260 +7,178 @@ "nf-core": { "ataqv/ataqv": { "branch": "master", - "git_sha": "56421e1a812bc2f9e77dbe9f297e9d9c580cb8a5", - "installed_by": [ - "modules" - ] + "git_sha": "11c7e5b3073845889060c793786bf3177275d62e", + "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": "11c7e5b3073845889060c793786bf3177275d62e", + "installed_by": ["modules"] }, "bowtie2/align": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "fastq_align_bowtie2" - ] + "git_sha": "0fe30831abbc2ed115e46e92330edf38f56edc3d", + "installed_by": ["fastq_align_bowtie2"] }, "bowtie2/build": { "branch": "master", - "git_sha": "e797efb47b0d3b2124753beb55dc83ab9512bceb", - "installed_by": [ - "modules" - ] + "git_sha": "6a24fbe314bb2e6fe6306c29a63076ea87e8eb3c", + "installed_by": ["modules"] }, "bwa/index": { "branch": "master", - "git_sha": "9518fa4f65f3fb8cde24fde7d40333b39ec8fd65", - "installed_by": [ - "modules" - ] + "git_sha": "baa9ee31e48f115832c8eb91a980bf35c9ffc9b9", + "installed_by": ["modules"] }, "bwa/mem": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "fastq_align_bwa" - ] + "git_sha": "b97197968ac12dde2463fa54541f6350c46f2035", + "installed_by": ["fastq_align_bwa"] }, "chromap/chromap": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "fastq_align_chromap" - ] + "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", + "installed_by": ["fastq_align_chromap"] }, "chromap/index": { "branch": "master", - "git_sha": "3a8e3ca607132a468c07c69aaa3bccd55eb983b8", - "installed_by": [ - "modules" - ] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": ["modules"] }, - "custom/dumpsoftwareversions": { + "custom/getchromsizes": { "branch": "master", - "git_sha": "8022c68e7403eecbd8ba9c49496f69f8c49d50f0", - "installed_by": [ - "modules" - ] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": ["modules"] }, - "custom/getchromsizes": { + "deeptools/alignmentsieve": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules" - ] + "git_sha": "5c2ab5de7e8de33ac7cab83a4cd28a4d29a84049", + "installed_by": ["modules"] }, "deeptools/computematrix": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] }, "deeptools/plotfingerprint": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] }, "deeptools/plotheatmap": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] }, "deeptools/plotprofile": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] }, "fastqc": { "branch": "master", - "git_sha": "810e8f2603ec38401d49a4aaed06f6d058745552", - "installed_by": [ - "modules", - "fastq_fastqc_umitools_trimgalore" - ] + "git_sha": "f89e009050fa3ea88b81f08a4fc6fe2afbae778b", + "installed_by": ["fastq_fastqc_umitools_trimgalore", "modules"] }, "gffread": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": ["modules"] }, "gunzip": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "e06548bfa36ee31869b81041879dd6b3a83b1d57", + "installed_by": ["modules"] }, "homer/annotatepeaks": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "ffc27c68870f5f67e541bb67d94e03c597f75257", + "installed_by": ["modules"] }, "khmer/uniquekmers": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": ["modules"] + }, + "macs3/callpeak": { + "branch": "master", + "git_sha": "06c8865e36741e05ad32ef70ab3fac127486af48", + "installed_by": ["modules"] }, - "macs2/callpeak": { + "multiqc": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "af27af1be706e6a2bb8fe454175b0cdf77f47b49", + "installed_by": ["modules"] }, "picard/collectmultiplemetrics": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": ["modules"] }, "picard/markduplicates": { "branch": "master", - "git_sha": "eca65aa4a5e2e192ac44d6962c8f9260f314ffb8", - "installed_by": [ - "modules", - "bam_markduplicates_picard" - ] + "git_sha": "1943aa60f7490c3d6740e8872e6e69122ccc8087", + "installed_by": ["bam_markduplicates_picard"] }, "picard/mergesamfiles": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "2d74c664aadaacfba29fc74840037dfc93129f82", + "installed_by": ["modules"] }, "preseq/lcextrap": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "bam_stats_samtools" - ] + "git_sha": "f4596fe0bdc096cf53ec4497e83defdb3a94ff62", + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "bam_stats_samtools" - ] + "git_sha": "f4596fe0bdc096cf53ec4497e83defdb3a94ff62", + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "bam_markduplicates_picard", - "bam_sort_stats_samtools" - ] + "git_sha": "f4596fe0bdc096cf53ec4497e83defdb3a94ff62", + "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": "4352dbdb09ec40db71e9b172b97a01dcf5622c26", + "installed_by": ["bam_sort_stats_samtools"] }, "samtools/stats": { "branch": "master", - "git_sha": "cf5b9c30a2adacc581793afb79fae5f5b50bed01", - "installed_by": [ - "modules", - "bam_stats_samtools" - ] + "git_sha": "f4596fe0bdc096cf53ec4497e83defdb3a94ff62", + "installed_by": ["bam_stats_samtools"] }, "subread/featurecounts": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": ["modules"] }, "trimgalore": { "branch": "master", - "git_sha": "b51a69e30973c71950225c817ad07a3337d22c40", - "installed_by": [ - "modules", - "fastq_fastqc_umitools_trimgalore" - ] + "git_sha": "eed5d14302a6c9070dcc25feeab707a27a4b3254", + "installed_by": ["fastq_fastqc_umitools_trimgalore"] }, "ucsc/bedgraphtobigwig": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "66290981ab6038ea86177ade40b9449bc790b0ce", + "installed_by": ["modules"] }, "umitools/extract": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "fastq_fastqc_umitools_trimgalore" - ] + "git_sha": "bd6d730b3f32742f402189113ba9480006a3350f", + "installed_by": ["fastq_fastqc_umitools_trimgalore"] }, "untar": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", - "installed_by": [ - "modules" - ] + "git_sha": "5c460c5a4736974abde2843294f35307ee2b0e5e", + "installed_by": ["modules"] } } }, @@ -268,60 +186,56 @@ "nf-core": { "bam_markduplicates_picard": { "branch": "master", - "git_sha": "6daac2bc63f4847e0c7cc661f4f5b043ac13faaf", - "installed_by": [ - "subworkflows" - ] + "git_sha": "1943aa60f7490c3d6740e8872e6e69122ccc8087", + "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": "4352dbdb09ec40db71e9b172b97a01dcf5622c26", + "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": "f4596fe0bdc096cf53ec4497e83defdb3a94ff62", + "installed_by": ["bam_markduplicates_picard", "bam_sort_stats_samtools"] }, "fastq_align_bowtie2": { "branch": "master", - "git_sha": "ac75f79157ecc64283a2b3a559f1ba90bc0f2259", - "installed_by": [ - "subworkflows" - ] + "git_sha": "0fe30831abbc2ed115e46e92330edf38f56edc3d", + "installed_by": ["subworkflows"] }, "fastq_align_bwa": { "branch": "master", - "git_sha": "ac75f79157ecc64283a2b3a559f1ba90bc0f2259", - "installed_by": [ - "subworkflows" - ] + "git_sha": "b97197968ac12dde2463fa54541f6350c46f2035", + "installed_by": ["subworkflows"] }, "fastq_align_chromap": { "branch": "master", - "git_sha": "ac75f79157ecc64283a2b3a559f1ba90bc0f2259", - "installed_by": [ - "subworkflows" - ] + "git_sha": "cfd937a668919d948f6fcbf4218e79de50c2f36f", + "installed_by": ["subworkflows"] }, "fastq_fastqc_umitools_trimgalore": { "branch": "master", - "git_sha": "b51a69e30973c71950225c817ad07a3337d22c40", - "installed_by": [ - "subworkflows" - ] + "git_sha": "8f2ec534d0418bf724cfd5f053176a9c500fae78", + "installed_by": ["subworkflows"] + }, + "utils_nextflow_pipeline": { + "branch": "master", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "installed_by": ["subworkflows"] + }, + "utils_nfcore_pipeline": { + "branch": "master", + "git_sha": "271e7fc14eb1320364416d996fb077421f3faed2", + "installed_by": ["subworkflows"] + }, + "utils_nfschema_plugin": { + "branch": "master", + "git_sha": "4b406a74dc0449c0401ed87d5bfff4252fd277fd", + "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..766a0468 100644 --- a/modules/local/bam_remove_orphans.nf +++ b/modules/local/bam_remove_orphans.nf @@ -42,4 +42,14 @@ process BAM_REMOVE_ORPHANS { END_VERSIONS """ } + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ } diff --git a/modules/local/bamtools_filter.nf b/modules/local/bamtools_filter.nf index a1e8feed..51a6bd3b 100644 --- a/modules/local/bamtools_filter.nf +++ b/modules/local/bamtools_filter.nf @@ -40,4 +40,15 @@ process BAMTOOLS_FILTER { bamtools: \$(echo \$(bamtools --version 2>&1) | sed 's/^.*bamtools //; s/Part .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + 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 + """ } diff --git a/modules/local/bedtools_genomecov.nf b/modules/local/bedtools_genomecov.nf index 92c94b99..5805dce7 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) @@ -19,8 +19,11 @@ process BEDTOOLS_GENOMECOV { 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,9 +33,34 @@ 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 + + rm tmp.bg + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") + sort: \$(sort --version | head -n 1 | awk '{print \$4;}') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bedGraph + touch ${prefix}.scale_factor.txt cat <<-END_VERSIONS > versions.yml "${task.process}": bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") 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..4b5cae51 100644 --- a/modules/local/deseq2_qc.nf +++ b/modules/local/deseq2_qc.nf @@ -44,6 +44,8 @@ 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 diff --git a/modules/local/frip_score.nf b/modules/local/frip_score.nf index 77f856bc..2d36e3b9 100644 --- a/modules/local/frip_score.nf +++ b/modules/local/frip_score.nf @@ -31,4 +31,15 @@ process FRIP_SCORE { 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 + 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 + """ } diff --git a/modules/local/genome_blacklist_regions.nf b/modules/local/genome_blacklist_regions.nf index 74a7936f..275234e0 100644 --- a/modules/local/genome_blacklist_regions.nf +++ b/modules/local/genome_blacklist_regions.nf @@ -42,4 +42,16 @@ process GENOME_BLACKLIST_REGIONS { END_VERSIONS """ } + + stub: + def file_out = "${sizes.simpleName}.include_regions.bed" + """ + touch $file_out + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") + END_VERSIONS + """ + + } diff --git a/modules/local/macs2_consensus.nf b/modules/local/macs3_consensus.nf similarity index 81% rename from modules/local/macs2_consensus.nf rename to modules/local/macs3_consensus.nf index 1f8ad55f..04fedb9f 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' @@ -23,17 +23,17 @@ process MACS2_CONSENSUS { 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(' ')} \\ | 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}","")} \\ ${prefix}.boolean.txt \\ diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf index 6064fd7d..3c8d0bcd 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/*') @@ -79,4 +79,15 @@ process MULTIQC { 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 + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS + """ } diff --git a/modules/local/multiqc_custom_peaks.nf b/modules/local/multiqc_custom_peaks.nf index 7972af76..35ee1c85 100644 --- a/modules/local/multiqc_custom_peaks.nf +++ b/modules/local/multiqc_custom_peaks.nf @@ -30,4 +30,16 @@ process MULTIQC_CUSTOM_PEAKS { 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 + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/local/plot_macs2_qc.nf b/modules/local/plot_macs3_qc.nf similarity index 96% rename from modules/local/plot_macs2_qc.nf rename to modules/local/plot_macs3_qc.nf index a2c39b02..9ce2edfe 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" @@ -22,7 +22,7 @@ process PLOT_MACS2_QC { def args = task.ext.args ?: '' def peak_type = is_narrow_peak ? 'narrowPeak' : 'broadPeak' """ - plot_macs2_qc.r \\ + plot_macs3_qc.r \\ -i ${peaks.join(',')} \\ -s ${peaks.join(',').replaceAll("_peaks.${peak_type}","")} \\ $args 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..d2796359 --- /dev/null +++ b/modules/nf-core/bowtie2/align/environment.yml @@ -0,0 +1,9 @@ +name: bowtie2_align +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::bowtie2=2.5.2 + - bioconda::samtools=1.18 + - conda-forge::pigz=2.6 diff --git a/modules/nf-core/bowtie2/align/main.nf b/modules/nf-core/bowtie2/align/main.nf index a77114d2..96a7027d 100644 --- a/modules/nf-core/bowtie2/align/main.nf +++ b/modules/nf-core/bowtie2/align/main.nf @@ -2,21 +2,26 @@ process BOWTIE2_ALIGN { tag "$meta.id" label "process_high" - conda "bioconda::bowtie2=2.4.4 bioconda::samtools=1.16.1 conda-forge::pigz=2.6" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:f70b31a2db15c023d641c32f433fb02cd04df5a6-0' : + 'biocontainers/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:f70b31a2db15c023d641c32f433fb02cd04df5a6-0' }" 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 + tuple val(meta), path("*fastq.gz") , emit: fastq , optional:true path "versions.yml" , emit: versions when: @@ -39,7 +44,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\$//"` @@ -52,8 +60,8 @@ process BOWTIE2_ALIGN { --threads $task.cpus \\ $unaligned \\ $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 @@ -76,12 +84,27 @@ 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 ? "touch ${prefix}.unmapped.fastq.gz" : "" + } else { + create_unmapped = save_unaligned ? "touch ${prefix}.unmapped_1.fastq.gz && touch ${prefix}.unmapped_2.fastq.gz" : "" + } + def reference = fasta && extension=="cram" ? "--reference ${fasta}" : "" + 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 + ${create_unmapped} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/bowtie2/align/meta.yml b/modules/nf-core/bowtie2/align/meta.yml index 60d04c12..e66811d0 100644 --- a/modules/nf-core/bowtie2/align/meta.yml +++ b/modules/nf-core/bowtie2/align/meta.yml @@ -65,3 +65,6 @@ output: 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..fdc1c59d --- /dev/null +++ b/modules/nf-core/bowtie2/align/tests/large_index.config @@ -0,0 +1,5 @@ +process { + withName: BOWTIE2_BUILD { + ext.args = '--large-index' + } +} \ No newline at end of file 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..03aeaf9e --- /dev/null +++ b/modules/nf-core/bowtie2/align/tests/main.nf.test @@ -0,0 +1,623 @@ +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, false, false - bam") { + + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [[ id:'test'], file(params.test_data['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, + process.out.log, + process.out.fastq, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - fastq, index, fasta, false, false - sam") { + + config "./sam.config" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [[ id:'test'], file(params.test_data['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.sam[0][1]).readLines()[0..4], + process.out.log, + process.out.fastq, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - fastq, index, fasta, false, false - sam2") { + + config "./sam2.config" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [[ id:'test'], file(params.test_data['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.sam[0][1]).readLines()[0..4], + process.out.log, + process.out.fastq, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - fastq, index, fasta, false, true - bam") { + + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [[ id:'test'], file(params.test_data['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, + process.out.log, + process.out.fastq, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [fastq1, fastq2], index, fasta, false, false - bam") { + + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_2_fastq_gz'], checkIfExists: true) + ] + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [[ id:'test'], file(params.test_data['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, + process.out.log, + process.out.fastq, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [fastq1, fastq2], index, fasta, false, true - bam") { + + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_2_fastq_gz'], checkIfExists: true) + ] + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [[ id:'test'], file(params.test_data['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, + process.out.log, + process.out.fastq, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - fastq, large_index, fasta, false, false - bam") { + + config "./large_index.config" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [[ id:'test'], file(params.test_data['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, + process.out.log, + process.out.fastq, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [fastq1, fastq2], large_index, fasta, false, false - bam") { + + config "./large_index.config" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_2_fastq_gz'], checkIfExists: true) + ] + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [[ id:'test'], file(params.test_data['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, + process.out.log, + process.out.fastq, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [fastq1, fastq2], index, fasta, true, false - bam") { + + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_2_fastq_gz'], checkIfExists: true) + ] + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [[ id:'test'], file(params.test_data['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, + process.out.log, + process.out.fastq, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - fastq, index, fasta, true, false - bam") { + + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [[ id:'test'], file(params.test_data['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, + process.out.log, + process.out.fastq, + process.out.versions + ).match() } + + ) + } + + } + + test("sarscov2 - [fastq1, fastq2], index, fasta, true, true - cram") { + + config "./cram_crai.config" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_2_fastq_gz'], checkIfExists: true) + ] + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [[ id:'test'], file(params.test_data['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, false, false - stub") { + + options "-stub" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_2_fastq_gz'], checkIfExists: true) + ] + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [[ id:'test'], file(params.test_data['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.versions + ).match() } + ) + } + + } + + test("sarscov2 - fastq, index, fasta, true, false - stub") { + + options "-stub" + setup { + run("BOWTIE2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) + ] + input[1] = BOWTIE2_BUILD.out.index + input[2] = [[ id:'test'], file(params.test_data['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.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..028e7da6 --- /dev/null +++ b/modules/nf-core/bowtie2/align/tests/main.nf.test.snap @@ -0,0 +1,311 @@ +{ + "sarscov2 - [fastq1, fastq2], large_index, fasta, false, false - bam": { + "content": [ + "test.bam", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.bowtie2.log:md5,bd89ce1b28c93bf822bae391ffcedd19" + ] + ], + [ + + ], + [ + "versions.yml:md5,01d18ab035146ea790e9a0f70adb758f" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-18T13:19:25.337323" + }, + "sarscov2 - fastq, index, fasta, false, false - sam2": { + "content": [ + [ + "ERR5069949.2151832\t16\tMT192765.1\t17453\t42\t150M\t*\t0\t0\tACGCACATTGCTAACTAAGGGCACACTAGAACCAGAATATTTCAATTCAGTGTGTAGACTTATGAAAACTATAGGTCCAGACATGTTCCTCGGAACTTGTCGGCGTTGTCCTGCTGAAATTGTTGACACTGTGAGTGCTTTGGTTTATGA\tAAAA&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..3f136d0a --- /dev/null +++ b/modules/nf-core/bwa/mem/environment.yml @@ -0,0 +1,10 @@ +name: bwa_mem +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bwa=0.7.17 + # renovate: datasource=conda depName=bioconda/samtools + - samtools=1.19.2 + - htslib=1.19.1 diff --git a/modules/nf-core/bwa/mem/main.nf b/modules/nf-core/bwa/mem/main.nf index d2f85daf..d8bd2815 100644 --- a/modules/nf-core/bwa/mem/main.nf +++ b/modules/nf-core/bwa/mem/main.nf @@ -2,19 +2,23 @@ process BWA_MEM { tag "$meta.id" label 'process_high' - conda "bioconda::bwa=0.7.17 bioconda::samtools=1.16.1" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:a34558545ae1413d94bde4578787ebef08027945-0' : + 'biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:a34558545ae1413d94bde4578787ebef08027945-0' }" 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("*.csi") , emit: csi, optional: true + tuple val(meta), path("*.crai") , emit: crai, optional: true + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -24,6 +28,13 @@ 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" """ INDEX=`find -L ./ -name "*.amb" | sed 's/\\.amb\$//'` @@ -32,7 +43,29 @@ process BWA_MEM { -t $task.cpus \\ \$INDEX \\ $reads \\ - | samtools $samtools_command $args2 --threads $task.cpus -o ${prefix}.bam - + | samtools $samtools_command $args2 ${reference} --threads $task.cpus -o ${prefix}.${extension} - + + 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 args = task.ext.args ?: '' + 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" + """ + touch ${prefix}.${extension} + touch ${prefix}.csi + touch ${prefix}.crai cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/bwa/mem/meta.yml b/modules/nf-core/bwa/mem/meta.yml index 62357bf8..1532c261 100644 --- a/modules/nf-core/bwa/mem/meta.yml +++ b/modules/nf-core/bwa/mem/meta.yml @@ -37,6 +37,10 @@ input: type: file description: BWA genome index files pattern: "Directory containing BWA index *.{amb,ann,bwt,pac,sa}" + - fasta: + type: file + description: Reference genome in FASTA format + pattern: "*.{fasta,fa}" - sort_bam: type: boolean description: use samtools sort (true) or samtools view (false) @@ -46,6 +50,18 @@ output: type: file description: Output BAM file containing read alignments pattern: "*.{bam}" + - cram: + type: file + description: Output CRAM file containing read alignments + pattern: "*.{cram}" + - csi: + type: file + description: Optional index file for BAM file + pattern: "*.{csi}" + - crai: + type: file + description: Optional index file for CRAM file + pattern: "*.{crai}" - versions: type: file description: File containing software versions @@ -53,3 +69,8 @@ output: 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..1fa9b56d --- /dev/null +++ b/modules/nf-core/bwa/mem/tests/main.nf.test @@ -0,0 +1,306 @@ +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" + + test("Single-End") { + + 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) + ] + """ + } + } + } + + 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("Single-End Sort") { + + 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) + ] + """ + } + } + } + + 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).match() } + ) + } + + } + + test("Paired-End") { + + 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) + ] + """ + } + } + } + + 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() } + ) + } + + } + + test("Paired-End Sort") { + + 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) + ] + """ + } + } + } + + 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).match() } + ) + } + + } + + test("Paired-End - no fasta") { + + 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) + ] + """ + } + } + } + + 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).match() } + ) + } + + } + + test("Single-end - stub") { + options "-stub" + 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) + ] + """ + } + } + } + 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( + file(process.out.bam[0][1]).name, + file(process.out.csi[0][1]).name, + process.out.versions + ).match() } + ) + } + } + + test("Paired-end - stub") { + options "-stub" + 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) + ] + """ + } + } + } + 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( + file(process.out.bam[0][1]).name, + file(process.out.csi[0][1]).name, + process.out.versions + ).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..0d1bdb41 --- /dev/null +++ b/modules/nf-core/bwa/mem/tests/main.nf.test.snap @@ -0,0 +1,295 @@ +{ + "Single-End": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,a74710a0345b4717bb4431bf9c257120" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,a74710a0345b4717bb4431bf9c257120" + ] + ], + "crai": [ + + ], + "cram": [ + + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-14T14:14:56.820798254" + }, + "Single-End Sort": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,cb1e038bc4d990683fa485d632550b54" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,cb1e038bc4d990683fa485d632550b54" + ] + ], + "crai": [ + + ], + "cram": [ + + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-14T14:15:20.271428534" + }, + "Paired-End": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,aea123a3828a99da1906126355f15a12" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,aea123a3828a99da1906126355f15a12" + ] + ], + "crai": [ + + ], + "cram": [ + + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-14T14:15:38.264256823" + }, + "Paired-End Sort": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,4682087bcdc3617384b375093fecd8dd" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,4682087bcdc3617384b375093fecd8dd" + ] + ], + "crai": [ + + ], + "cram": [ + + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-14T14:16:00.528642686" + }, + "Single-end - stub": { + "content": [ + "test.bam", + "test.csi", + [ + "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-15T09:50:33.238543011" + }, + "Paired-End - no fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,aea123a3828a99da1906126355f15a12" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,aea123a3828a99da1906126355f15a12" + ] + ], + "crai": [ + + ], + "cram": [ + + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-14T14:40:16.345342005" + }, + "Paired-end - stub": { + "content": [ + "test.bam", + "test.csi", + [ + "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-15T09:50:42.268673302" + } +} \ No newline at end of file diff --git a/modules/nf-core/bwa/mem/tests/tags.yml b/modules/nf-core/bwa/mem/tests/tags.yml new file mode 100644 index 00000000..82992d1f --- /dev/null +++ b/modules/nf-core/bwa/mem/tests/tags.yml @@ -0,0 +1,3 @@ +bwa/mem: + - modules/nf-core/bwa/index/** + - modules/nf-core/bwa/mem/** 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/deeptools/alignmentsieve/environment.yml b/modules/nf-core/deeptools/alignmentsieve/environment.yml new file mode 100644 index 00000000..d8e208ca --- /dev/null +++ b/modules/nf-core/deeptools/alignmentsieve/environment.yml @@ -0,0 +1,6 @@ +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::deeptools=3.5.5 + - 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..3223399c --- /dev/null +++ b/modules/nf-core/deeptools/alignmentsieve/main.nf @@ -0,0 +1,49 @@ +process DEEPTOOLS_ALIGNMENTSIEVE { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-eb9e7907c7a753917c1e4d7a64384c047429618a:41defd13a6f2ce014549fcc05d0b051f655777f9-0': + 'biocontainers/mulled-v2-eb9e7907c7a753917c1e4d7a64384c047429618a:41defd13a6f2ce014549fcc05d0b051f655777f9-0' }" + + input: + tuple val(meta), path(input), path(input_index) + + output: + tuple val(meta), path("*_as.bam") , emit: bam + path "versions.yml" , emit: 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 + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + deeptools: \$(alignmentSieve --version | sed -e "s/alignmentSieve //g") + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_as.bam + touch ${prefix}_log.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + deeptools: \$(alignmentSieve --version | sed -e "s/alignmentSieve //g") + END_VERSIONS + """ +} diff --git a/modules/nf-core/deeptools/alignmentsieve/meta.yml b/modules/nf-core/deeptools/alignmentsieve/meta.yml new file mode 100644 index 00000000..37d381ca --- /dev/null +++ b/modules/nf-core/deeptools/alignmentsieve/meta.yml @@ -0,0 +1,56 @@ +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 visualzation 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}" + - input_index: + type: file + description: BAM index file + pattern: "*.{bai}" +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" + - logs: + - "*_log.txt": + type: file + description: TXT file + pattern: "*.txt" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +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..2d3b61b9 --- /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.versions) + .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..ad1c635d --- /dev/null +++ b/modules/nf-core/deeptools/alignmentsieve/tests/main.nf.test.snap @@ -0,0 +1,59 @@ +{ + "homo_sampiens - bam": { + "content": [ + [ + "test_log.txt:md5,39f97a6a2ff83330d5c93411113df63a" + ], + "463ac3b905fbf4ddf113a94dbfa8d69f", + [ + "versions.yml:md5,baf8080ab016b89a27483809252bc803" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-26T12:59:06.183167" + }, + "homo_sampiens - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test_as.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,baf8080ab016b89a27483809252bc803" + ], + "2": [ + "test_log.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test_as.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "logs": [ + "test_log.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "versions": [ + "versions.yml:md5,baf8080ab016b89a27483809252bc803" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-26T12:59:10.273315" + } +} \ No newline at end of file diff --git a/modules/nf-core/deeptools/alignmentsieve/tests/tags.yml b/modules/nf-core/deeptools/alignmentsieve/tests/tags.yml new file mode 100644 index 00000000..fd24baa9 --- /dev/null +++ b/modules/nf-core/deeptools/alignmentsieve/tests/tags.yml @@ -0,0 +1,2 @@ +deeptools/bamcoverage: + - "modules/nf-core/deeptools/alignmentsieve/**" diff --git a/modules/nf-core/deeptools/computematrix/environment.yml b/modules/nf-core/deeptools/computematrix/environment.yml new file mode 100644 index 00000000..0c80282f --- /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.5 diff --git a/modules/nf-core/deeptools/computematrix/main.nf b/modules/nf-core/deeptools/computematrix/main.nf index e77e2839..e8a36001 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" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/deeptools:3.5.5--pyhdfd78af_0': + 'biocontainers/deeptools:3.5.5--pyhdfd78af_0' }" input: tuple val(meta), path(bigwig) @@ -36,4 +36,16 @@ process DEEPTOOLS_COMPUTEMATRIX { 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 + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + deeptools: \$(computeMatrix --version | sed -e "s/computeMatrix //g") + END_VERSIONS + """ } diff --git a/modules/nf-core/deeptools/computematrix/meta.yml b/modules/nf-core/deeptools/computematrix/meta.yml index 8a148f5d..5da5a008 100644 --- a/modules/nf-core/deeptools/computematrix/meta.yml +++ b/modules/nf-core/deeptools/computematrix/meta.yml @@ -7,51 +7,69 @@ 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"] - + 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: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML 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..39873aa3 --- /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.versions) + .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..a1916610 --- /dev/null +++ b/modules/nf-core/deeptools/computematrix/tests/main.nf.test.snap @@ -0,0 +1,72 @@ +{ + "sarscov2 - mat - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.computeMatrix.mat.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.computeMatrix.vals.mat.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,ccf4527952be3b834d42b6a968193b09" + ], + "matrix": [ + [ + { + "id": "test" + }, + "test.computeMatrix.mat.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "table": [ + [ + { + "id": "test" + }, + "test.computeMatrix.vals.mat.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,ccf4527952be3b834d42b6a968193b09" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-08-05T10:31:20.853496401" + }, + "sarscov2 - bigwig - bed": { + "content": [ + "test.computeMatrix.mat.gz", + [ + [ + { + "id": "test" + }, + "test.computeMatrix.vals.mat.tab:md5,19e22051cc44edb7db3e0f8345330d90" + ] + ], + [ + "versions.yml:md5,ccf4527952be3b834d42b6a968193b09" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-08-05T10:31:15.614009233" + } +} \ 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..f9e94fb2 --- /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' + } + +} \ No newline at end of file diff --git a/modules/nf-core/deeptools/plotfingerprint/environment.yml b/modules/nf-core/deeptools/plotfingerprint/environment.yml new file mode 100644 index 00000000..0c80282f --- /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.5 diff --git a/modules/nf-core/deeptools/plotfingerprint/main.nf b/modules/nf-core/deeptools/plotfingerprint/main.nf index 3159e941..0dba2ff7 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" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/deeptools:3.5.5--pyhdfd78af_0': + 'biocontainers/deeptools:3.5.5--pyhdfd78af_0' }" input: tuple val(meta), path(bams), path(bais) @@ -38,4 +38,17 @@ process DEEPTOOLS_PLOTFINGERPRINT { 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 + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + deeptools: \$(plotFingerprint --version | sed -e "s/plotFingerprint //g") + END_VERSIONS + """ } diff --git a/modules/nf-core/deeptools/plotfingerprint/meta.yml b/modules/nf-core/deeptools/plotfingerprint/meta.yml index 29ddf893..70306388 100644 --- a/modules/nf-core/deeptools/plotfingerprint/meta.yml +++ b/modules/nf-core/deeptools/plotfingerprint/meta.yml @@ -7,54 +7,78 @@ 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"] - + 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: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML 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..818c6c9f --- /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.versions) + .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..502f8cd6 --- /dev/null +++ b/modules/nf-core/deeptools/plotfingerprint/tests/main.nf.test.snap @@ -0,0 +1,90 @@ +{ + "homo_sampiens - bam": { + "content": [ + "test.plotFingerprint.pdf", + "test.plotFingerprint.raw.txt", + [ + false + ], + [ + "versions.yml:md5,2dd872e44f5b7284c080491607d9b42a" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-08-05T10:14:38.559795237" + }, + "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": [ + "versions.yml:md5,2dd872e44f5b7284c080491607d9b42a" + ], + "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": [ + "versions.yml:md5,2dd872e44f5b7284c080491607d9b42a" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-08-05T10:14:45.23521809" + } +} \ 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..0c80282f --- /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.5 diff --git a/modules/nf-core/deeptools/plotheatmap/main.nf b/modules/nf-core/deeptools/plotheatmap/main.nf index 58309eea..0bc6d148 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" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/deeptools:3.5.5--pyhdfd78af_0': + 'biocontainers/deeptools:3.5.5--pyhdfd78af_0' }" input: tuple val(meta), path(matrix) @@ -33,4 +33,16 @@ process DEEPTOOLS_PLOTHEATMAP { 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 + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + deeptools: \$(plotFingerprint --version | sed -e "s/plotFingerprint //g") + END_VERSIONS + """ } diff --git a/modules/nf-core/deeptools/plotheatmap/meta.yml b/modules/nf-core/deeptools/plotheatmap/meta.yml index 9296f503..fd15cf2c 100644 --- a/modules/nf-core/deeptools/plotheatmap/meta.yml +++ b/modules/nf-core/deeptools/plotheatmap/meta.yml @@ -7,48 +7,61 @@ 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"] - + 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: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML 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..b0bcaa9c --- /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.versions) + .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..6cf07363 --- /dev/null +++ b/modules/nf-core/deeptools/plotheatmap/tests/main.nf.test.snap @@ -0,0 +1,69 @@ +{ + "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": [ + "versions.yml:md5,f4040282400b8087dc94f1fa0b1cfefc" + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotHeatmap.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "table": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotHeatmap.mat.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,f4040282400b8087dc94f1fa0b1cfefc" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-08-05T10:17:23.70673465" + }, + "sarscov2 - mat": { + "content": [ + "test.plotHeatmap.pdf", + "test.plotHeatmap.mat.tab", + [ + "versions.yml:md5,f4040282400b8087dc94f1fa0b1cfefc" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-08-05T10:17:17.327116658" + } +} \ 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..0c80282f --- /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.5 diff --git a/modules/nf-core/deeptools/plotprofile/main.nf b/modules/nf-core/deeptools/plotprofile/main.nf index b1ab454d..4e9b44bd 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" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/deeptools:3.5.5--pyhdfd78af_0': + 'biocontainers/deeptools:3.5.5--pyhdfd78af_0' }" input: tuple val(meta), path(matrix) @@ -33,4 +33,16 @@ process DEEPTOOLS_PLOTPROFILE { 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 + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + deeptools: \$(plotProfile --version | sed -e "s/plotProfile //g") + END_VERSIONS + """ } diff --git a/modules/nf-core/deeptools/plotprofile/meta.yml b/modules/nf-core/deeptools/plotprofile/meta.yml index 44612ea9..bac0b23c 100644 --- a/modules/nf-core/deeptools/plotprofile/meta.yml +++ b/modules/nf-core/deeptools/plotprofile/meta.yml @@ -7,48 +7,63 @@ 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"] - + 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 # TSV + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML 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..fe52873b --- /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.versions) + .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..17bef5cf --- /dev/null +++ b/modules/nf-core/deeptools/plotprofile/tests/main.nf.test.snap @@ -0,0 +1,69 @@ +{ + "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": [ + "versions.yml:md5,668bc5d10cff87bd952f8b9294416ac3" + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotProfile.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "table": [ + [ + { + "id": "test", + "single_end": false + }, + "test.plotProfile.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,668bc5d10cff87bd952f8b9294416ac3" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-08-05T10:20:41.694233491" + }, + "sarscov2 - mat": { + "content": [ + "test.plotProfile.pdf", + "test.plotProfile.tab", + [ + "versions.yml:md5,668bc5d10cff87bd952f8b9294416ac3" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-08-05T10:20:35.515374962" + } +} \ No newline at end of file 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..de33f841 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -1,40 +1,49 @@ process FASTQC { - tag "$meta.id" - label 'process_medium' + tag "${meta.id}" + label 'process_low' - conda "bioconda::fastqc=0.11.9" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' : + '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("*.html") , emit: html + 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 script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + 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 rename_to = old_new_pairs*.join(' ').join(' ') - def renamed_files = old_new_pairs.collect{ old_name, new_name -> new_name }.join(' ') + def rename_to = old_new_pairs*.join(' ').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 ? ((int) (task.memory.toUnit('MB') / task.cpus)) : 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 +51,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..49164c88 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: + conda: + linux_amd64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-af7a5314d5015c29_1/condalock + linux_arm64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-df99cb252670875a_2/condalock + docker: + linux_amd64: + build_id: bd-af7a5314d5015c29_1 + name: community.wave.seqera.io/library/fastqc:0.12.1--af7a5314d5015c29 + scanId: sc-a618548acbee5a8a_30 + linux_arm64: + build_id: bd-df99cb252670875a_2 + name: community.wave.seqera.io/library/fastqc:0.12.1--df99cb252670875a + scanId: sc-b5913ed5d42b22d2_18 + singularity: + linux_amd64: + build_id: bd-104d26ddd9519960_1 + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--104d26ddd9519960 + https: https://community.wave.seqera.io/v2/library/fastqc/blobs/sha256:e0c976cb2eca5fee72618a581537a4f8ea42fcae24c9b201e2e0f764fd28648a + linux_arm64: + build_id: bd-d56b505a93aef38a_1 + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--d56b505a93aef38a + https: https://community.wave.seqera.io/v2/library/fastqc/blobs/sha256:fd39534bf298698cbe3ee4d4a6f1e73330ec4bca44c38dd9a4d06cb5ea838017 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/gunzip/main.nf b/modules/nf-core/gunzip/main.nf index e7189d2f..73bf08cd 100644 --- a/modules/nf-core/gunzip/main.nf +++ b/modules/nf-core/gunzip/main.nf @@ -21,10 +21,14 @@ process GUNZIP { def args = task.ext.args ?: '' gunzip = archive.toString() - '.gz' """ - gunzip \\ - -f \\ + # 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 + $archive \\ + > $gunzip cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/homer/annotatepeaks/main.nf b/modules/nf-core/homer/annotatepeaks/main.nf index cfc140f5..b6a4c6bd 100644 --- a/modules/nf-core/homer/annotatepeaks/main.nf +++ b/modules/nf-core/homer/annotatepeaks/main.nf @@ -15,6 +15,7 @@ process HOMER_ANNOTATEPEAKS { output: tuple val(meta), path("*annotatePeaks.txt"), emit: txt + tuple val(meta), path("*annStats.txt"), emit: stats, optional: true path "versions.yml" , emit: versions when: diff --git a/modules/nf-core/homer/annotatepeaks/meta.yml b/modules/nf-core/homer/annotatepeaks/meta.yml index b815e975..2c6e52a1 100644 --- a/modules/nf-core/homer/annotatepeaks/meta.yml +++ b/modules/nf-core/homer/annotatepeaks/meta.yml @@ -39,6 +39,10 @@ output: type: file description: The annotated peaks pattern: "*annotatePeaks.txt" + - annotation_stats: + type: file + description: the annStats file output from -annStats parameter + pattern: "*annStats.txt" - versions: type: file description: File containing software versions diff --git a/modules/nf-core/macs3/callpeak/environment.yml b/modules/nf-core/macs3/callpeak/environment.yml new file mode 100644 index 00000000..4aa6a32d --- /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.1" diff --git a/modules/nf-core/macs2/callpeak/main.nf b/modules/nf-core/macs3/callpeak/main.nf similarity index 66% rename from modules/nf-core/macs2/callpeak/main.nf rename to modules/nf-core/macs3/callpeak/main.nf index cbef7838..53a1a200 100644 --- a/modules/nf-core/macs2/callpeak/main.nf +++ b/modules/nf-core/macs3/callpeak/main.nf @@ -1,15 +1,16 @@ -process MACS2_CALLPEAK { + +process MACS3_CALLPEAK { tag "$meta.id" label 'process_medium' - conda "bioconda::macs2=2.2.7.1" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/macs3:3.0.1--py311h0152c62_3': + 'biocontainers/macs3:3.0.1--py311h0152c62_3' }" input: tuple val(meta), path(ipbam), path(controlbam) - val macs2_gsize + val macs3_gsize output: tuple val(meta), path("*.{narrowPeak,broadPeak}"), emit: peak @@ -36,10 +37,10 @@ process MACS2_CALLPEAK { args_list.remove(id) } """ - macs2 \\ + macs3 \\ callpeak \\ ${args_list.join(' ')} \\ - --gsize $macs2_gsize \\ + --gsize $macs3_gsize \\ --format $format \\ --name $prefix \\ --treatment $ipbam \\ @@ -47,7 +48,23 @@ process MACS2_CALLPEAK { cat <<-END_VERSIONS > versions.yml "${task.process}": - macs2: \$(macs2 --version | sed -e "s/macs2 //g") + macs3: \$(macs3 --version | sed -e "s/macs3 //g") + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.gappedPeak + touch ${prefix}.bed + touch ${prefix}.bdg + touch ${prefix}.narrowPeak + touch ${prefix}.xls + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + macs3: \$(macs3 --version | sed -e "s/macs3 //g") END_VERSIONS """ } diff --git a/modules/nf-core/macs2/callpeak/meta.yml b/modules/nf-core/macs3/callpeak/meta.yml similarity index 56% rename from modules/nf-core/macs2/callpeak/meta.yml rename to modules/nf-core/macs3/callpeak/meta.yml index 6e2bc1db..1603b8e2 100644 --- a/modules/nf-core/macs2/callpeak/meta.yml +++ b/modules/nf-core/macs3/callpeak/meta.yml @@ -1,4 +1,6 @@ -name: macs2_callpeak +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "macs3_callpeak" description: Peak calling of enriched genomic regions of ChIP-seq and ATAC-seq experiments keywords: - alignment @@ -6,32 +8,40 @@ keywords: - 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 + - 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"] + licence: ["BSD-3-clause"] input: - meta: type: map description: | Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + e.g. `[ id:'sample_1', single_end:false ]` - ipbam: type: file description: The ChIP-seq treatment file - controlbam: type: file description: The control file - - macs2_gsize: + - macs3_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) + 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: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` - versions: type: file description: File containing software version @@ -58,6 +68,6 @@ output: pattern: "*.bdg" authors: - - "@ntoda03" - "@JoseEspinosa" - - "@jianhong" +maintainers: + - "@JoseEspinosa" 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..217e3107 --- /dev/null +++ b/modules/nf-core/macs3/callpeak/tests/bam.config @@ -0,0 +1,5 @@ +process { + withName: 'MACS3_CALLPEAK' { + ext.args = '--qval 0.1' + } +} \ No newline at end of file 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..19444006 --- /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' + } +} \ No newline at end of file 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..d6d98292 --- /dev/null +++ b/modules/nf-core/macs3/callpeak/tests/main.nf.test.snap @@ -0,0 +1,358 @@ +{ + "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,221852e4639574d2f53cf1917efa4922" + ] + ], + "2": [ + "versions.yml:md5,cb33970f9aaa0730733abe2fd9cb2b74" + ], + "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": [ + "versions.yml:md5,cb33970f9aaa0730733abe2fd9cb2b74" + ], + "xls": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.xls:md5,221852e4639574d2f53cf1917efa4922" + ] + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-22T17:04:31.629715" + }, + "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": [ + "versions.yml:md5,cb33970f9aaa0730733abe2fd9cb2b74" + ], + "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": [ + "versions.yml:md5,cb33970f9aaa0730733abe2fd9cb2b74" + ], + "xls": [ + [ + { + "id": "test", + "single_end": false + }, + "test.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-22T17:04:58.589844" + }, + "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,9fce04613bdc9c8372a9f884aa0d5aa6" + ] + ], + "2": [ + "versions.yml:md5,cb33970f9aaa0730733abe2fd9cb2b74" + ], + "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": [ + "versions.yml:md5,cb33970f9aaa0730733abe2fd9cb2b74" + ], + "xls": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.xls:md5,9fce04613bdc9c8372a9f884aa0d5aa6" + ] + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-22T17:04:44.063426" + }, + "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,14efbf7137623df5aaf282b506ac9601" + ] + ], + "2": [ + "versions.yml:md5,cb33970f9aaa0730733abe2fd9cb2b74" + ], + "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": [ + "versions.yml:md5,cb33970f9aaa0730733abe2fd9cb2b74" + ], + "xls": [ + [ + { + "id": "test", + "single_end": false + }, + "test_peaks.xls:md5,14efbf7137623df5aaf282b506ac9601" + ] + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-22T17:04:16.697163" + } +} \ No newline at end of file diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml new file mode 100644 index 00000000..d02016a0 --- /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.32 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf new file mode 100644 index 00000000..c1158fb0 --- /dev/null +++ b/modules/nf-core/multiqc/main.nf @@ -0,0 +1,63 @@ +process MULTIQC { + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb/data' : + 'community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf' }" + + input: + path multiqc_files, stageAs: "?/*" + path(multiqc_config) + path(extra_multiqc_config) + path(multiqc_logo) + path(replace_names) + path(sample_names) + + output: + path "*multiqc_report.html", emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + path "versions.yml" , 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 ? "--config $multiqc_config" : '' + def extra_config = extra_multiqc_config ? "--config $extra_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 \\ + $extra_config \\ + $logo \\ + $replace \\ + $samples \\ + . + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS + """ + + stub: + """ + mkdir multiqc_data + mkdir multiqc_plots + touch multiqc_report.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml new file mode 100644 index 00000000..ce30eb73 --- /dev/null +++ b/modules/nf-core/multiqc/meta.yml @@ -0,0 +1,92 @@ +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: + - 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 # YAML + - extra_multiqc_config: + type: file + description: Second optional config yml for MultiQC. Will override common sections + in multiqc_config. + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - 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 # TSV + - 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 # TSV +output: + report: + - "*multiqc_report.html": + type: file + description: MultiQC report file + pattern: "multiqc_report.html" + ontologies: [] + data: + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + plots: + - "*_plots": + type: file + description: Plots created by MultiQC + pattern: "*_data" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@abhi18av" + - "@bunop" + - "@drpatelh" + - "@jfy133" +maintainers: + - "@abhi18av" + - "@bunop" + - "@drpatelh" + - "@jfy133" 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..33316a7d --- /dev/null +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -0,0 +1,92 @@ +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(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) + input[1] = [] + input[2] = [] + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, + { assert process.out.data[0] ==~ ".*/multiqc_data" }, + { assert snapshot(process.out.versions).match("multiqc_versions_single") } + ) + } + + } + + test("sarscov2 single-end [fastqc] [config]") { + + when { + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) + input[1] = Channel.of(file("https://github.com/nf-core/tools/raw/dev/nf_core/pipeline-template/assets/multiqc_config.yml", checkIfExists: true)) + input[2] = [] + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, + { assert process.out.data[0] ==~ ".*/multiqc_data" }, + { assert snapshot(process.out.versions).match("multiqc_versions_config") } + ) + } + } + + test("sarscov2 single-end [fastqc] - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) + input[1] = [] + input[2] = [] + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.report.collect { file(it).getName() } + + process.out.data.collect { file(it).getName() } + + process.out.plots.collect { file(it).getName() } + + process.out.versions ).match("multiqc_stub") } + ) + } + + } +} 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..a88bafd6 --- /dev/null +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -0,0 +1,41 @@ +{ + "multiqc_versions_single": { + "content": [ + [ + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "24.10.4" + }, + "timestamp": "2025-10-27T13:33:24.356715" + }, + "multiqc_stub": { + "content": [ + [ + "multiqc_report.html", + "multiqc_data", + "multiqc_plots", + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "24.10.4" + }, + "timestamp": "2025-10-27T13:34:11.103619" + }, + "multiqc_versions_config": { + "content": [ + [ + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "24.10.4" + }, + "timestamp": "2025-10-27T13:34:04.615233" + } +} \ 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..c537a6a3 --- /dev/null +++ b/modules/nf-core/multiqc/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'MULTIQC' { + ext.prefix = null + } +} diff --git a/modules/nf-core/picard/markduplicates/environment.yml b/modules/nf-core/picard/markduplicates/environment.yml new file mode 100644 index 00000000..58b795f5 --- /dev/null +++ b/modules/nf-core/picard/markduplicates/environment.yml @@ -0,0 +1,7 @@ +name: picard_markduplicates +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::picard=3.1.1 diff --git a/modules/nf-core/picard/markduplicates/main.nf b/modules/nf-core/picard/markduplicates/main.nf index facd7efb..ad0b2963 100644 --- a/modules/nf-core/picard/markduplicates/main.nf +++ b/modules/nf-core/picard/markduplicates/main.nf @@ -2,19 +2,20 @@ process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - conda "bioconda::picard=3.0.0" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/picard:3.1.1--hdfd78af_0' : + 'biocontainers/picard:3.1.1--hdfd78af_0' }" input: - tuple val(meta), path(bam) + tuple val(meta), path(reads) tuple val(meta2), path(fasta) tuple val(meta3), 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 @@ -24,20 +25,25 @@ 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() } + + 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 \\ + --INPUT $reads \\ + --OUTPUT ${prefix}.${suffix} \\ + $reference \\ --METRICS_FILE ${prefix}.MarkDuplicates.metrics.txt cat <<-END_VERSIONS > versions.yml @@ -48,9 +54,10 @@ process PICARD_MARKDUPLICATES { 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}.${suffix} touch ${prefix}.MarkDuplicates.metrics.txt cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/picard/markduplicates/meta.yml b/modules/nf-core/picard/markduplicates/meta.yml index f7693d2f..1f0ffe16 100644 --- a/modules/nf-core/picard/markduplicates/meta.yml +++ b/modules/nf-core/picard/markduplicates/meta.yml @@ -21,9 +21,9 @@ input: description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - bam: + - reads: type: file - description: BAM file + description: Sequence reads file, can be SAM/BAM/CRAM format pattern: "*.{bam,cram,sam}" - meta2: type: map @@ -32,7 +32,7 @@ input: e.g. [ id:'genome' ] - fasta: type: file - description: Reference genome fasta file + description: Reference genome fasta file, required for CRAM input pattern: "*.{fasta,fa}" - meta3: type: map @@ -57,6 +57,10 @@ output: type: file description: An optional BAM index file. If desired, --CREATE_INDEX must be passed as a flag pattern: "*.{bai}" + - cram: + type: file + description: Output CRAM file + pattern: "*.{cram}" - metrics: type: file description: Duplicate metrics file generated by picard @@ -69,3 +73,7 @@ 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..e3e97f6c --- /dev/null +++ b/modules/nf-core/picard/markduplicates/tests/main.nf.test @@ -0,0 +1,92 @@ +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] = [ [:], [] ] + input[2] = [ [:], [] ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.bam[0][1]).name).match("unsorted_bam_name") }, + { assert snapshot(path(process.out.metrics.get(0).get(1)).readLines()[0..2]).match("unsorted_bam_metrics") }, + { assert snapshot(process.out.versions).match("unsorted_bam_versions") } + ) + } + } + + 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] = [ [:], [] ] + input[2] = [ [:], [] ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.bam[0][1]).name).match("sorted_bam_name") }, + { assert snapshot(path(process.out.metrics.get(0).get(1)).readLines()[0..2]).match("sorted_bam_metrics") }, + { assert snapshot(process.out.versions).match("sorted_bam_versions") } + ) + } + } + + 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) + ]) + input[2] = Channel.of([ + [ id:'genome' ], + 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).match("cram_name") }, + { assert snapshot(path(process.out.metrics.get(0).get(1)).readLines()[0..2]).match("cram_metrics") }, + { assert snapshot(process.out.versions).match("cram_versions") } + ) + } + } +} 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..eb17111e --- /dev/null +++ b/modules/nf-core/picard/markduplicates/tests/main.nf.test.snap @@ -0,0 +1,110 @@ +{ + "sorted_bam_versions": { + "content": [ + [ + "versions.yml:md5,b699af51b1956f3810f8a7c066e0ab17" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T15:31:50.928021" + }, + "unsorted_bam_name": { + "content": [ + "test.marked.bam" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-01-19T10:26:28.100755" + }, + "cram_metrics": { + "content": [ + [ + "## htsjdk.samtools.metrics.StringHeader", + "# MarkDuplicates --INPUT test.paired_end.sorted.cram --OUTPUT test.marked.cram --METRICS_FILE test.marked.MarkDuplicates.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_QUALITY_SUM_STRATEGY false --USE_END_IN_UNPAIRED_READS false --USE_UNPAIRED_CLIPPED_END false --UNPAIRED_END_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" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T15:25:47.518152" + }, + "sorted_bam_metrics": { + "content": [ + [ + "## htsjdk.samtools.metrics.StringHeader", + "# MarkDuplicates --INPUT test.paired_end.sorted.bam --OUTPUT test.marked.bam --METRICS_FILE test.marked.MarkDuplicates.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_QUALITY_SUM_STRATEGY false --USE_END_IN_UNPAIRED_READS false --USE_UNPAIRED_CLIPPED_END false --UNPAIRED_END_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" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-21T11:39:10.318331" + }, + "cram_name": { + "content": [ + "test.marked.cram" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T15:25:47.459663" + }, + "cram_versions": { + "content": [ + [ + "versions.yml:md5,b699af51b1956f3810f8a7c066e0ab17" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-01-19T10:27:03.26989" + }, + "unsorted_bam_versions": { + "content": [ + [ + "versions.yml:md5,b699af51b1956f3810f8a7c066e0ab17" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T15:31:24.040403" + }, + "unsorted_bam_metrics": { + "content": [ + [ + "## htsjdk.samtools.metrics.StringHeader", + "# MarkDuplicates --INPUT test.paired_end.bam --OUTPUT test.marked.bam --METRICS_FILE test.marked.MarkDuplicates.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_QUALITY_SUM_STRATEGY false --USE_END_IN_UNPAIRED_READS false --USE_UNPAIRED_CLIPPED_END false --UNPAIRED_END_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" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-21T10:51:12.831787" + }, + "sorted_bam_name": { + "content": [ + "test.marked.bam" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-01-19T10:26:45.080116" + } +} \ 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..02818dd6 --- /dev/null +++ b/modules/nf-core/picard/markduplicates/tests/nextflow.config @@ -0,0 +1,6 @@ +process { + withName: PICARD_MARKDUPLICATES { + ext.prefix = { "${meta.id}.marked" } + ext.args = '--ASSUME_SORT_ORDER queryname' + } +} diff --git a/modules/nf-core/picard/markduplicates/tests/tags.yml b/modules/nf-core/picard/markduplicates/tests/tags.yml new file mode 100644 index 00000000..4f213d62 --- /dev/null +++ b/modules/nf-core/picard/markduplicates/tests/tags.yml @@ -0,0 +1,2 @@ +picard/markduplicates: + - modules/nf-core/picard/markduplicates/** 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..8e456b9c 100644 --- a/modules/nf-core/picard/mergesamfiles/main.nf +++ b/modules/nf-core/picard/mergesamfiles/main.nf @@ -2,10 +2,10 @@ process PICARD_MERGESAMFILES { tag "$meta.id" label 'process_medium' - conda "bioconda::picard=3.0.0" + conda "${moduleDir}/environment.yml" 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' }" + '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) @@ -49,4 +49,14 @@ process PICARD_MERGESAMFILES { END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$( echo \$(picard MergeSamFiles --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ } diff --git a/modules/nf-core/picard/mergesamfiles/meta.yml b/modules/nf-core/picard/mergesamfiles/meta.yml index 5f07ecd0..a1d8783c 100644 --- a/modules/nf-core/picard/mergesamfiles/meta.yml +++ b/modules/nf-core/picard/mergesamfiles/meta.yml @@ -13,29 +13,37 @@ 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: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML 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..f6ba7f8e --- /dev/null +++ b/modules/nf-core/picard/mergesamfiles/tests/main.nf.test @@ -0,0 +1,60 @@ + +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.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(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..a0769c9c --- /dev/null +++ b/modules/nf-core/picard/mergesamfiles/tests/main.nf.test.snap @@ -0,0 +1,50 @@ +{ + "test-picard-mergesamfiles-stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,31ced05bc2f0dce0b11a752a89130dcb" + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,31ced05bc2f0dce0b11a752a89130dcb" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-10-31T14:53:39.007529" + }, + "test-picard-mergesamfiles": { + "content": [ + "730da54c088350ff625d34b95e623dca", + [ + "versions.yml:md5,31ced05bc2f0dce0b11a752a89130dcb" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.7" + }, + "timestamp": "2025-09-15T11:02:06.505999205" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/flagstat/environment.yml b/modules/nf-core/samtools/flagstat/environment.yml new file mode 100644 index 00000000..bd57cb54 --- /dev/null +++ b/modules/nf-core/samtools/flagstat/environment.yml @@ -0,0 +1,8 @@ +name: samtools_flagstat +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::samtools=1.19.2 + - bioconda::htslib=1.19.1 diff --git a/modules/nf-core/samtools/flagstat/main.nf b/modules/nf-core/samtools/flagstat/main.nf index eb7e72fc..eb5f5252 100644 --- a/modules/nf-core/samtools/flagstat/main.nf +++ b/modules/nf-core/samtools/flagstat/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_FLAGSTAT { tag "$meta.id" label 'process_single' - conda "bioconda::samtools=1.17" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : + 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" input: tuple val(meta), path(bam), path(bai) @@ -32,4 +32,15 @@ process SAMTOOLS_FLAGSTAT { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.flagstat + + 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/flagstat/meta.yml b/modules/nf-core/samtools/flagstat/meta.yml index 954225df..97991358 100644 --- a/modules/nf-core/samtools/flagstat/meta.yml +++ b/modules/nf-core/samtools/flagstat/meta.yml @@ -47,3 +47,5 @@ output: pattern: "versions.yml" authors: - "@drpatelh" +maintainers: + - "@drpatelh" 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..24c3c04b --- /dev/null +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test @@ -0,0 +1,36 @@ +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 { + params { + outdir = "$outputDir" + } + 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 { + assertAll ( + { assert process.success }, + { assert snapshot(process.out.flagstat).match("flagstat") }, + { assert snapshot(process.out.versions).match("versions") } + ) + } + } +} 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..a76fc27e --- /dev/null +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap @@ -0,0 +1,32 @@ +{ + "flagstat": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T18:31:37.783927" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,fd0030ce49ab3a92091ad80260226452" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:11:44.299617452" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/flagstat/tests/tags.yml b/modules/nf-core/samtools/flagstat/tests/tags.yml new file mode 100644 index 00000000..2d2b7255 --- /dev/null +++ b/modules/nf-core/samtools/flagstat/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/flagstat: + - modules/nf-core/samtools/flagstat/** diff --git a/modules/nf-core/samtools/idxstats/environment.yml b/modules/nf-core/samtools/idxstats/environment.yml new file mode 100644 index 00000000..174973b8 --- /dev/null +++ b/modules/nf-core/samtools/idxstats/environment.yml @@ -0,0 +1,8 @@ +name: samtools_idxstats +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::samtools=1.19.2 + - bioconda::htslib=1.19.1 diff --git a/modules/nf-core/samtools/idxstats/main.nf b/modules/nf-core/samtools/idxstats/main.nf index a257d700..a544026f 100644 --- a/modules/nf-core/samtools/idxstats/main.nf +++ b/modules/nf-core/samtools/idxstats/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_IDXSTATS { tag "$meta.id" label 'process_single' - conda "bioconda::samtools=1.17" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : + 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" input: tuple val(meta), path(bam), path(bai) @@ -33,4 +33,16 @@ process SAMTOOLS_IDXSTATS { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + touch ${prefix}.idxstats + + 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/idxstats/meta.yml b/modules/nf-core/samtools/idxstats/meta.yml index dda87e1e..344e92a3 100644 --- a/modules/nf-core/samtools/idxstats/meta.yml +++ b/modules/nf-core/samtools/idxstats/meta.yml @@ -48,3 +48,5 @@ output: pattern: "versions.yml" authors: - "@drpatelh" +maintainers: + - "@drpatelh" 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..a2dcb27c --- /dev/null +++ b/modules/nf-core/samtools/idxstats/tests/main.nf.test @@ -0,0 +1,36 @@ +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 { + params { + outdir = "$outputDir" + } + 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 { + assertAll ( + { assert process.success }, + { assert snapshot(process.out.idxstats).match("idxstats") }, + { assert snapshot(process.out.versions).match("versions") } + ) + } + } +} 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..a7050bdc --- /dev/null +++ b/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap @@ -0,0 +1,32 @@ +{ + "versions": { + "content": [ + [ + "versions.yml:md5,613dde56f108418039ffcdeeddba397a" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:16:50.147462763" + }, + "idxstats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T18:36:41.561026" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/idxstats/tests/tags.yml b/modules/nf-core/samtools/idxstats/tests/tags.yml new file mode 100644 index 00000000..d3057c61 --- /dev/null +++ b/modules/nf-core/samtools/idxstats/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/idxstats: + - modules/nf-core/samtools/idxstats/** diff --git a/modules/nf-core/samtools/index/environment.yml b/modules/nf-core/samtools/index/environment.yml new file mode 100644 index 00000000..a5e50649 --- /dev/null +++ b/modules/nf-core/samtools/index/environment.yml @@ -0,0 +1,8 @@ +name: samtools_index +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::samtools=1.19.2 + - bioconda::htslib=1.19.1 diff --git a/modules/nf-core/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf index 0b20aa4b..dc14f98d 100644 --- a/modules/nf-core/samtools/index/main.nf +++ b/modules/nf-core/samtools/index/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_INDEX { tag "$meta.id" label 'process_low' - conda "bioconda::samtools=1.17" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : + 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" input: tuple val(meta), path(input) diff --git a/modules/nf-core/samtools/index/meta.yml b/modules/nf-core/samtools/index/meta.yml index 8bd2fa6f..01a4ee03 100644 --- a/modules/nf-core/samtools/index/meta.yml +++ b/modules/nf-core/samtools/index/meta.yml @@ -51,3 +51,7 @@ authors: - "@drpatelh" - "@ewels" - "@maxulysse" +maintainers: + - "@drpatelh" + - "@ewels" + - "@maxulysse" 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..0ed260ef --- /dev/null +++ b/modules/nf-core/samtools/index/tests/csi.nextflow.config @@ -0,0 +1,7 @@ +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..bb7756d1 --- /dev/null +++ b/modules/nf-core/samtools/index/tests/main.nf.test @@ -0,0 +1,87 @@ +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 { + params { + outdir = "$outputDir" + } + 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.bai).match("bai") }, + { assert snapshot(process.out.versions).match("bai_versions") } + ) + } + } + + test("crai") { + + when { + params { + outdir = "$outputDir" + } + 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 { + assertAll ( + { assert process.success }, + { assert snapshot(process.out.crai).match("crai") }, + { assert snapshot(process.out.versions).match("crai_versions") } + ) + } + } + + test("csi") { + + config "./csi.nextflow.config" + + when { + params { + outdir = "$outputDir" + } + 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 path(process.out.csi.get(0).get(1)).exists() }, + { assert snapshot(process.out.versions).match("csi_versions") } + ) + } + } +} 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..3dc8e7de --- /dev/null +++ b/modules/nf-core/samtools/index/tests/main.nf.test.snap @@ -0,0 +1,74 @@ +{ + "crai_versions": { + "content": [ + [ + "versions.yml:md5,cc4370091670b64bba7c7206403ffb3e" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:12:00.324667957" + }, + "csi_versions": { + "content": [ + [ + "versions.yml:md5,cc4370091670b64bba7c7206403ffb3e" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:12:07.885103162" + }, + "crai": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,14bc3bd5c89cacc8f4541f9062429029" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T18:41:38.446424" + }, + "bai": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,704c10dd1326482448ca3073fdebc2f4" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T18:40:46.579747" + }, + "bai_versions": { + "content": [ + [ + "versions.yml:md5,cc4370091670b64bba7c7206403ffb3e" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:11:51.641425452" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/index/tests/tags.yml b/modules/nf-core/samtools/index/tests/tags.yml new file mode 100644 index 00000000..e0f58a7a --- /dev/null +++ b/modules/nf-core/samtools/index/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/index: + - modules/nf-core/samtools/index/** diff --git a/modules/nf-core/samtools/sort/environment.yml b/modules/nf-core/samtools/sort/environment.yml new file mode 100644 index 00000000..4d898e48 --- /dev/null +++ b/modules/nf-core/samtools/sort/environment.yml @@ -0,0 +1,8 @@ +name: samtools_sort +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::samtools=1.19.2 + - bioconda::htslib=1.19.1 diff --git a/modules/nf-core/samtools/sort/main.nf b/modules/nf-core/samtools/sort/main.nf index 2b7753fd..fc374f98 100644 --- a/modules/nf-core/samtools/sort/main.nf +++ b/modules/nf-core/samtools/sort/main.nf @@ -2,17 +2,20 @@ process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' - conda "bioconda::samtools=1.17" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : + 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" input: - tuple val(meta), path(bam) + tuple val(meta) , path(bam) + tuple val(meta2), path(fasta) output: - tuple val(meta), path("*.bam"), emit: bam - tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val(meta), path("*.bam"), emit: bam, optional: true + tuple val(meta), path("*.cram"), emit: cram, optional: true + tuple val(meta), path("*.crai"), emit: crai, optional: true + tuple val(meta), path("*.csi"), emit: csi, optional: true path "versions.yml" , emit: versions when: @@ -21,14 +24,24 @@ process SAMTOOLS_SORT { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-fmt sam") ? "sam" : + args.contains("--output-fmt cram") ? "cram" : + "bam" + def reference = fasta ? "--reference ${fasta}" : "" if ("$bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + """ + samtools cat \\ + --threads $task.cpus \\ + ${bam} \\ + | \\ samtools sort \\ $args \\ - -@ $task.cpus \\ - -o ${prefix}.bam \\ - -T $prefix \\ - $bam + -T ${prefix} \\ + --threads $task.cpus \\ + ${reference} \\ + -o ${prefix}.${extension} \\ + - cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -40,6 +53,7 @@ process SAMTOOLS_SORT { def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.bam + touch ${prefix}.bam.csi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/samtools/sort/meta.yml b/modules/nf-core/samtools/sort/meta.yml index 07328431..341a7d0e 100644 --- a/modules/nf-core/samtools/sort/meta.yml +++ b/modules/nf-core/samtools/sort/meta.yml @@ -23,8 +23,18 @@ input: e.g. [ id:'test', single_end:false ] - bam: type: file - description: BAM/CRAM/SAM file + description: BAM/CRAM/SAM file(s) 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: "*.{fa,fasta,fna}" + optional: true output: - meta: type: map @@ -33,16 +43,29 @@ output: e.g. [ id:'test', single_end:false ] - bam: type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - versions: + description: Sorted BAM file + pattern: "*.{bam}" + - cram: type: file - description: File containing software versions - pattern: "versions.yml" + description: Sorted CRAM file + pattern: "*.{cram}" + - crai: + type: file + description: CRAM index file (optional) + pattern: "*.crai" - csi: type: file description: BAM index file (optional) pattern: "*.csi" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" 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..8360e2b1 --- /dev/null +++ b/modules/nf-core/samtools/sort/tests/main.nf.test @@ -0,0 +1,96 @@ +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") { + + 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) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("cram") { + + 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) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("bam_stub") { + + config "./nextflow.config" + options "-stub" + + when { + params { + outdir = "$outputDir" + } + 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) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(file(process.out.bam[0][1]).name).match("bam_stub_bam") }, + { assert snapshot(process.out.versions).match("bam_stub_versions") } + ) + } + } +} 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..38477656 --- /dev/null +++ b/modules/nf-core/samtools/sort/tests/main.nf.test.snap @@ -0,0 +1,154 @@ +{ + "cram": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,bc0b7c25da26384a006ed84cc9e4da23" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.csi:md5,8d4e836c2fed6c0bf874d5e8cdba5831" + ] + ], + "4": [ + "versions.yml:md5,e6d43fefc9a8bff91c2ce6e3a1716eca" + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,bc0b7c25da26384a006ed84cc9e4da23" + ] + ], + "crai": [ + + ], + "cram": [ + + ], + "csi": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.csi:md5,8d4e836c2fed6c0bf874d5e8cdba5831" + ] + ], + "versions": [ + "versions.yml:md5,e6d43fefc9a8bff91c2ce6e3a1716eca" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-04T15:08:00.830294" + }, + "bam_stub_bam": { + "content": [ + "test.sorted.bam" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:21:04.364044" + }, + "bam_stub_versions": { + "content": [ + [ + "versions.yml:md5,e6d43fefc9a8bff91c2ce6e3a1716eca" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:15:00.20800281" + }, + "bam": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,bc0b7c25da26384a006ed84cc9e4da23" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.csi:md5,8d4e836c2fed6c0bf874d5e8cdba5831" + ] + ], + "4": [ + "versions.yml:md5,e6d43fefc9a8bff91c2ce6e3a1716eca" + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,bc0b7c25da26384a006ed84cc9e4da23" + ] + ], + "crai": [ + + ], + "cram": [ + + ], + "csi": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.csi:md5,8d4e836c2fed6c0bf874d5e8cdba5831" + ] + ], + "versions": [ + "versions.yml:md5,e6d43fefc9a8bff91c2ce6e3a1716eca" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-04T15:07:48.773803" + } +} \ 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..f642771f --- /dev/null +++ b/modules/nf-core/samtools/sort/tests/nextflow.config @@ -0,0 +1,8 @@ +process { + + withName: SAMTOOLS_SORT { + ext.prefix = { "${meta.id}.sorted" } + ext.args = "--write-index" + } + +} diff --git a/modules/nf-core/samtools/sort/tests/tags.yml b/modules/nf-core/samtools/sort/tests/tags.yml new file mode 100644 index 00000000..cd63ea20 --- /dev/null +++ b/modules/nf-core/samtools/sort/tests/tags.yml @@ -0,0 +1,3 @@ +samtools/sort: + - modules/nf-core/samtools/sort/** + - tests/modules/nf-core/samtools/sort/** diff --git a/modules/nf-core/samtools/stats/environment.yml b/modules/nf-core/samtools/stats/environment.yml new file mode 100644 index 00000000..67bb0ca4 --- /dev/null +++ b/modules/nf-core/samtools/stats/environment.yml @@ -0,0 +1,8 @@ +name: samtools_stats +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::samtools=1.19.2 + - bioconda::htslib=1.19.1 diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf index 4a2607de..52b00f4b 100644 --- a/modules/nf-core/samtools/stats/main.nf +++ b/modules/nf-core/samtools/stats/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_STATS { tag "$meta.id" label 'process_single' - conda "bioconda::samtools=1.17" + conda "${moduleDir}/environment.yml" 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' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : + 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" input: tuple val(meta), path(input), path(input_index) diff --git a/modules/nf-core/samtools/stats/meta.yml b/modules/nf-core/samtools/stats/meta.yml index 90e6345f..735ff812 100644 --- a/modules/nf-core/samtools/stats/meta.yml +++ b/modules/nf-core/samtools/stats/meta.yml @@ -57,3 +57,7 @@ authors: - "@drpatelh" - "@FriederikeHanssen" - "@ramprasadn" +maintainers: + - "@drpatelh" + - "@FriederikeHanssen" + - "@ramprasadn" 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..e3d5cb14 --- /dev/null +++ b/modules/nf-core/samtools/stats/tests/main.nf.test @@ -0,0 +1,65 @@ +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 { + params { + outdir = "$outputDir" + } + 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 { + assertAll( + {assert process.success}, + {assert snapshot(process.out).match()} + ) + } + } + + test("cram") { + + when { + params { + outdir = "$outputDir" + } + 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/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + {assert process.success}, + {assert snapshot(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..1b7c9ba4 --- /dev/null +++ b/modules/nf-core/samtools/stats/tests/main.nf.test.snap @@ -0,0 +1,72 @@ +{ + "cram": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,01812900aa4027532906c5d431114233" + ] + ], + "1": [ + "versions.yml:md5,0514ceb1769b2a88843e08c1f82624a9" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,01812900aa4027532906c5d431114233" + ] + ], + "versions": [ + "versions.yml:md5,0514ceb1769b2a88843e08c1f82624a9" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:15:25.562429714" + }, + "bam": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,5d8681bf541199898c042bf400391d59" + ] + ], + "1": [ + "versions.yml:md5,0514ceb1769b2a88843e08c1f82624a9" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,5d8681bf541199898c042bf400391d59" + ] + ], + "versions": [ + "versions.yml:md5,0514ceb1769b2a88843e08c1f82624a9" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:15:07.857611509" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/stats/tests/tags.yml b/modules/nf-core/samtools/stats/tests/tags.yml new file mode 100644 index 00000000..7c28e30f --- /dev/null +++ b/modules/nf-core/samtools/stats/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/stats: + - modules/nf-core/samtools/stats/** diff --git a/modules/nf-core/trimgalore/environment.yml b/modules/nf-core/trimgalore/environment.yml new file mode 100644 index 00000000..60b33ef2 --- /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=0.6.10 diff --git a/modules/nf-core/trimgalore/main.nf b/modules/nf-core/trimgalore/main.nf index dcb77ae7..5790b520 100644 --- a/modules/nf-core/trimgalore/main.nf +++ b/modules/nf-core/trimgalore/main.nf @@ -1,22 +1,22 @@ process TRIMGALORE { - tag "$meta.id" + tag "${meta.id}" label 'process_high' - 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 == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/trim-galore:0.6.10--hdfd78af_2' : + 'biocontainers/trim-galore:0.6.10--hdfd78af_2'}" 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 +24,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..ac97b087 --- /dev/null +++ b/modules/nf-core/trimgalore/tests/main.nf.test @@ -0,0 +1,162 @@ +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, + file(process.out.log[0][1]).readLines()[0..9], // line 11 changes + file(process.out.log[0][1]).readLines()[11..59], + 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[0][1][0], + process.out.reads[0][1][1], + file(process.out.log[0][1][0]).readLines()[0..9], // line 11 changes + file(process.out.log[0][1][0]).readLines()[11..58], + file(process.out.log[0][1][1]).readLines()[0..9], // line 11 changes + file(process.out.log[0][1][1]).readLines()[11..60], + 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[0][1][0], + process.out.reads[0][1][1], + process.out.unpaired[0][1][0], + process.out.unpaired[0][1][1], + file(process.out.log[0][1][0]).readLines()[0..9], // line 11 changes + file(process.out.log[0][1][0]).readLines()[11..59], + file(process.out.log[0][1][1]).readLines()[0..9], // line 11 changes + file(process.out.log[0][1][1]).readLines()[11..63], + 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..2fb55f2d --- /dev/null +++ b/modules/nf-core/trimgalore/tests/main.nf.test.snap @@ -0,0 +1,468 @@ +{ + "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", + "0.6.10" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2025-12-15T14:40:14.896140126" + }, + "sarscov2 - fastq - paired-end - keep-unpaired": { + "content": [ + "test_1_val_1.fq.gz:md5,75413e85910bbc2e1556e12f6479f935", + "test_2_val_2.fq.gz:md5,d3c588c12646ebd36a0812fe02d0bda6", + "test_1_unpaired_1.fq.gz:md5,17e0e878f6d0e93b9008a05f128660b6", + "test_2_unpaired_2.fq.gz:md5,b09a064368a867e099e66df5ef69b044", + [ + "", + "SUMMARISING RUN PARAMETERS", + "==========================", + "Input filename: test_1.fastq.gz", + "Trimming mode: paired-end", + "Trim Galore version: 0.6.10", + "Cutadapt version: 5.2", + "Number of cores used for trimming: 1", + "Quality Phred score cutoff: 20", + "Quality encoding type selected: ASCII+33" + ], + [ + "Defaulting to Illumina universal adapter ( AGATCGGAAGAGC ). Specify -a SEQUENCE to avoid this behavior).", + "Adapter sequence: 'AGATCGGAAGAGC' (Illumina TruSeq, Sanger iPCR; default (inconclusive auto-detection))", + "Maximum trimming error rate: 0.1 (default)", + "Minimum required adapter overlap (stringency): 1 bp", + "Minimum required sequence length for both reads before a sequence pair gets removed: 150 bp", + "Length cut-off for read 1: 35 bp (default)", + "Length cut-off for read 2: 35 bp (default)", + "Output file will be GZIP compressed", + "", + "", + "This is cutadapt 5.2 with Python 3.12.12", + "Command line parameters: -j 1 -e 0.1 -q 20 -O 1 -a AGATCGGAAGAGC test_1.fastq.gz", + "Processing single-end reads on 1 core ...", + "", + "=== Summary ===", + "", + "Total reads processed: 100", + "Reads with adapters: 31 (31.0%)", + "Reads written (passing filters): 100 (100.0%)", + "", + "Total basepairs processed: 13,897 bp", + "Quality-trimmed: 0 bp (0.0%)", + "Total written (filtered): 13,851 bp (99.7%)", + "", + "=== Adapter 1 ===", + "", + "Sequence: AGATCGGAAGAGC; Type: regular 3'; Length: 13; Trimmed: 31 times", + "", + "Minimum overlap: 1", + "No. of allowed errors:", + "1-9 bp: 0; 10-13 bp: 1", + "", + "Bases preceding removed adapters:", + " A: 35.5%", + " C: 25.8%", + " G: 9.7%", + " T: 29.0%", + " none/other: 0.0%", + "", + "Overview of removed sequences", + "length\tcount\texpect\tmax.err\terror counts", + "1\t19\t25.0\t0\t19", + "2\t10\t6.2\t0\t10", + "3\t1\t1.6\t0\t1", + "4\t1\t0.4\t0\t1", + "", + "RUN STATISTICS FOR INPUT FILE: test_1.fastq.gz", + "=============================================", + "100 sequences processed in total" + ], + [ + "", + "SUMMARISING RUN PARAMETERS", + "==========================", + "Input filename: test_2.fastq.gz", + "Trimming mode: paired-end", + "Trim Galore version: 0.6.10", + "Cutadapt version: 5.2", + "Number of cores used for trimming: 1", + "Quality Phred score cutoff: 20", + "Quality encoding type selected: ASCII+33" + ], + [ + "Defaulting to Illumina universal adapter ( AGATCGGAAGAGC ). Specify -a SEQUENCE to avoid this behavior).", + "Adapter sequence: 'AGATCGGAAGAGC' (Illumina TruSeq, Sanger iPCR; default (inconclusive auto-detection))", + "Maximum trimming error rate: 0.1 (default)", + "Minimum required adapter overlap (stringency): 1 bp", + "Minimum required sequence length for both reads before a sequence pair gets removed: 150 bp", + "Length cut-off for read 1: 35 bp (default)", + "Length cut-off for read 2: 35 bp (default)", + "Output file will be GZIP compressed", + "", + "", + "This is cutadapt 5.2 with Python 3.12.12", + "Command line parameters: -j 1 -e 0.1 -q 20 -O 1 -a AGATCGGAAGAGC test_2.fastq.gz", + "Processing single-end reads on 1 core ...", + "", + "=== Summary ===", + "", + "Total reads processed: 100", + "Reads with adapters: 40 (40.0%)", + "Reads written (passing filters): 100 (100.0%)", + "", + "Total basepairs processed: 13,748 bp", + "Quality-trimmed: 0 bp (0.0%)", + "Total written (filtered): 13,693 bp (99.6%)", + "", + "=== Adapter 1 ===", + "", + "Sequence: AGATCGGAAGAGC; Type: regular 3'; Length: 13; Trimmed: 40 times", + "", + "Minimum overlap: 1", + "No. of allowed errors:", + "1-9 bp: 0; 10-13 bp: 1", + "", + "Bases preceding removed adapters:", + " A: 35.0%", + " C: 25.0%", + " G: 5.0%", + " T: 35.0%", + " none/other: 0.0%", + "", + "Overview of removed sequences", + "length\tcount\texpect\tmax.err\terror counts", + "1\t28\t25.0\t0\t28", + "2\t10\t6.2\t0\t10", + "3\t1\t1.6\t0\t1", + "4\t1\t0.4\t0\t1", + "", + "RUN STATISTICS FOR INPUT FILE: test_2.fastq.gz", + "=============================================", + "100 sequences processed in total", + "", + "Total number of sequences analysed for the sequence pair length validation: 100", + "", + "Number of sequence pairs removed because at least one read was shorter than the length cutoff (150 bp): 81 (81.00%)" + ], + { + "versions_trimgalore": [ + [ + "TRIMGALORE", + "trimgalore", + "0.6.10" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2025-12-15T14:39:53.811844594" + }, + "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", + "0.6.10" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2025-12-15T14:40:03.991561892" + }, + "sarscov2 - fastq - paired-end": { + "content": [ + "test_1_val_1.fq.gz:md5,566d44cca0d22c522d6cf0e50c7165dc", + "test_2_val_2.fq.gz:md5,3c023e8e890b897821df3dc98f48c2b3", + [ + "", + "SUMMARISING RUN PARAMETERS", + "==========================", + "Input filename: test_1.fastq.gz", + "Trimming mode: paired-end", + "Trim Galore version: 0.6.10", + "Cutadapt version: 5.2", + "Number of cores used for trimming: 1", + "Quality Phred score cutoff: 20", + "Quality encoding type selected: ASCII+33" + ], + [ + "Defaulting to Illumina universal adapter ( AGATCGGAAGAGC ). Specify -a SEQUENCE to avoid this behavior).", + "Adapter sequence: 'AGATCGGAAGAGC' (Illumina TruSeq, Sanger iPCR; default (inconclusive auto-detection))", + "Maximum trimming error rate: 0.1 (default)", + "Minimum required adapter overlap (stringency): 1 bp", + "Minimum required sequence length for both reads before a sequence pair gets removed: 20 bp", + "Output file will be GZIP compressed", + "", + "", + "This is cutadapt 5.2 with Python 3.12.12", + "Command line parameters: -j 1 -e 0.1 -q 20 -O 1 -a AGATCGGAAGAGC test_1.fastq.gz", + "Processing single-end reads on 1 core ...", + "", + "=== Summary ===", + "", + "Total reads processed: 100", + "Reads with adapters: 31 (31.0%)", + "Reads written (passing filters): 100 (100.0%)", + "", + "Total basepairs processed: 13,897 bp", + "Quality-trimmed: 0 bp (0.0%)", + "Total written (filtered): 13,851 bp (99.7%)", + "", + "=== Adapter 1 ===", + "", + "Sequence: AGATCGGAAGAGC; Type: regular 3'; Length: 13; Trimmed: 31 times", + "", + "Minimum overlap: 1", + "No. of allowed errors:", + "1-9 bp: 0; 10-13 bp: 1", + "", + "Bases preceding removed adapters:", + " A: 35.5%", + " C: 25.8%", + " G: 9.7%", + " T: 29.0%", + " none/other: 0.0%", + "", + "Overview of removed sequences", + "length\tcount\texpect\tmax.err\terror counts", + "1\t19\t25.0\t0\t19", + "2\t10\t6.2\t0\t10", + "3\t1\t1.6\t0\t1", + "4\t1\t0.4\t0\t1", + "", + "RUN STATISTICS FOR INPUT FILE: test_1.fastq.gz", + "=============================================", + "100 sequences processed in total", + "" + ], + [ + "", + "SUMMARISING RUN PARAMETERS", + "==========================", + "Input filename: test_2.fastq.gz", + "Trimming mode: paired-end", + "Trim Galore version: 0.6.10", + "Cutadapt version: 5.2", + "Number of cores used for trimming: 1", + "Quality Phred score cutoff: 20", + "Quality encoding type selected: ASCII+33" + ], + [ + "Defaulting to Illumina universal adapter ( AGATCGGAAGAGC ). Specify -a SEQUENCE to avoid this behavior).", + "Adapter sequence: 'AGATCGGAAGAGC' (Illumina TruSeq, Sanger iPCR; default (inconclusive auto-detection))", + "Maximum trimming error rate: 0.1 (default)", + "Minimum required adapter overlap (stringency): 1 bp", + "Minimum required sequence length for both reads before a sequence pair gets removed: 20 bp", + "Output file will be GZIP compressed", + "", + "", + "This is cutadapt 5.2 with Python 3.12.12", + "Command line parameters: -j 1 -e 0.1 -q 20 -O 1 -a AGATCGGAAGAGC test_2.fastq.gz", + "Processing single-end reads on 1 core ...", + "", + "=== Summary ===", + "", + "Total reads processed: 100", + "Reads with adapters: 40 (40.0%)", + "Reads written (passing filters): 100 (100.0%)", + "", + "Total basepairs processed: 13,748 bp", + "Quality-trimmed: 0 bp (0.0%)", + "Total written (filtered): 13,693 bp (99.6%)", + "", + "=== Adapter 1 ===", + "", + "Sequence: AGATCGGAAGAGC; Type: regular 3'; Length: 13; Trimmed: 40 times", + "", + "Minimum overlap: 1", + "No. of allowed errors:", + "1-9 bp: 0; 10-13 bp: 1", + "", + "Bases preceding removed adapters:", + " A: 35.0%", + " C: 25.0%", + " G: 5.0%", + " T: 35.0%", + " none/other: 0.0%", + "", + "Overview of removed sequences", + "length\tcount\texpect\tmax.err\terror counts", + "1\t28\t25.0\t0\t28", + "2\t10\t6.2\t0\t10", + "3\t1\t1.6\t0\t1", + "4\t1\t0.4\t0\t1", + "", + "RUN STATISTICS FOR INPUT FILE: test_2.fastq.gz", + "=============================================", + "100 sequences processed in total", + "", + "Total number of sequences analysed for the sequence pair length validation: 100", + "" + ], + { + "versions_trimgalore": [ + [ + "TRIMGALORE", + "trimgalore", + "0.6.10" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2025-12-15T14:39:43.937555685" + }, + "sarscov2 - fastq - single-end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test_trimmed.fq.gz:md5,566d44cca0d22c522d6cf0e50c7165dc" + ] + ], + [ + "", + "SUMMARISING RUN PARAMETERS", + "==========================", + "Input filename: test.fastq.gz", + "Trimming mode: single-end", + "Trim Galore version: 0.6.10", + "Cutadapt version: 5.2", + "Number of cores used for trimming: 1", + "Quality Phred score cutoff: 20", + "Quality encoding type selected: ASCII+33" + ], + [ + "Defaulting to Illumina universal adapter ( AGATCGGAAGAGC ). Specify -a SEQUENCE to avoid this behavior).", + "Adapter sequence: 'AGATCGGAAGAGC' (Illumina TruSeq, Sanger iPCR; default (inconclusive auto-detection))", + "Maximum trimming error rate: 0.1 (default)", + "Minimum required adapter overlap (stringency): 1 bp", + "Minimum required sequence length before a sequence gets removed: 20 bp", + "Output file will be GZIP compressed", + "", + "", + "This is cutadapt 5.2 with Python 3.12.12", + "Command line parameters: -j 1 -e 0.1 -q 20 -O 1 -a AGATCGGAAGAGC test.fastq.gz", + "Processing single-end reads on 1 core ...", + "", + "=== Summary ===", + "", + "Total reads processed: 100", + "Reads with adapters: 31 (31.0%)", + "Reads written (passing filters): 100 (100.0%)", + "", + "Total basepairs processed: 13,897 bp", + "Quality-trimmed: 0 bp (0.0%)", + "Total written (filtered): 13,851 bp (99.7%)", + "", + "=== Adapter 1 ===", + "", + "Sequence: AGATCGGAAGAGC; Type: regular 3'; Length: 13; Trimmed: 31 times", + "", + "Minimum overlap: 1", + "No. of allowed errors:", + "1-9 bp: 0; 10-13 bp: 1", + "", + "Bases preceding removed adapters:", + " A: 35.5%", + " C: 25.8%", + " G: 9.7%", + " T: 29.0%", + " none/other: 0.0%", + "", + "Overview of removed sequences", + "length\tcount\texpect\tmax.err\terror counts", + "1\t19\t25.0\t0\t19", + "2\t10\t6.2\t0\t10", + "3\t1\t1.6\t0\t1", + "4\t1\t0.4\t0\t1", + "", + "RUN STATISTICS FOR INPUT FILE: test.fastq.gz", + "=============================================", + "100 sequences processed in total", + "Sequences removed because they became shorter than the length cutoff of 20 bp:\t0 (0.0%)", + "" + ], + { + "versions_trimgalore": [ + [ + "TRIMGALORE", + "trimgalore", + "0.6.10" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2025-12-15T14:39:33.985021562" + } +} \ 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/main.nf b/modules/nf-core/ucsc/bedgraphtobigwig/main.nf index 054924e7..06bb4709 100644 --- a/modules/nf-core/ucsc/bedgraphtobigwig/main.nf +++ b/modules/nf-core/ucsc/bedgraphtobigwig/main.nf @@ -3,10 +3,10 @@ process UCSC_BEDGRAPHTOBIGWIG { 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" + conda "bioconda::ucsc-bedgraphtobigwig=445" 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' }" + 'https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:445--h954228d_0' : + 'biocontainers/ucsc-bedgraphtobigwig:445--h954228d_0' }" input: tuple val(meta), path(bedgraph) @@ -22,7 +22,7 @@ process UCSC_BEDGRAPHTOBIGWIG { 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. + def VERSION = '445' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ bedGraphToBigWig \\ $bedgraph \\ @@ -34,4 +34,16 @@ process UCSC_BEDGRAPHTOBIGWIG { ucsc: $VERSION END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '445' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + """ + touch ${prefix}.bigWig + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ucsc: $VERSION + END_VERSIONS + """ } diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml b/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml index ba8915be..416c91e0 100755 --- a/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml +++ b/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml @@ -3,6 +3,9 @@ description: Convert a bedGraph file to bigWig format. keywords: - bedgraph - bigwig + - ucsc + - bedgraphtobigwig + - converter tools: - ucsc: description: Convert a bedGraph file to bigWig format. 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..82d18cd5 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" + conda "${moduleDir}/environment.yml" 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' }" + '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/nextflow.config b/nextflow.config index f3a8ea72..a3bf11d4 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,173 @@ 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 + hook_url = System.getenv('HOOK_URL') + 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 } // 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)' } - arm { - docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' + 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' + } + 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 +265,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.04.0' + version = '2.2.0dev' doi = 'https://doi.org/10.5281/zenodo.2634132' } -// 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..bc24eb9e 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.", @@ -598,28 +598,30 @@ }, "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 +629,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..b3f60e80 --- /dev/null +++ b/nf-test.config @@ -0,0 +1,24 @@ +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 'nextflow.config', 'nf-test.config', 'conf/test.config', 'tests/nextflow.config', 'tests/.nftignore' + + // load the necessary plugins + plugins { + load "nft-utils@0.0.5" + } +} 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..a3677e50 --- /dev/null +++ b/ro-crate-metadata.json @@ -0,0 +1,260 @@ +{ + "@context": "https://w3id.org/ro/crate/1.1/context", + "@graph": [ + { + "@id": "./", + "@type": "Dataset", + "creativeWorkStatus": "InProgress", + "datePublished": "2025-11-20T09:31:24+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.04.0-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-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\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/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.\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/usage/getting_started/configuration#custom-configuration-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\u00f6rn 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](.github/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": "assets/" + }, + { + "@id": "conf/" + }, + { + "@id": "docs/" + }, + { + "@id": "docs/images/" + }, + { + "@id": "modules/" + }, + { + "@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" + }, + "name": "nf-core/atacseq" + }, + { + "@id": "ro-crate-metadata.json", + "@type": "CreativeWork", + "about": { + "@id": "./" + }, + "conformsTo": [ + { + "@id": "https://w3id.org/ro/crate/1.1" + }, + { + "@id": "https://w3id.org/workflowhub/workflow-ro-crate/1.0" + } + ] + }, + { + "@id": "main.nf", + "@type": [ + "File", + "SoftwareSourceCode", + "ComputationalWorkflow" + ], + "dateCreated": "", + "dateModified": "2025-11-20T09:31:24Z", + "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", + "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.04.0" + }, + { + "@id": "assets/", + "@type": "Dataset", + "description": "Additional files" + }, + { + "@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/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/" + } + ] +} \ No newline at end of file diff --git a/subworkflows/local/bam_bedgraph_bigwig_bedtools_ucsc.nf b/subworkflows/local/bam_bedgraph_bigwig_bedtools_ucsc.nf index 0947571c..5796f407 100644 --- a/subworkflows/local/bam_bedgraph_bigwig_bedtools_ucsc.nf +++ b/subworkflows/local/bam_bedgraph_bigwig_bedtools_ucsc.nf @@ -10,7 +10,7 @@ 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() diff --git a/subworkflows/local/bam_filter_bamtools.nf b/subworkflows/local/bam_filter_bamtools.nf index 7c0bba66..fef11086 100644 --- a/subworkflows/local/bam_filter_bamtools.nf +++ b/subworkflows/local/bam_filter_bamtools.nf @@ -32,7 +32,7 @@ workflow BAM_FILTER_BAMTOOLS { BAMTOOLS_FILTER .out .bam - .branch { + .branch { meta, bam -> single_end: meta.single_end return [ meta, bam ] @@ -49,11 +49,23 @@ workflow BAM_FILTER_BAMTOOLS { } ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions.first()) + SAMTOOLS_INDEX.out.bai + .join(SAMTOOLS_INDEX.out.csi, by: [0], remainder: true) + .map { + meta, bai, csi -> + if (bai) { + [ meta, bai ] + } else { + [ meta, csi ] + } + } + .set { ch_index } + // // Run samtools stats, flagstat and idxstats on SE BAM // BAM_STATS_SAMTOOLS ( - ch_bam.single_end.join(SAMTOOLS_INDEX.out.bai), + ch_bam.single_end.join(ch_index), ch_fasta ) ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions.first()) @@ -62,7 +74,8 @@ workflow BAM_FILTER_BAMTOOLS { // Name sort PE BAM before filtering with pysam // SAMTOOLS_SORT ( - ch_bam.paired_end + ch_bam.paired_end, + ch_fasta ) ch_versions = ch_versions.mix(SAMTOOLS_SORT.out.versions.first()) @@ -87,6 +100,7 @@ workflow BAM_FILTER_BAMTOOLS { 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 ] ] + csi = BAM_SORT_STATS_SAMTOOLS.out.csi.mix(SAMTOOLS_INDEX.out.csi) // channel: [ val(meta), [ 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 ] ] 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 69% 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..69ecb99f 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,53 +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 - // - 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 + // Call peaks with MACS3 // - MACS2_CALLPEAK ( - ch_bed, + MACS3_CALLPEAK ( + ch_bam, macs_gsize ) - ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions.first()) + ch_versions = ch_versions.mix(MACS3_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 { + .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, peaks ] @@ -105,8 +86,8 @@ workflow BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER { 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_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() @@ -115,24 +96,24 @@ workflow BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER { // 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{it[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 + ch_versions = ch_versions.mix(PLOT_MACS3_QC.out.versions) // // Peak annotation QC plots with R @@ -150,21 +131,21 @@ workflow BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER { } 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 ] diff --git a/subworkflows/local/bam_shift_reads.nf b/subworkflows/local/bam_shift_reads.nf index 4e99c1df..a9ef9ec7 100644 --- a/subworkflows/local/bam_shift_reads.nf +++ b/subworkflows/local/bam_shift_reads.nf @@ -1,11 +1,12 @@ 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_fasta // channel: [ fasta ] main: ch_versions = Channel.empty() @@ -22,7 +23,8 @@ workflow BAM_SHIFT_READS { // Sort reads // SAMTOOLS_SORT ( - DEEPTOOLS_ALIGNMENTSIEVE.out.bam + DEEPTOOLS_ALIGNMENTSIEVE.out.bam, + ch_fasta ) ch_versions = ch_versions.mix(SAMTOOLS_SORT.out.versions) 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..292d3fd1 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,7 +19,7 @@ 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() @@ -29,7 +29,7 @@ workflow BED_CONSENSUS_QUANTIFY_QC_BEDTOOLS_FEATURECOUNTS_DESEQ2 { ch_peaks .collect { it[1] } .filter { it.size() > 1 } - .map { + .map { peaks -> [ [ id: 'consensus_peaks' ], peaks ] } @@ -38,11 +38,11 @@ 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) + ch_versions = ch_versions.mix(MACS3_CONSENSUS.out.versions) // // Annotate consensus peaks @@ -50,7 +50,7 @@ workflow BED_CONSENSUS_QUANTIFY_QC_BEDTOOLS_FEATURECOUNTS_DESEQ2 { ch_homer_annotatepeaks = Channel.empty() if (!skip_peak_annotation) { HOMER_ANNOTATEPEAKS ( - MACS2_CONSENSUS.out.bed, + MACS3_CONSENSUS.out.bed, ch_fasta, ch_gtf ) @@ -64,11 +64,11 @@ workflow BED_CONSENSUS_QUANTIFY_QC_BEDTOOLS_FEATURECOUNTS_DESEQ2 { .collect { it[1] } .filter { it.size() > 1 } .map { [ it ] } - .concat(MACS2_CONSENSUS.out.saf) + .concat(MACS3_CONSENSUS.out.saf) .collect() .filter { it.size() == 3 } .map { - bam, meta, saf -> + bam, meta, saf -> [ meta, bam , saf ] } .set { ch_bam_saf } @@ -112,11 +112,11 @@ workflow BED_CONSENSUS_QUANTIFY_QC_BEDTOOLS_FEATURECOUNTS_DESEQ2 { } 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 ] diff --git a/subworkflows/local/bigwig_plot_deeptools.nf b/subworkflows/local/bigwig_plot_deeptools.nf index 45c2c0c2..a51fa800 100644 --- a/subworkflows/local/bigwig_plot_deeptools.nf +++ b/subworkflows/local/bigwig_plot_deeptools.nf @@ -13,7 +13,7 @@ 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() diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index 0c00f5ba..1d832adc 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -30,9 +30,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..3b7d7613 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -31,7 +31,23 @@ 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() @@ -40,29 +56,29 @@ workflow PREPARE_GENOME { // 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] } + if (fasta.endsWith('.gz')) { + ch_fasta = GUNZIP_FASTA ( [ [:], fasta ] ).gunzip.map { tuple -> tuple[1] } ch_versions = ch_versions.mix(GUNZIP_FASTA.out.versions) } 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] } + if (gtf) { + if (gtf.endsWith('.gz')) { + ch_gtf = GUNZIP_GTF ( [ [:], gtf ] ).gunzip.map { tuple -> tuple[1] } ch_versions = ch_versions.mix(GUNZIP_GTF.out.versions) } 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] } + } else if (gff) { + if (gff.endsWith('.gz')) { + ch_gff = GUNZIP_GFF ( [ [:], gff ] ).gunzip.map { tuple -> tuple[1] } ch_versions = ch_versions.mix(GUNZIP_GFF.out.versions) } 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) @@ -72,26 +88,24 @@ workflow PREPARE_GENOME { // 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] } + if (blacklist) { + if (blacklist.endsWith('.gz')) { + ch_blacklist = GUNZIP_BLACKLIST ( [ [:], blacklist ] ).gunzip.map { tuple -> tuple[1] } ch_versions = ch_versions.mix(GUNZIP_BLACKLIST.out.versions) } 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 } } @@ -100,32 +114,32 @@ workflow PREPARE_GENOME { 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] } + if (gene_bed.endsWith('.gz')) { + ch_gene_bed = GUNZIP_GENE_BED ( [ [:], params.gene_bed ] ).gunzip.map { tuple -> tuple[1] } ch_versions = ch_versions.mix(GUNZIP_GENE_BED.out.versions) } 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] } + if (tss_bed.endsWith('.gz')) { + ch_tss_bed = GUNZIP_TSS_BED ( [ [:], tss_bed ] ).gunzip.map { tuple -> tuple[1] } ch_versions = ch_versions.mix(GUNZIP_TSS_BED.out.versions) } 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] } + CUSTOM_GETCHROMSIZES ( ch_fasta.map { item -> [ [:], item ] } ) + ch_chrom_sizes = CUSTOM_GETCHROMSIZES.out.sizes.map { tuple -> tuple[1] } + ch_fai = CUSTOM_GETCHROMSIZES.out.fai.map{ tuple -> tuple[1] } ch_versions = ch_versions.mix(CUSTOM_GETCHROMSIZES.out.versions) // @@ -146,8 +160,8 @@ workflow PREPARE_GENOME { 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) @@ -157,16 +171,15 @@ workflow PREPARE_GENOME { // 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 + if (bwa_index) { + if (bwa_index.endsWith('.tar.gz')) { + ch_bwa_index = UNTAR_BWA_INDEX ( [ [:], bwa_index ] ).untar ch_versions = ch_versions.mix(UNTAR_BWA_INDEX.out.versions) } 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 } } @@ -175,15 +188,15 @@ workflow PREPARE_GENOME { // 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 + if (bowtie2_index) { + if (bowtie2_index.endsWith('.tar.gz')) { + ch_bowtie2_index = UNTAR_BOWTIE2_INDEX ( [ [:], bowtie2_index ] ).untar ch_versions = ch_versions.mix(UNTAR_BOWTIE2_INDEX.out.versions) } 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_bowtie2_index = BOWTIE2_BUILD ( ch_fasta.map { item -> [ [:], item ] } ).index ch_versions = ch_versions.mix(BOWTIE2_BUILD.out.versions) } } @@ -193,15 +206,15 @@ workflow PREPARE_GENOME { // 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 + ch_versions = ch_versions.mix(UNTAR_CHROMAP_INDEX.out.versions) } 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_chromap_index = CHROMAP_INDEX ( ch_fasta.map { item -> [ [:], item ] } ).index ch_versions = ch_versions.mix(CHROMAP_INDEX.out.versions) } } @@ -211,12 +224,12 @@ workflow PREPARE_GENOME { // 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] } + if (star_index) { + if (star_index.endsWith('.tar.gz')) { + ch_star_index = UNTAR_STAR_INDEX ( [ [:], star_index ] ).untar.map{ tuple -> tuple[1] } ch_versions = ch_versions.mix(UNTAR_STAR_INDEX.out.versions) } 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 @@ -225,15 +238,15 @@ workflow PREPARE_GENOME { } // - // 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 + read_length ) - ch_macs_gsize = KHMER_UNIQUEKMERS.out.kmers.map { it.text.trim() } + ch_macs_gsize = KHMER_UNIQUEKMERS.out.kmers.map { item -> item.text.trim() } ch_versions = ch_versions.mix(KHMER_UNIQUEKMERS.out.versions) } @@ -250,7 +263,6 @@ 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 - + macs_gsize = ch_macs_gsize // integer: MACS3 genome size versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } 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..8c1705c5 --- /dev/null +++ b/subworkflows/local/utils_nfcore_atacseq_pipeline/main.nf @@ -0,0 +1,280 @@ +// +// 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 { imNotification } 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: + + ch_versions = channel.empty() + + // + // 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 + // + 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 +""" + 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 + hook_url // string: hook URL for notifications + 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) + if (hook_url) { + imNotification(summary_params, hook_url) + } + } + + workflow.onError { + log.error "Pipeline failed. Please refer to troubleshooting docs: https://nf-co.re/docs/usage/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..2de059b8 100644 --- a/subworkflows/nf-core/bam_markduplicates_picard/main.nf +++ b/subworkflows/nf-core/bam_markduplicates_picard/main.nf @@ -9,7 +9,7 @@ include { BAM_STATS_SAMTOOLS } from '../bam_stats_samtools/main' workflow BAM_MARKDUPLICATES_PICARD { take: - ch_bam // channel: [ val(meta), path(bam) ] + ch_reads // channel: [ val(meta), path(reads) ] ch_fasta // channel: [ path(fasta) ] ch_fai // channel: [ path(fai) ] @@ -17,31 +17,33 @@ workflow BAM_MARKDUPLICATES_PICARD { ch_versions = Channel.empty() - PICARD_MARKDUPLICATES ( ch_bam, ch_fasta.map { [ [:], it ] }, ch_fai.map { [ [:], it ] } ) + PICARD_MARKDUPLICATES ( ch_reads, ch_fasta, ch_fai ) ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES.out.versions.first()) - SAMTOOLS_INDEX ( PICARD_MARKDUPLICATES.out.bam ) + ch_markdup = PICARD_MARKDUPLICATES.out.bam.mix(PICARD_MARKDUPLICATES.out.cram) + + SAMTOOLS_INDEX ( ch_markdup ) ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions.first()) - 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 ] - } + ch_reads_index = ch_markdup + .join(SAMTOOLS_INDEX.out.bai, by: [0], remainder: true) + .join(SAMTOOLS_INDEX.out.crai, by: [0], remainder: true) + .join(SAMTOOLS_INDEX.out.csi, by: [0], remainder: true) + .map{meta, reads, bai, crai, csi -> + if (bai) [ meta, reads, bai ] + else if (crai) [ meta, reads, crai ] + else [ meta, reads, csi ] } - BAM_STATS_SAMTOOLS ( ch_bam_bai, ch_fasta ) + BAM_STATS_SAMTOOLS ( ch_reads_index, ch_fasta ) ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) emit: bam = PICARD_MARKDUPLICATES.out.bam // channel: [ val(meta), path(bam) ] - metrics = PICARD_MARKDUPLICATES.out.metrics // 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) ] bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), path(bai) ] + crai = SAMTOOLS_INDEX.out.crai // channel: [ val(meta), path(crai) ] csi = SAMTOOLS_INDEX.out.csi // channel: [ val(meta), path(csi) ] stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), path(stats) ] diff --git a/subworkflows/nf-core/bam_markduplicates_picard/meta.yml b/subworkflows/nf-core/bam_markduplicates_picard/meta.yml index d5e71609..433d35b2 100644 --- a/subworkflows/nf-core/bam_markduplicates_picard/meta.yml +++ b/subworkflows/nf-core/bam_markduplicates_picard/meta.yml @@ -6,22 +6,21 @@ 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) ] + Sequence reads in BAM/CRAM/SAM format + Structure: [ val(meta), path(reads) ] - ch_fasta: description: | - Reference genome fasta file + Reference genome fasta file required for CRAM input Structure: [ path(fasta) ] - ch_fasta: description: | @@ -30,12 +29,20 @@ input: 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 @@ -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..5ef337dc --- /dev/null +++ b/subworkflows/nf-core/bam_markduplicates_picard/tests/main.nf.test @@ -0,0 +1,93 @@ +nextflow_workflow { + + name "Test Workflow BAM_MARKDUPLICATES_PICARD" + script "../main.nf" + workflow "BAM_MARKDUPLICATES_PICARD" + + 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) + ]) + input[2] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + path(workflow.out.bam[0][1]), + path(workflow.out.bai[0][1]), + path(workflow.out.flagstat[0][1]), + path(workflow.out.idxstats[0][1]), + path(workflow.out.stats[0][1]), + ).match("sarscov2 - bam") }, + { assert path(workflow.out.metrics.get(0).get(1)).getText().contains("97") } + ) + } + } + + 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) + ]) + input[2] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + file(workflow.out.cram[0][1]).name, + path(workflow.out.crai[0][1]), + path(workflow.out.flagstat[0][1]), + path(workflow.out.idxstats[0][1]), + path(workflow.out.stats[0][1]), + ).match("homo_sapiens - cram") }, + { assert path(workflow.out.metrics.get(0).get(1)).getText().contains("0.999986") } + ) + } + } + +} 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..caf4ac8a --- /dev/null +++ b/subworkflows/nf-core/bam_markduplicates_picard/tests/main.nf.test.snap @@ -0,0 +1,30 @@ +{ + "homo_sapiens - cram": { + "content": [ + "test.cram", + "test.cram.crai:md5,78d47ba01ac4e05f3ae1e353902a989e", + "test.flagstat:md5,93b0ef463df947ede1f42ff60396c34d", + "test.idxstats:md5,e179601fa7b8ebce81ac3765206f6c15", + "test.stats:md5,c2f74a4d9b2377bcf4f4f184da3801af" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T20:45:38.364189" + }, + "sarscov2 - bam": { + "content": [ + "test.bam:md5,3091fe6ba1b7530f382fe40b9fd8f45b", + "test.bam.bai:md5,4d3ae8d013444b55e17aa0149a2ab404", + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783", + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2", + "test.stats:md5,d7796222a087b9bb97f631f1c21b9c95" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-21T11:38:08.434529" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/bam_markduplicates_picard/tests/tags.yml b/subworkflows/nf-core/bam_markduplicates_picard/tests/tags.yml new file mode 100644 index 00000000..10b85270 --- /dev/null +++ b/subworkflows/nf-core/bam_markduplicates_picard/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/bam_markduplicates_picard: + - subworkflows/nf-core/bam_markduplicates_picard/** diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/main.nf b/subworkflows/nf-core/bam_sort_stats_samtools/main.nf index fc1c652b..b716375b 100644 --- a/subworkflows/nf-core/bam_sort_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_sort_stats_samtools/main.nf @@ -15,7 +15,7 @@ workflow BAM_SORT_STATS_SAMTOOLS { ch_versions = Channel.empty() - SAMTOOLS_SORT ( ch_bam ) + SAMTOOLS_SORT ( ch_bam, ch_fasta ) ch_versions = ch_versions.mix(SAMTOOLS_SORT.out.versions.first()) SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) 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..75b5b934 --- /dev/null +++ b/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test @@ -0,0 +1,82 @@ +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 { + params { + outdir = "$outputDir" + } + 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) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert workflow.out.bam.get(0).get(1) ==~ ".*.bam"}, + { assert workflow.out.bai.get(0).get(1) ==~ ".*.bai"}, + { assert snapshot(workflow.out.stats).match("test_bam_sort_stats_samtools_single_end_stats") }, + { assert snapshot(workflow.out.flagstat).match("test_bam_sort_stats_samtools_single_end_flagstats") }, + { assert snapshot(workflow.out.idxstats).match("test_bam_sort_stats_samtools_single_end_idxstats") } + ) + } + } + + test("test_bam_sort_stats_samtools_paired_end") { + + when { + params { + outdir = "$outputDir" + } + 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) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert workflow.out.bam.get(0).get(1) ==~ ".*.bam"}, + { assert workflow.out.bai.get(0).get(1) ==~ ".*.bai"}, + { assert snapshot(workflow.out.stats).match("test_bam_sort_stats_samtools_paired_end_stats") }, + { assert snapshot(workflow.out.flagstat).match("test_bam_sort_stats_samtools_paired_end_flagstats") }, + { assert snapshot(workflow.out.idxstats).match("test_bam_sort_stats_samtools_paired_end_idxstats") } + ) + } + } +} 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..6645a092 --- /dev/null +++ b/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap @@ -0,0 +1,110 @@ +{ + "test_bam_sort_stats_samtools_paired_end_flagstats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2023-10-22T20:25:03.687121177" + }, + "test_bam_sort_stats_samtools_paired_end_idxstats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2023-10-22T20:25:03.709648916" + }, + "test_bam_sort_stats_samtools_single_end_stats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,cb0bf2b79de52fdf0c61e80efcdb0bb4" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:44:38.553256801" + }, + "test_bam_sort_stats_samtools_paired_end_stats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d7796222a087b9bb97f631f1c21b9c95" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:44:48.355870518" + }, + "test_bam_sort_stats_samtools_single_end_idxstats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,613e048487662c694aa4a2f73ca96a20" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-01-18T17:10:02.84631" + }, + "test_bam_sort_stats_samtools_single_end_flagstats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,2191911d72575a2358b08b1df64ccb53" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-01-18T17:10:02.829756" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/tests/tags.yml b/subworkflows/nf-core/bam_sort_stats_samtools/tests/tags.yml new file mode 100644 index 00000000..30b69d6a --- /dev/null +++ b/subworkflows/nf-core/bam_sort_stats_samtools/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/bam_sort_stats_samtools: + - subworkflows/nf-core/bam_sort_stats_samtools/** diff --git a/subworkflows/nf-core/bam_stats_samtools/main.nf b/subworkflows/nf-core/bam_stats_samtools/main.nf index e80ce43a..44d4c010 100644 --- a/subworkflows/nf-core/bam_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_stats_samtools/main.nf @@ -14,7 +14,7 @@ workflow BAM_STATS_SAMTOOLS { main: ch_versions = Channel.empty() - SAMTOOLS_STATS ( ch_bam_bai, ch_fasta.map { [ [:], it ] } ) + SAMTOOLS_STATS ( ch_bam_bai, ch_fasta ) ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions) SAMTOOLS_FLAGSTAT ( ch_bam_bai ) 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..c8b21f28 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test @@ -0,0 +1,108 @@ +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 { + params { + outdir = "$outputDir" + } + 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) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out.stats).match("test_bam_stats_samtools_single_end_stats") }, + { assert snapshot(workflow.out.flagstat).match("test_bam_stats_samtools_single_end_flagstats") }, + { assert snapshot(workflow.out.idxstats).match("test_bam_stats_samtools_single_end_idxstats") } + ) + } + } + + test("test_bam_stats_samtools_paired_end") { + + when { + params { + outdir = "$outputDir" + } + 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) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out.stats).match("test_bam_stats_samtools_paired_end_stats") }, + { assert snapshot(workflow.out.flagstat).match("test_bam_stats_samtools_paired_end_flagstats") }, + { assert snapshot(workflow.out.idxstats).match("test_bam_stats_samtools_paired_end_idxstats") } + ) + } + } + + test("test_bam_stats_samtools_paired_end_cram") { + + when { + params { + outdir = "$outputDir" + } + 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) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out.stats).match("test_bam_stats_samtools_paired_end_cram_stats") }, + { assert snapshot(workflow.out.flagstat).match("test_bam_stats_samtools_paired_end_cram_flagstats") }, + { assert snapshot(workflow.out.idxstats).match("test_bam_stats_samtools_paired_end_cram_idxstats") } + ) + } + } + +} 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..bf0b0c69 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap @@ -0,0 +1,164 @@ +{ + "test_bam_stats_samtools_paired_end_cram_flagstats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,a53f3d26e2e9851f7d528442bbfe9781" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2023-11-06T09:31:26.194017574" + }, + "test_bam_stats_samtools_paired_end_stats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,ddaf8f33fe9c1ebe9b06933213aec8ed" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:45:06.230091746" + }, + "test_bam_stats_samtools_paired_end_flagstats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-01-18T17:17:27.717482" + }, + "test_bam_stats_samtools_single_end_flagstats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,2191911d72575a2358b08b1df64ccb53" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2023-11-06T09:26:10.340046381" + }, + "test_bam_stats_samtools_paired_end_cram_idxstats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,e179601fa7b8ebce81ac3765206f6c15" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2023-11-06T09:31:26.207052003" + }, + "test_bam_stats_samtools_single_end_stats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,dc178e1a4956043aba8abc83e203521b" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:44:57.442208382" + }, + "test_bam_stats_samtools_paired_end_idxstats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-01-18T17:17:27.726719" + }, + "test_bam_stats_samtools_single_end_idxstats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,613e048487662c694aa4a2f73ca96a20" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2023-11-06T09:26:10.349439801" + }, + "test_bam_stats_samtools_paired_end_cram_stats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d3345c4887f4a9ea4f7f56405b495db0" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:45:14.997164209" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/tags.yml b/subworkflows/nf-core/bam_stats_samtools/tests/tags.yml new file mode 100644 index 00000000..ec2f2d68 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/bam_stats_samtools: + - subworkflows/nf-core/bam_stats_samtools/** diff --git a/subworkflows/nf-core/fastq_align_bowtie2/main.nf b/subworkflows/nf-core/fastq_align_bowtie2/main.nf index e77cb2c4..cafaa9bf 100644 --- a/subworkflows/nf-core/fastq_align_bowtie2/main.nf +++ b/subworkflows/nf-core/fastq_align_bowtie2/main.nf @@ -20,19 +20,19 @@ workflow FASTQ_ALIGN_BOWTIE2 { // // 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 ) + ch_versions = ch_versions.mix(BOWTIE2_ALIGN.out.versions) // // Sort, index BAM file and run samtools stats, flagstat and idxstats // - BAM_SORT_STATS_SAMTOOLS ( BOWTIE2_ALIGN.out.aligned, ch_fasta ) + BAM_SORT_STATS_SAMTOOLS ( BOWTIE2_ALIGN.out.bam, ch_fasta ) ch_versions = ch_versions.mix(BAM_SORT_STATS_SAMTOOLS.out.versions) 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_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 ] ] bai = BAM_SORT_STATS_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] diff --git a/subworkflows/nf-core/fastq_align_bowtie2/meta.yml b/subworkflows/nf-core/fastq_align_bowtie2/meta.yml index 4900670f..58023a89 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 @@ -60,6 +61,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..b5e84f51 --- /dev/null +++ b/subworkflows/nf-core/fastq_align_bowtie2/tests/main.nf.test @@ -0,0 +1,99 @@ +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.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true)]) + """ + } + } + } + when { + workflow { + """ + input[0] = Channel.of([[ id:'test', single_end:true ], [ file(params.test_data['sarscov2']['illumina']['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.test_data['sarscov2']['genome']['genome_fasta'], 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.bai[0][1]).name, + workflow.out.csi, + 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.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true)]) + """ + } + } + } + when { + workflow { + """ + input[0] = Channel.of([[ id:'test', single_end:false ], [file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true), file(params.test_data['sarscov2']['illumina']['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.test_data['sarscov2']['genome']['genome_fasta'], 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.bai[0][1]).name, + workflow.out.csi, + 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..c0f3f8bf --- /dev/null +++ b/subworkflows/nf-core/fastq_align_bowtie2/tests/main.nf.test.snap @@ -0,0 +1,126 @@ +{ + "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.bam.stats:md5,9a65272e49581873b1ea211f738e992f" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.flagstat:md5,e9ce9093133116bc54fd335cfe698372" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.idxstats:md5,e16eb632f7f462514b0873c7ac8ac905" + ] + ], + [ + "versions.yml:md5,5d5ab1d650a93d8bb5ed142943798a6a", + "versions.yml:md5,666dbae2343fc479e483656c35d3d8a1", + "versions.yml:md5,aab337e63eac9055aadb9a35cec16053", + "versions.yml:md5,c27f74d9c37fbb3365c437a9f7e81c27", + "versions.yml:md5,eb9364a9f1745d6a345b8b4b03aebe25", + "versions.yml:md5,f982efa9031f340ace29f76dd47a8ce1" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-18T14:40:54.318808117" + }, + "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.bam.stats:md5,1086d408391af2a5c80c6dee0efa7e59" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.flagstat:md5,49f3d51a8804ce58fe9cecd2549d279b" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.idxstats:md5,29ff2fa56d35b2a47625b8f517f1a947" + ] + ], + [ + "versions.yml:md5,5d5ab1d650a93d8bb5ed142943798a6a", + "versions.yml:md5,666dbae2343fc479e483656c35d3d8a1", + "versions.yml:md5,aab337e63eac9055aadb9a35cec16053", + "versions.yml:md5,c27f74d9c37fbb3365c437a9f7e81c27", + "versions.yml:md5,eb9364a9f1745d6a345b8b4b03aebe25", + "versions.yml:md5,f982efa9031f340ace29f76dd47a8ce1" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-18T14:41:11.243874685" + } +} \ 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..2f85e807 --- /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.bam" } + } +} diff --git a/subworkflows/nf-core/fastq_align_bowtie2/tests/tags.yml b/subworkflows/nf-core/fastq_align_bowtie2/tests/tags.yml new file mode 100644 index 00000000..267bcc77 --- /dev/null +++ b/subworkflows/nf-core/fastq_align_bowtie2/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/fastq_align_bowtie2: + - subworkflows/nf-core/fastq_align_bowtie2/** diff --git a/subworkflows/nf-core/fastq_align_bwa/main.nf b/subworkflows/nf-core/fastq_align_bwa/main.nf index 4ce4f886..c7408d08 100644 --- a/subworkflows/nf-core/fastq_align_bwa/main.nf +++ b/subworkflows/nf-core/fastq_align_bwa/main.nf @@ -10,7 +10,7 @@ workflow FASTQ_ALIGN_BWA { 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_fasta // channel (optional) : [ val(meta3), path(fasta) ] main: ch_versions = Channel.empty() @@ -19,7 +19,7 @@ workflow FASTQ_ALIGN_BWA { // Map reads with BWA // - BWA_MEM ( ch_reads, ch_index, val_sort_bam ) + BWA_MEM ( ch_reads, ch_index, ch_fasta, val_sort_bam ) ch_versions = ch_versions.mix(BWA_MEM.out.versions.first()) // diff --git a/subworkflows/nf-core/fastq_align_bwa/meta.yml b/subworkflows/nf-core/fastq_align_bwa/meta.yml index 548fec3f..fa218408 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,7 +24,7 @@ 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 @@ -30,9 +32,8 @@ input: - ch_fasta: 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. This only needs to be given if val_sort_bam = true. + Structure: [ val(meta), path(fasta) ] output: - bam_orig: description: | @@ -68,3 +69,5 @@ output: 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..93c3aac3 --- /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.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true)]) + """ + } + } + } + when { + workflow { + """ + input[0] = Channel.of([[ id:'test', single_end:true ],[ file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) ]]) + input[1] = BWA_INDEX.out.index + input[2] = false + input[3] = Channel.value([[id: 'genome'], file(params.test_data['sarscov2']['genome']['genome_fasta'], 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.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true)]) + """ + } + } + } + when { + workflow { + """ + input[0] = Channel.of([[ id:'test', single_end:false ], [file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true), file(params.test_data['sarscov2']['illumina']['test_2_fastq_gz'], checkIfExists: true)] + ] ) + input[1] = BWA_INDEX.out.index + input[2] = false + input[3] = Channel.value([[id: 'genome'], file(params.test_data['sarscov2']['genome']['genome_fasta'], 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..8e8075da --- /dev/null +++ b/subworkflows/nf-core/fastq_align_bwa/tests/main.nf.test.snap @@ -0,0 +1,284 @@ +{ + "fastq_align_bwa_paired_end": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,aea123a3828a99da1906126355f15a12" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,8d6755b312c5c41ff32632a0734e13df" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.bai:md5,b5b49beae3e9ff2c620e680d81ceff81" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.stats:md5,9c42440e435b7ad02a343d367affafcd" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.flagstat:md5,18d602435a02a4d721b78d1812622159" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.idxstats:md5,85d20a901eef23ca50c323638a2eb602" + ] + ], + "7": [ + "versions.yml:md5,484d99e7712f776c479382a1f338845f", + "versions.yml:md5,4ebdf6c874da163e55a849b73e30a5d1", + "versions.yml:md5,634430380db3a08ad4e56159b82af9e8", + "versions.yml:md5,703c0bec9aac86f8e74b082131814e55", + "versions.yml:md5,959c12230206836d2572f1ac5a401f2f", + "versions.yml:md5,ca8dc5bf65d052d902af1b03fec0b1fd" + ], + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.bai:md5,b5b49beae3e9ff2c620e680d81ceff81" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,8d6755b312c5c41ff32632a0734e13df" + ] + ], + "bam_orig": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,aea123a3828a99da1906126355f15a12" + ] + ], + "csi": [ + + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.flagstat:md5,18d602435a02a4d721b78d1812622159" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.idxstats:md5,85d20a901eef23ca50c323638a2eb602" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.stats:md5,9c42440e435b7ad02a343d367affafcd" + ] + ], + "versions": [ + "versions.yml:md5,484d99e7712f776c479382a1f338845f", + "versions.yml:md5,4ebdf6c874da163e55a849b73e30a5d1", + "versions.yml:md5,634430380db3a08ad4e56159b82af9e8", + "versions.yml:md5,703c0bec9aac86f8e74b082131814e55", + "versions.yml:md5,959c12230206836d2572f1ac5a401f2f", + "versions.yml:md5,ca8dc5bf65d052d902af1b03fec0b1fd" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-14T13:25:38.265819012" + }, + "fastq_align_bwa_single_end": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,a74710a0345b4717bb4431bf9c257120" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam:md5,e023c5a6d28a4998a0d8199c459c2a08" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.bai:md5,9257847727b20a8f7288ad6912fbada4" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.stats:md5,c8e4edbf950def8abbd9e4ae74b31383" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.flagstat:md5,2191911d72575a2358b08b1df64ccb53" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.idxstats:md5,613e048487662c694aa4a2f73ca96a20" + ] + ], + "7": [ + "versions.yml:md5,484d99e7712f776c479382a1f338845f", + "versions.yml:md5,4ebdf6c874da163e55a849b73e30a5d1", + "versions.yml:md5,634430380db3a08ad4e56159b82af9e8", + "versions.yml:md5,703c0bec9aac86f8e74b082131814e55", + "versions.yml:md5,959c12230206836d2572f1ac5a401f2f", + "versions.yml:md5,ca8dc5bf65d052d902af1b03fec0b1fd" + ], + "bai": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.bai:md5,9257847727b20a8f7288ad6912fbada4" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam:md5,e023c5a6d28a4998a0d8199c459c2a08" + ] + ], + "bam_orig": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,a74710a0345b4717bb4431bf9c257120" + ] + ], + "csi": [ + + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.flagstat:md5,2191911d72575a2358b08b1df64ccb53" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.idxstats:md5,613e048487662c694aa4a2f73ca96a20" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.stats:md5,c8e4edbf950def8abbd9e4ae74b31383" + ] + ], + "versions": [ + "versions.yml:md5,484d99e7712f776c479382a1f338845f", + "versions.yml:md5,4ebdf6c874da163e55a849b73e30a5d1", + "versions.yml:md5,634430380db3a08ad4e56159b82af9e8", + "versions.yml:md5,703c0bec9aac86f8e74b082131814e55", + "versions.yml:md5,959c12230206836d2572f1ac5a401f2f", + "versions.yml:md5,ca8dc5bf65d052d902af1b03fec0b1fd" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-14T13:25:08.154131783" + } +} \ 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_bwa/tests/tags.yml b/subworkflows/nf-core/fastq_align_bwa/tests/tags.yml new file mode 100644 index 00000000..bfe89ccf --- /dev/null +++ b/subworkflows/nf-core/fastq_align_bwa/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/fastq_align_bwa: + - subworkflows/nf-core/fastq_align_bwa/** diff --git a/subworkflows/nf-core/fastq_align_chromap/main.nf b/subworkflows/nf-core/fastq_align_chromap/main.nf index 9d706c98..26b6a4be 100644 --- a/subworkflows/nf-core/fastq_align_chromap/main.nf +++ b/subworkflows/nf-core/fastq_align_chromap/main.nf @@ -27,7 +27,7 @@ workflow FASTQ_ALIGN_CHROMAP { // // Sort, index BAM file and run samtools stats, flagstat and idxstats // - BAM_SORT_STATS_SAMTOOLS(CHROMAP_CHROMAP.out.bam, ch_fasta.map { it[1] }) + BAM_SORT_STATS_SAMTOOLS(CHROMAP_CHROMAP.out.bam, ch_fasta) ch_versions = ch_versions.mix(BAM_SORT_STATS_SAMTOOLS.out.versions) emit: diff --git a/subworkflows/nf-core/fastq_align_chromap/meta.yml b/subworkflows/nf-core/fastq_align_chromap/meta.yml index d5f59cac..1db3eff1 100644 --- a/subworkflows/nf-core/fastq_align_chromap/meta.yml +++ b/subworkflows/nf-core/fastq_align_chromap/meta.yml @@ -10,13 +10,14 @@ keywords: - chip-seq - atac-seq - hic -modules: +components: - chromap/chromap - samtools/sort - samtools/index - samtools/stats - samtools/idxstats - samtools/flagstat + - bam_sort_stats_samtools input: - meta: type: map @@ -98,3 +99,5 @@ output: pattern: "versions.yml" authors: - "@JoseEspinosa" +maintainers: + - "@JoseEspinosa" diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/main.nf b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/main.nf index db2e5b32..262cbf53 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() + fastqc_html = channel.empty() + fastqc_zip = channel.empty() if (!skip_fastqc) { - FASTQC (reads) + FASTQC(reads) fastqc_html = FASTQC.out.html - fastqc_zip = FASTQC.out.zip - ch_versions = ch_versions.mix(FASTQC.out.versions.first()) + fastqc_zip = FASTQC.out.zip } - umi_reads = reads - umi_log = Channel.empty() + trimmer_reads = reads + umi_log = channel.empty() + 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) + trimmer_reads = UMITOOLS_EXTRACT.out.reads + umi_reads = UMITOOLS_EXTRACT.out.reads + 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 { 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() + trim_reads = trimmer_reads + trim_unpaired = channel.empty() + trim_html = channel.empty() + trim_zip = channel.empty() + trim_log = channel.empty() + trim_read_count = channel.empty() if (!skip_trimming) { - TRIMGALORE (umi_reads) + TRIMGALORE(trimmer_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()) + trim_html = TRIMGALORE.out.html + trim_zip = TRIMGALORE.out.zip + trim_log = TRIMGALORE.out.log // // Filter FastQ files based on minimum trimmed read count after adapter trimming // - TRIMGALORE - .out - .reads + 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 ] - } + .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 ] } + .filter { _meta, _reads, num_reads -> num_reads >= min_trimmed_reads.toFloat() } + .map { meta, reads_, _num_reads -> [meta, reads_] } .set { trim_reads } ch_num_trimmed_reads - .map { meta, reads, num_reads -> [ meta, num_reads ] } + .map { meta, _reads, num_reads -> [meta, num_reads] } .set { 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 = trim_reads // channel: [ val(meta), [ reads ] ] + fastqc_html // channel: [ val(meta), [ html ] ] + fastqc_zip // channel: [ val(meta), [ zip ] ] + umi_log // channel: [ val(meta), [ log ] ] + umi_reads // channel: [ val(meta), [ reads ] ] + 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) ] } 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..1c66c068 --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test @@ -0,0 +1,274 @@ +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 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..a22db98b --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test.snap @@ -0,0 +1,527 @@ +{ + "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" + } +} \ No newline at end of file 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..2f30e9a4 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -0,0 +1,419 @@ +// +// 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 +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 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}-") + } +} + +// +// Construct and send a notification to a web server as JSON e.g. Microsoft Teams and Slack +// +def imNotification(summary_params, hook_url) { + def summary = [:] + summary_params + .keySet() + .sort() + .each { group -> + 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'] = getWorkflowVersion() + 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("${workflow.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()) + } +} 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.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..ee4738c8 --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -0,0 +1,74 @@ +// +// 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 : "", + ) + 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..8d8c7371 --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -0,0 +1,8 @@ +plugins { + id "nf-schema@2.5.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..2479b405 --- /dev/null +++ b/tests/.nftignore @@ -0,0 +1,98 @@ +# === 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 + +# 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 + +# Feature counting +**/*.featureCounts.txt +**/*.featureCounts.txt.summary + +# 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..db9b185d --- /dev/null +++ b/tests/bowtie2.nf.test.snap @@ -0,0 +1,999 @@ +{ + "bowtie2": { + "content": [ + 264, + { + + }, + [ + "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.txt", + "bowtie2/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.txt.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.txt", + "bowtie2/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.txt.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.MarkDuplicates.metrics.txt", + "bowtie2/merged_replicate/picard_metrics/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.MarkDuplicates.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_chipseq_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,c4ca22efb3fde3d789c36ba6d5799c3b", + "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,8b22e8c8ecea9894ed833dd6cddc54b3", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt:md5,b764128ab7799892423b19c6ccb4b626", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt:md5,d47768f439c8d34cac3bc2674742b469", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt:md5,f580c4c31ccbc7166c376d56c02a9bb8", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt:md5,07141ad6a6b31c3352cd2bf792d51244", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak:md5,ea09e6f989d568179bb6d4016ce6b05c", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak:md5,af70a4bbd09f93d477f7bf0da412e7c1", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls:md5,6658cf4e398b73f79feaa4ec0738458c", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak:md5,367fd45a7763b51d4cd9fedb0fe166cf", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak:md5,de818e40e8b1f54370b61f0bb8f13971", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls:md5,ad17e1190178a918c4b011777ca2dbef", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak:md5,b027f21fdeeab2aded434cdf0662eade", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak:md5,bba8bcfb72a3a618fc73c50e5a441ff0", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls:md5,8957ed96feb20b95dacdb42d664390e7", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak:md5,532e5a716c9eaee4e5cb902db93b0330", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak:md5,5d0c059f3f3859552063c01c87377f36", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls:md5,c5d6592ae571aa288dd546e6f486a915", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak:md5,cb670f5524bfeec98e13791901cf5e85", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak:md5,30007654f473d64d04142398686cc044", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls:md5,6b9727ec35ddf2c08d6b83a2a0c07352", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak:md5,4f8717f68a96566461d4a5d89ff8c8b4", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak:md5,009c53e1ebe0c3c15a850204b90f170a", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls:md5,85eff9164c2d26bf5d6e8b91bb6c8479", + "consensus_peaks.mLb.clN.bed:md5,22d733ece656a67a422b0315b23f9c9f", + "consensus_peaks.mLb.clN.boolean.intersect.txt:md5,b94b233aed48706619605c02b2863c86", + "consensus_peaks.mLb.clN.boolean.txt:md5,1ee192755172f74353f735194c220286", + "consensus_peaks.mLb.clN.saf:md5,57d7ef9d115b95642d0c3ec3a3ba527a", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,550a1828bac887ad03d668a762d054c9", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,b29ff7969612feb9378b8eb9b2756cf0", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,d918d617a20f38604fb310abd2fcb87a", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,4c3c7cbd5b0ccefc634e80462664dc53", + "OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt:md5,7d35bd13b608e03d40a55e3f3bfd09a8", + "OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt:md5,2eb0b01a2d9f8532d6a45bb75a4af284", + "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,8a1652741df9b4a0cab8c5d55b6c159f", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,9e1e3f161db661fe94fb8bbf28400c16", + "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,06dce40a946a13c3de60a7adae34a9a8", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,05f386e99a2bf491736faf401e9f6955", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,46c746a5e42ac20fe00d33fb7edb50de", + "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,a36753550e07fa88497c773cbe906b12", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,a9cd3bbd45b9d0699289ea7d17b4ceb8", + "macs3_annotatePeaks.mLb.clN.summary.txt:md5,d46466e2a03007ea07cdb72898a6fc9f", + "macs3_annotatePeaks.mLb.clN.summary_mqc.tsv:md5,c077a52f6ba1578716ced3056ca853bc", + "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,c661090a3b16a1bd8266d2944e5275aa", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats:md5,2311c10365c6d32686687c45364a4c68", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat:md5,05d63c2a96930d95903ba473715471ab", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats:md5,8a1ccd0919ab4bc46900bc2d3766545d", + "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,f3717f20b0a147335489af5e491a465e", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats:md5,789966115fa1a61465325dd032d8d6bb", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat:md5,7bf27dfca2de687108b3422d07bced38", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats:md5,30ccd67075e44547cfeed66775cc06e0", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,b78928acedd953b463f2fafbaddd2db2", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,9214dcd7af45625536c802e8a0fcbd8d", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,e3ffc456e11644eeb263635b5de06c60", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,68ffb74938104b83fed53eeaf944257a", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,8576b7091d4dcc02813958d9480c5343", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,e01b20f6830a87d270e2b0669c545839", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,a0bfcc840028961bdbfade2171d7b3af", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,d1a9ffc601796bc331b706da39f84c3b", + "OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt:md5,4ae52326ea6d9c88981794990d160d7a", + "OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt:md5,3949285f45e86c07a28376a6e9cf82db", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak:md5,83b6b10167ebd2c62178baedfaa2bac7", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak:md5,4d8d3899e01feaa535f40b731106376a", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls:md5,eb10956577cc7de4c52461e385752da0", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak:md5,6bd7edef426ea7ecea92cb6d8e4dbb5b", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak:md5,c48b4fe741c360ec5a37a586237b4b99", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls:md5,6196d4630c50da3ad51c2dcd51bdb5cf", + "consensus_peaks.mRp.clN.bed:md5,a78537a7090fab8981e4d6090d15aebe", + "consensus_peaks.mRp.clN.boolean.intersect.txt:md5,89344ae317e6c1e28c863527dad5e198", + "consensus_peaks.mRp.clN.boolean.txt:md5,4b338bf5bcffe441aa04b923558a0472", + "consensus_peaks.mRp.clN.saf:md5,4845f51306cf1497609bc1a61a289dea", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,29d08d9150fee1b39574149813b214d9", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,6e1dd2c9fee4e2eb68e8ecf7ca2d5346", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,74899652a36d8fa5904f4162c5be88ac", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,b7866b3eecbaef33e997148d5da83644", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv:md5,1b7f58e64f3f7acafecdf885fa42b432", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv:md5,fcf12be4d7c8cd044f8ebeaf36992d92", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv:md5,cba5bf9706da1fab1835f8cfc7db2835", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv:md5,38c01dcf4843f83c55cdd17caa461c74", + "macs3_annotatePeaks.mRp.clN.summary.txt:md5,2be9d8b64f5b30cc2b533306e8abc167", + "macs3_annotatePeaks.mRp.clN.summary_mqc.tsv:md5,a962cee655d6ebdfa3c16f34363a35b0", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat:md5,d340f1bcbbff2b04bfc55ef0852b770e", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats:md5,cfcb9972dc21c1354a43ef90d86dc0a7", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat:md5,65caad221a0d196cb4856def965b0a4d", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats:md5,fb8d44a124a8afc03cea5a360c441b1e", + "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,e471b58fc0050c2a64bf32b77a9bd3cb", + "mqc_fastqc_adapter_content_plot-2_1.txt:md5,7050d22f2eabdafb3d1eb81e736599af", + "mqc_fastqc_adapter_content_plot_1.txt:md5,66f3e2f6ba14599b0d6c20144df60777", + "mqc_fastqc_per_base_n_content_plot-2_1.txt:md5,7c5db7fad8afe578076466416e17bbd0", + "mqc_fastqc_per_base_n_content_plot_1.txt:md5,8d9cdd0463193b7e10332e2ca0273aca", + "mqc_fastqc_per_base_sequence_quality_plot-2_1.txt:md5,3f7c1c4998d41f10fcc48f15fc1c214f", + "mqc_fastqc_per_base_sequence_quality_plot_1.txt:md5,821cb87b0ae8bd61cd445d153b8f371a", + "mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt:md5,076f8f06afb71ddf1de87480c0a937ab", + "mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt:md5,4f0d049c48c4cde730fdc2ee37130658", + "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,3dde643427f3229f283527966d7dd32e", + "mqc_fastqc_per_sequence_quality_scores_plot_1.txt:md5,3bfe1c94f710975829e2c1e3b5f16ea7", + "mqc_fastqc_sequence_counts_plot-2_1.txt:md5,83670beba48f5d0a1ff4bb038628f49e", + "mqc_fastqc_sequence_counts_plot_1.txt:md5,d0cf8d64e742b5f446e6b602d86913b9", + "mqc_fastqc_sequence_duplication_levels_plot-2_1.txt:md5,907ad5b8fb27d2d9fd19281c8fa77e65", + "mqc_fastqc_sequence_duplication_levels_plot_1.txt:md5,23c4883ed6c22212b0c3e07a863745d1", + "mqc_fastqc_sequence_length_distribution_plot_1.txt:md5,46650932914f76713075e12934d6fcfe", + "mqc_featureCounts_assignment_plot-2_1.txt:md5,8b39250a1171c6c6bb78a4305b90fec4", + "mqc_featureCounts_assignment_plot_1.txt:md5,9a5acc803f46c321d63a24f00a847f73", + "mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt:md5,da2027ac0f5b3d5c8f09d143e33d5b7e", + "mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt:md5,df5f2b22f6cfd3f283a85ca992681e01", + "mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt:md5,08a2bd1f3f0a49f45c28727cc1ddb2e5", + "mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt:md5,65d1d255cd23f7411a08b16835c80ade", + "mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt:md5,0a510f24402ef3b6ab449fc469b59ae0", + "mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt:md5,4686908e3531dba3adc60f15b24b4b99", + "mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt:md5,eefdf30e98f2736e68be8477a5e7ca7d", + "mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt:md5,7b6fbe6d5f4b3d2dbea22cd397fedd02", + "mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt:md5,e9a30daf040c75789a80e4306dd6cb66", + "mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,8539a53fd282c421b994207368622130", + "mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,7076568a893a368fbe98af0fce27221c", + "mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,378f609b89709eee4bafafcd46369cb9", + "mqc_samtools_alignment_plot-2_1.txt:md5,3fa20d0fa77a67c280822141b07498fe", + "mqc_samtools_alignment_plot-3_1.txt:md5,eacc60f65d347d664b383a9d26abfff7", + "mqc_samtools_alignment_plot-4_1.txt:md5,c6d391361e11f4b20f0aa8c33fb76ac7", + "mqc_samtools_alignment_plot_1.txt:md5,0180669a82ff5e2b3403dd80dfdfb753", + "multiqc_citations.txt:md5,34da9f7497d275274f6dfd3b89831edb", + "multiqc_cutadapt.txt:md5,19916e059f11fa2c038c97bbb0ea190b", + "multiqc_fastqc.txt:md5,a9a7484add8120fc3cf3d5626a92973b", + "multiqc_fastqc_1.txt:md5,6f694cea56d88eb91b4c9610f7a12ca5", + "multiqc_featureCounts_mlib_featurecounts.txt:md5,116462ab13ea41766a59cd7dfdc31c4c", + "multiqc_featureCounts_mrep_featurecounts.txt:md5,9102f58e2ad6319aef5ffea782d55d54", + "multiqc_mlib_frip_score-plot.txt:md5,1d2cdadd30b920bad9251c22da1c082c", + "multiqc_mlib_peak_annotation-plot.txt:md5,9a1225e481d16106e275694e90452292", + "multiqc_mlib_peak_count-plot.txt:md5,0a210bb812578cb1b30128fb3314fb0f", + "multiqc_mrep_frip_score-plot.txt:md5,c09b4e1d962ef9b3147f2164a1b32a65", + "multiqc_mrep_peak_annotation-plot.txt:md5,26bb9e3b0e3ac7444ec313aea9a9453b", + "multiqc_mrep_peak_count-plot.txt:md5,7a88fc56da309a0f9054af588f1043d2", + "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" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + }, + "timestamp": "2026-03-23T11:21:01.31350503" + }, + "bowtie2 with stub": { + "content": [ + 26 + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + }, + "timestamp": "2026-03-20T22:48:53.767667318" + } +} \ No newline at end of file diff --git a/tests/chromap.nf.test b/tests/chromap.nf.test new file mode 100644 index 00000000..959dbd26 --- /dev/null +++ b/tests/chromap.nf.test @@ -0,0 +1,57 @@ +nextflow_pipeline { + + name "Test pipeline with chromap aligner" + script "../main.nf" + tag "chromap" + + test("chromap") { + + when { + params { + outdir = "$outputDir" + aligner = "chromap" + } + } + + 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..82d0bb9d --- /dev/null +++ b/tests/chromap.nf.test.snap @@ -0,0 +1,1003 @@ +{ + "chromap": { + "content": [ + 264, + { + + }, + [ + "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.txt", + "chromap/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.txt.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.txt", + "chromap/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.txt.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.MarkDuplicates.metrics.txt", + "chromap/merged_replicate/picard_metrics/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.MarkDuplicates.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_chipseq_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,d97330d16eb460d931ebdfdff0128c52", + "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,d635ca1c198136c1b83ab68288488b10", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt:md5,1409efd63e2cf79517e9218c99ee8620", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt:md5,1571513ccf7c1337a7b949bd015d2f6f", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt:md5,b836211db4b2034b82e6c7423aed73a7", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt:md5,295c36b91ec9972d90585e1182f83d5c", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak:md5,ee0c43ccbb1ed621a9d08b8f87a416a7", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak:md5,c13b6ec7cd42201feca1e5efb0df1e46", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls:md5,9131e6dbb7080692354e7cb75deab721", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak:md5,f8ce0542a8d29d21e7e36e5a1f14a291", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak:md5,029d69ede57101e4ae47beca0f5855b9", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls:md5,ebfff423c8256325e02a0a678afd471b", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak:md5,3fb92a851db5c787e4a657ccd9d556e4", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak:md5,0532c3bd1b28a86ab0f7a8b0dc2c7e3c", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls:md5,b6d6edad7448a3178220b5e2a20bbcb6", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak:md5,47363b5e05e476cc2012dd0d27e75645", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak:md5,90e1d78f59a4002eef74f932ed511093", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls:md5,fe1fdd3f286185d92d0300cccf350333", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak:md5,994abda3863d73af0a3413ac384a18ed", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak:md5,62218a10f439002ec21b5c994e842c8d", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls:md5,723807344e4db2928998a7b75dc012cf", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak:md5,f1ba7b07aad5d576951a1bf6f293731f", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak:md5,f4aa1f1dc530cfc0d05bae9b76aeab63", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls:md5,a177ef92450f72b80bb78032b2ee770f", + "consensus_peaks.mLb.clN.bed:md5,6af43a82d944c834ba0cedaeefed1f7d", + "consensus_peaks.mLb.clN.boolean.intersect.txt:md5,c7a4b348316d239fb8a99494878f5671", + "consensus_peaks.mLb.clN.boolean.txt:md5,3cbaaf9e01f14b6be95653a88066d59b", + "consensus_peaks.mLb.clN.saf:md5,099f2478c1c3700154a77d7a3fbe8390", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,7dddf9f9cbf0dad0d951926637794a9d", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,6f638911eb4464c36f6125f028a7e32d", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,de01bed225db1ae2e49a169fbc8fe7e8", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,3a83e6a9c42c5cbf569b7ed9b4a84f42", + "OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt:md5,37e00518c49678edb2012d63aa709220", + "OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt:md5,d7bf6f184c4ad16923390c05844659ee", + "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,737b93c649e01cd07c11fea31766af3c", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,2670957a3288098575f8ba655d09edf7", + "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,846f217e5830c33eebd390239fb92def", + "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,1b62f379ea8cabe2eea9658e7eb9f935", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,9c822f06367e6118b6c96ed2e8c66779", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,136444116ae420a4cbc860b3c8c5f2fc", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,e6596f93479edaf5cddbd1262240a593", + "macs3_annotatePeaks.mLb.clN.summary.txt:md5,3eb0b849056f86bb65a103266b33bd0b", + "macs3_annotatePeaks.mLb.clN.summary_mqc.tsv:md5,4ed8ff68da85a0893234a6a573fab9bf", + "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,3b663c95e6a0fd83c48ad033332dfb45", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,4ee6bf1ce67fc1ab5fb3dc0abaf616ae", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.flagstat:md5,a0ea06a0d2df66d1530f3d71d2722106", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats:md5,b3ae761856f971beb6e9568860ee76ae", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat:md5,e5e02e0df9b3148103b911655cde6d47", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats:md5,479387a5118919aa6b681687c979978b", + "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,5a6c6670c037ceedb190379a7e4dbd43", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats:md5,f44826f68a26301646e470c01fc19cb7", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat:md5,8b5903d6e1959ef64cc3665288ab3543", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats:md5,957d60dd498740fccf1db5850d6410d5", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,fc43734cc2f936b79c0f30077a50ca06", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,0a6b43de099291189a70de0a803489a7", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,06297742d79d72bfa93d33bd46661b90", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,f83b49675bd1cd31a157d26f6e775575", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,c750ac8e894dabe2726783ec3641f735", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,b7f7d6c7fb27d6d3d0f5303b637f1ce1", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,52b2ff84fca8ae4aad741642cd8e2a89", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,4387cc3f5911de045241159e3f76102c", + "OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt:md5,4022a7cf72fed8e1a7157a392c03e8c4", + "OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt:md5,f823f25e516674264d2c9a1573e98093", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak:md5,bbde14d2a8d0766c30d7af8555e5d08d", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak:md5,93b4828933e175fec461785de0712f83", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls:md5,a2e12e14444f90bfa347affc8e1b5635", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak:md5,8db2fd7d730d6672ad36d7a9b3ac9a5d", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak:md5,5776f6c62583303b97cb4efe98fb06ca", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls:md5,f1eb2998da8fbe999b717bbb275a7c19", + "consensus_peaks.mRp.clN.bed:md5,53e60ec0a68f48e8221ce9f20c8d4827", + "consensus_peaks.mRp.clN.boolean.intersect.txt:md5,48dfaf669ac3e0920650a3850ada90dc", + "consensus_peaks.mRp.clN.boolean.txt:md5,b52a53523696848a49d077ed81564d8c", + "consensus_peaks.mRp.clN.saf:md5,a6c022a654c4ec4915da5c44e3be08ad", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,79e50e62930af090aca1956b1ad936b0", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,d47907a311f3a640f48612cdcc4c8f2c", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,2ce6ff6191e38a9b13b74086bb247f3c", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,f53d6eea11671941939cc3f27a859ae4", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv:md5,92acdf5ebcdc692a3cc53320935d4977", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv:md5,cbc849e624768ab6ded7bb71b08115ec", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv:md5,ec75b93401006505f6d8ac0fce2f1ac8", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv:md5,8659f3069a89eeb010358ac0e0ee04e6", + "macs3_annotatePeaks.mRp.clN.summary.txt:md5,9f675c9ad540f0a6695f49936a1bbb7e", + "macs3_annotatePeaks.mRp.clN.summary_mqc.tsv:md5,f9c93f552208c2a5d27f73018b65bf60", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat:md5,9f6207d2d9bfd4d238f86eeaf9fbd1bd", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats:md5,5fe07a6022d95f9655efe47c50b36c9a", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat:md5,919b13f7be53e35d60c97af1d3e14edd", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats:md5,d4b33f4434db5ad34fd314a73b9ad5f6", + "genome.index:md5,227e5a277953cecaccdb4a3500718b94", + "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,981d7b2a2569691b054241609f416699", + "mqc_fastqc_adapter_content_plot-2_1.txt:md5,7050d22f2eabdafb3d1eb81e736599af", + "mqc_fastqc_adapter_content_plot_1.txt:md5,66f3e2f6ba14599b0d6c20144df60777", + "mqc_fastqc_per_base_n_content_plot-2_1.txt:md5,7c5db7fad8afe578076466416e17bbd0", + "mqc_fastqc_per_base_n_content_plot_1.txt:md5,8d9cdd0463193b7e10332e2ca0273aca", + "mqc_fastqc_per_base_sequence_quality_plot-2_1.txt:md5,3f7c1c4998d41f10fcc48f15fc1c214f", + "mqc_fastqc_per_base_sequence_quality_plot_1.txt:md5,821cb87b0ae8bd61cd445d153b8f371a", + "mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt:md5,076f8f06afb71ddf1de87480c0a937ab", + "mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt:md5,4f0d049c48c4cde730fdc2ee37130658", + "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,3dde643427f3229f283527966d7dd32e", + "mqc_fastqc_per_sequence_quality_scores_plot_1.txt:md5,3bfe1c94f710975829e2c1e3b5f16ea7", + "mqc_fastqc_sequence_counts_plot-2_1.txt:md5,83670beba48f5d0a1ff4bb038628f49e", + "mqc_fastqc_sequence_counts_plot_1.txt:md5,d0cf8d64e742b5f446e6b602d86913b9", + "mqc_fastqc_sequence_duplication_levels_plot-2_1.txt:md5,907ad5b8fb27d2d9fd19281c8fa77e65", + "mqc_fastqc_sequence_duplication_levels_plot_1.txt:md5,23c4883ed6c22212b0c3e07a863745d1", + "mqc_fastqc_sequence_length_distribution_plot_1.txt:md5,46650932914f76713075e12934d6fcfe", + "mqc_featureCounts_assignment_plot-2_1.txt:md5,066346d45ae910b3a68121675262bbbe", + "mqc_featureCounts_assignment_plot_1.txt:md5,2c59acb9cb5c612863b26fed519aee06", + "mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt:md5,b14230a321b4ca2fc91ec32a60e62f2e", + "mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt:md5,107579e3ac937a5a8106d6b58396bf11", + "mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt:md5,474ba2636e993a043ef5d8b17e82d0cc", + "mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt:md5,bc6b4db5d4fd85ad084bcd9484b64b51", + "mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt:md5,c9179b4f2dff42ea794dc984b28a2404", + "mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt:md5,063ca520bd6fd32d9d03e406e8d17804", + "mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt:md5,499a695289f338b6e4b3368ad7ed6692", + "mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt:md5,94eaa4e595fa40f648d631393a117c35", + "mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt:md5,a0e040bc97b8b6e1d580fc7c8d51d405", + "mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,dcbc29c494751dd1e71878b2faf726aa", + "mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,2035a3d2939f6d8a38810b9316a116ed", + "mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,a6793c7c85f6e3d67a63a3e0a1e27bba", + "mqc_samtools_alignment_plot-2_1.txt:md5,bcdc55f96d627b72c840ecef552aff81", + "mqc_samtools_alignment_plot-3_1.txt:md5,7937ae44567f7b16a29d4acebbab2c35", + "mqc_samtools_alignment_plot-4_1.txt:md5,c9425f57e8b9755314ab0fc69c5274b5", + "mqc_samtools_alignment_plot_1.txt:md5,a1219ecb42974a8d09d17e7033fa7327", + "multiqc_citations.txt:md5,34da9f7497d275274f6dfd3b89831edb", + "multiqc_cutadapt.txt:md5,19916e059f11fa2c038c97bbb0ea190b", + "multiqc_fastqc.txt:md5,a9a7484add8120fc3cf3d5626a92973b", + "multiqc_fastqc_1.txt:md5,6f694cea56d88eb91b4c9610f7a12ca5", + "multiqc_featureCounts_mlib_featurecounts.txt:md5,a4e5754dbb15ee5816b70f1c65990098", + "multiqc_featureCounts_mrep_featurecounts.txt:md5,872a3fa507f5fa31d1f25596d9e1b093", + "multiqc_mlib_frip_score-plot.txt:md5,aea83446f00b9c4ac21c5f53239193ab", + "multiqc_mlib_peak_annotation-plot.txt:md5,43f43dd57a8334827acbe41f3793e85c", + "multiqc_mlib_peak_count-plot.txt:md5,464296670d3b57836660fcce8d409897", + "multiqc_mrep_frip_score-plot.txt:md5,eb6c4c4a9347e5212ad1efb59c854efe", + "multiqc_mrep_peak_annotation-plot.txt:md5,20a7ca66cd7584dd46524e51722936de", + "multiqc_mrep_peak_count-plot.txt:md5,c9ab0e2f3129e47def46eff0c92b504d", + "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" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + }, + "timestamp": "2026-03-23T11:36:19.333490193" + }, + "chromap with stub": { + "content": [ + 26 + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + }, + "timestamp": "2026-03-20T23:04:44.979984419" + } +} \ No newline at end of file diff --git a/tests/controls.nf.test b/tests/controls.nf.test new file mode 100644 index 00000000..ab4ee573 --- /dev/null +++ b/tests/controls.nf.test @@ -0,0 +1,35 @@ +nextflow_pipeline { + + name "Test pipeline" + script "../main.nf" + tag "pipeline" + + 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..b14201b2 --- /dev/null +++ b/tests/controls.nf.test.snap @@ -0,0 +1,989 @@ +{ + "-profile test_controls": { + "content": [ + 264, + { + + }, + [ + "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.txt", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.txt.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.txt.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.MarkDuplicates.metrics.txt", + "bwa/merged_replicate/picard_metrics/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.MarkDuplicates.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_chipseq_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,6ba17d7ec7e2247e9b970bd3b0ce9a96", + "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,6caa1b14d21350752628436355eabef5", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt:md5,a9b555d96448f5ac9bdb6f4526f86341", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt:md5,e3ac13dff612e52453ccf3bc4692c2ea", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt:md5,bf338379ef0251df310edcbe41668fee", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt:md5,57e48407c6ada9d84166e734ca43a5ed", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak:md5,c5b53511f764fb205886daa4f2ab00ec", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak:md5,50b3a0ebae79dc153e56a37658bfab6f", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls:md5,41446ba0c0eb56ba34ba518658d76e89", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak:md5,47246433d4cb8625d047b25c84d25857", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak:md5,43d571030847b7cc2b21b0f61cc12c16", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls:md5,c55f63c9db41018a430158453e0538af", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak:md5,171bbf48bda913bf702954c20dd57fcb", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak:md5,d101f70984161baefc31fb7536b3835e", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls:md5,d375f257642d942eaeeeef93541a8257", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak:md5,c163607903fd2e2ae38db046fdd787f0", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak:md5,71e4536c7172f000dd66c39f39396e86", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls:md5,4a2e2c3ac0b87ff4a3cc5439015cfc5d", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak:md5,49b0ebc586b9e59b72a1d6c35a07c5f9", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak:md5,c55133b8532173de8fe7b3b1f51e6190", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls:md5,cd2ee19135ebda5b33b953b8d5039390", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak:md5,5fec6a7a54bfd5fc2178dc2408664e9b", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak:md5,775585b2d83a50b483d28f82415b9bdb", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls:md5,fb6af0f9cf4506c25b041e2ace8953cb", + "consensus_peaks.mLb.clN.bed:md5,39dda87fd18c5f238ccba441c2a49d0e", + "consensus_peaks.mLb.clN.boolean.intersect.txt:md5,937220dde650b860d42373294d96f002", + "consensus_peaks.mLb.clN.boolean.txt:md5,463563ea22099f42efe11e4a7c0548c3", + "consensus_peaks.mLb.clN.saf:md5,9121e62a952c9e58b046c2776882f9b6", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,75af17c0333c4da8085c8fbd63b7361a", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,ab7764c3b53e97833c0cee9cbc60ead4", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,5eaf69e0d03d4a1a7f542d8cab107f0c", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,8004916b9169d86825517a3a8993cf6f", + "OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt:md5,531e5674c4c011a78dec0ed280ec4522", + "OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt:md5,66689c145a16b7c36586cbcc8bf1a992", + "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,160b7f88062c5ad1317e177bcf375236", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,363b299f1ac39d86230789177e3ba2d9", + "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,a904ac58084ee573989f28809034d5c0", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,49a15784f9ab6d9eff73508e2f463cce", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,ab8e5b2a2208d2c7f899ed7a8cf67845", + "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,d355b0d932962b8eb42dbecd1bcbc5fa", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,6718411a3dd59b2e62e9758c401b14a2", + "macs3_annotatePeaks.mLb.clN.summary.txt:md5,0aef404ef488aefb3dd7a72826c28db8", + "macs3_annotatePeaks.mLb.clN.summary_mqc.tsv:md5,a24fa1102eb240a1108f92e8988f39a0", + "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,4d9ca367550a721dd0aaeaab58421bdb", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats:md5,cdc0d96cb1c0e5b48ba2c418233f7a94", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat:md5,8d0f37dc5986deee90d63bd439874882", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats:md5,a77125d053253ed788969bfaedbfc455", + "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,3c313eb066e4a38fb3fd81fed8267492", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats:md5,80d6c838ba770ac3f736ca076871108d", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat:md5,6f26205e50a841c2cd65ccc87ec70eb5", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats:md5,a0b8823060c04c5d68255b9c558fc414", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,5b01c6b579255502fe3ce7a7d8096552", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,8ab305c4b298cc942dc2f9d11ea3bce2", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,5b26ec19f5770acfd55d523de688a3fe", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,a16727dd09a8ae9840851b682ab37854", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,3f51a059a43e027213af32611c93dfe5", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,2a77e286b62e4f2567024ba7a2192066", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,7aed9e40456bf326010231d9f3c1bf33", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,7af9840564eee65e3ddb1a0765787ac9", + "OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt:md5,b9a30528c9329b0600ff3c9a7658c12e", + "OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt:md5,730eec38d30794964d7f52ceae006582", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak:md5,185644d17b2ea602c990c8540735f01d", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak:md5,39211adc421cce0c0c14e887ea0a4d6c", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls:md5,d8bf42b50905eac9cd3e387fae92a617", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak:md5,52b2837492d44cb7e5549f183c92f8de", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak:md5,bb6ef1e40a2bad3b27ecb87d5890af7e", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls:md5,c725baa3370fd86f5707e01dbed81c7c", + "consensus_peaks.mRp.clN.bed:md5,09f7a0a60739a9682dfe296bdea96421", + "consensus_peaks.mRp.clN.boolean.intersect.txt:md5,a87fffa46d4050a48119917bbcf5252d", + "consensus_peaks.mRp.clN.boolean.txt:md5,decb8fd3c102c337d0e21fa4be18cd42", + "consensus_peaks.mRp.clN.saf:md5,22e0ad81994c6eb378b3361be3867498", + "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,eca73e1c36fb4dcc5f8f877cebcf0385", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv:md5,77e68c5e870602351948297838f8ca1d", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv:md5,1b0ed83d8a0b7b7248fd8da81816bcb9", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv:md5,69282ee9e2eb7a11317fff5209564bbc", + "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,60634034743a850c19091b008ad0d7f7", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats:md5,0e5f7e4dc3d46e3cfcb47172524175b2", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat:md5,cfa64d93e9604b521747179b268b5eaa", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats:md5,3234e2237de090f8443246018063e755", + "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,3b3676a0aea21f6f925f0d8fc77e13ae", + "mqc_fastqc_adapter_content_plot-2_1.txt:md5,7050d22f2eabdafb3d1eb81e736599af", + "mqc_fastqc_adapter_content_plot_1.txt:md5,66f3e2f6ba14599b0d6c20144df60777", + "mqc_fastqc_per_base_n_content_plot-2_1.txt:md5,7c5db7fad8afe578076466416e17bbd0", + "mqc_fastqc_per_base_n_content_plot_1.txt:md5,8d9cdd0463193b7e10332e2ca0273aca", + "mqc_fastqc_per_base_sequence_quality_plot-2_1.txt:md5,3f7c1c4998d41f10fcc48f15fc1c214f", + "mqc_fastqc_per_base_sequence_quality_plot_1.txt:md5,821cb87b0ae8bd61cd445d153b8f371a", + "mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt:md5,076f8f06afb71ddf1de87480c0a937ab", + "mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt:md5,4f0d049c48c4cde730fdc2ee37130658", + "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,3dde643427f3229f283527966d7dd32e", + "mqc_fastqc_per_sequence_quality_scores_plot_1.txt:md5,3bfe1c94f710975829e2c1e3b5f16ea7", + "mqc_fastqc_sequence_counts_plot-2_1.txt:md5,83670beba48f5d0a1ff4bb038628f49e", + "mqc_fastqc_sequence_counts_plot_1.txt:md5,d0cf8d64e742b5f446e6b602d86913b9", + "mqc_fastqc_sequence_duplication_levels_plot-2_1.txt:md5,907ad5b8fb27d2d9fd19281c8fa77e65", + "mqc_fastqc_sequence_duplication_levels_plot_1.txt:md5,23c4883ed6c22212b0c3e07a863745d1", + "mqc_fastqc_sequence_length_distribution_plot_1.txt:md5,46650932914f76713075e12934d6fcfe", + "mqc_featureCounts_assignment_plot-2_1.txt:md5,861efa81b89447534c36ad0ee83cab84", + "mqc_featureCounts_assignment_plot_1.txt:md5,3467de957432846db73ca75916f69f03", + "mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt:md5,742884105ee8faa08ffc04a0d744a65f", + "mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt:md5,912267a9d1ab1b4f2a2fdea45f756590", + "mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt:md5,8c6fa3652e68b3bb048d571f515a3d82", + "mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt:md5,f818f92f6dae674c5c9ba1fdd30ac283", + "mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt:md5,8dfe752841049fd868d32e4f7982e8ae", + "mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt:md5,c038743f9f9a6feae3d4b4988cc322d2", + "mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt:md5,524bcb4364c376b9e9c337bce8606bd4", + "mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt:md5,807f1b9be4e9095e058b9ada9beeadf1", + "mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt:md5,8a9f046ce11094993e8daab88a441604", + "mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,3f69d5db75d2b832bb85d7e5c74c8958", + "mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,7e72b13471b3e6755dd6b4868bfb1914", + "mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,c0881aaed3b67938936d0dbdd0064e6c", + "mqc_samtools_alignment_plot-2_1.txt:md5,fdec2a0c318ccf06f757ac78a43d7775", + "mqc_samtools_alignment_plot-3_1.txt:md5,ffbd2892db3589a9c531afdab210d6df", + "mqc_samtools_alignment_plot-4_1.txt:md5,fad0dc92bef7676f2dd96fcb29a80afe", + "mqc_samtools_alignment_plot_1.txt:md5,83a5a93a7d827431cfecd1ed9923bac2", + "multiqc_citations.txt:md5,34da9f7497d275274f6dfd3b89831edb", + "multiqc_cutadapt.txt:md5,19916e059f11fa2c038c97bbb0ea190b", + "multiqc_fastqc.txt:md5,a9a7484add8120fc3cf3d5626a92973b", + "multiqc_fastqc_1.txt:md5,6f694cea56d88eb91b4c9610f7a12ca5", + "multiqc_featureCounts_mlib_featurecounts.txt:md5,b66204f6e03a8f4aa6b5d6206f0ced92", + "multiqc_featureCounts_mrep_featurecounts.txt:md5,8002c1ba6325b1eaab118099d01b7ee1", + "multiqc_mlib_frip_score-plot.txt:md5,fad5d91d452286d71c5357951c28c62d", + "multiqc_mlib_peak_annotation-plot.txt:md5,bc637d1fb7a56ab4ddba3eb900ea5619", + "multiqc_mlib_peak_count-plot.txt:md5,22e2cc18e32e26a95a5db993a25a02d2", + "multiqc_mrep_frip_score-plot.txt:md5,69ff05e5e8e5fd888f1ea32a60b72994", + "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" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + }, + "timestamp": "2026-03-23T20:25:35.262604817" + } +} \ 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..47293f2c --- /dev/null +++ b/tests/default.nf.test.snap @@ -0,0 +1,989 @@ +{ + "-profile test": { + "content": [ + 264, + { + + }, + [ + "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.txt", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.txt.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.txt.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.MarkDuplicates.metrics.txt", + "bwa/merged_replicate/picard_metrics/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.MarkDuplicates.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_chipseq_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,6ba17d7ec7e2247e9b970bd3b0ce9a96", + "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,6caa1b14d21350752628436355eabef5", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt:md5,a9b555d96448f5ac9bdb6f4526f86341", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt:md5,e3ac13dff612e52453ccf3bc4692c2ea", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt:md5,bf338379ef0251df310edcbe41668fee", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt:md5,57e48407c6ada9d84166e734ca43a5ed", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak:md5,c5b53511f764fb205886daa4f2ab00ec", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak:md5,50b3a0ebae79dc153e56a37658bfab6f", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls:md5,41446ba0c0eb56ba34ba518658d76e89", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak:md5,47246433d4cb8625d047b25c84d25857", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak:md5,43d571030847b7cc2b21b0f61cc12c16", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls:md5,c55f63c9db41018a430158453e0538af", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak:md5,171bbf48bda913bf702954c20dd57fcb", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak:md5,d101f70984161baefc31fb7536b3835e", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls:md5,d375f257642d942eaeeeef93541a8257", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak:md5,c163607903fd2e2ae38db046fdd787f0", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak:md5,71e4536c7172f000dd66c39f39396e86", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls:md5,4a2e2c3ac0b87ff4a3cc5439015cfc5d", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak:md5,49b0ebc586b9e59b72a1d6c35a07c5f9", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak:md5,c55133b8532173de8fe7b3b1f51e6190", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls:md5,cd2ee19135ebda5b33b953b8d5039390", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak:md5,5fec6a7a54bfd5fc2178dc2408664e9b", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak:md5,775585b2d83a50b483d28f82415b9bdb", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls:md5,fb6af0f9cf4506c25b041e2ace8953cb", + "consensus_peaks.mLb.clN.bed:md5,39dda87fd18c5f238ccba441c2a49d0e", + "consensus_peaks.mLb.clN.boolean.intersect.txt:md5,937220dde650b860d42373294d96f002", + "consensus_peaks.mLb.clN.boolean.txt:md5,463563ea22099f42efe11e4a7c0548c3", + "consensus_peaks.mLb.clN.saf:md5,9121e62a952c9e58b046c2776882f9b6", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,75af17c0333c4da8085c8fbd63b7361a", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,ab7764c3b53e97833c0cee9cbc60ead4", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,5eaf69e0d03d4a1a7f542d8cab107f0c", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,8004916b9169d86825517a3a8993cf6f", + "OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt:md5,531e5674c4c011a78dec0ed280ec4522", + "OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt:md5,66689c145a16b7c36586cbcc8bf1a992", + "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,160b7f88062c5ad1317e177bcf375236", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,363b299f1ac39d86230789177e3ba2d9", + "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,a904ac58084ee573989f28809034d5c0", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,49a15784f9ab6d9eff73508e2f463cce", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,ab8e5b2a2208d2c7f899ed7a8cf67845", + "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,d355b0d932962b8eb42dbecd1bcbc5fa", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,6718411a3dd59b2e62e9758c401b14a2", + "macs3_annotatePeaks.mLb.clN.summary.txt:md5,0aef404ef488aefb3dd7a72826c28db8", + "macs3_annotatePeaks.mLb.clN.summary_mqc.tsv:md5,a24fa1102eb240a1108f92e8988f39a0", + "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,4d9ca367550a721dd0aaeaab58421bdb", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats:md5,cdc0d96cb1c0e5b48ba2c418233f7a94", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat:md5,8d0f37dc5986deee90d63bd439874882", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats:md5,a77125d053253ed788969bfaedbfc455", + "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,3c313eb066e4a38fb3fd81fed8267492", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats:md5,80d6c838ba770ac3f736ca076871108d", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat:md5,6f26205e50a841c2cd65ccc87ec70eb5", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats:md5,a0b8823060c04c5d68255b9c558fc414", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,5b01c6b579255502fe3ce7a7d8096552", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,8ab305c4b298cc942dc2f9d11ea3bce2", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,5b26ec19f5770acfd55d523de688a3fe", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,a16727dd09a8ae9840851b682ab37854", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,3f51a059a43e027213af32611c93dfe5", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,2a77e286b62e4f2567024ba7a2192066", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,7aed9e40456bf326010231d9f3c1bf33", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,7af9840564eee65e3ddb1a0765787ac9", + "OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt:md5,b9a30528c9329b0600ff3c9a7658c12e", + "OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt:md5,730eec38d30794964d7f52ceae006582", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak:md5,185644d17b2ea602c990c8540735f01d", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak:md5,39211adc421cce0c0c14e887ea0a4d6c", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls:md5,d8bf42b50905eac9cd3e387fae92a617", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak:md5,52b2837492d44cb7e5549f183c92f8de", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak:md5,bb6ef1e40a2bad3b27ecb87d5890af7e", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls:md5,c725baa3370fd86f5707e01dbed81c7c", + "consensus_peaks.mRp.clN.bed:md5,09f7a0a60739a9682dfe296bdea96421", + "consensus_peaks.mRp.clN.boolean.intersect.txt:md5,a87fffa46d4050a48119917bbcf5252d", + "consensus_peaks.mRp.clN.boolean.txt:md5,decb8fd3c102c337d0e21fa4be18cd42", + "consensus_peaks.mRp.clN.saf:md5,22e0ad81994c6eb378b3361be3867498", + "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,eca73e1c36fb4dcc5f8f877cebcf0385", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv:md5,77e68c5e870602351948297838f8ca1d", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv:md5,1b0ed83d8a0b7b7248fd8da81816bcb9", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv:md5,69282ee9e2eb7a11317fff5209564bbc", + "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,60634034743a850c19091b008ad0d7f7", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats:md5,0e5f7e4dc3d46e3cfcb47172524175b2", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat:md5,cfa64d93e9604b521747179b268b5eaa", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats:md5,3234e2237de090f8443246018063e755", + "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,3b3676a0aea21f6f925f0d8fc77e13ae", + "mqc_fastqc_adapter_content_plot-2_1.txt:md5,7050d22f2eabdafb3d1eb81e736599af", + "mqc_fastqc_adapter_content_plot_1.txt:md5,66f3e2f6ba14599b0d6c20144df60777", + "mqc_fastqc_per_base_n_content_plot-2_1.txt:md5,7c5db7fad8afe578076466416e17bbd0", + "mqc_fastqc_per_base_n_content_plot_1.txt:md5,8d9cdd0463193b7e10332e2ca0273aca", + "mqc_fastqc_per_base_sequence_quality_plot-2_1.txt:md5,3f7c1c4998d41f10fcc48f15fc1c214f", + "mqc_fastqc_per_base_sequence_quality_plot_1.txt:md5,821cb87b0ae8bd61cd445d153b8f371a", + "mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt:md5,076f8f06afb71ddf1de87480c0a937ab", + "mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt:md5,4f0d049c48c4cde730fdc2ee37130658", + "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,3dde643427f3229f283527966d7dd32e", + "mqc_fastqc_per_sequence_quality_scores_plot_1.txt:md5,3bfe1c94f710975829e2c1e3b5f16ea7", + "mqc_fastqc_sequence_counts_plot-2_1.txt:md5,83670beba48f5d0a1ff4bb038628f49e", + "mqc_fastqc_sequence_counts_plot_1.txt:md5,d0cf8d64e742b5f446e6b602d86913b9", + "mqc_fastqc_sequence_duplication_levels_plot-2_1.txt:md5,907ad5b8fb27d2d9fd19281c8fa77e65", + "mqc_fastqc_sequence_duplication_levels_plot_1.txt:md5,23c4883ed6c22212b0c3e07a863745d1", + "mqc_fastqc_sequence_length_distribution_plot_1.txt:md5,46650932914f76713075e12934d6fcfe", + "mqc_featureCounts_assignment_plot-2_1.txt:md5,861efa81b89447534c36ad0ee83cab84", + "mqc_featureCounts_assignment_plot_1.txt:md5,3467de957432846db73ca75916f69f03", + "mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt:md5,742884105ee8faa08ffc04a0d744a65f", + "mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt:md5,912267a9d1ab1b4f2a2fdea45f756590", + "mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt:md5,8c6fa3652e68b3bb048d571f515a3d82", + "mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt:md5,f818f92f6dae674c5c9ba1fdd30ac283", + "mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt:md5,8dfe752841049fd868d32e4f7982e8ae", + "mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt:md5,c038743f9f9a6feae3d4b4988cc322d2", + "mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt:md5,524bcb4364c376b9e9c337bce8606bd4", + "mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt:md5,807f1b9be4e9095e058b9ada9beeadf1", + "mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt:md5,8a9f046ce11094993e8daab88a441604", + "mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,3f69d5db75d2b832bb85d7e5c74c8958", + "mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,7e72b13471b3e6755dd6b4868bfb1914", + "mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,c0881aaed3b67938936d0dbdd0064e6c", + "mqc_samtools_alignment_plot-2_1.txt:md5,fdec2a0c318ccf06f757ac78a43d7775", + "mqc_samtools_alignment_plot-3_1.txt:md5,ffbd2892db3589a9c531afdab210d6df", + "mqc_samtools_alignment_plot-4_1.txt:md5,fad0dc92bef7676f2dd96fcb29a80afe", + "mqc_samtools_alignment_plot_1.txt:md5,83a5a93a7d827431cfecd1ed9923bac2", + "multiqc_citations.txt:md5,34da9f7497d275274f6dfd3b89831edb", + "multiqc_cutadapt.txt:md5,19916e059f11fa2c038c97bbb0ea190b", + "multiqc_fastqc.txt:md5,a9a7484add8120fc3cf3d5626a92973b", + "multiqc_fastqc_1.txt:md5,6f694cea56d88eb91b4c9610f7a12ca5", + "multiqc_featureCounts_mlib_featurecounts.txt:md5,b66204f6e03a8f4aa6b5d6206f0ced92", + "multiqc_featureCounts_mrep_featurecounts.txt:md5,8002c1ba6325b1eaab118099d01b7ee1", + "multiqc_mlib_frip_score-plot.txt:md5,fad5d91d452286d71c5357951c28c62d", + "multiqc_mlib_peak_annotation-plot.txt:md5,bc637d1fb7a56ab4ddba3eb900ea5619", + "multiqc_mlib_peak_count-plot.txt:md5,22e2cc18e32e26a95a5db993a25a02d2", + "multiqc_mrep_frip_score-plot.txt:md5,69ff05e5e8e5fd888f1ea32a60b72994", + "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" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + }, + "timestamp": "2026-03-23T14:22:38.747626997" + } +} \ No newline at end of file diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 00000000..940c0375 --- /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..1b2ce00b --- /dev/null +++ b/tests/skip_consensus_peaks.nf.test.snap @@ -0,0 +1,905 @@ +{ + "skip_consensus_peaks with stub": { + "content": [ + 26 + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + }, + "timestamp": "2026-03-20T23:13:57.511221102" + }, + "skip_consensus_peaks": { + "content": [ + 256, + { + + }, + [ + "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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.metrics.txt", + "bwa/merged_replicate/picard_metrics/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.MarkDuplicates.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_chipseq_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,6ba17d7ec7e2247e9b970bd3b0ce9a96", + "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,6caa1b14d21350752628436355eabef5", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt:md5,a9b555d96448f5ac9bdb6f4526f86341", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt:md5,e3ac13dff612e52453ccf3bc4692c2ea", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt:md5,bf338379ef0251df310edcbe41668fee", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt:md5,57e48407c6ada9d84166e734ca43a5ed", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak:md5,c5b53511f764fb205886daa4f2ab00ec", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak:md5,50b3a0ebae79dc153e56a37658bfab6f", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls:md5,41446ba0c0eb56ba34ba518658d76e89", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak:md5,47246433d4cb8625d047b25c84d25857", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak:md5,43d571030847b7cc2b21b0f61cc12c16", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls:md5,c55f63c9db41018a430158453e0538af", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak:md5,171bbf48bda913bf702954c20dd57fcb", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak:md5,d101f70984161baefc31fb7536b3835e", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls:md5,d375f257642d942eaeeeef93541a8257", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak:md5,c163607903fd2e2ae38db046fdd787f0", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak:md5,71e4536c7172f000dd66c39f39396e86", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls:md5,4a2e2c3ac0b87ff4a3cc5439015cfc5d", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak:md5,49b0ebc586b9e59b72a1d6c35a07c5f9", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak:md5,c55133b8532173de8fe7b3b1f51e6190", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls:md5,cd2ee19135ebda5b33b953b8d5039390", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak:md5,5fec6a7a54bfd5fc2178dc2408664e9b", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak:md5,775585b2d83a50b483d28f82415b9bdb", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls:md5,fb6af0f9cf4506c25b041e2ace8953cb", + "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,160b7f88062c5ad1317e177bcf375236", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,363b299f1ac39d86230789177e3ba2d9", + "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,a904ac58084ee573989f28809034d5c0", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,49a15784f9ab6d9eff73508e2f463cce", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,ab8e5b2a2208d2c7f899ed7a8cf67845", + "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,d355b0d932962b8eb42dbecd1bcbc5fa", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,6718411a3dd59b2e62e9758c401b14a2", + "macs3_annotatePeaks.mLb.clN.summary.txt:md5,0aef404ef488aefb3dd7a72826c28db8", + "macs3_annotatePeaks.mLb.clN.summary_mqc.tsv:md5,a24fa1102eb240a1108f92e8988f39a0", + "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,4d9ca367550a721dd0aaeaab58421bdb", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats:md5,cdc0d96cb1c0e5b48ba2c418233f7a94", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat:md5,8d0f37dc5986deee90d63bd439874882", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats:md5,a77125d053253ed788969bfaedbfc455", + "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,3c313eb066e4a38fb3fd81fed8267492", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats:md5,80d6c838ba770ac3f736ca076871108d", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat:md5,6f26205e50a841c2cd65ccc87ec70eb5", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats:md5,a0b8823060c04c5d68255b9c558fc414", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,5b01c6b579255502fe3ce7a7d8096552", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,8ab305c4b298cc942dc2f9d11ea3bce2", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,5b26ec19f5770acfd55d523de688a3fe", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,a16727dd09a8ae9840851b682ab37854", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,3f51a059a43e027213af32611c93dfe5", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,2a77e286b62e4f2567024ba7a2192066", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,7aed9e40456bf326010231d9f3c1bf33", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,7af9840564eee65e3ddb1a0765787ac9", + "OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt:md5,b9a30528c9329b0600ff3c9a7658c12e", + "OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt:md5,730eec38d30794964d7f52ceae006582", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak:md5,185644d17b2ea602c990c8540735f01d", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak:md5,39211adc421cce0c0c14e887ea0a4d6c", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls:md5,d8bf42b50905eac9cd3e387fae92a617", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak:md5,52b2837492d44cb7e5549f183c92f8de", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak:md5,bb6ef1e40a2bad3b27ecb87d5890af7e", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls:md5,c725baa3370fd86f5707e01dbed81c7c", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv:md5,77e68c5e870602351948297838f8ca1d", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv:md5,1b0ed83d8a0b7b7248fd8da81816bcb9", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv:md5,69282ee9e2eb7a11317fff5209564bbc", + "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,60634034743a850c19091b008ad0d7f7", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats:md5,0e5f7e4dc3d46e3cfcb47172524175b2", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat:md5,cfa64d93e9604b521747179b268b5eaa", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats:md5,3234e2237de090f8443246018063e755", + "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,3b3676a0aea21f6f925f0d8fc77e13ae", + "mqc_fastqc_adapter_content_plot-2_1.txt:md5,7050d22f2eabdafb3d1eb81e736599af", + "mqc_fastqc_adapter_content_plot_1.txt:md5,66f3e2f6ba14599b0d6c20144df60777", + "mqc_fastqc_per_base_n_content_plot-2_1.txt:md5,7c5db7fad8afe578076466416e17bbd0", + "mqc_fastqc_per_base_n_content_plot_1.txt:md5,8d9cdd0463193b7e10332e2ca0273aca", + "mqc_fastqc_per_base_sequence_quality_plot-2_1.txt:md5,3f7c1c4998d41f10fcc48f15fc1c214f", + "mqc_fastqc_per_base_sequence_quality_plot_1.txt:md5,821cb87b0ae8bd61cd445d153b8f371a", + "mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt:md5,076f8f06afb71ddf1de87480c0a937ab", + "mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt:md5,4f0d049c48c4cde730fdc2ee37130658", + "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,3dde643427f3229f283527966d7dd32e", + "mqc_fastqc_per_sequence_quality_scores_plot_1.txt:md5,3bfe1c94f710975829e2c1e3b5f16ea7", + "mqc_fastqc_sequence_counts_plot-2_1.txt:md5,83670beba48f5d0a1ff4bb038628f49e", + "mqc_fastqc_sequence_counts_plot_1.txt:md5,d0cf8d64e742b5f446e6b602d86913b9", + "mqc_fastqc_sequence_duplication_levels_plot-2_1.txt:md5,907ad5b8fb27d2d9fd19281c8fa77e65", + "mqc_fastqc_sequence_duplication_levels_plot_1.txt:md5,23c4883ed6c22212b0c3e07a863745d1", + "mqc_fastqc_sequence_length_distribution_plot_1.txt:md5,46650932914f76713075e12934d6fcfe", + "mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt:md5,742884105ee8faa08ffc04a0d744a65f", + "mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt:md5,912267a9d1ab1b4f2a2fdea45f756590", + "mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt:md5,8c6fa3652e68b3bb048d571f515a3d82", + "mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt:md5,f818f92f6dae674c5c9ba1fdd30ac283", + "mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt:md5,8dfe752841049fd868d32e4f7982e8ae", + "mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt:md5,c038743f9f9a6feae3d4b4988cc322d2", + "mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt:md5,524bcb4364c376b9e9c337bce8606bd4", + "mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt:md5,807f1b9be4e9095e058b9ada9beeadf1", + "mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt:md5,8a9f046ce11094993e8daab88a441604", + "mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,3f69d5db75d2b832bb85d7e5c74c8958", + "mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,7e72b13471b3e6755dd6b4868bfb1914", + "mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,c0881aaed3b67938936d0dbdd0064e6c", + "mqc_samtools_alignment_plot-2_1.txt:md5,fdec2a0c318ccf06f757ac78a43d7775", + "mqc_samtools_alignment_plot-3_1.txt:md5,ffbd2892db3589a9c531afdab210d6df", + "mqc_samtools_alignment_plot-4_1.txt:md5,fad0dc92bef7676f2dd96fcb29a80afe", + "mqc_samtools_alignment_plot_1.txt:md5,83a5a93a7d827431cfecd1ed9923bac2", + "multiqc_citations.txt:md5,380946add69d6b34db956b1565820d2c", + "multiqc_cutadapt.txt:md5,19916e059f11fa2c038c97bbb0ea190b", + "multiqc_fastqc.txt:md5,a9a7484add8120fc3cf3d5626a92973b", + "multiqc_fastqc_1.txt:md5,6f694cea56d88eb91b4c9610f7a12ca5", + "multiqc_mlib_frip_score-plot.txt:md5,fad5d91d452286d71c5357951c28c62d", + "multiqc_mlib_peak_annotation-plot.txt:md5,bc637d1fb7a56ab4ddba3eb900ea5619", + "multiqc_mlib_peak_count-plot.txt:md5,22e2cc18e32e26a95a5db993a25a02d2", + "multiqc_mrep_frip_score-plot.txt:md5,69ff05e5e8e5fd888f1ea32a60b72994", + "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" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + }, + "timestamp": "2026-03-23T20:49:11.652630181" + } +} \ 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..3fe54370 --- /dev/null +++ b/tests/skip_trimming.nf.test.snap @@ -0,0 +1,889 @@ +{ + "skip_trimming": { + "content": [ + 256, + { + + }, + [ + "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.txt", + "bwa/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.txt.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.txt", + "bwa/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.txt.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.MarkDuplicates.metrics.txt", + "bwa/merged_replicate/picard_metrics/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.MarkDuplicates.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_chipseq_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,659c900f8be056cabaecdf0cf8992449", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls:md5,c27b821be1bed0050e7129292f4ac4c4", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak:md5,2465ec263cd50577995418413d7dce42", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak:md5,ce05b66c8644e05f91260be71b3c799e", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls:md5,63fe893b810c925c6bd3214df2d17086", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak:md5,d58ac509e5955ef11e78166a8398caa7", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak:md5,30afa099afe41ec21149f6a0e8bf9882", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls:md5,90191ed78cfc1b5417be865570228534", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak:md5,989551d20b0cc0ab1b856cf41a878ed9", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak:md5,550689e5f987da17a2a7e97e8b20b0f9", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls:md5,a33818adc510b2c669e841897bf58cae", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak:md5,a454e4af57c9af7085d936d9fcc96f1e", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak:md5,e43e0b81040bd172f7e9aee857efd233", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls:md5,d3539d92d2466bee39990ffdbe34330b", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak:md5,d83276ebd8c6c594038fdceb519929ac", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak:md5,3333b8da73db92f660778260e144ef7a", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls:md5,3188ac548bc58db0fa569cf25bff6973", + "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.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,88580c6e8d6ec676be482eccb609378c", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls:md5,ecb0aec376aa0025c86a089cabcebf4d", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak:md5,35709d3fc707f53628e0ccab6b464d83", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak:md5,df8204d2f219db2fa44bc1c7073e60a0", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls:md5,eedf4ae489baa75e01c1a27c8f04221a", + "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.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" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + }, + "timestamp": "2026-03-23T21:03:15.403557209" + }, + "skip_trimming with stub": { + "content": [ + 213 + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + }, + "timestamp": "2025-11-03T13:33:27.997860306" + } +} \ 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..9a1669ed --- /dev/null +++ b/tests/star.nf.test.snap @@ -0,0 +1,1041 @@ +{ + "star": { + "content": [ + 264, + { + + }, + [ + "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_chipseq_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.txt", + "star/merged_library/macs3/broad_peak/consensus/consensus_peaks.mLb.clN.featureCounts.txt.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.MarkDuplicates.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.txt", + "star/merged_replicate/macs3/broad_peak/consensus/consensus_peaks.mRp.clN.featureCounts.txt.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.MarkDuplicates.metrics.txt", + "star/merged_replicate/picard_metrics/OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.MarkDuplicates.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,5614a5f428cad6b1efcdffbb8487f4d0", + "mqc_fastqc_adapter_content_plot-2_1.txt:md5,7050d22f2eabdafb3d1eb81e736599af", + "mqc_fastqc_adapter_content_plot_1.txt:md5,66f3e2f6ba14599b0d6c20144df60777", + "mqc_fastqc_per_base_n_content_plot-2_1.txt:md5,7c5db7fad8afe578076466416e17bbd0", + "mqc_fastqc_per_base_n_content_plot_1.txt:md5,8d9cdd0463193b7e10332e2ca0273aca", + "mqc_fastqc_per_base_sequence_quality_plot-2_1.txt:md5,3f7c1c4998d41f10fcc48f15fc1c214f", + "mqc_fastqc_per_base_sequence_quality_plot_1.txt:md5,821cb87b0ae8bd61cd445d153b8f371a", + "mqc_fastqc_per_sequence_gc_content_plot-2_Counts.txt:md5,076f8f06afb71ddf1de87480c0a937ab", + "mqc_fastqc_per_sequence_gc_content_plot-2_Percentages.txt:md5,4f0d049c48c4cde730fdc2ee37130658", + "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,3dde643427f3229f283527966d7dd32e", + "mqc_fastqc_per_sequence_quality_scores_plot_1.txt:md5,3bfe1c94f710975829e2c1e3b5f16ea7", + "mqc_fastqc_sequence_counts_plot-2_1.txt:md5,83670beba48f5d0a1ff4bb038628f49e", + "mqc_fastqc_sequence_counts_plot_1.txt:md5,d0cf8d64e742b5f446e6b602d86913b9", + "mqc_fastqc_sequence_duplication_levels_plot-2_1.txt:md5,907ad5b8fb27d2d9fd19281c8fa77e65", + "mqc_fastqc_sequence_duplication_levels_plot_1.txt:md5,23c4883ed6c22212b0c3e07a863745d1", + "mqc_fastqc_sequence_length_distribution_plot_1.txt:md5,46650932914f76713075e12934d6fcfe", + "mqc_featureCounts_assignment_plot-2_1.txt:md5,a68c726dd325fb05bdac468021e6d915", + "mqc_featureCounts_assignment_plot_1.txt:md5,96ea63ea653c829990e859cac1ead3ab", + "mqc_samtools-idxstats-mapped-reads-plot-2_Normalised_Counts.txt:md5,0365698843b5dbaf32710bd8bfe9b5ed", + "mqc_samtools-idxstats-mapped-reads-plot-2_Observed_over_Expected_Counts.txt:md5,3b625d09168ed22e200e69f4a7104cfc", + "mqc_samtools-idxstats-mapped-reads-plot-2_Raw_Counts.txt:md5,38cb8d7f7cd9c39da2240638540773b7", + "mqc_samtools-idxstats-mapped-reads-plot-3_Normalised_Counts.txt:md5,72d5f2cea14d1d7e0834e040b125ed70", + "mqc_samtools-idxstats-mapped-reads-plot-3_Observed_over_Expected_Counts.txt:md5,a22bf555cae0dda763c6df3549cb1d6f", + "mqc_samtools-idxstats-mapped-reads-plot-3_Raw_Counts.txt:md5,fbc0a126480b3ecf17d9ede478e70f9e", + "mqc_samtools-idxstats-mapped-reads-plot-4_Normalised_Counts.txt:md5,6ca49435a43c19f388e9aff980ab9084", + "mqc_samtools-idxstats-mapped-reads-plot-4_Observed_over_Expected_Counts.txt:md5,e9ee948cbf535683043b2fddf4e8fb66", + "mqc_samtools-idxstats-mapped-reads-plot-4_Raw_Counts.txt:md5,61b95fb8a4f5f8e0deb5717e18d86090", + "mqc_samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,f3c8f1554674e7e8eb1affccfc010f4b", + "mqc_samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,76f7552df76b2bec2bc472000a66988a", + "mqc_samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,98d9baa50dd5ade65979be7bd9791376", + "mqc_samtools_alignment_plot-2_1.txt:md5,f9840e1ed30305dac024d9bdd573c426", + "mqc_samtools_alignment_plot-3_1.txt:md5,79b4b6780b8324f1bcf0b81f92c7b549", + "mqc_samtools_alignment_plot-4_1.txt:md5,8241656c1b93bed4b3b725e1be6236c1", + "mqc_samtools_alignment_plot_1.txt:md5,e273e83438806ed8a61bf15052ae9251", + "multiqc_citations.txt:md5,34da9f7497d275274f6dfd3b89831edb", + "multiqc_cutadapt.txt:md5,19916e059f11fa2c038c97bbb0ea190b", + "multiqc_fastqc.txt:md5,a9a7484add8120fc3cf3d5626a92973b", + "multiqc_fastqc_1.txt:md5,6f694cea56d88eb91b4c9610f7a12ca5", + "multiqc_featureCounts_mlib_featurecounts.txt:md5,26b144fde7a16879ab0f859f9be2b371", + "multiqc_featureCounts_mrep_featurecounts.txt:md5,17bc5d87a6be34a2add90f1a78efe9b9", + "multiqc_mlib_frip_score-plot.txt:md5,03ca2f05877aeb795c71a9835aa7c7c8", + "multiqc_mlib_peak_annotation-plot.txt:md5,ad464cf5f4a581187a7dc98693999a27", + "multiqc_mlib_peak_count-plot.txt:md5,825d5d9d0e7d118c904eab2dfa3b912e", + "multiqc_mrep_frip_score-plot.txt:md5,c7a99f3dc6cf7756b11ca786d5bf154d", + "multiqc_mrep_peak_annotation-plot.txt:md5,3343c26c3f16ea19fc4d5a73141239f3", + "multiqc_mrep_peak_count-plot.txt:md5,0341231a30ef1f61ccec2bfd37a99d4b", + "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,aced6e2ac008d82aabed98ca2a8b341e", + "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,a22d50d14b76f3a830019bbfc78febfd", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.scale_factor.txt:md5,4fbc241cec6a091be919fdb7068ad8a4", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN.scale_factor.txt:md5,cf0e1529b9f498207ef0c094a8fb9ed7", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.scale_factor.txt:md5,e08f19135302dff2969254b6629820ff", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.scale_factor.txt:md5,db74e4b80e1d17f1761b30e5ef9c279e", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.scale_factor.txt:md5,30434411062e4b6579e0b66b19c07fc4", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.broadPeak:md5,2548b49e84483ac74c16f114d2c1d17b", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.gappedPeak:md5,d56c3cdad431b707b6b600276da00875", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.xls:md5,edf4b3f94298be07beba88de145abeb9", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.broadPeak:md5,dbead85e4df9c2d1be24be72886d61c9", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.gappedPeak:md5,a278a86e3d67a62f594decd2cb92c248", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.xls:md5,c1b61802c252ff61d6a517cf246719d3", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.broadPeak:md5,7e0b0dbe055cc7553be6b0bb29ae477f", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.gappedPeak:md5,69728131921994669030baed3e87e605", + "OSMOTIC_STRESS_T100_SE_REP1.mLb.clN_peaks.xls:md5,b336f0f8c9cc5521a736ddf636279bcf", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.broadPeak:md5,aa4caeba7a2e0d6a0b5769373cbca014", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.gappedPeak:md5,2da1d3179985f427374e6c79734691a7", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN_peaks.xls:md5,bd593937e3eea53b26ef19124d1a1bc1", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.broadPeak:md5,8aaa10598a935c52e63376637d55c7b0", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.gappedPeak:md5,1770d09db2bb066f8e9cecb4946ae973", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN_peaks.xls:md5,de573b53e2cb09039ddf4311477c1e85", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.broadPeak:md5,8a19424cc30637a2f547b3ddab521ffa", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.gappedPeak:md5,4c2d0de6d936965413705a7d34af8812", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.xls:md5,4c013503aa809f3482a8d2f68d60b227", + "consensus_peaks.mLb.clN.bed:md5,7646742d8976b49ec3f90bf9d7fbe5a8", + "consensus_peaks.mLb.clN.boolean.intersect.txt:md5,35942306df818c33595d500f68547d9d", + "consensus_peaks.mLb.clN.boolean.txt:md5,8bf218731c7796d1ce8c5df84c543df3", + "consensus_peaks.mLb.clN.saf:md5,b118acbef780b61f24f88453a33dca19", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,c084ab8c295e832e4ffac54f10e5291a", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,95a82cd0085bcb03d0371c27dd8f7e04", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,52465f1c189efc4b677ceb323d3a8ccc", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,d7db1ed107f318f44cca945983842bca", + "OSMOTIC_STRESS_T150_SE_REP1.size_factors.txt:md5,84bc544d1c2a3797d2d81ed122871864", + "OSMOTIC_STRESS_T15_PE_REP1.size_factors.txt:md5,b33eed1d9a6eae58b7fc48cd0303c027", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN_peaks.FRiP_mqc.tsv:md5,9ac1ae649efd0fcf3e9102081d4d66c8", + "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,07263c01ecd9c1988234975879e01370", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN_peaks.count_mqc.tsv:md5,1ddd8a4d942ef2a44b0f2e1ea763887f", + "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,4ab2a1e016f12e82ef6e9008753051af", + "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,fb30d2c9552e840235f52fffcc0b0c6d", + "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,219f7eee4afa753047fd7ae6691a887d", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN_peaks.count_mqc.tsv:md5,95b301f88d0ea495d95431faf9e8fc45", + "macs3_annotatePeaks.mLb.clN.summary.txt:md5,20ec8d6c898174286ef23b7a1837f92d", + "macs3_annotatePeaks.mLb.clN.summary_mqc.tsv:md5,bd1641f72c176acad5143819e8056668", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,6fb454bcb68e963dea90dd7c6d664cb6", + "OSMOTIC_STRESS_T0_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,54ffac99e3d6fadef0e9ae738b144abb", + "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,ec7c2c049ac658c47170997cbe6bc030", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.clN.sorted.bam.idxstats:md5,58b9dd3213da1b299e1f3b7ab031ba04", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.flagstat:md5,5d5604d76c1d659d3aa03e26d3f54917", + "OSMOTIC_STRESS_T0_PE_REP2.mLb.mkD.sorted.bam.idxstats:md5,f9ad2a1b0f76585a06752b2a0ac166b6", + "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,bc679504d2c7bc5d87df6eb5bcc04a43", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.clN.sorted.bam.idxstats:md5,23d0d2e72bf58e01d568ad547227e47a", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.flagstat:md5,321663b7fa578b106b953cb5cd8af753", + "OSMOTIC_STRESS_T100_SE_REP2.mLb.mkD.sorted.bam.idxstats:md5,bc6503d98cacdd17de481ad5337f5052", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.flagstat:md5,c7a2d99f02feaf98092beb689e6fcbd0", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.clN.sorted.bam.idxstats:md5,4b8b29028641baedae9b468ad1f5b2d7", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.flagstat:md5,ac9f955709f343eba835956aeed6c51a", + "OSMOTIC_STRESS_T150_SE_REP1.mLb.mkD.sorted.bam.idxstats:md5,31b969a00fe899bc06836f79edec64d8", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.flagstat:md5,eaf21a534ddb2d45c4e69fec81a74878", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.clN.sorted.bam.idxstats:md5,b7dc543e44636e4c569c1b0064c51f3c", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.flagstat:md5,5c4ecd5bad2fc2c0a200cae09745d38f", + "OSMOTIC_STRESS_T15_PE_REP1.mLb.mkD.sorted.bam.idxstats:md5,60b8189bafbd5bd5d9e3500dcfed779e", + "OSMOTIC_STRESS_T0_PE.mRp.clN.scale_factor.txt:md5,027236ef18d97af8c4468c6991130e01", + "OSMOTIC_STRESS_T100_SE.mRp.clN.scale_factor.txt:md5,10f4b247ed7d98a91d9fdcb9cfa94a3d", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.broadPeak:md5,b1186d709f1843e4ace217f485272ea3", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.gappedPeak:md5,7c772ef07086b5452cd99bfa9b08e766", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.xls:md5,65db1cc34bfed7da437d0b708dc1344b", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.broadPeak:md5,f7509a148058eba471a5af089bf9caa1", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.gappedPeak:md5,44cd63f363fbf9f570262376f731b465", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.xls:md5,87df4cbb17cc528e1ab679ed66a8500a", + "consensus_peaks.mRp.clN.bed:md5,86918ef9299f0bb6e7c6c5fa6538167f", + "consensus_peaks.mRp.clN.boolean.intersect.txt:md5,7722bcd9eee345fd51603e734e396620", + "consensus_peaks.mRp.clN.boolean.txt:md5,6c51903f45d733e3bd7a4460f38f1047", + "consensus_peaks.mRp.clN.saf:md5,1d0afef0c15c6bb644ace3df53e1c448", + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "OSMOTIC_STRESS_T0_PE_REP1.size_factors.txt:md5,def4ef1ff6d029e608edb60d89c001ed", + "OSMOTIC_STRESS_T0_PE_REP2.size_factors.txt:md5,acf183f63323499c0d2cb2c780b76594", + "OSMOTIC_STRESS_T100_SE_REP1.size_factors.txt:md5,b3d30d4c4c473af80d010d9cf848d3cf", + "OSMOTIC_STRESS_T100_SE_REP2.size_factors.txt:md5,d606d14c1584a19fca3b55547058621e", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.FRiP_mqc.tsv:md5,9c54a27a8b6cc6e0a7f7ed9c1dc20a62", + "OSMOTIC_STRESS_T0_PE.mRp.clN_peaks.count_mqc.tsv:md5,f1362a3c63d2c94fa2f2fadca032dbba", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.FRiP_mqc.tsv:md5,ff129ebd4acf7d532a3e9153e25ffdc8", + "OSMOTIC_STRESS_T100_SE.mRp.clN_peaks.count_mqc.tsv:md5,c5005dcf7f771409d6af9f8242b700fe", + "macs3_annotatePeaks.mRp.clN.summary.txt:md5,949ffb5874dab43485183fedc71f264c", + "macs3_annotatePeaks.mRp.clN.summary_mqc.tsv:md5,aaee46e391c099b2373e4a4054f97604", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.flagstat:md5,3d75bee2e0d21a9f0a5b63b067627901", + "OSMOTIC_STRESS_T0_PE.mRp.clN.sorted.bam.idxstats:md5,c098860a16cb80dc02c9e7350650c0a3", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.flagstat:md5,f4fd8f22ff88f5cd6f1685fe404884dd", + "OSMOTIC_STRESS_T100_SE.mRp.clN.sorted.bam.idxstats:md5,ba93fd0513c58366b31537e06da25a54" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + }, + "timestamp": "2026-03-23T12:10:00.120333021" + }, + "star with stub": { + "content": [ + 26 + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.7" + }, + "timestamp": "2026-03-20T23:41:33.115193909" + } +} \ 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..a265ad5d 100644 --- a/workflows/atacseq.nf +++ b/workflows/atacseq.nf @@ -1,85 +1,33 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 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 { softwareVersionsToYAML } 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 +40,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 +66,84 @@ 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_versions // channel: [ path(versions.yml) ] + 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 + + 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 + } + + ch_multiqc_files = channel.empty() // - // SUBWORKFLOW: Uncompress and prepare reference genome files + // Collection versions from topic channel // - PREPARE_GENOME ( - params.aligner - ) - ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) + def topic_versions = channel.topic("versions") + .distinct() + .branch { entry -> + versions_file: entry instanceof Path + versions_tuple: true + } + + def topic_versions_string = topic_versions.versions_tuple + .map { process, tool, version -> + [ process[process.lastIndexOf(':')+1..-1], " ${tool}: ${version}" ] + } + .groupTuple(by:0) + .map { process, tool_versions -> + tool_versions.unique().sort() + "${process}:\n${tool_versions.join('\n')}" + } // // 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 @@ -175,25 +175,25 @@ 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() 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 + .map { + [ [:], it ] + } ) 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 @@ -206,13 +206,15 @@ 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 + .map { + [ [:], it ] + } ) 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 @@ -223,40 +225,10 @@ workflow ATACSEQ { // 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 + FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.reads, + ch_chromap_index, + ch_fasta .map { [ [:], it ] }, @@ -265,8 +237,8 @@ workflow ATACSEQ { [], [] ) - ch_genome_bam_index = FASTQ_ALIGN_CHROMAP.out.bai ch_genome_bam = FASTQ_ALIGN_CHROMAP.out.bam + ch_genome_bam_index = FASTQ_ALIGN_CHROMAP.out.bai ch_samtools_stats = FASTQ_ALIGN_CHROMAP.out.stats ch_samtools_flagstat = FASTQ_ALIGN_CHROMAP.out.flagstat ch_samtools_idxstats = FASTQ_ALIGN_CHROMAP.out.idxstats @@ -280,12 +252,14 @@ workflow ATACSEQ { 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 + .map { + [ [:], it ] + }, 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 @@ -322,8 +296,14 @@ workflow ATACSEQ { // MERGED_LIBRARY_MARKDUPLICATES_PICARD ( PICARD_MERGESAMFILES_LIBRARY.out.bam, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai + ch_fasta + .map { + [ [:], it ] + }, + ch_fai + .map { + [ [:], it ] + } ) ch_versions = ch_versions.mix(MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.versions) @@ -331,9 +311,22 @@ workflow ATACSEQ { // 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.bai, by: [0], remainder: true) + .join(MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.csi, by: [0], remainder: true) + .map { + meta, bam, bai, csi -> + if (bai) { + [ meta, bam, bai ] + } else { + [ meta, bam, csi ] + } + }, + ch_filtered_bed.first(), + ch_fasta + .map { + [ [:], it ] + }, ch_bamtools_filter_se_config, ch_bamtools_filter_pe_config ) @@ -363,15 +356,11 @@ workflow ATACSEQ { .map { [ it[0], it[1], [] ] }, - PREPARE_GENOME - .out - .fasta + ch_fasta .map { [ [:], it ] }, - PREPARE_GENOME - .out - .fai + ch_fai .map { [ [:], it ] } @@ -383,27 +372,36 @@ workflow ATACSEQ { // // 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_bai = MERGED_LIBRARY_FILTER_BAM.out.bai ch_merged_library_filter_flagstat = MERGED_LIBRARY_FILTER_BAM.out.flagstat + ch_merged_library_filter_csi = MERGED_LIBRARY_FILTER_BAM.out.csi 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_fasta + .map { + [ [:], it ] + } ) 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_bai = MERGED_LIBRARY_BAM_SHIFT_READS.out.bai ch_merged_library_filter_flagstat = MERGED_LIBRARY_BAM_SHIFT_READS.out.flagstat + ch_merged_library_filter_csi = MERGED_LIBRARY_BAM_SHIFT_READS.out.csi + } // // 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) @@ -414,8 +412,8 @@ workflow ATACSEQ { 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) @@ -423,7 +421,16 @@ workflow ATACSEQ { // Create channels: [ meta, [bam], [bai] ] or [ meta, [ bam, control_bam ] [ bai, control_bai ] ] ch_merged_library_filter_bam - .join(ch_merged_library_filter_bai, by: [0]) + .join(ch_merged_library_filter_bai, by: [0], remainder: true) + .join(ch_merged_library_filter_csi, by: [0], remainder: true) + .map { + meta, bam, bai, csi -> + if (bai) { + [ meta, bam, bai ] + } else { + [ meta, bam, csi ] + } + } .set { ch_bam_bai } if (params.with_control) { @@ -474,13 +481,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_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, @@ -494,7 +501,7 @@ workflow ATACSEQ { // // SUBWORKFLOW: Consensus peaks analysis // - ch_macs2_consensus_library_bed = 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() @@ -502,15 +509,15 @@ workflow ATACSEQ { 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 @@ -521,7 +528,16 @@ workflow ATACSEQ { MERGED_LIBRARY_MARKDUPLICATES_PICARD .out .bam - .join(MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.bai, by: [0]) + .join(MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.bai, by: [0], remainder: true) + .join(MERGED_LIBRARY_MARKDUPLICATES_PICARD.out.csi, by: [0], remainder: true) + .map { + meta, bam, bai, csi -> + if (bai) { + [ meta, bam, bai ] + } else { + [ meta, bam, csi ] + } + } .join(MERGED_LIBRARY_CALL_ANNOTATE_PEAKS.out.peaks, by: [0]) .set { ch_bam_peaks } @@ -532,10 +548,10 @@ 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()) @@ -553,11 +569,11 @@ workflow ATACSEQ { 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_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() @@ -596,8 +612,14 @@ workflow ATACSEQ { // MERGED_REPLICATE_MARKDUPLICATES_PICARD ( PICARD_MERGESAMFILES_REPLICATE.out.bam, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai + ch_fasta + .map { + [ [:], it ] + }, + ch_fai + .map { + [ [:], it ] + } ) ch_markduplicates_replicate_stats = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.stats ch_markduplicates_replicate_flagstat = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.flagstat @@ -609,30 +631,37 @@ workflow ATACSEQ { // 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_bai = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.bai ch_merged_replicate_markduplicate_flagstat = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.flagstat + ch_merged_replicate_markduplicate_csi = MERGED_REPLICATE_MARKDUPLICATES_PICARD.out.csi 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_fasta + .map { + [ [:], it ] + } ) 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_bai = MERGED_REPLICATE_BAM_SHIFT_READS.out.bai ch_merged_replicate_markduplicate_flagstat = MERGED_REPLICATE_BAM_SHIFT_READS.out.flagstat + ch_merged_replicate_markduplicate_csi = MERGED_REPLICATE_BAM_SHIFT_READS.out.csi + } + 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 + ch_versions = ch_versions.mix(MERGED_REPLICATE_BAM_TO_BIGWIG.out.versions) } - - // 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) - // Create channels: [ meta, bam, ([] for control_bam) ] if (params.with_control) { ch_merged_replicate_markduplicate_bam @@ -660,13 +689,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,10 +704,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_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 ch_versions = ch_versions.mix(MERGED_REPLICATE_CALL_ANNOTATE_PEAKS.out.versions) // @@ -688,15 +717,15 @@ 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 @@ -709,27 +738,27 @@ workflow ATACSEQ { // if (!params.skip_igv) { IGV ( - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.fai, + ch_fasta, + ch_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_macs3_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_macs3_replicate_peaks.collect{it[1]}.ifEmpty([]), + ch_macs3_consensus_replicate_bed.collect{it[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('') }, @@ -738,27 +767,37 @@ workflow ATACSEQ { } // - // MODULE: Pipeline reporting + // Collate and save software versions // - CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_versions.unique().collectFile(name: 'collated_versions.yml') - ) + ch_collated_versions = softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) + .mix(topic_versions_string) + .collectFile( + storeDir: "${params.outdir}/pipeline_info", + name: 'nf_core_' + 'chipseq_software_' + 'mqc_' + 'versions.yml', + sort: true, + newLine: true + ) // // MODULE: MultiQC // if (!params.skip_multiqc) { - workflow_summary = WorkflowAtacseq.paramsSummaryMultiqc(workflow, summary_params) - ch_workflow_summary = Channel.value(workflow_summary) - - methods_description = WorkflowAtacseq.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description) - ch_methods_description = Channel.value(methods_description) + ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) + ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() + ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath(params.multiqc_logo) : Channel.empty() + summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") + ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) + 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) + 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([]), @@ -793,9 +832,9 @@ workflow ATACSEQ { ch_markduplicates_replicate_idxstats.collect{it[1]}.ifEmpty([]), ch_markduplicates_replicate_metrics.collect{it[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_macs3_frip_replicate_multiqc.collect{it[1]}.ifEmpty([]), + ch_macs3_peak_count_replicate_multiqc.collect{it[1]}.ifEmpty([]), + ch_macs3_plot_homer_annotatepeaks_replicate_multiqc.collect().ifEmpty([]), ch_featurecounts_replicate_multiqc.collect{it[1]}.ifEmpty([]), ch_deseq2_pca_library_multiqc.collect().ifEmpty([]), @@ -803,26 +842,12 @@ workflow ATACSEQ { 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: + multiqc_report = ch_multiqc_report.toList() // channel: /path/to/multiqc_report.html + versions = ch_versions // channel: [ path(versions.yml) ] } /*