diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4ecfbfe33..b290e0901 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -10,15 +10,7 @@ "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" + "python.defaultInterpreterPath": "/opt/conda/bin/python" }, // Add the IDs of extensions you want installed when the container is created. diff --git a/.editorconfig b/.editorconfig index b6b319077..72dda289a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -18,7 +18,16 @@ end_of_line = unset insert_final_newline = unset trim_trailing_whitespace = unset indent_style = unset -indent_size = unset +[/subworkflows/nf-core/**] +charset = unset +end_of_line = unset +insert_final_newline = unset +trim_trailing_whitespace = unset +indent_style = unset [/assets/email*] indent_size = unset + +# ignore python and markdown +[*.{py,md}] +indent_style = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 82ce14f40..d784a8bbc 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -9,9 +9,8 @@ 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 ;) -:::info -If you need help using or modifying nf-core/rnaseq then the best place to ask is on the nf-core Slack [#rnaseq](https://nfcore.slack.com/channels/rnaseq) channel ([join our Slack here](https://nf-co.re/join/slack)). -::: +> [!NOTE] +> If you need help using or modifying nf-core/rnaseq then the best place to ask is on the nf-core Slack [#rnaseq](https://nfcore.slack.com/channels/rnaseq) channel ([join our Slack here](https://nf-co.re/join/slack)). ## Contribution workflow @@ -27,8 +26,11 @@ If you're not used to this workflow with git, you can start with some [docs from ## Tests -You can optionally test your changes by running the pipeline locally. Then it is recommended to use the `debug` profile to -receive warnings about process selectors and other debug info. Example: `nextflow run . -profile debug,test,docker --outdir `. +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. @@ -90,7 +92,7 @@ Once there, use `nf-core schema build` to add to `nextflow_schema.json`. Sensible defaults for process resource requirements (CPUs / memory / time) for a process should be defined in `conf/base.config`. These should generally be specified generic with `withLabel:` selectors so they can be shared across multiple processes/steps of the pipeline. A nf-core standard set of labels that should be followed where possible can be seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/master/nf_core/pipeline-template/conf/base.config), which has the default process as a single core-process, and then different levels of multi-core configurations for increasingly large memory requirements defined with standardised labels. -The process resources can be passed on to the tool dynamically within the process with the `${task.cpu}` and `${task.memory}` variables in the `script:` block. +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 diff --git a/.github/include.yaml b/.github/include.yaml new file mode 100644 index 000000000..a3629f4c4 --- /dev/null +++ b/.github/include.yaml @@ -0,0 +1,10 @@ +".": + - ./.github/workflows/** + - ./nf-test.config + - ./nextflow.config +tests: + - ./assets/* + - ./bin/* + - ./conf/* + - ./main.nf + - ./nextflow_schema.json diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index d694b7b67..53ecc73d4 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -19,7 +19,7 @@ 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: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 66bd47cf9..8346f837c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,288 +1,112 @@ 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 + NFT_VER: "0.9.0" + NFT_WORKDIR: "~" + NFT_DIFF: "pdiff" + NFT_DIFF_ARGS: "--line-numbers --expand-tabs=2" 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/rnaseq') }}" + nf-test-changes: + name: Check for changes runs-on: ubuntu-latest - strategy: - matrix: - NXF_VER: - - "23.04.0" - - "latest-everything" + outputs: + nf_test_files: ${{ steps.list.outputs.components }} steps: - - name: Check out pipeline code - uses: actions/checkout@v4 - - - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 + - uses: actions/checkout@v4 with: - version: "${{ matrix.NXF_VER }}" + fetch-depth: 0 - - name: Hash Github Workspace - id: hash_workspace - run: | - echo "digest=$(echo RNA_3.10.1_${{ github.workspace }} | md5sum | cut -c 1-25)" >> $GITHUB_OUTPUT - - - name: Cache test data - id: cache-testdata - uses: actions/cache@v3 + - name: List nf-test files + id: list + uses: adamrtalbot/detect-nf-test-changes@v0.0.2 with: - path: test-datasets/ - key: ${{ steps.hash_workspace.outputs.digest }} + head: ${{ github.sha }} + base: origin/${{ github.base_ref }} + include: .github/include.yaml - - name: Check out test data - if: steps.cache-testdata.outputs.cache-hit != 'true' - uses: actions/checkout@v3 - with: - repository: nf-core/test-datasets - ref: rnaseq3 - path: test-datasets/ - - - name: Replace remote paths in samplesheets + - name: print list of nf-test files run: | - for f in ${{ github.workspace }}/test-datasets/samplesheet/v3.10/*.csv; do - sed -i "s=https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/=${{ github.workspace }}/test-datasets/=g" $f - echo "========== $f ============" - cat $f - echo "========================================" - done; + echo ${{ steps.list.outputs.components }} - - name: Run pipeline with test data - run: | - nextflow run ${GITHUB_WORKSPACE} -profile test_cache,docker --outdir ./results --test_data_base ${{ github.workspace }}/test-datasets/ - - star_salmon: - name: Test STAR Salmon with workflow parameters - if: ${{ (github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/rnaseq')) && !contains(github.event.head_commit.message, '[ci fast]') }} + test: + name: ${{ matrix.nf_test_files }} ${{ matrix.profile }} NF-${{ matrix.NXF_VER }} + needs: [nf-test-changes] + if: needs.nf-test-changes.outputs.nf_test_files != '[]' runs-on: ubuntu-latest strategy: + fail-fast: false matrix: - parameters: - - "--skip_qc" - - "--skip_trimming" - - "--gtf false" - - "--star_index false" - - "--transcript_fasta false" - - "--min_mapped_reads 90" - - "--with_umi" - - "--with_umi --skip_trimming" - - "--remove_ribo_rna --skip_qualimap" - - "--bam_csi_index" - - "--save_align_intermeds --save_reference" - - "--featurecounts_group_type false" - - "--trimmer fastp" - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 - - - name: Hash Github Workspace - id: hash_workspace - run: | - echo "digest=$(echo RNA_3.10.1_${{ github.workspace }} | md5sum | cut -c 1-25)" >> $GITHUB_OUTPUT - - - name: Cache test data - id: cache-testdata - uses: actions/cache@v3 - with: - path: test-datasets/ - key: ${{ steps.hash_workspace.outputs.digest }} - - - name: Check out test data - if: steps.cache-testdata.outputs.cache-hit != 'true' - uses: actions/checkout@v3 - with: - repository: nf-core/test-datasets - ref: rnaseq3 - path: test-datasets/ - - - name: Replace remote paths in samplesheets - run: | - for f in ${{ github.workspace }}/test-datasets/samplesheet/v3.10/*.csv; do - sed -i "s=https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/=${{ github.workspace }}/test-datasets/=g" $f - echo "========== $f ============" - cat $f - echo "========================================" - done; - - - name: Install Nextflow - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ - - - name: Run pipeline with STAR and various parameters - run: | - nextflow run ${GITHUB_WORKSPACE} -profile test_cache,docker --aligner star_salmon ${{ matrix.parameters }} --outdir ./results --test_data_base ${{ github.workspace }}/test-datasets/ + NXF_VER: + - "latest-everything" + - "23.04" + nf_test_files: ["${{ fromJson(needs.nf-test-changes.outputs.nf_test_files) }}"] + profile: + - "docker" - star_rsem: - name: Test STAR RSEM with workflow parameters - if: ${{ (github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/rnaseq')) && !contains(github.event.head_commit.message, '[ci fast]') }} - runs-on: ubuntu-latest - strategy: - matrix: - parameters: - - "--skip_qc" - - "--rsem_index false" steps: - name: Check out pipeline code - uses: actions/checkout@v2 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - - name: Hash Github Workspace - id: hash_workspace - run: | - echo "digest=$(echo RNA_3.10.1_${{ github.workspace }} | md5sum | cut -c 1-25)" >> $GITHUB_OUTPUT - - - name: Cache test data - id: cache-testdata - uses: actions/cache@v3 + - name: Install Nextflow + uses: nf-core/setup-nextflow@v2 with: - path: test-datasets/ - key: ${{ steps.hash_workspace.outputs.digest }} + version: "${{ matrix.NXF_VER }}" - - name: Check out test data - if: steps.cache-testdata.outputs.cache-hit != 'true' - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 with: - repository: nf-core/test-datasets - ref: rnaseq3 - path: test-datasets/ + python-version: "3.11" + architecture: "x64" - - name: Replace remote paths in samplesheets + - name: Install pdiff to see diff between nf-test snapshots run: | - for f in ${{ github.workspace }}/test-datasets/samplesheet/v3.10/*.csv; do - sed -i "s=https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/=${{ github.workspace }}/test-datasets/=g" $f - echo "========== $f ============" - cat $f - echo "========================================" - done; + python -m pip install --upgrade pip + pip install pdiff - - name: Install Nextflow - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ + - uses: nf-core/setup-nf-test@v1 - - name: Run pipeline with RSEM STAR and various parameters + - name: Run nf-test run: | - nextflow run ${GITHUB_WORKSPACE} -profile test_cache,docker --aligner star_rsem ${{ matrix.parameters }} --outdir ./results --test_data_base ${{ github.workspace }}/test-datasets/ + nf-test test --verbose ${{ matrix.nf_test_files }} --profile "+${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap - hisat2: - name: Test HISAT2 with workflow parameters - if: ${{ (github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/rnaseq')) && !contains(github.event.head_commit.message, '[ci fast]') }} - runs-on: ubuntu-latest - strategy: - matrix: - parameters: - - "--skip_qc" - - "--hisat2_index false" - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 - - - name: Hash Github Workspace - id: hash_workspace - run: | - echo "digest=$(echo RNA_3.10.1_${{ github.workspace }} | md5sum | cut -c 1-25)" >> $GITHUB_OUTPUT - - - name: Cache test data - id: cache-testdata - uses: actions/cache@v3 + - uses: pcolby/tap-summary@v1 with: - path: test-datasets/ - key: ${{ steps.hash_workspace.outputs.digest }} + path: >- + test.tap - - name: Check out test data - if: steps.cache-testdata.outputs.cache-hit != 'true' - uses: actions/checkout@v3 - with: - repository: nf-core/test-datasets - ref: rnaseq3 - path: test-datasets/ - - - name: Replace remote paths in samplesheets - run: | - for f in ${{ github.workspace }}/test-datasets/samplesheet/v3.10/*.csv; do - sed -i "s=https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/=${{ github.workspace }}/test-datasets/=g" $f - echo "========== $f ============" - cat $f - echo "========================================" - done; - - - name: Install Nextflow + - name: Output log on failure + if: failure() run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ + sudo apt install bat > /dev/null + batcat --decorations=always --color=always ${{ github.workspace }}/.nf-test/tests/*/meta/nextflow.log - - name: Run pipeline with HISAT2 and various parameters - run: | - nextflow run ${GITHUB_WORKSPACE} -profile test_cache,docker --aligner hisat2 ${{ matrix.parameters }} --outdir ./results --test_data_base ${{ github.workspace }}/test-datasets/ + - name: Publish Test Report + uses: mikepenz/action-junit-report@v3 + if: always() # always run even if the previous step fails + with: + report_paths: test.xml - pseudo: - name: Test Pseudoaligners with workflow parameters - if: ${{ (github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/rnaseq')) && !contains(github.event.head_commit.message, '[ci fast]') }} + confirm-pass: runs-on: ubuntu-latest - strategy: - matrix: - parameters: - - "--pseudo_aligner salmon --skip_qc" - - "--pseudo_aligner salmon --skip_alignment --skip_pseudo_alignment" - - "--pseudo_aligner salmon --salmon_index false --transcript_fasta false" - - "--pseudo_aligner kallisto --skip_qc" - - "--pseudo_aligner kallisto --skip_alignment --skip_pseudo_alignment" - - "--pseudo_aligner kallisto --kallisto_index false --transcript_fasta false" + needs: [test] + if: always() steps: - - name: Check out pipeline code - uses: actions/checkout@v2 - - - name: Hash Github Workspace - id: hash_workspace - run: | - echo "digest=$(echo RNA_3.10.1_${{ github.workspace }} | md5sum | cut -c 1-25)" >> $GITHUB_OUTPUT - - - name: Cache test data - id: cache-testdata - uses: actions/cache@v3 - with: - path: test-datasets/ - key: ${{ steps.hash_workspace.outputs.digest }} - - - name: Check out test data - if: steps.cache-testdata.outputs.cache-hit != 'true' - uses: actions/checkout@v3 - with: - repository: nf-core/test-datasets - ref: rnaseq3 - path: test-datasets/ - - - name: Replace remote paths in samplesheets - run: | - for f in ${{ github.workspace }}/test-datasets/samplesheet/v3.10/*.csv; do - sed -i "s=https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/=${{ github.workspace }}/test-datasets/=g" $f - echo "========== $f ============" - cat $f - echo "========================================" - done; - - - name: Install Nextflow - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ - - - name: Run pipeline with Salmon or Kallisto and various parameters - run: | - nextflow run ${GITHUB_WORKSPACE} -profile test_cache,docker ${{ matrix.parameters }} --outdir ./results --test_data_base ${{ github.workspace }}/test-datasets/ + - name: All tests ok + if: ${{ !contains(needs.*.result, 'failure') }} + run: exit 0 + - name: One or more tests failed + if: ${{ contains(needs.*.result, 'failure') }} + run: exit 1 + + - name: debug-print + if: always() + run: | + echo "toJSON(needs) = ${{ toJSON(needs) }}" + echo "toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index 694e90ecb..0b6b1f272 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@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9 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 000000000..2d20d6442 --- /dev/null +++ b/.github/workflows/download_pipeline.yml @@ -0,0 +1,86 @@ +name: Test successful pipeline download with 'nf-core download' + +# Run the workflow when: +# - dispatched manually +# - when a PR is opened or reopened to 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 download." + required: true + default: "dev" + pull_request: + types: + - opened + - edited + - synchronize + branches: + - master + pull_request_target: + branches: + - master + +env: + NXF_ANSI_LOG: false + +jobs: + download: + runs-on: ubuntu-latest + 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@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 + with: + python-version: "3.12" + architecture: "x64" + - uses: eWaterCycle/setup-singularity@931d4e31109e875b13309ae1d07c70ca8fbc8537 # v7 + with: + singularity-version: 3.8.3 + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install git+https://github.com/nf-core/tools.git@dev + + - name: Get the repository name and current branch set as environment variable + run: | + echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV} + echo "REPOTITLE_LOWERCASE=$(basename ${GITHUB_REPOSITORY,,})" >> ${GITHUB_ENV} + echo "REPO_BRANCH=${{ github.event.inputs.testbranch || 'dev' }}" >> ${GITHUB_ENV} + + - name: Download the pipeline + env: + NXF_SINGULARITY_CACHEDIR: ./ + run: | + nf-core download ${{ env.REPO_LOWERCASE }} \ + --revision ${{ env.REPO_BRANCH }} \ + --outdir ./${{ env.REPOTITLE_LOWERCASE }} \ + --compress "none" \ + --container-system 'singularity' \ + --container-library "quay.io" -l "docker.io" -l "ghcr.io" \ + --container-cache-utilisation 'amend' \ + --download-configuration + + - name: Inspect download + run: tree ./${{ env.REPOTITLE_LOWERCASE }} + + - name: Run the downloaded pipeline (stub) + id: stub_run_pipeline + continue-on-error: true + env: + NXF_SINGULARITY_CACHEDIR: ./ + NXF_SINGULARITY_HOME_MOUNT: true + run: nextflow run ./${{ env.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ env.REPO_BRANCH }}) -stub -profile test,singularity --outdir ./results + - name: Run the downloaded pipeline (stub run not supported) + id: run_pipeline + if: ${{ job.steps.stub_run_pipeline.status == failure() }} + env: + NXF_SINGULARITY_CACHEDIR: ./ + NXF_SINGULARITY_HOME_MOUNT: true + run: nextflow run ./${{ env.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ env.REPO_BRANCH }}) -profile test,singularity --outdir ./results diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index 619e58a6e..1d7eed3bb 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix-linting.yml @@ -4,7 +4,7 @@ on: types: [created] jobs: - deploy: + 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/') && @@ -13,10 +13,17 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 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@71345be0265236311c031f5c7866368bd1eff043 # v4 + 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 @@ -24,32 +31,59 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} - - uses: actions/setup-node@v4 + # Install and run pre-commit + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 + with: + python-version: "3.12" - - name: Install Prettier - run: npm install -g prettier @prettier/plugin-php + - name: Install pre-commit + run: pip install pre-commit - # 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 pre-commit + id: pre-commit + run: pre-commit run --all-files + continue-on-error: true - - name: Run 'prettier --write' - if: steps.prettier_status.outputs.result == 'fail' - run: prettier --write ${GITHUB_WORKSPACE} + # 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@71345be0265236311c031f5c7866368bd1eff043 # v4 + with: + comment-id: ${{ github.event.comment.id }} + reactions: "+1" - name: Commit & push changes - if: steps.prettier_status.outputs.result == 'fail' + 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 linting with Prettier" + 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@71345be0265236311c031f5c7866368bd1eff043 # v4 + 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@71345be0265236311c031f5c7866368bd1eff043 # v4 + 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@71345be0265236311c031f5c7866368bd1eff043 # v4 + 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/rnaseq/actions/runs/${{ github.run_id }}) for more details. diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 905c58e44..1fcafe880 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,74 +11,34 @@ on: types: [published] jobs: - EditorConfig: + pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - - uses: actions/setup-node@v4 - - - 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@v4 - - - uses: actions/setup-node@v4 - - - 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@v4 - - - 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.12 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: - message: | - ## Python linting (`black`) is failing - - To keep the code consistent with lots of contributors, we run automated code consistency checks. - To fix this CI test, please run: - - * Install [`black`](https://black.readthedocs.io/en/stable/): `pip install black` - * Fix formatting errors in your pipeline: `black .` - - Once you push these changes the test should pass, and you can hide this comment :+1: + python-version: "3.12" - We highly recommend setting up Black in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + - name: Install pre-commit + run: pip install pre-commit - 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@v4 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 + uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: - python-version: "3.11" + python-version: "3.12" architecture: "x64" - name: Install dependencies @@ -99,7 +59,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 0bbcd30f2..40acc23f5 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@09f2f74827fd3a8607589e5ad7f9398816f540fe # v3 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@331f8f5b4215f0445d3c07b4967662a32a2d3e31 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 6ad339277..03ecfcf72 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -9,6 +9,11 @@ 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' ' ')" >> $GITHUB_OUTPUT + - uses: rzr/fediverse-action@master with: access-token: ${{ secrets.MASTODON_ACCESS_TOKEN }} @@ -20,11 +25,13 @@ jobs: Please see the changelog: ${{ github.event.release.html_url }} + ${{ steps.get_topics.outputs.topics }} #nfcore #openscience #nextflow #bioinformatics + send-tweet: runs-on: ubuntu-latest steps: - - uses: actions/setup-python@v4 + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: python-version: "3.10" - name: Install dependencies @@ -56,7 +63,7 @@ jobs: bsky-post: runs-on: ubuntu-latest steps: - - uses: zentered/bluesky-post-action@v0.0.2 + - uses: zentered/bluesky-post-action@80dbe0a7697de18c15ad22f4619919ceb5ccf597 # v0.1.0 with: post: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! diff --git a/.gitignore b/.gitignore index 5124c9ac7..ef809d7c3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,12 @@ +*.pyc +.DS_Store .nextflow* -work/ +.nf-test.log data/ +nf-test +.nf-test* results/ -.DS_Store -testing/ +test.xml testing* -*.pyc +testing/ +work/ diff --git a/.gitpod.yml b/.gitpod.yml index acf726953..105a1821a 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -7,15 +7,14 @@ tasks: - name: unset JAVA_TOOL_OPTIONS command: | unset JAVA_TOOL_OPTIONS + 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 + # - nextflow.nextflow # Nextflow syntax highlighting - oderwat.indent-rainbow # Highlight indentation level - streetsidesoftware.code-spell-checker # Spelling checker for source code + - charliermarsh.ruff # Code linter Ruff diff --git a/.nf-core.yml b/.nf-core.yml index 094459361..d01e0a8b4 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,8 +1,15 @@ repository_type: pipeline +nf_core_version: "2.14.1" lint: files_unchanged: - assets/email_template.html - assets/email_template.txt - - lib/NfcoreTemplate.groovy - - pyproject.toml + - .gitignore + files_exist: + - conf/modules.config + actions_ci: false multiqc_config: false + modules_config: false + nextflow_config: + - config_defaults: + - params.ribo_database_manifest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0c31cdb99..4dc0f1dcd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,13 @@ repos: - repo: https://github.com/pre-commit/mirrors-prettier - rev: "v2.7.1" + rev: "v3.1.0" hooks: - id: prettier + additional_dependencies: + - prettier@3.2.5 + + - repo: https://github.com/editorconfig-checker/editorconfig-checker.python + rev: "2.7.3" + hooks: + - id: editorconfig-checker + alias: ec diff --git a/CHANGELOG.md b/CHANGELOG.md index e2d4c8fc8..2c3d147f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,163 @@ 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). +## [[3.15.0](https://github.com/nf-core/rnaseq/releases/tag/3.15.0)] - 2024-09-04 + +### Credits + +Special thanks to the following for their contributions to the release: + +- [Adam Talbot](https://github.com/adamrtalbot) +- [David Carlson](https://github.com/davidecarlson) +- [Edmund Miller](https://github.com/edmundmiller) +- [Jonathan Manning](https://github.com/pinin4fjords) +- [Laramie Lindsey](https://github.com/laramiellindsey) +- [Luke Zappia](https://github.com/lazappi) +- [Matthias Zepper](https://github.com/MatthiasZepper) +- [Maxime Garcia](https://github.com/maxulysse) +- [Pieter Moris](https://github.com/pmoris) +- [Rob Syme](https://github.com/robsyme) +- [Thomas Danhorn](https://github.com/tdanhorn) + +Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. + +### Enhancements & fixes + +- [PR #1180](https://github.com/nf-core/rnaseq/pull/1180) - Bump pipeline version to 3.15.0dev +- [PR #1186](https://github.com/nf-core/rnaseq/pull/1186) - Properly update qualimap/rnaseq module (ie not patch) +- [PR #1197](https://github.com/nf-core/rnaseq/pull/1197) - Delete lib directory and replace with utils\_\* subworkflows +- [PR #1199](https://github.com/nf-core/rnaseq/pull/1199) - Replace modules.config with more modular config files per module/subworkflow/workflow +- [PR #1201](https://github.com/nf-core/rnaseq/pull/1201) - Template update for nf-core/tools v2.12 +- [PR #1206](https://github.com/nf-core/rnaseq/pull/1206) - Remove `lib/` directory and `modules.config` +- [PR #1210](https://github.com/nf-core/rnaseq/pull/1210) - Use pseudoalignment subworkflow components from nf-core/modules +- [PR #1212](https://github.com/nf-core/rnaseq/pull/1212) - Update all modules and subworkflows to latest versions +- [PR #1213](https://github.com/nf-core/rnaseq/pull/1213) - Pass transcriptome fasta through to samtools stats +- [PR #1214](https://github.com/nf-core/rnaseq/pull/1214) - Bump umitools + delocalise prepareforrsem ([#831](https://github.com/nf-core/rnaseq/issues/831)) +- [PR #1216](https://github.com/nf-core/rnaseq/pull/1216) - Delocalise catadditionalfasta ([#1162](https://github.com/nf-core/rnaseq/issues/1162)) +- [PR #1217](https://github.com/nf-core/rnaseq/pull/1217) - Update Emiller88 => edmundmiller in README +- [PR #1218](https://github.com/nf-core/rnaseq/pull/1218) - Template update for nf-core/tools v2.13 +- [PR #1220](https://github.com/nf-core/rnaseq/pull/1220) - Initialise nf-test and add pipeline level test +- [PR #1221](https://github.com/nf-core/rnaseq/pull/1221) - Use nf-test test for all nf-core components +- [PR #1226](https://github.com/nf-core/rnaseq/pull/1226) - Reuse bbsplit index and don't keep overwriting ([#1225](https://github.com/nf-core/rnaseq/issues/1225)) +- [PR #1228](https://github.com/nf-core/rnaseq/pull/1228) - Make README usage consistent with docs/usage.md +- [PR #1229](https://github.com/nf-core/rnaseq/pull/1229) - Template update for nf-core/tools v2.13.1 +- [PR #1231](https://github.com/nf-core/rnaseq/pull/1231) - Add sortmerna index possibilities +- [PR #1232](https://github.com/nf-core/rnaseq/pull/1232) - Add nf-test tests to star_genomegenerate_igenomes +- [PR #1233](https://github.com/nf-core/rnaseq/pull/1233) - Add nf-test tests to star_align_igenomes +- [PR #1234](https://github.com/nf-core/rnaseq/pull/1234) - Use genomecov from nf-core/modules +- [PR #1235](https://github.com/nf-core/rnaseq/pull/1235) - Add nf-test tests to utils_nfcore_rnaseq_pipeline tests +- [PR #1236](https://github.com/nf-core/rnaseq/pull/1236) - Add nf-test tests to gtf_filter +- [PR #1237](https://github.com/nf-core/rnaseq/pull/1237) - Fix concurrency error in Github CI workflow +- [PR #1238](https://github.com/nf-core/rnaseq/pull/1238) - Add nf-test tests to preprocess_transcripts_fasta_gencode +- [PR #1239](https://github.com/nf-core/rnaseq/pull/1239) - Add nf-test tests to align_star +- [PR #1240](https://github.com/nf-core/rnaseq/pull/1240) - Fix reference files params usage +- [PR #1241](https://github.com/nf-core/rnaseq/pull/1241) - Add nf-test tests to deseq2_qc +- [PR #1242](https://github.com/nf-core/rnaseq/pull/1242) - Use dupradar from nf-core/modules +- [PR #1243](https://github.com/nf-core/rnaseq/pull/1243) - Add nf-test for module MULTIQC_CUSTOM_BIOTYPE +- [PR #1244](https://github.com/nf-core/rnaseq/pull/1244) - Add gtf2bed tests +- [PR #1245](https://github.com/nf-core/rnaseq/pull/1245) - nf test quantify rsem +- [PR #1246](https://github.com/nf-core/rnaseq/pull/1246) - nf-test quantify pseudoalignment +- [PR #1247](https://github.com/nf-core/rnaseq/pull/1247) - nf-test prepare_genome +- [PR #1248](https://github.com/nf-core/rnaseq/pull/1248) - Improved ext.args consolidation for STAR and TRIMGALORE extra_args parameters +- [PR #1249](https://github.com/nf-core/rnaseq/pull/1249) - Include nf-tests for rsem_merge_counts module +- [PR #1250](https://github.com/nf-core/rnaseq/pull/1250) - Remove all tags.yml files because the testing system has changed +- [PR #1251](https://github.com/nf-core/rnaseq/pull/1251) - Replace deseq2qc paths +- [PR #1252](https://github.com/nf-core/rnaseq/pull/1252) - Fix genomeAttribute usage +- [PR #1253](https://github.com/nf-core/rnaseq/pull/1253) - Use nf-test files as matrix to test over in CI/CD for efficiency +- [PR #1260](https://github.com/nf-core/rnaseq/pull/1260) - Update CHANGELOG +- [PR #1261](https://github.com/nf-core/rnaseq/pull/1261) - Add more tests for PREPARE_GENOME +- [PR #1262](https://github.com/nf-core/rnaseq/pull/1262) - Fix CI pipeline +- [PR #1264](https://github.com/nf-core/rnaseq/pull/1264) - Add GHA files back into include statement of Github workflow change detection +- [PR #1265](https://github.com/nf-core/rnaseq/pull/1265) - Small updates noticed during code review +- [PR #1266](https://github.com/nf-core/rnaseq/pull/1266) - Delete unecessary tags from nf.test files for modules and subworkflows +- [PR #1271](https://github.com/nf-core/rnaseq/pull/1271) - Update trimming subworkflow to include more tests +- [PR #1272](https://github.com/nf-core/rnaseq/pull/1272) - Simple pipeline level nf-tests +- [PR #1274](https://github.com/nf-core/rnaseq/pull/1274) - Update bam_markduplicates_picard subworkflow +- [PR #1278](https://github.com/nf-core/rnaseq/pull/1278) - Delocalise pseudo quant workflow +- [PR #1279](https://github.com/nf-core/rnaseq/pull/1279) - Add pseudoaligner pipeline level tests to test suite +- [PR #1280](https://github.com/nf-core/rnaseq/pull/1280) - Reorganise pipeline level tests into flat directory structure +- [PR #1282](https://github.com/nf-core/rnaseq/pull/1282) - Fix CHANGELOG error +- [PR #1283](https://github.com/nf-core/rnaseq/pull/1283) - Add output files to nf-test snapshot +- [PR #1293](https://github.com/nf-core/rnaseq/pull/1293) - Update subworkflow utils_nfcore_pipeline +- [PR #1297](https://github.com/nf-core/rnaseq/pull/1297) - Important! Template update for nf-core/tools v2.14.1 +- [PR #1302](https://github.com/nf-core/rnaseq/pull/1302) - Add missing files from Tximport processing +- [PR #1304](https://github.com/nf-core/rnaseq/pull/1304) - Remove redundant gene TPM outputs +- [PR #1306](https://github.com/nf-core/rnaseq/pull/1306) - Overhaul strandedness detection / comparison +- [PR #1307](https://github.com/nf-core/rnaseq/pull/1307) - Clarify infer strandedness step in subway map and text +- [PR #1308](https://github.com/nf-core/rnaseq/pull/1308) - Various MultiQC issues: FastQC sections for raw and trimmed reads // umi-tools dedup and extraction plots, custom content styling. +- [PR #1309](https://github.com/nf-core/rnaseq/pull/1309) - Document FASTP sampling +- [PR #1310](https://github.com/nf-core/rnaseq/pull/1310) - Reinstate pseudoalignment subworkflow config +- [PR #1312](https://github.com/nf-core/rnaseq/pull/1312) - Fix issues with unzipping of GTF/ GFF files without absolute paths +- [PR #1314](https://github.com/nf-core/rnaseq/pull/1314) - Add reference genome recommendations to usage docs +- [PR #1317](https://github.com/nf-core/rnaseq/pull/1317) - Strip problematic ifEmpty() +- [PR #1319](https://github.com/nf-core/rnaseq/pull/1319) - Reinstate oncomplete error messages +- [PR #1321](https://github.com/nf-core/rnaseq/pull/1321) - Remove push and release triggers from CI +- [PR #1322](https://github.com/nf-core/rnaseq/pull/1322) - Use pre-built Github Action to detect nf-test changes +- [PR #1323](https://github.com/nf-core/rnaseq/pull/1323) - Update actions/checkout to v4 +- [PR #1324](https://github.com/nf-core/rnaseq/pull/1324) - Fix tags entries and rename pipeline level tests +- [PR #1325](https://github.com/nf-core/rnaseq/pull/1325) - Minor fixes to strandedness settings and messaging +- [PR #1326](https://github.com/nf-core/rnaseq/pull/1326) - Move Conda dependencies for local modules to individual environment file +- [PR #1328](https://github.com/nf-core/rnaseq/pull/1328) - Add pipeline level test for STAR-RSEM and HISAT2 +- [PR #1329](https://github.com/nf-core/rnaseq/pull/1329) - Remove tags from all nf-test files +- [PR #1330](https://github.com/nf-core/rnaseq/pull/1330) - Update all nf-core/modules and subworkflows +- [PR #1331](https://github.com/nf-core/rnaseq/pull/1331) - Adding stubs for local modules +- [PR #1334](https://github.com/nf-core/rnaseq/pull/1334) - Update all nf-core/modules and subworkflows with stubs +- [PR #1335](https://github.com/nf-core/rnaseq/pull/1335) - Adding stubs at all levels +- [PR #1336](https://github.com/nf-core/rnaseq/pull/1336) - Use nf-core/setup-nf-test to install nf-test from cache during CI/CD +- [PR #1340](https://github.com/nf-core/rnaseq/pull/1340) - Remove out-of-date Azure specific guidance +- [PR #1341](https://github.com/nf-core/rnaseq/pull/1341) - Add rename in the MultiQC report for samples without techreps +- [PR #1342](https://github.com/nf-core/rnaseq/pull/1342) - Factor out preprocessing +- [PR #1345](https://github.com/nf-core/rnaseq/pull/1345) - Fix preprocessing call +- [PR #1350](https://github.com/nf-core/rnaseq/pull/1350) - Reduce resource usage for sort process in bedtools/genomecov +- [PR #1352](https://github.com/nf-core/rnaseq/pull/1352) - Assorted fixes to MultiQC usage +- [PR #1353](https://github.com/nf-core/rnaseq/pull/1353) - Correct conditional for salmon indexing in preprocessing workflow +- [PR #1355](https://github.com/nf-core/rnaseq/pull/1355) - Make all curves on subway map better looking, and all lines now have the same width +- [PR #1357](https://github.com/nf-core/rnaseq/pull/1357) - Fix anchor issue in multiqc +- [PR #1358](https://github.com/nf-core/rnaseq/pull/1358) - Update test profiles to restore a static URI for megatests +- [PR #1359](https://github.com/nf-core/rnaseq/pull/1359) - Update MultiQC and revert unnecessary workaround +- [PR #1360](https://github.com/nf-core/rnaseq/pull/1360) - More complete snapshots for pipeline level tests +- [PR #1361](https://github.com/nf-core/rnaseq/pull/1361) - Animate subway map +- [PR #1362](https://github.com/nf-core/rnaseq/pull/1362) - Move multiqc module prefix for nf-test to module +- [PR #1363](https://github.com/nf-core/rnaseq/pull/1363) - Minor updates of nf-core modules and subworkflows +- [PR #1363](https://github.com/nf-core/rnaseq/pull/1363) - Update dupradar script +- [PR #1366](https://github.com/nf-core/rnaseq/pull/1366) - Clarify docs on different tximport count files +- [PR #1367](https://github.com/nf-core/rnaseq/pull/1367) - Clarify design formula and blind dispersion estimation +- [PR #1370](https://github.com/nf-core/rnaseq/pull/1370) - Bump versions for 3.15.0 +- [PR #1371](https://github.com/nf-core/rnaseq/pull/1371) - Apply Maxime's CHANGELOG edits +- [PR #1372](https://github.com/nf-core/rnaseq/pull/1372) - Bump tximeta/tximport for gene table row names fix + +### Parameters + +| Old parameter | New parameter | +| ------------------ | -------------------------------- | +| | `--pipelines_testdata_base_path` | +| | `--sortmerna_index` | +| | `--stranded_threshold` | +| | `--unstranded_threshold` | +| `--test_data_base` | | + +### Software dependencies + +| Dependency | Old version | New version | +| ----------------------------------- | ----------- | ----------- | +| `bedtools` | 2.30.0 | 2.31.1 | +| `bioconductor-dupradar` | 1.28.0 | 1.32.0 | +| `bioconductor-summarizedexperiment` | 1.24.0 | 1.32.0 | +| `bioconductor-tximeta` | 1.12.0 | 1.20.1 | +| `gffread` | 0.12.1 | 0.12.7 | +| `multiqc` | 1.20 | 1.22.3 | +| `picard` | 3.0.0 | 3.1.1 | +| `samtools` | 1.17 | 1.20 | +| `sortmerna` | 4.3.4 | 4.3.6 | +| `umi_tools` | 1.14 | 1.15 | +| `untar` | 1.3 | 1.34 | + +> **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 new version information isn't present. + ## [[3.14.0](https://github.com/nf-core/rnaseq/releases/tag/3.14.0)] - 2024-01-08 ### Credits diff --git a/README.md b/README.md index 9e3b4641a..c5f58478e 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,18 @@ -# ![nf-core/rnaseq](docs/images/nf-core-rnaseq_logo_light.png#gh-light-mode-only) ![nf-core/rnaseq](docs/images/nf-core-rnaseq_logo_dark.png#gh-dark-mode-only) +

+ + + nf-core/rnaseq + +

-[![GitHub Actions CI Status](https://github.com/nf-core/rnaseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/rnaseq/actions?query=workflow%3A%22nf-core+CI%22) -[![GitHub Actions Linting Status](https://github.com/nf-core/rnaseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/rnaseq/actions?query=workflow%3A%22nf-core+linting%22)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/rnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.1400710-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.1400710) +[![GitHub Actions CI Status](https://github.com/nf-core/rnaseq/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/rnaseq/actions/workflows/ci.yml) +[![GitHub Actions Linting Status](https://github.com/nf-core/rnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/rnaseq/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/rnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.1400710-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.1400710)[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) [![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A523.04.0-23aa62.svg)](https://www.nextflow.io/) [![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/rnaseq) +[![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/rnaseq) [![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23rnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/rnaseq)[![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) @@ -15,10 +20,12 @@ **nf-core/rnaseq** is a bioinformatics pipeline that can be used to analyse RNA sequencing data obtained from organisms with a reference genome and annotation. It takes a samplesheet and FASTQ files as input, performs quality control (QC), trimming and (pseudo-)alignment, and produces a gene expression matrix and extensive QC report. -![nf-core/rnaseq metro map](docs/images/nf-core-rnaseq_metro_map_grey.png) +![nf-core/rnaseq metro map](docs/images/nf-core-rnaseq_metro_map_grey_animated.svg) + +> In case the image above is not loading, please have a look at the [static version](docs/images/nf-core-rnaseq_metro_map_grey.png). 1. Merge re-sequenced FastQ files ([`cat`](http://www.linfo.org/cat.html)) -2. Sub-sample FastQ files and auto-infer strandedness ([`fq`](https://github.com/stjude-rust-labs/fq), [`Salmon`](https://combine-lab.github.io/salmon/)) +2. Auto-infer strandedness by subsampling and pseudoalignment ([`fq`](https://github.com/stjude-rust-labs/fq), [`Salmon`](https://combine-lab.github.io/salmon/)) 3. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) 4. UMI extraction ([`UMI-tools`](https://github.com/CGATOxford/UMI-tools)) 5. Adapter and quality trimming ([`Trim Galore!`](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/)) @@ -75,9 +82,10 @@ Now, you can run the pipeline using: ```bash nextflow run nf-core/rnaseq \ - --input samplesheet.csv \ + --input \ --outdir \ - --genome GRCh37 \ + --gtf \ + --fasta \ -profile ``` @@ -114,7 +122,7 @@ Many thanks to other who have helped out along the way too, including (but not l - [Alex Peltzer](https://github.com/apeltzer) - [Colin Davenport](https://github.com/colindaven) - [Denis Moreno](https://github.com/Galithil) -- [Edmund Miller](https://github.com/Emiller88) +- [Edmund Miller](https://github.com/edmundmiller) - [Gregor Sturm](https://github.com/grst) - [Jacki Buros Novik](https://github.com/jburos) - [Lorena Pantano](https://github.com/lpantano) diff --git a/assets/dummy_file.txt b/assets/dummy_file.txt deleted file mode 100644 index 8b1378917..000000000 --- a/assets/dummy_file.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/assets/email_template.html b/assets/email_template.html index 0ef39b222..dc46d39ee 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -14,7 +14,7 @@
-

nf-core/rnaseq v${version}

+

nf-core/rnaseq ${version}

Run Name: $runName

<% if (!success){ out << """ diff --git a/assets/email_template.txt b/assets/email_template.txt index 5440f887a..8789fd8ae 100644 --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -4,7 +4,7 @@ |\\ | |__ __ / ` / \\ |__) |__ } { | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, `._,._,' - nf-core/rnaseq v${version} + nf-core/rnaseq ${version} ---------------------------------------------------- Run Name: $runName diff --git a/assets/nf-core-rnaseq_logo_light.png b/assets/nf-core-rnaseq_logo_light.png index b0c99cb83..87c1d5f1d 100644 Binary files a/assets/nf-core-rnaseq_logo_light.png and b/assets/nf-core-rnaseq_logo_light.png differ diff --git a/bin/deseq2_qc.r b/bin/deseq2_qc.r index 14bd48f70..d55180400 100755 --- a/bin/deseq2_qc.r +++ b/bin/deseq2_qc.r @@ -92,7 +92,8 @@ if (decompose) { DDSFile <- paste(opt$outprefix,".dds.RData",sep="") counts <- count.table[,samples.vec,drop=FALSE] -dds <- DESeqDataSetFromMatrix(countData=round(counts), colData=coldata, design=~ 1) +# `design=~1` creates intercept-only model, equivalent to setting `blind=TRUE` for transformation. +dds <- DESeqDataSetFromMatrix(countData=round(counts), colData=coldata, design=~1) dds <- estimateSizeFactors(dds) if (min(dim(count.table))<=1) { # No point if only one sample, or one gene save(dds,file=DDSFile) diff --git a/bin/dupradar.r b/bin/dupradar.r deleted file mode 100755 index 00119f550..000000000 --- a/bin/dupradar.r +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/env Rscript - -# Written by Phil Ewels and released under the MIT license. - -# Command line argument processing -args = commandArgs(trailingOnly=TRUE) -if (length(args) < 5) { - stop("Usage: dupRadar.r ", call.=FALSE) -} -input_bam <- args[1] -output_prefix <- args[2] -annotation_gtf <- args[3] -stranded <- as.numeric(args[4]) -paired_end <- if(args[5]=='paired') TRUE else FALSE -threads <- as.numeric(args[6]) - -bamRegex <- "(.+)\\.bam$" - -if(!(grepl(bamRegex, input_bam) && file.exists(input_bam) && (!file.info(input_bam)$isdir))) stop("First argument '' must be an existing file (not a directory) with '.bam' extension...") -if(!(file.exists(annotation_gtf) && (!file.info(annotation_gtf)$isdir))) stop("Second argument '' must be an existing file (and not a directory)...") -if(is.na(stranded) || (!(stranded %in% (0:2)))) stop("Third argument must be a numeric value in 0(unstranded)/1(forward)/2(reverse)...") -if(is.na(threads) || (threads<=0)) stop("Fifth argument must be a strictly positive numeric value...") - -# Debug messages (stderr) -message("Input bam (Arg 1): ", input_bam) -message("Input gtf (Arg 2): ", annotation_gtf) -message("Strandness (Arg 3): ", c("unstranded", "forward", "reverse")[stranded+1]) -message("paired/single (Arg 4): ", ifelse(paired_end, 'paired', 'single')) -message("Nb threads (Arg 5): ", threads) -message("R package loc. (Arg 6): ", ifelse(length(args) > 4, args[5], "Not specified")) -message("Output basename : ", output_prefix) - - -# Load / install packages -if (length(args) > 5) { .libPaths( c( args[6], .libPaths() ) ) } -if (!require("dupRadar")){ - source("http://bioconductor.org/biocLite.R") - biocLite("dupRadar", suppressUpdates=TRUE) - library("dupRadar") -} -if (!require("parallel")) { - install.packages("parallel", dependencies=TRUE, repos='http://cloud.r-project.org/') - library("parallel") -} - -# Duplicate stats -dm <- analyzeDuprates(input_bam, annotation_gtf, stranded, paired_end, threads) -write.table(dm, file=paste(output_prefix, "_dupMatrix.txt", sep=""), quote=F, row.name=F, sep="\t") - -# 2D density scatter plot -pdf(paste0(output_prefix, "_duprateExpDens.pdf")) -duprateExpDensPlot(DupMat=dm) -title("Density scatter plot") -mtext(output_prefix, side=3) -dev.off() -fit <- duprateExpFit(DupMat=dm) -cat( - paste("- dupRadar Int (duprate at low read counts):", fit$intercept), - paste("- dupRadar Sl (progression of the duplication rate):", fit$slope), - fill=TRUE, labels=output_prefix, - file=paste0(output_prefix, "_intercept_slope.txt"), append=FALSE -) - -# Create a multiqc file dupInt -sample_name <- gsub("Aligned.sortedByCoord.out.markDups", "", output_prefix) -line="#id: DupInt -#plot_type: 'generalstats' -#pconfig: -# dupRadar_intercept: -# title: 'dupInt' -# namespace: 'DupRadar' -# description: 'Intercept value from DupRadar' -# max: 100 -# min: 0 -# scale: 'RdYlGn-rev' -# format: '{:.2f}%' -Sample dupRadar_intercept" - -write(line,file=paste0(output_prefix, "_dup_intercept_mqc.txt"),append=TRUE) -write(paste(sample_name, fit$intercept),file=paste0(output_prefix, "_dup_intercept_mqc.txt"),append=TRUE) - -# Get numbers from dupRadar GLM -curve_x <- sort(log10(dm$RPK)) -curve_y = 100*predict(fit$glm, data.frame(x=curve_x), type="response") -# Remove all of the infinite values -infs = which(curve_x %in% c(-Inf,Inf)) -curve_x = curve_x[-infs] -curve_y = curve_y[-infs] -# Reduce number of data points -curve_x <- curve_x[seq(1, length(curve_x), 10)] -curve_y <- curve_y[seq(1, length(curve_y), 10)] -# Convert x values back to real counts -curve_x = 10^curve_x -# Write to file -line="#id: dupradar -#plot_type: 'linegraph' -#section_name: 'DupRadar' -#section_href: 'bioconductor.org/packages/release/bioc/html/dupRadar.html' -#description: \"provides duplication rate quality control for RNA-Seq datasets. Highly expressed genes can be expected to have a lot of duplicate reads, but high numbers of duplicates at low read counts can indicate low library complexity with technical duplication. -# This plot shows the general linear models - a summary of the gene duplication distributions. \" -#pconfig: -# title: 'DupRadar General Linear Model' -# xLog: True -# xlab: 'expression (reads/kbp)' -# ylab: '% duplicate reads' -# ymax: 100 -# ymin: 0 -# tt_label: '{point.x:.1f} reads/kbp: {point.y:,.2f}% duplicates' -# xPlotLines: -# - color: 'green' -# dashStyle: 'LongDash' -# label: -# style: {color: 'green'} -# text: '0.5 RPKM' -# verticalAlign: 'bottom' -# y: -65 -# value: 0.5 -# width: 1 -# - color: 'red' -# dashStyle: 'LongDash' -# label: -# style: {color: 'red'} -# text: '1 read/bp' -# verticalAlign: 'bottom' -# y: -65 -# value: 1000 -# width: 1" - -write(line,file=paste0(output_prefix, "_duprateExpDensCurve_mqc.txt"),append=TRUE) -write.table( - cbind(curve_x, curve_y), - file=paste0(output_prefix, "_duprateExpDensCurve_mqc.txt"), - quote=FALSE, row.names=FALSE, col.names=FALSE, append=TRUE, -) - -# Distribution of expression box plot -pdf(paste0(output_prefix, "_duprateExpBoxplot.pdf")) -duprateExpBoxplot(DupMat=dm) -title("Percent Duplication by Expression") -mtext(output_prefix, side=3) -dev.off() - -# Distribution of RPK values per gene -pdf(paste0(output_prefix, "_expressionHist.pdf")) -expressionHist(DupMat=dm) -title("Distribution of RPK values per gene") -mtext(output_prefix, side=3) -dev.off() - -# Print sessioninfo to standard out -print(output_prefix) -citation("dupRadar") -sessionInfo() diff --git a/bin/fasta2gtf.py b/bin/fasta2gtf.py deleted file mode 100755 index 716ee06ce..000000000 --- a/bin/fasta2gtf.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python3 - -# Written by Pranathi Vemuri and released under the MIT license. - -""" -Read a custom fasta file and create a custom GTF containing each entry -""" -import argparse -from itertools import groupby -import logging - -# Create a logger -logging.basicConfig(format="%(name)s - %(asctime)s %(levelname)s: %(message)s") -logger = logging.getLogger(__file__) -logger.setLevel(logging.INFO) - - -def fasta_iter(fasta_name): - """ - modified from Brent Pedersen - Correct Way To Parse A Fasta File In Python - given a fasta file. yield tuples of header, sequence - - Fasta iterator from https://www.biostars.org/p/710/#120760 - """ - with open(fasta_name) as fh: - # ditch the boolean (x[0]) and just keep the header or sequence since - # we know they alternate. - faiter = (x[1] for x in groupby(fh, lambda line: line[0] == ">")) - for header in faiter: - # drop the ">" - headerStr = header.__next__()[1:].strip() - - # join all sequence lines to one. - seq = "".join(s.strip() for s in faiter.__next__()) - - yield (headerStr, seq) - - -def fasta2gtf(fasta, output, biotype): - fiter = fasta_iter(fasta) - # GTF output lines - lines = [] - attributes = 'exon_id "{name}.1"; exon_number "1";{biotype} gene_id "{name}_gene"; gene_name "{name}_gene"; gene_source "custom"; transcript_id "{name}_gene"; transcript_name "{name}_gene";\n' - line_template = "{name}\ttransgene\texon\t1\t{length}\t.\t+\t.\t" + attributes - - for ff in fiter: - name, seq = ff - # Use first ID as separated by spaces as the "sequence name" - # (equivalent to "chromosome" in other cases) - seqname = name.split()[0] - # Remove all spaces - name = seqname.replace(" ", "_") - length = len(seq) - biotype_attr = "" - if biotype: - biotype_attr = f' {biotype} "transgene";' - line = line_template.format(name=name, length=length, biotype=biotype_attr) - lines.append(line) - - with open(output, "w") as f: - f.write("".join(lines)) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="""Convert a custom fasta (e.g. transgene) - to a GTF annotation.""" - ) - parser.add_argument("fasta", type=str, help="Custom transgene sequence") - parser.add_argument( - "-o", - "--output", - dest="output", - default="transgenes.gtf", - type=str, - help="Gene annotation GTF output", - ) - parser.add_argument( - "-b", - "--biotype", - dest="biotype", - default="", - type=str, - help="Name of gene biotype attribute to use in last column of GTF entry", - ) - args = parser.parse_args() - fasta2gtf(args.fasta, args.output, args.biotype) diff --git a/bin/mqc_features_stat.py b/bin/mqc_features_stat.py index fa69b231c..b0577cd5f 100755 --- a/bin/mqc_features_stat.py +++ b/bin/mqc_features_stat.py @@ -21,8 +21,7 @@ # description: '% reads overlapping {ft} features' # max: 100 # min: 0 -# scale: 'RdYlGn-rev' -# format: '{{:.2f}}%'""" +# scale: 'RdYlGn-rev'""" def mqc_feature_stat(bfile, features, outfile, sname=None): diff --git a/bin/prepare-for-rsem.py b/bin/prepare-for-rsem.py deleted file mode 100755 index f874af792..000000000 --- a/bin/prepare-for-rsem.py +++ /dev/null @@ -1,270 +0,0 @@ -#!/usr/bin/env python3 - -""" -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Credits -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This script is a clone of the "prepare-for-rsem.py" script written by -Ian Sudbury, Tom Smith and other contributors to the UMI-tools package: -https://github.com/CGATOxford/UMI-tools - -It has been included here to address problems encountered with -Salmon quant and RSEM as discussed in the issue below: -https://github.com/CGATOxford/UMI-tools/issues/465 - -When the "umi_tools prepare-for-rsem" command becomes available in an official -UMI-tools release this script will be replaced and deprecated. - -Commit: -https://github.com/CGATOxford/UMI-tools/blob/bf8608d6a172c5ca0dcf33c126b4e23429177a72/umi_tools/prepare-for-rsem.py - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -prepare_for_rsem - make the output from dedup or group compatible with RSEM -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The SAM format specification states that the mnext and mpos fields should point -to the primary alignment of a read's mate. However, not all aligners adhere to -this standard. In addition, the RSEM software requires that the mate of a read1 -appears directly after it in its input BAM. This requires that there is exactly -one read1 alignment for every read2 and vice versa. - -In general (except in a few edge cases) UMI tools outputs only the read2 to that -corresponds to the read specified in the mnext and mpos positions of a selected -read1, and only outputs this read once, even if multiple read1s point to it. -This makes UMI-tools outputs incompatible with RSEM. This script takes the output -from dedup or groups and ensures that each read1 has exactly one read2 (and vice -versa), that read2 always appears directly after read1,and that pairs point to -each other (note this is technically not valid SAM format). Copy any specified -tags from read1 to read2 if they are present (by default, UG and BX, the unique -group and correct UMI tags added by _group_) - -Input must to name sorted. - - -https://raw.githubusercontent.com/CGATOxford/UMI-tools/master/LICENSE - -""" - -from umi_tools import Utilities as U -from collections import defaultdict, Counter -import pysam -import sys - -usage = """ -prepare_for_rsem - make output from dedup or group compatible with RSEM - -Usage: umi_tools prepare_for_rsem [OPTIONS] [--stdin=IN_BAM] [--stdout=OUT_BAM] - - note: If --stdout is omited, standard out is output. To - generate a valid BAM file on standard out, please - redirect log with --log=LOGFILE or --log2stderr """ - - -def chunk_bam(bamfile): - """Take in a iterator of pysam.AlignmentSegment entries and yield - lists of reads that all share the same name""" - - last_query_name = None - output_buffer = list() - - for read in bamfile: - if last_query_name is not None and last_query_name != read.query_name: - yield (output_buffer) - output_buffer = list() - - last_query_name = read.query_name - output_buffer.append(read) - - yield (output_buffer) - - -def copy_tags(tags, read1, read2): - """Given a list of tags, copies the values of these tags from read1 - to read2, if the tag is set""" - - for tag in tags: - try: - read1_tag = read1.get_tag(tag, with_value_type=True) - read2.set_tag(tag, value=read1_tag[0], value_type=read1_tag[1]) - except KeyError: - pass - - return read2 - - -def pick_mate(read, template_dict, mate_key): - """Find the mate of read in the template dict using key. It will retrieve - all reads at that key, and then scan to pick the one that refers to _read_ - as it's mate. If there is no such read, it picks a first one it comes to""" - - mate = None - - # get a list of secondary reads at the correct alignment position - potential_mates = template_dict[not read.is_read1][mate_key] - - # search through one at a time to find a read that points to the current read - # as its mate. - for candidate_mate in potential_mates: - if ( - candidate_mate.next_reference_name == read.reference_name - and candidate_mate.next_reference_start == read.pos - ): - mate = candidate_mate - - # if no such read is found, then pick any old secondary alignment at that position - # note: this happens when UMI-tools outputs the wrong read as something's pair. - if mate is None and len(potential_mates) > 0: - mate = potential_mates[0] - - return mate - - -def main(argv=None): - if argv is None: - argv = sys.argv - - # setup command line parser - parser = U.OptionParser(version="%prog version: $Id$", usage=usage, description=globals()["__doc__"]) - group = U.OptionGroup(parser, "RSEM preparation specific options") - - group.add_option( - "--tags", - dest="tags", - type="string", - default="UG,BX", - help="Comma-separated list of tags to transfer from read1 to read2", - ) - group.add_option( - "--sam", dest="sam", action="store_true", default=False, help="input and output SAM rather than BAM" - ) - - parser.add_option_group(group) - - # add common options (-h/--help, ...) and parse command line - (options, args) = U.Start( - parser, argv=argv, add_group_dedup_options=False, add_umi_grouping_options=False, add_sam_options=False - ) - - skipped_stats = Counter() - - if options.stdin != sys.stdin: - in_name = options.stdin.name - options.stdin.close() - else: - in_name = "-" - - if options.sam: - mode = "" - else: - mode = "b" - - inbam = pysam.AlignmentFile(in_name, "r" + mode) - - if options.stdout != sys.stdout: - out_name = options.stdout.name - options.stdout.close() - else: - out_name = "-" - - outbam = pysam.AlignmentFile(out_name, "w" + mode, template=inbam) - - options.tags = options.tags.split(",") - - for template in chunk_bam(inbam): - assert len(set(r.query_name for r in template)) == 1 - current_template = {True: defaultdict(list), False: defaultdict(list)} - - for read in template: - key = (read.reference_name, read.pos, not read.is_secondary) - current_template[read.is_read1][key].append(read) - - output = set() - - for read in template: - mate = None - - # if this read is a non_primary alignment, we first want to check if it has a mate - # with the non-primary alignment flag set. - - mate_key_primary = True - mate_key_secondary = (read.next_reference_name, read.next_reference_start, False) - - # First look for a read that has the same primary/secondary status - # as read (i.e. secondary mate for secondary read, and primary mate - # for primary read) - mate_key = (read.next_reference_name, read.next_reference_start, read.is_secondary) - mate = pick_mate(read, current_template, mate_key) - - # If none was found then look for the opposite (primary mate of secondary - # read or seconadary mate of primary read) - if mate is None: - mate_key = (read.next_reference_name, read.next_reference_start, not read.is_secondary) - mate = pick_mate(read, current_template, mate_key) - - # If we still don't have a mate, then their can't be one? - if mate is None: - skipped_stats["no_mate"] += 1 - U.warn( - "Alignment {} has no mate -- skipped".format( - "\t".join(map(str, [read.query_name, read.flag, read.reference_name, int(read.pos)])) - ) - ) - continue - - # because we might want to make changes to the read, but not have those changes reflected - # if we need the read again,we copy the read. This is only way I can find to do this. - read = pysam.AlignedSegment().from_dict(read.to_dict(), read.header) - mate = pysam.AlignedSegment().from_dict(mate.to_dict(), read.header) - - # Make it so that if our read is secondary, the mate is also secondary. We don't make the - # mate primary if the read is primary because we would otherwise end up with mulitple - # primary alignments. - if read.is_secondary: - mate.is_secondary = True - - # In a situation where there is already one mate for each read, then we will come across - # each pair twice - once when we scan read1 and once when we scan read2. Thus we need - # to make sure we don't output something already output. - if read.is_read1: - mate = copy_tags(options.tags, read, mate) - output_key = str(read) + str(mate) - - if output_key not in output: - output.add(output_key) - outbam.write(read) - outbam.write(mate) - skipped_stats["pairs_output"] += 1 - - elif read.is_read2: - read = copy_tags(options.tags, mate, read) - output_key = str(mate) + str(read) - - if output_key not in output: - output.add(output_key) - outbam.write(mate) - outbam.write(read) - skipped_stats["pairs_output"] += 1 - - else: - skipped_stats["skipped_not_read12"] += 1 - U.warn( - "Alignment {} is neither read1 nor read2 -- skipped".format( - "\t".join(map(str, [read.query_name, read.flag, read.reference_name, int(read.pos)])) - ) - ) - continue - - if not out_name == "-": - outbam.close() - - U.info( - "Total pairs output: {}, Pairs skipped - no mates: {}," - " Pairs skipped - not read1 or 2: {}".format( - skipped_stats["pairs_output"], skipped_stats["no_mate"], skipped_stats["skipped_not_read12"] - ) - ) - U.Stop() - - -if __name__ == "__main__": - sys.exit(main(sys.argv)) diff --git a/bin/summarizedexperiment.r b/bin/summarizedexperiment.r deleted file mode 100755 index 767d542c7..000000000 --- a/bin/summarizedexperiment.r +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env Rscript - -# Written by Lorena Pantano and released under the MIT license. - -library(SummarizedExperiment) - -## Create SummarizedExperiment (se) object from counts - -args <- commandArgs(trailingOnly = TRUE) -if (length(args) < 3) { - stop("Usage: summarizedexperiment.r ", call. = FALSE) -} - -coldata <- args[1] -counts_fn <- args[2] -tpm_fn <- args[3] -tx2gene <- args[4] - -info <- file.info(tx2gene) -if (info$size == 0) { - tx2gene <- NULL -} else { - rowdata <- read.csv(tx2gene, sep = "\t", header = FALSE) - colnames(rowdata) <- c("tx", "gene_id", "gene_name") - tx2gene <- rowdata[, 1:2] -} - -counts <- read.csv(counts_fn, row.names = 1, sep = "\t") -counts <- counts[, 2:ncol(counts), drop = FALSE] # remove gene_name column -tpm <- read.csv(tpm_fn, row.names = 1, sep = "\t") -tpm <- tpm[, 2:ncol(tpm), drop = FALSE] # remove gene_name column - -if (length(intersect(rownames(counts), rowdata[["tx"]])) > length(intersect(rownames(counts), rowdata[["gene_id"]]))) { - by_what <- "tx" -} else { - by_what <- "gene_id" - rowdata <- unique(rowdata[, 2:3]) -} - -if (file.exists(coldata)) { - coldata <- read.csv(coldata, sep = "\t") - coldata <- coldata[match(colnames(counts), coldata[, 1]), ] - coldata <- cbind(files = fns, coldata) -} else { - message("ColData not avaliable ", coldata) - coldata <- data.frame(files = colnames(counts), names = colnames(counts)) -} - -rownames(coldata) <- coldata[["names"]] -extra <- setdiff(rownames(counts), as.character(rowdata[[by_what]])) -if (length(extra) > 0) { - rowdata <- rbind( - rowdata, - data.frame( - tx = extra, - gene_id = extra, - gene_name = extra - )[, colnames(rowdata)] - ) -} - -rowdata <- rowdata[match(rownames(counts), as.character(rowdata[[by_what]])), ] -rownames(rowdata) <- rowdata[[by_what]] -se <- SummarizedExperiment( - assays = list(counts = counts, abundance = tpm), - colData = DataFrame(coldata), - rowData = rowdata -) - -saveRDS(se, file = paste0(tools::file_path_sans_ext(counts_fn), ".rds")) diff --git a/bin/tximport.r b/bin/tximport.r deleted file mode 100755 index 59a8fcd9e..000000000 --- a/bin/tximport.r +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env Rscript - -# Script for importing and processing transcript-level quantifications. -# Written by Lorena Pantano, later modified by Jonathan Manning, and released -# under the MIT license. - -# Loading required libraries -library(SummarizedExperiment) -library(tximport) - -# Parsing command line arguments -args <- commandArgs(trailingOnly=TRUE) -if (length(args) < 4) { - stop("Usage: tximport.r ", - call.=FALSE) -} - -# Assigning command line arguments to variables -coldata_path <- args[1] -path <- args[2] -prefix <- args[3] -quant_type <- args[4] -tx2gene_path <- args[5] - -## Functions - -# Build a table from a SummarizedExperiment object -build_table <- function(se.obj, slot) { - cbind(rowData(se.obj)[,1:2], assays(se.obj)[[slot]]) -} - -# Write a table to a file with given parameters -write_se_table <- function(params) { - file_name <- paste0(prefix, ".", params$suffix) - write.table(build_table(params$obj, params$slot), file_name, - sep="\t", quote=FALSE, row.names = FALSE) -} - -# Read transcript metadata from a given path -read_transcript_info <- function(tinfo_path){ - info <- file.info(tinfo_path) - if (info$size == 0) { - stop("tx2gene file is empty") - } - - transcript_info <- read.csv(tinfo_path, sep="\t", header = FALSE, - col.names = c("tx", "gene_id", "gene_name")) - - extra <- setdiff(rownames(txi[[1]]), as.character(transcript_info[["tx"]])) - transcript_info <- rbind(transcript_info, data.frame(tx=extra, gene_id=extra, gene_name=extra)) - transcript_info <- transcript_info[match(rownames(txi[[1]]), transcript_info[["tx"]]), ] - rownames(transcript_info) <- transcript_info[["tx"]] - - list(transcript = transcript_info, - gene = unique(transcript_info[,2:3]), - tx2gene = transcript_info[,1:2]) -} - -# Read and process sample/column data from a given path -read_coldata <- function(coldata_path){ - if (file.exists(coldata_path)) { - coldata <- read.csv(coldata_path, sep="\t") - coldata <- coldata[match(names, coldata[,1]),] - coldata <- cbind(files = fns, coldata) - } else { - message("ColData not available: ", coldata_path) - coldata <- data.frame(files = fns, names = names) - } - rownames(coldata) <- coldata[["names"]] -} - -# Create a SummarizedExperiment object with given data -create_summarized_experiment <- function(counts, abundance, length, col_data, row_data) { - SummarizedExperiment(assays = list(counts = counts, abundance = abundance, length = length), - colData = col_data, - rowData = row_data) -} - -# Main script starts here - -# Define pattern for file names based on quantification type -pattern <- ifelse(quant_type == "kallisto", "abundance.tsv", "quant.sf") -fns <- list.files(path, pattern = pattern, recursive = T, full.names = T) -names <- basename(dirname(fns)) -names(fns) <- names -dropInfReps <- quant_type == "kallisto" - -# Import transcript-level quantifications -txi <- tximport(fns, type = quant_type, txOut = TRUE, dropInfReps = dropInfReps) - -# Read transcript and sample data -transcript_info <- read_transcript_info(tx2gene_path) -coldata <- read_coldata(coldata_path) - -# Create initial SummarizedExperiment object -se <- create_summarized_experiment(txi[["counts"]], txi[["abundance"]], txi[["length"]], - DataFrame(coldata), transcript_info$transcript) - -# Setting parameters for writing tables -params <- list( - list(obj = se, slot = "abundance", suffix = "transcript_tpm.tsv"), - list(obj = se, slot = "counts", suffix = "transcript_counts.tsv"), - list(obj = se, slot = "length", suffix = "transcript_lengths.tsv") -) - -# Process gene-level data if tx2gene mapping is available -if ("tx2gene" %in% names(transcript_info) && !is.null(transcript_info$tx2gene)) { - tx2gene <- transcript_info$tx2gene - gi <- summarizeToGene(txi, tx2gene = tx2gene) - gi.ls <- summarizeToGene(txi, tx2gene = tx2gene, countsFromAbundance = "lengthScaledTPM") - gi.s <- summarizeToGene(txi, tx2gene = tx2gene, countsFromAbundance = "scaledTPM") - - gene_info <- transcript_info$gene[match(rownames(gi[[1]]), transcript_info$gene[["gene_id"]]),] - rownames(gene_info) <- gene_info[["tx"]] - - col_data_frame <- DataFrame(coldata) - - # Create gene-level SummarizedExperiment objects - gse <- create_summarized_experiment(gi[["counts"]], gi[["abundance"]], gi[["length"]], - col_data_frame, gene_info) - gse.ls <- create_summarized_experiment(gi.ls[["counts"]], gi.ls[["abundance"]], gi.ls[["length"]], - col_data_frame, gene_info) - gse.s <- create_summarized_experiment(gi.s[["counts"]], gi.s[["abundance"]], gi.s[["length"]], - col_data_frame, gene_info) - - params <- c(params, list( - list(obj = gse, slot = "length", suffix = "gene_lengths.tsv"), - list(obj = gse, slot = "abundance", suffix = "gene_tpm.tsv"), - list(obj = gse, slot = "counts", suffix = "gene_counts.tsv"), - list(obj = gse.ls, slot = "abundance", suffix = "gene_tpm_length_scaled.tsv"), - list(obj = gse.ls, slot = "counts", suffix = "gene_counts_length_scaled.tsv"), - list(obj = gse.s, slot = "abundance", suffix = "gene_tpm_scaled.tsv"), - list(obj = gse.s, slot = "counts", suffix = "gene_counts_scaled.tsv") - )) -} - -# Writing tables for each set of parameters -done <- lapply(params, write_se_table) - -# Output session information and citations -citation("tximeta") -sessionInfo() - diff --git a/conf/base.config b/conf/base.config index 337564e5c..93ad25b28 100644 --- a/conf/base.config +++ b/conf/base.config @@ -57,7 +57,4 @@ process { errorStrategy = 'retry' maxRetries = 2 } - withName:CUSTOM_DUMPSOFTWAREVERSIONS { - cache = false - } } diff --git a/conf/modules.config b/conf/modules.config deleted file mode 100644 index 16d635cdb..000000000 --- a/conf/modules.config +++ /dev/null @@ -1,1167 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Config file for defining DSL2 per module options and publishing paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Available keys to override module options: - ext.args = Additional arguments appended to command in module. - ext.args2 = Second set of arguments appended to command in module (multi-tool modules). - ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.prefix = File name prefix for output files. ----------------------------------------------------------------------------------------- -*/ - -def rseqc_modules = params.rseqc_modules ? params.rseqc_modules.split(',').collect{ it.trim().toLowerCase() } : [] - -// -// General configuration options -// - -process { - publishDir = [ - path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - 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' - ] - } -} - -// -// Genome preparation options -// - -process { - withName: 'GUNZIP_.*|MAKE_TRANSCRIPTS_FASTA' { - publishDir = [ - path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } - ] - } - - withName: 'UNTAR_.*' { - ext.args2 = '--no-same-owner' - } - - withName: 'UNTAR_.*|STAR_GENOMEGENERATE|STAR_GENOMEGENERATE_IGENOMES|HISAT2_BUILD' { - publishDir = [ - path: { params.save_reference ? "${params.outdir}/genome/index" : params.outdir }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } - ] - } - - withName: 'GFFREAD' { - ext.args = '--keep-exon-attrs -F -T' - publishDir = [ - path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } - ] - } - - withName: 'HISAT2_EXTRACTSPLICESITES' { - publishDir = [ - path: { params.save_reference ? "${params.outdir}/genome/index" : params.outdir }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } - ] - } - - withName: 'SALMON_INDEX' { - ext.args = { [ - params.gencode ? '--gencode' : '', - params.pseudo_aligner_kmer_size ? "-k ${params.pseudo_aligner_kmer_size}": '' - ].join(' ').trim() } - publishDir = [ - path: { params.save_reference ? "${params.outdir}/genome/index" : params.outdir }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } - ] - } - - withName: 'KALLISTO_INDEX' { - ext.args = params.pseudo_aligner_kmer_size ? "-k ${params.pseudo_aligner_kmer_size}" : '' - publishDir = [ - path: { params.save_reference ? "${params.outdir}/genome/index" : params.outdir }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } - ] - } - - withName: 'RSEM_PREPAREREFERENCE_GENOME' { - ext.args = '--star' - publishDir = [ - path: { params.save_reference ? "${params.outdir}/genome/index" : params.outdir }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } - ] - } - - withName: 'GTF2BED' { - publishDir = [ - path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } - ] - } - - withName: 'CAT_ADDITIONAL_FASTA|PREPROCESS_TRANSCRIPTS_FASTA_GENCODE' { - publishDir = [ - path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } - ] - } - - withName: 'GTF_FILTER' { - ext.args = { params.skip_gtf_transcript_filter ?: '--skip_transcript_id_check' } - publishDir = [ - path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } - ] - } - - withName: 'CUSTOM_GETCHROMSIZES' { - publishDir = [ - path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } - ] - } - - withName: 'CAT_FASTQ' { - publishDir = [ - path: { params.save_merged_fastq ? "${params.outdir}/fastq" : params.outdir }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename.endsWith('.fastq.gz') && params.save_merged_fastq) ? filename : null } - ] - } -} - -if (!params.skip_bbsplit && params.bbsplit_fasta_list) { - process { - withName: '.*:PREPARE_GENOME:BBMAP_BBSPLIT' { - ext.args = 'build=1' - publishDir = [ - path: { params.save_reference ? "${params.outdir}/genome/index" : params.outdir }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } - ] - } - } -} - -// -// Read subsampling and strand inferring options -// - -process { - withName: 'FQ_SUBSAMPLE' { - ext.args = '--record-count 1000000 --seed 1' - ext.prefix = { "${meta.id}.subsampled" } - publishDir = [ - enabled: false - ] - } - - withName: '.*:FASTQ_SUBSAMPLE_FQ_SALMON:SALMON_QUANT' { - ext.args = '--skipQuant' - publishDir = [ - enabled: false - ] - } -} - -// -// Read QC and trimming options -// - -if (!(params.skip_fastqc || params.skip_qc)) { - if (params.trimmer == 'trimgalore') { - process { - withName: '.*:FASTQ_FASTQC_UMITOOLS_TRIMGALORE:FASTQC' { - ext.args = '--quiet' - } - } - } - - if (params.trimmer == 'fastp') { - process { - withName: '.*:FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW' { - ext.args = '--quiet' - } - - withName: '.*:FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM' { - ext.args = '--quiet' - publishDir = [ - path: { "${params.outdir}/${params.trimmer}/fastqc" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - } -} - -if (!params.skip_trimming) { - if (params.trimmer == 'trimgalore') { - process { - withName: '.*:FASTQ_FASTQC_UMITOOLS_TRIMGALORE:TRIMGALORE' { - ext.args = { - [ - "--fastqc_args '-t ${task.cpus}'", - params.extra_trimgalore_args ? params.extra_trimgalore_args.split("\\s(?=--)") : '' - ].flatten().unique(false).join(' ').trim() - } - publishDir = [ - [ - path: { "${params.outdir}/${params.trimmer}/fastqc" }, - mode: params.publish_dir_mode, - pattern: "*.{html,zip}" - ], - [ - path: { params.save_trimmed ? "${params.outdir}/${params.trimmer}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: "*.fq.gz", - saveAs: { params.save_trimmed ? it : null } - ], - [ - path: { "${params.outdir}/${params.trimmer}" }, - mode: params.publish_dir_mode, - pattern: "*.txt" - ] - ] - } - } - } - - if (params.trimmer == 'fastp') { - process { - withName: '.*:FASTQ_FASTQC_UMITOOLS_FASTP:FASTP' { - ext.args = { params.extra_fastp_args ?: '' } - publishDir = [ - [ - path: { "${params.outdir}/${params.trimmer}" }, - mode: params.publish_dir_mode, - pattern: "*.{json,html}" - ], - [ - path: { "${params.outdir}/${params.trimmer}/log" }, - mode: params.publish_dir_mode, - pattern: "*.log" - ], - [ - path: { params.save_trimmed ? "${params.outdir}/${params.trimmer}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz", - saveAs: { params.save_trimmed ? it : null } - ] - ] - } - } - } -} - -if (params.with_umi && !params.skip_umi_extract) { - process { - withName: 'UMITOOLS_EXTRACT' { - ext.args = { [ - params.umitools_extract_method ? "--extract-method=${params.umitools_extract_method}" : '', - params.umitools_bc_pattern ? "--bc-pattern='${params.umitools_bc_pattern}'" : '', - params.umitools_bc_pattern2 ? "--bc-pattern2='${params.umitools_bc_pattern2}'" : '', - params.umitools_umi_separator ? "--umi-separator='${params.umitools_umi_separator}'" : '' - ].join(' ').trim() } - publishDir = [ - [ - path: { "${params.outdir}/umitools" }, - mode: params.publish_dir_mode, - pattern: "*.log" - ], - [ - path: { params.save_umi_intermeds ? "${params.outdir}/umitools" : params.outdir }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz", - saveAs: { params.save_umi_intermeds ? it : null } - ] - ] - } - } -} - -// -// Contaminant removal options -// - -if (!params.skip_bbsplit) { - process { - withName: 'BBMAP_BBSPLIT' { - ext.args = 'build=1 ambiguous2=all maxindel=150000' - publishDir = [ - [ - path: { "${params.outdir}/bbsplit" }, - mode: params.publish_dir_mode, - pattern: '*.txt' - ], - [ - path: { params.save_bbsplit_reads ? "${params.outdir}/bbsplit" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.fastq.gz', - saveAs: { params.save_bbsplit_reads ? it : null } - ] - ] - } - } -} - -if (params.remove_ribo_rna) { - process { - withName: 'SORTMERNA' { - ext.args = '--num_alignments 1 -v' - publishDir = [ - [ - path: { "${params.outdir}/sortmerna" }, - mode: params.publish_dir_mode, - pattern: "*.log" - ], - [ - path: { params.save_non_ribo_reads ? "${params.outdir}/sortmerna" : params.outdir }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz", - saveAs: { params.save_non_ribo_reads ? it : null } - ] - ] - } - } -} - -// -// General alignment options -// - -if (!params.skip_alignment) { - process { - withName: 'NFCORE_RNASEQ:RNASEQ:.*:BAM_SORT_STATS_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { - ext.prefix = { "${meta.id}.sorted.bam" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/samtools_stats" }, - mode: params.publish_dir_mode, - pattern: "*.{stats,flagstat,idxstats}" - ] - } - - withName: 'NFCORE_RNASEQ:RNASEQ:.*:BAM_SORT_STATS_SAMTOOLS:SAMTOOLS_SORT' { - ext.prefix = { "${meta.id}.sorted" } - publishDir = [ - path: { ( ['star_salmon','hisat2'].contains(params.aligner) && - ( params.save_align_intermeds || ( !params.with_umi && params.skip_markduplicates ) ) - ) || params.save_align_intermeds || params.skip_markduplicates ? "${params.outdir}/${params.aligner}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: "*.bam", - saveAs: { ( ['star_salmon','hisat2'].contains(params.aligner) && - ( params.save_align_intermeds || ( !params.with_umi && params.skip_markduplicates ) ) - ) || params.save_align_intermeds || params.skip_markduplicates ? it : null } - ] - } - - withName: 'NFCORE_RNASEQ:RNASEQ:.*:BAM_SORT_STATS_SAMTOOLS:SAMTOOLS_INDEX' { - ext.args = { params.bam_csi_index ? '-c' : '' } - publishDir = [ - path: { ( ['star_salmon','hisat2'].contains(params.aligner) && - ( params.save_align_intermeds || ( !params.with_umi && params.skip_markduplicates ) ) - ) || params.save_align_intermeds || params.skip_markduplicates ? "${params.outdir}/${params.aligner}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: "*.{bai,csi}", - saveAs: { ( ['star_salmon','hisat2'].contains(params.aligner) && - ( params.save_align_intermeds || ( !params.with_umi && params.skip_markduplicates ) ) - ) || params.save_align_intermeds || params.skip_markduplicates ? it : null } - ] - } - } - - if (!params.skip_markduplicates && !params.with_umi) { - process { - withName: '.*:BAM_MARKDUPLICATES_PICARD:PICARD_MARKDUPLICATES' { - ext.args = '--ASSUME_SORTED true --REMOVE_DUPLICATES false --VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp' - ext.prefix = { "${meta.id}.markdup.sorted" } - publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/picard_metrics" }, - mode: params.publish_dir_mode, - pattern: '*metrics.txt' - ], - [ - path: { "${params.outdir}/${params.aligner}" }, - mode: params.publish_dir_mode, - pattern: '*.bam' - ] - ] - } - - withName: '.*:BAM_MARKDUPLICATES_PICARD:SAMTOOLS_INDEX' { - ext.args = { params.bam_csi_index ? '-c' : '' } - ext.prefix = { "${meta.id}.markdup.sorted" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}" }, - mode: params.publish_dir_mode, - pattern: '*.{bai,csi}' - ] - } - - withName: '.*:BAM_MARKDUPLICATES_PICARD:BAM_STATS_SAMTOOLS:.*' { - ext.prefix = { "${meta.id}.markdup.sorted.bam" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/samtools_stats" }, - mode: params.publish_dir_mode, - pattern: '*.{stats,flagstat,idxstats}' - ] - } - } - } - - if (params.with_umi && ['star_salmon','hisat2'].contains(params.aligner)) { - process { - withName: '.*:BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME:UMITOOLS_DEDUP' { - ext.args = { [ - meta.single_end ? '' : '--unpaired-reads=discard --chimeric-pairs=discard', - params.umitools_grouping_method ? "--method='${params.umitools_grouping_method}'" : '', - params.umitools_umi_separator ? "--umi-separator='${params.umitools_umi_separator}'" : '' - ].join(' ').trim() } - ext.prefix = { "${meta.id}.umi_dedup.sorted" } - publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/umitools" }, - mode: params.publish_dir_mode, - pattern: '*.tsv' - ], - [ - path: { params.save_align_intermeds || params.with_umi || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.bam', - saveAs: { params.save_align_intermeds || params.with_umi || params.save_umi_intermeds ? it : null } - ] - ] - } - - withName: '.*:BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME:SAMTOOLS_INDEX' { - ext.args = { params.bam_csi_index ? '-c' : '' } - ext.prefix = { "${meta.id}.umi_dedup.sorted" } - publishDir = [ - path: { params.save_align_intermeds || params.with_umi || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.{bai,csi}', - saveAs: { params.save_align_intermeds || params.with_umi || params.save_umi_intermeds ? it : null } - ] - } - - withName: '.*:BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME:BAM_STATS_SAMTOOLS:.*' { - ext.prefix = { "${meta.id}.umi_dedup.sorted.bam" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/samtools_stats" }, - mode: params.publish_dir_mode, - pattern: '*.{stats,flagstat,idxstats}' - ] - } - } - } - - if (!params.skip_bigwig) { - process { - withName: 'BEDTOOLS_GENOMECOV' { - ext.args = '-split -du' - publishDir = [ - enabled: false - ] - } - - withName: '.*:BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_FORWARD:UCSC_BEDCLIP' { - ext.prefix = { "${meta.id}.clip.forward" } - publishDir = [ - enabled: false - ] - } - - withName: '.*:BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_FORWARD:UCSC_BEDGRAPHTOBIGWIG' { - ext.prefix = { "${meta.id}.forward" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/bigwig" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*:BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_REVERSE:UCSC_BEDCLIP' { - ext.prefix = { "${meta.id}.clip.reverse" } - publishDir = [ - enabled: false - ] - } - - withName: '.*:BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_REVERSE:UCSC_BEDGRAPHTOBIGWIG' { - ext.prefix = { "${meta.id}.reverse" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/bigwig" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - } - - if (!params.skip_stringtie) { - process { - withName: 'STRINGTIE_STRINGTIE' { - ext.args = { [ - '-v', - params.stringtie_ignore_gtf ? '' : '-e' - ].join(' ').trim() } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/stringtie" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - } -} - -// -// STAR Salmon alignment options -// - -if (!params.skip_alignment && params.aligner == 'star_salmon') { - process { - withName: '.*:ALIGN_STAR:STAR_ALIGN|.*:ALIGN_STAR:STAR_ALIGN_IGENOMES' { - ext.args = { [ - '--quantMode TranscriptomeSAM', - '--twopassMode Basic', - '--outSAMtype BAM Unsorted', - '--readFilesCommand zcat', - '--runRNGseed 0', - '--outFilterMultimapNmax 20', - '--alignSJDBoverhangMin 1', - '--outSAMattributes NH HI AS NM MD', - '--quantTranscriptomeBan Singleend', - '--outSAMstrandField intronMotif', - params.save_unaligned ? '--outReadsUnmapped Fastx' : '', - params.extra_star_align_args ? params.extra_star_align_args.split("\\s(?=--)") : '' - ].flatten().unique(false).join(' ').trim() } - publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/log" }, - mode: params.publish_dir_mode, - pattern: '*.{out,tab}' - ], - [ - path: { params.save_align_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.bam', - saveAs: { params.save_align_intermeds ? it : null } - ], - [ - path: { params.save_unaligned ? "${params.outdir}/${params.aligner}/unmapped" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.fastq.gz', - saveAs: { params.save_unaligned ? it : null } - ] - ] - } - - withName: '.*:QUANTIFY_STAR_SALMON:SALMON_QUANT' { - ext.args = { params.extra_salmon_quant_args ?: '' } - publishDir = [ - path: { "${params.outdir}/${params.aligner}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') || filename.endsWith('_meta_info.json') ? null : filename } - ] - } - - withName: '.*:QUANTIFY_STAR_SALMON:TX2GENE' { - publishDir = [ - path: { "${params.outdir}/${params.aligner}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*:QUANTIFY_STAR_SALMON:TXIMPORT' { - ext.prefix = { "${quant_type}.merged" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*:QUANTIFY_STAR_SALMON:SE_.*' { - publishDir = [ - path: { "${params.outdir}/${params.aligner}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - - if (params.with_umi) { - process { - withName: 'NFCORE_RNASEQ:RNASEQ:SAMTOOLS_SORT' { - ext.args = '-n' - ext.prefix = { "${meta.id}.umi_dedup.transcriptome" } - publishDir = [ - path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.bam', - saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } - ] - } - - withName: 'NFCORE_RNASEQ:RNASEQ:UMITOOLS_PREPAREFORSALMON' { - ext.prefix = { "${meta.id}.umi_dedup.transcriptome.filtered" } - publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/umitools/log" }, - mode: params.publish_dir_mode, - pattern: '*.log' - ], - [ - path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.bam', - saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } - ] - ] - } - - withName: 'NFCORE_RNASEQ:RNASEQ:BAM_SORT_STATS_SAMTOOLS:SAMTOOLS_SORT' { - ext.prefix = { "${meta.id}.transcriptome.sorted" } - publishDir = [ - path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.bam', - saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } - ] - } - - withName: 'NFCORE_RNASEQ:RNASEQ:BAM_SORT_STATS_SAMTOOLS:SAMTOOLS_INDEX' { - publishDir = [ - path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.bai', - saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } - ] - } - - withName: 'NFCORE_RNASEQ:RNASEQ:BAM_SORT_STATS_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { - ext.prefix = { "${meta.id}.transcriptome.sorted.bam" } - publishDir = [ - path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}/samtools_stats" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.{stats,flagstat,idxstats}', - saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } - ] - } - - withName: '.*:BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_TRANSCRIPTOME:UMITOOLS_DEDUP' { - ext.args = { [ - meta.single_end ? '' : '--unpaired-reads=discard --chimeric-pairs=discard', - params.umitools_grouping_method ? "--method='${params.umitools_grouping_method}'" : '', - params.umitools_umi_separator ? "--umi-separator='${params.umitools_umi_separator}'" : '' - ].join(' ').trim() } - ext.prefix = { "${meta.id}.umi_dedup.transcriptome.sorted" } - publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/umitools" }, - mode: params.publish_dir_mode, - pattern: '*.tsv' - ], - [ - path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.bam', - saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } - ] - ] - } - - withName: '.*:BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_TRANSCRIPTOME:SAMTOOLS_INDEX' { - publishDir = [ - path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.bai', - saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } - ] - } - - withName: '.*:BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_TRANSCRIPTOME:BAM_STATS_SAMTOOLS:.*' { - ext.prefix = { "${meta.id}.umi_dedup.transcriptome.sorted.bam" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/samtools_stats" }, - mode: params.publish_dir_mode, - pattern: '*.{stats,flagstat,idxstats}' - ] - } - } - } - - if (!params.skip_qc & !params.skip_deseq2_qc) { - process { - withName: 'DESEQ2_QC_STAR_SALMON' { - ext.args = { [ - "--id_col 1", - "--sample_suffix ''", - "--count_col 3", - params.deseq2_vst ? '--vst TRUE' : '' - ].join(' ').trim() } - ext.args2 = 'star_salmon' - publishDir = [ - path: { "${params.outdir}/${params.aligner}/deseq2_qc" }, - mode: params.publish_dir_mode, - pattern: "*{RData,pca.vals.txt,plots.pdf,sample.dists.txt,size_factors,log}" - ] - } - } - } -} - -// -// STAR RSEM alignment options -// - -if (!params.skip_alignment && params.aligner == 'star_rsem') { - process { - withName: '.*:QUANTIFY_RSEM:RSEM_CALCULATEEXPRESSION' { - ext.args = [ - '--star', - '--star-output-genome-bam', - '--star-gzipped-read-file', - '--estimate-rspd', - '--seed 1' - ].join(' ').trim() - publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}" }, - mode: params.publish_dir_mode, - pattern: "*.{stat,results}" - ], - [ - path: { params.save_align_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: "*.bam", - saveAs: { params.save_align_intermeds ? it : null } - ], - [ - path: { "${params.outdir}/${params.aligner}/log" }, - mode: params.publish_dir_mode, - pattern: "*.log" - ] - ] - } - - withName: '.*:QUANTIFY_RSEM:RSEM_MERGE_COUNTS' { - publishDir = [ - path: { "${params.outdir}/${params.aligner}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - - if (!params.skip_qc & !params.skip_deseq2_qc) { - process { - withName: 'DESEQ2_QC_RSEM' { - ext.args = { [ - "--id_col 1", - "--sample_suffix ''", - "--count_col 3", - params.deseq2_vst ? '--vst TRUE' : '' - ].join(' ').trim() } - ext.args2 = 'star_rsem' - publishDir = [ - path: { "${params.outdir}/${params.aligner}/deseq2_qc" }, - mode: params.publish_dir_mode, - pattern: "*{RData,pca.vals.txt,plots.pdf,sample.dists.txt,size_factors,log}" - ] - } - } - } -} - -// -// HISAT2 alignment options -// - -if (!params.skip_alignment && params.aligner == 'hisat2') { - process { - withName: '.*:FASTQ_ALIGN_HISAT2:HISAT2_ALIGN' { - ext.args = '--met-stderr --new-summary --dta' - publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/log" }, - mode: params.publish_dir_mode, - pattern: '*.log' - ], - [ - path: { params.save_align_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.bam', - saveAs: { params.save_align_intermeds ? it : null } - ], - [ - path: { params.save_unaligned ? "${params.outdir}/${params.aligner}/unmapped" : params.outdir }, - mode: params.publish_dir_mode, - pattern: '*.fastq.gz', - saveAs: { params.save_unaligned ? it : null } - ] - ] - } - } -} - -// -// Post-alignment QC options -// - -if (!params.skip_alignment && !params.skip_qc) { - if (!params.skip_preseq) { - process { - withName: 'PRESEQ_LCEXTRAP' { - ext.args = '-verbose -bam -seed 1 -seg_len 100000000' - publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/preseq" }, - mode: params.publish_dir_mode, - pattern: "*.txt" - ], - [ - path: { "${params.outdir}/${params.aligner}/preseq/log" }, - mode: params.publish_dir_mode, - pattern: "*.log" - ] - ] - } - } - } - - if (!params.skip_qualimap) { - process { - withName: 'QUALIMAP_RNASEQ' { - publishDir = [ - path: { "${params.outdir}/${params.aligner}/qualimap" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - } - - if (!params.skip_dupradar) { - process { - withName: 'DUPRADAR' { - publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/dupradar/scatter_plot" }, - mode: params.publish_dir_mode, - pattern: "*Dens.pdf" - ], - [ - path: { "${params.outdir}/${params.aligner}/dupradar/box_plot" }, - mode: params.publish_dir_mode, - pattern: "*Boxplot.pdf" - ], - [ - path: { "${params.outdir}/${params.aligner}/dupradar/histogram" }, - mode: params.publish_dir_mode, - pattern: "*Hist.pdf" - ], - [ - path: { "${params.outdir}/${params.aligner}/dupradar/gene_data" }, - mode: params.publish_dir_mode, - pattern: "*Matrix.txt" - ], - [ - path: { "${params.outdir}/${params.aligner}/dupradar/intercepts_slope" }, - mode: params.publish_dir_mode, - pattern: "*slope.txt" - ] - ] - } - } - } - - if (!params.skip_biotype_qc && params.featurecounts_group_type) { - process { - withName: 'SUBREAD_FEATURECOUNTS' { - ext.args = { [ - '-B -C', - params.gencode ? "-g gene_type" : "-g $params.featurecounts_group_type", - "-t $params.featurecounts_feature_type" - ].join(' ').trim() } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/featurecounts" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: 'MULTIQC_CUSTOM_BIOTYPE' { - publishDir = [ - path: { "${params.outdir}/${params.aligner}/featurecounts" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - } - - if (!params.skip_rseqc && 'bam_stat' in rseqc_modules) { - process { - withName: '.*:BAM_RSEQC:RSEQC_BAMSTAT' { - publishDir = [ - path: { "${params.outdir}/${params.aligner}/rseqc/bam_stat" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - } - - if (!params.skip_rseqc && 'infer_experiment' in rseqc_modules) { - process { - withName: '.*:BAM_RSEQC:RSEQC_INFEREXPERIMENT' { - publishDir = [ - path: { "${params.outdir}/${params.aligner}/rseqc/infer_experiment" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - } - - if (!params.skip_rseqc && 'junction_annotation' in rseqc_modules) { - process { - withName: '.*:BAM_RSEQC:RSEQC_JUNCTIONANNOTATION' { - publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/rseqc/junction_annotation/pdf" }, - mode: params.publish_dir_mode, - pattern: '*.pdf' - ], - [ - path: { "${params.outdir}/${params.aligner}/rseqc/junction_annotation/bed" }, - mode: params.publish_dir_mode, - pattern: '*.bed' - ], - [ - path: { "${params.outdir}/${params.aligner}/rseqc/junction_annotation/xls" }, - mode: params.publish_dir_mode, - pattern: '*.xls' - ], - [ - path: { "${params.outdir}/${params.aligner}/rseqc/junction_annotation/log" }, - mode: params.publish_dir_mode, - pattern: '*.log' - ], - [ - path: { "${params.outdir}/${params.aligner}/rseqc/junction_annotation/rscript" }, - mode: params.publish_dir_mode, - pattern: '*.r' - ] - ] - } - } - } - - if (!params.skip_rseqc && 'junction_saturation' in rseqc_modules) { - process { - withName: '.*:BAM_RSEQC:RSEQC_JUNCTIONSATURATION' { - publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/rseqc/junction_saturation/pdf" }, - mode: params.publish_dir_mode, - pattern: '*.pdf' - ], - [ - path: { "${params.outdir}/${params.aligner}/rseqc/junction_saturation/rscript" }, - mode: params.publish_dir_mode, - pattern: '*.r' - ] - ] - } - } - } - - if (!params.skip_rseqc && 'read_duplication' in rseqc_modules) { - process { - withName: '.*:BAM_RSEQC:RSEQC_READDUPLICATION' { - publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/rseqc/read_duplication/pdf" }, - mode: params.publish_dir_mode, - pattern: '*.pdf' - ], - [ - path: { "${params.outdir}/${params.aligner}/rseqc/read_duplication/xls" }, - mode: params.publish_dir_mode, - pattern: '*.xls' - ], - [ - path: { "${params.outdir}/${params.aligner}/rseqc/read_duplication/rscript" }, - mode: params.publish_dir_mode, - pattern: '*.r' - ] - ] - } - } - } - - if (!params.skip_rseqc && 'read_distribution' in rseqc_modules && !params.bam_csi_index) { - process { - withName: '.*:BAM_RSEQC:RSEQC_READDISTRIBUTION' { - publishDir = [ - path: { "${params.outdir}/${params.aligner}/rseqc/read_distribution" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - } - - if (!params.skip_rseqc && 'inner_distance' in rseqc_modules && !params.bam_csi_index) { - process { - withName: '.*:BAM_RSEQC:RSEQC_INNERDISTANCE' { - publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/rseqc/inner_distance/txt" }, - mode: params.publish_dir_mode, - pattern: '*.txt', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ], - [ - path: { "${params.outdir}/${params.aligner}/rseqc/inner_distance/pdf" }, - mode: params.publish_dir_mode, - pattern: '*.pdf' - ], - [ - path: { "${params.outdir}/${params.aligner}/rseqc/inner_distance/rscript" }, - mode: params.publish_dir_mode, - pattern: '*.r' - ] - ] - } - } - } - - if (!params.skip_rseqc && 'tin' in rseqc_modules && !params.bam_csi_index) { - process { - withName: '.*:BAM_RSEQC:RSEQC_TIN' { - publishDir = [ - path: { "${params.outdir}/${params.aligner}/rseqc/tin" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - } -} - -if (!params.skip_multiqc) { - process { - withName: 'MULTIQC' { - ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } - ext.prefix = "multiqc_report" - publishDir = [ - path: { [ - "${params.outdir}/multiqc", - params.skip_alignment? '' : "/${params.aligner}" - ].join('') }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } -} - -// -// Salmon/ Kallisto pseudoalignment options -// - -if (!params.skip_pseudo_alignment && params.pseudo_aligner == 'salmon') { - process { - withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:SALMON_QUANT' { - ext.args = { params.extra_salmon_quant_args ?: '' } - publishDir = [ - path: { "${params.outdir}/${params.pseudo_aligner}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') || filename.endsWith('_meta_info.json') ? null : filename } - ] - } - } -} - -if (!params.skip_pseudo_alignment && params.pseudo_aligner == 'kallisto') { - process { - withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:KALLISTO_QUANT' { - ext.args = params.extra_kallisto_quant_args ?: '' - publishDir = [ - path: { "${params.outdir}/${params.pseudo_aligner}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') || filename.endsWith('.run_info.json') || filename.endsWith('.log') ? null : filename } - ] - } - } -} - -if (!params.skip_pseudo_alignment && params.pseudo_aligner) { - process { - withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:TX2GENE' { - publishDir = [ - path: { "${params.outdir}/${params.pseudo_aligner}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:TXIMPORT' { - ext.prefix = { "${quant_type}.merged" } - publishDir = [ - path: { "${params.outdir}/${params.pseudo_aligner}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:SE_.*' { - publishDir = [ - path: { "${params.outdir}/${params.pseudo_aligner}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - - if (!params.skip_qc & !params.skip_deseq2_qc) { - process { - withName: 'DESEQ2_QC_PSEUDO' { - ext.args = { [ - "--id_col 1", - "--sample_suffix ''", - "--count_col 3", - params.deseq2_vst ? '--vst TRUE' : '' - ].join(' ').trim() } - ext.args2 = { params.pseudo_aligner } - publishDir = [ - path: { "${params.outdir}/${params.pseudo_aligner}/deseq2_qc" }, - mode: params.publish_dir_mode, - pattern: "*{RData,pca.vals.txt,plots.pdf,sample.dists.txt,size_factors,log}" - ] - } - } - } -} diff --git a/conf/test.config b/conf/test.config index f9154ba31..f7a9fca91 100644 --- a/conf/test.config +++ b/conf/test.config @@ -19,21 +19,20 @@ params { max_memory = '6.GB' max_time = '6.h' - // Input data - input = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/samplesheet/v3.10/samplesheet_test.csv" + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/626c8fab639062eade4b10747e919341cbf9b41a/samplesheet/v3.10/samplesheet_test.csv' // Genome references - fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/genome.fasta" - gtf = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/genes_with_empty_tid.gtf.gz" - gff = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/genes.gff.gz" - transcript_fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/transcriptome.fasta" - additional_fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/gfp.fa.gz" - - bbsplit_fasta_list = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/bbsplit_fasta_list.txt" - hisat2_index = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/hisat2.tar.gz" - salmon_index = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/salmon.tar.gz" - rsem_index = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/rsem.tar.gz" + fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/626c8fab639062eade4b10747e919341cbf9b41a/reference/genome.fasta' + gtf = 'https://raw.githubusercontent.com/nf-core/test-datasets/626c8fab639062eade4b10747e919341cbf9b41a/reference/genes_with_empty_tid.gtf.gz' + gff = 'https://raw.githubusercontent.com/nf-core/test-datasets/626c8fab639062eade4b10747e919341cbf9b41a/reference/genes.gff.gz' + transcript_fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/626c8fab639062eade4b10747e919341cbf9b41a/reference/transcriptome.fasta' + additional_fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/626c8fab639062eade4b10747e919341cbf9b41a/reference/gfp.fa.gz' + + bbsplit_fasta_list = 'https://raw.githubusercontent.com/nf-core/test-datasets/626c8fab639062eade4b10747e919341cbf9b41a/reference/bbsplit_fasta_list.txt' + hisat2_index = 'https://raw.githubusercontent.com/nf-core/test-datasets/626c8fab639062eade4b10747e919341cbf9b41a/reference/hisat2.tar.gz' + salmon_index = 'https://raw.githubusercontent.com/nf-core/test-datasets/626c8fab639062eade4b10747e919341cbf9b41a/reference/salmon.tar.gz' + rsem_index = 'https://raw.githubusercontent.com/nf-core/test-datasets/626c8fab639062eade4b10747e919341cbf9b41a/reference/rsem.tar.gz' // Other parameters skip_bbsplit = false diff --git a/conf/test_cache.config b/conf/test_cache.config deleted file mode 100644 index 51aad577e..000000000 --- a/conf/test_cache.config +++ /dev/null @@ -1,50 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running minimal tests using cached / offline test data -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a fast and simple pipeline test. - - Use as follows: - nextflow run nf-core/rnaseq -profile test, --outdir - ----------------------------------------------------------------------------------------- -*/ - -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 - // params.test_data_base (default) = 'https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq3/' - input = "${params.test_data_base}/samplesheet/v3.10/samplesheet_test.csv" - - // Genome references - fasta = "${params.test_data_base}/reference/genome.fasta" - gtf = "${params.test_data_base}/reference/genes.gtf.gz" - gff = "${params.test_data_base}/reference/genes.gff.gz" - transcript_fasta = "${params.test_data_base}/reference/transcriptome.fasta" - additional_fasta = "${params.test_data_base}/reference/gfp.fa.gz" - - bbsplit_fasta_list = "${params.test_data_base}/reference/bbsplit_fasta_list.txt" - hisat2_index = "${params.test_data_base}/reference/hisat2.tar.gz" - salmon_index = "${params.test_data_base}/reference/salmon.tar.gz" - rsem_index = "${params.test_data_base}/reference/rsem.tar.gz" - - // Other parameters - skip_bbsplit = false - pseudo_aligner = 'salmon' - umitools_bc_pattern = 'NNNN' -} - -// When using RSEM, remove warning from STAR whilst building tiny indices -process { - withName: 'RSEM_PREPAREREFERENCE_GENOME' { - ext.args2 = "--genomeSAindexNbases 7" - } -} diff --git a/conf/test_full.config b/conf/test_full.config index d63a1f676..320b8156f 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,7 +15,7 @@ params { config_profile_description = 'Full test dataset to check pipeline function' // Parameters for full-size test - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/v3.10/samplesheet_full.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/626c8fab639062eade4b10747e919341cbf9b41a/samplesheet/v3.10/samplesheet_full.csv' genome = 'GRCh37' pseudo_aligner = 'salmon' } diff --git a/docs/images/mqc_strand_check.png b/docs/images/mqc_strand_check.png old mode 100755 new mode 100644 index 7b163f9ea..54ae2f275 Binary files a/docs/images/mqc_strand_check.png and b/docs/images/mqc_strand_check.png differ diff --git a/docs/images/nf-core-rnaseq_logo_dark.png b/docs/images/nf-core-rnaseq_logo_dark.png index ff8abdd96..a13319659 100644 Binary files a/docs/images/nf-core-rnaseq_logo_dark.png and b/docs/images/nf-core-rnaseq_logo_dark.png differ diff --git a/docs/images/nf-core-rnaseq_logo_light.png b/docs/images/nf-core-rnaseq_logo_light.png index b0c99cb83..c156a0a0a 100644 Binary files a/docs/images/nf-core-rnaseq_logo_light.png and b/docs/images/nf-core-rnaseq_logo_light.png differ diff --git a/docs/images/nf-core-rnaseq_metro_map_grey.png b/docs/images/nf-core-rnaseq_metro_map_grey.png index 0dbf23f81..d2c040315 100644 Binary files a/docs/images/nf-core-rnaseq_metro_map_grey.png and b/docs/images/nf-core-rnaseq_metro_map_grey.png differ diff --git a/docs/images/nf-core-rnaseq_metro_map_grey.svg b/docs/images/nf-core-rnaseq_metro_map_grey.svg index b17e5844c..7b55ae7e5 100644 --- a/docs/images/nf-core-rnaseq_metro_map_grey.svg +++ b/docs/images/nf-core-rnaseq_metro_map_grey.svg @@ -7,7 +7,7 @@ viewBox="0 0 646.4851 269.92565" version="1.1" id="svg8" - inkscape:version="1.3 (1:1.3+202307231459+0e150ed6c4)" + inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)" sodipodi:docname="nf-core-rnaseq_metro_map_grey.svg" inkscape:export-filename="nf-core-rnaseq_metro_map_grey.png" inkscape:export-xdpi="89" @@ -648,16 +648,2143 @@ id="clipPath1278">23SalmonKallistoMultiQCGTFFASTA1catfastqsubsamplefastq(fq)TSV5RSeQC(multiple modules)PreseqdupRadarDESeq2(PCA only)MultiQCQualimaprnaseqSTARSalmonHISAT2RSEM4SAMtools(sort, index, stats)BEDtoolsgenomecovbedGraphToBigWigUMI-toolsdedupStringTiepicardMarkDuplicatesTSVBAMBAIBIGWIGHTMLPseudo-aligner: Salmon, Quantification: SalmonAligner: HISAT2, Quantification: NoneAligner: STAR, Quantification: Salmon (default)Pseudo-aligner: Kallisto, Quantification: KallistoAligner: STAR, Quantification: RSEMMETHODSTAGE2. Genome alignment & quantification3. Pseudo-alignment & quantification5. Final QC1. Pre-processing4. Post-processingLicense:1catfastqSTAGE2. Genome alignment & quantification3. Pseudo-alignment & quantification1. Pre-processing4. Post-processing3SalmonKallistoMultiQCTSV5RSeQC(multiple modules)Preseq4SAMtools(sort, index, stats)BEDtoolsgenomecovbedGraphToBigWigStringTiepicardMarkDuplicatesFASTQcatfastqTrimTrimGalore!Galore!SortMeRNASortMeRNAFastQCFastQCinferinferstrandednessstrandedness(Salmon)(fq, Salmon)BBSplitBBSplitUMI-toolsUMI-toolsextractextractFastQCFastQCFastPFastP12STARSalmonHISAT2RSEMUMI-toolsdedup + inkscape:connector-curvature="0" />TSVQualimaprnaseqDESeq2(PCA only) diff --git a/docs/images/nf-core-rnaseq_metro_map_grey_animated.svg b/docs/images/nf-core-rnaseq_metro_map_grey_animated.svg new file mode 100644 index 000000000..96ea8972a --- /dev/null +++ b/docs/images/nf-core-rnaseq_metro_map_grey_animated.svg @@ -0,0 +1,5489 @@ + + + +image/svg+xml1catfastqSTAGE2. Genome alignment & quantification3. Pseudo-alignment & quantification1. Pre-processing4. Post-processing35412 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/output.md b/docs/output.md index a4c559b3b..bb2f03f6b 100644 --- a/docs/output.md +++ b/docs/output.md @@ -367,7 +367,7 @@ The majority of RSeQC scripts generate output files which can be plotted and sum -This script predicts the "strandedness" of the protocol (i.e. unstranded, sense or antisense) that was used to prepare the sample for sequencing by assessing the orientation in which aligned reads overlay gene features in the reference genome. The strandedness of each sample has to be provided to the pipeline in the input samplesheet (see [usage docs](https://nf-co.re/rnaseq/usage#samplesheet-input)). However, this information is not always available, especially for public datasets. As a result, additional features have been incorporated into this pipeline to auto-detect whether you have provided the correct information in the samplesheet, and if this is not the case then a warning table will be placed at the top of the MultiQC report highlighting the offending samples (see image below). If required, this will allow you to correct the input samplesheet and rerun the pipeline with the accurate strand information. Note, it is important to get this information right because it can affect the final results. +This script predicts the "strandedness" of the protocol (i.e. unstranded, sense or antisense) that was used to prepare the sample for sequencing by assessing the orientation in which aligned reads overlay gene features in the reference genome. The strandedness of each sample has to be provided to the pipeline in the input samplesheet (see [usage docs](https://nf-co.re/rnaseq/usage#samplesheet-input)). However, this information is not always available, especially for public datasets. As a result, additional features have been incorporated into this pipeline to auto-detect whether you have provided the correct information in the samplesheet, and if this is not the case then the affected libraries will be flagged in the table under 'Strandedness Checks' elsewhere in the report. If required, this will allow you to correct the input samplesheet and rerun the pipeline with the accurate strand information. Note, it is important to get this information right because it can affect the final results. RSeQC documentation: [infer_experiment.py](http://rseqc.sourceforge.net/#infer-experiment-py) @@ -642,6 +642,8 @@ The script included in the pipeline uses DESeq2 to normalise read counts across By default, the pipeline uses the `vst` transformation which is more suited to larger experiments. You can set the parameter `--deseq2_vst false` if you wish to use the DESeq2 native `rlog` option. See [DESeq2 docs](http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#data-transformations-and-visualization) for a more detailed explanation. +Both types of transformation are performed blind, i.e. using across-all-samples variability, without using any prior information on experimental groups (equivalent to using an intercept-only design), as recommended by the [DESeq2 docs](https://www.bioconductor.org/packages/release/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#blind-dispersion-estimation). + The PCA plots are generated based alternately on the top five hundred most variable genes, or all genes. The former is the conventional approach that is more likely to pick up strong effects (ie the biological signal) and the latter, when different, is picking up a weaker but consistent effect that is synchronised across many transcripts. We project both of these onto the first two PCs (shown in the top row of the figure below), which is the best two dimensional representation of the variation between samples. We also explore higher components in terms of experimental factors inferred from sample names. If your sample naming convention follows a strict policy of using underscores to delimit values of experimental factors (for example `WT_UNTREATED_REP1`) and all names have the same number of underscores (so excluding `WT_TREATED_10ml_REP1` from being compatible with the previous label), then any of these factors that are informative (ie label some but not all samples the same) then we individually plot upto the first five PCs, per experimental level, for each of the experimental factors. @@ -682,9 +684,10 @@ The principal output files are the same between Salmon and Kallsto: - `.merged.gene_counts.tsv`: Matrix of gene-level raw counts across all samples. - `.gene_tpm.tsv`: Matrix of gene-level TPM values across all samples. - `.gene_counts.rds`: RDS object that can be loaded in R that contains a [SummarizedExperiment](https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html) container with the TPM (`abundance`), estimated counts (`counts`) and transcript length (`length`) in the assays slot for genes. - - `.merged.gene_counts_scaled.tsv`: Matrix of gene-level library size-scaled counts across all samples. + - `.merged.gene_lengths.tsv`: Matrix of average within-sample transcript lengths for each gene across all samples. + - `.merged.gene_counts_scaled.tsv`: Matrix of gene-level library size-scaled estimated counts across all samples. - `.merged.gene_counts_scaled.rds`: RDS object that can be loaded in R that contains a [SummarizedExperiment](https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html) container with the TPM (`abundance`), estimated library size-scaled counts (`counts`) and transcript length (`length`) in the assays slot for genes. - - `.merged.gene_counts_length_scaled.tsv`: Matrix of gene-level length-scaled counts across all samples. + - `.merged.gene_counts_length_scaled.tsv`: Matrix of gene-level length-scaled estimated counts across all samples. - `.merged.gene_counts_length_scaled.rds`: RDS object that can be loaded in R that contains a [SummarizedExperiment](https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html) container with the TPM (`abundance`), estimated length-scaled counts (`counts`) and transcript length (`length`) in the assays slot for genes. - `.merged.transcript_counts.tsv`: Matrix of isoform-level raw counts across all samples. - `.merged.transcript_tpm.tsv`: Matrix of isoform-level TPM values across all samples. @@ -725,11 +728,11 @@ Transcripts with large inferential uncertainty won't be assigned the exact numbe The [tximport](https://bioconductor.org/packages/release/bioc/html/tximport.html) package is used in this pipeline to summarise the results generated by Salmon or Kallisto into matrices for use with downstream differential analysis packages. We use tximport with different options to summarize count and TPM quantifications at the gene- and transcript-level. Please see [#499](https://github.com/nf-core/rnaseq/issues/499) for discussion and links regarding which counts are suitable for different types of analysis. -According to the `txtimport` documentation you can do one of the following: +According to the [`txtimport` documentation](https://bioconductor.org/packages/release/bioc/vignettes/tximport/inst/doc/tximport.html#Downstream_DGE_in_Bioconductor) you can do one of the following: -- Use bias corrected counts with an offset: import all the salmon files with `tximport` and then use `DESeq2` with `dds <- DESeqDataSetFromTximport(txi, sampleTable, ~condition)` to correct for changes to the average transcript length across samples. -- Use bias corrected counts without an offset: load and use `salmon.merged.gene_counts_length_scaled.tsv` or `salmon.merged.gene_counts_scaled.tsv` directly as you would with a regular counts matrix. -- Use bias uncorrected counts: load and use the `txi$counts` matrix (or `salmon.merged.gene_counts.tsv`) with `DESeq2`. This does not correct for potential differential isoform usage. Alternatively, if you have 3’ tagged RNA-seq data this is the most suitable method. +- Use the original (bias-uncorrected) counts _with an offset_: import all the salmon `quant.sf` files with `tximport` and then use `DESeq2` with `dds <- DESeqDataSetFromTximport(txi, sampleTable, ~condition)` to automatically construct an object with gene-level offsets in-built, which can be used by DESeq2 to automatically account for effective gene length effects across conditions. It's also possible to combine the `.merged.gene_counts.tsv` and `.gene_lengths.tsv` matrices output by this workflow to make your own object the same way - which is what [the nf-core differentialabundance workflow does](https://nf-co.re/differentialabundance/1.5.0/docs/usage#outputs-from-nf-corernaseq-and-other-tximport-processed-results). See the [DESeq2 module](https://github.com/nf-core/modules/blob/c8f7f481bf2ccd8f9c7f2d499d94e74d4b9e23ab/modules/nf-core/deseq2/differential/templates/deseq_de.R#L323) for the implementation details. +- Use bias-corrected counts _without an offset_: load and use `salmon.merged.gene_counts_length_scaled.tsv` or `salmon.merged.gene_counts_scaled.tsv` directly as you would with a regular gene-level counts matrix. These files were created using the `tximport` argument `countsFromAbundance="scaledTPM"` or `"lengthScaledTPM"` to scale counts to library size or to library size and average transcript length respectively. +- Use the original (bias-uncorrected) counts _without an offset_: load and use the `txi$counts` matrix (or `salmon.merged.gene_counts.tsv`) with `DESeq2`. This is generally **not** recommended, since it does not correct for potential differential isoform usage (the offset). However, if you have 3’ tagged RNA-seq data, then this _is_ the most suitable method, because the counts do not exhibit any length bias. > **NB:** The default Salmon parameters and a k-mer size of 31 are used to create the index. As [documented here](https://salmon.readthedocs.io/en/latest/salmon.html#preparing-transcriptome-indices-mapping-based-mode) and [discussed here](https://github.com/COMBINE-lab/salmon/issues/482#issuecomment-583799668), a k-mer size off 31 works well with reads that are 75bp or longer. diff --git a/docs/usage.md b/docs/usage.md index 7b148c636..b613ab79d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -18,7 +18,7 @@ You will need to create a samplesheet with information about the samples you wou ### Multiple runs of the same sample -The `sample` 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 concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes. If you set the strandedness value to `auto` the pipeline will sub-sample the input FastQ files to 1 million reads, use Salmon Quant to infer the strandedness automatically and then propagate this information to the remainder of the pipeline. If the strandedness has been inferred or provided incorrectly a warning will be present at the top of the MultiQC report so please be sure to check when looking at the QC for your samples. +The `sample` 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 concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes. ```csv title="samplesheet.csv" sample,fastq_1,fastq_2,strandedness @@ -27,6 +27,51 @@ CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz,a CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz,auto ``` +### Strandedness Prediction + +If you set the strandedness value to `auto`, the pipeline will sub-sample the input FastQ files to 1 million reads, use Salmon Quant to automatically infer the strandedness, and then propagate this information through the rest of the pipeline. This behavior is controlled by the `--stranded_threshold` and `--unstranded_threshold` parameters, which are set to 0.8 and 0.1 by default, respectively. This means: + +- **Forward stranded:** At least 80% of the fragments are in the 'forward' orientation. +- **Unstranded:** The forward and reverse fractions differ by less than 10%. +- **Undetermined:** Samples that do not meet either criterion, possibly indicating issues such as genomic DNA contamination. + +**Note:** These thresholds apply to both the strandedness inferred from Salmon outputs for input to the pipeline and how strandedness is inferred from RSeQC results using pipeline outputs. + +#### Usage Examples + +1. **Forward Stranded Sample:** + + - Forward fraction: 0.85 + - Reverse fraction: 0.15 + - **Classification:** Forward stranded + +2. **Reverse Stranded Sample:** + + - Forward fraction: 0.1 + - Reverse fraction: 0.9 + - **Classification:** Reverse stranded + +3. **Unstranded Sample:** + + - Forward fraction: 0.45 + - Reverse fraction: 0.55 + - **Classification:** Unstranded + +4. **Undetermined Sample:** + - Forward fraction: 0.6 + - Reverse fraction: 0.4 + - **Classification:** Undetermined + +You can control the stringency of this behavior with `--stranded_threshold` and `--unstranded_threshold`. + +#### Errors and Reporting + +The results of strandedness inference are displayed in the MultiQC report under 'Strandedness Checks'. This shows any provided strandedness and the results inferred by both Salmon (when strandedness is set to 'auto') and RSeQC. Mismatches between input strandedness (explicitly provided by the user or inferred by Salmon) and output strandedness from RSeQC are marked as fails. For example, if a user specifies 'forward' as strandedness for a library that is actually reverse stranded, this is marked as a fail. + +![MultiQC - Strand check table](images/mqc_strand_check.png) + +Be sure to check the strandedness report when reviewing the QC for your samples. + ### 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. @@ -55,6 +100,14 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p > **NB:** The `group` and `replicate` columns were replaced with a single `sample` column as of v3.1 of the pipeline. The `sample` column is essentially a concatenation of the `group` and `replicate` columns, however it now also offers more flexibility in instances where replicate information is not required e.g. when sequencing clinical samples. If all values of `sample` have the same number of underscores, fields defined by these underscore-separated names may be used in the PCA plots produced by the pipeline, to regain the ability to represent different groupings. +## FASTQ sampling + +If you would like to reduce the number of reads used in the analysis, for example to test pipeline operation with limited resource usage, you can make use of the FASTP option for trimming (see below). FASTP has an option to take the first `n` reads of input FASTQ file(s), so this can be used to reduce the reads passed to subsequent steps. For example, to pass only the first 10,000 reads for trimming you would set input paramters like: + +``` +--trimmer fastp --extra_fastp_args '--reads_to_process 10000' +``` + ## Adapter trimming options [Trim Galore!](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/) is a wrapper tool around Cutadapt and FastQC to peform quality and adapter trimming on FastQ files. Trim Galore! will automatically detect and trim the appropriate adapter sequence. It is the default trimming tool used by this pipeline, however you can use fastp instead by specifying the `--trimmer fastp` parameter. [fastp](https://github.com/OpenGene/fastp) is a tool designed to provide fast, all-in-one preprocessing for FastQ files. It has been developed in C++ with multithreading support to achieve higher performance. You can specify additional options for Trim Galore! and fastp via the `--extra_trimgalore_args` and `--extra_fastp_args` parameters, respectively. @@ -93,12 +146,13 @@ The `--umitools_grouping_method` parameter affects [how similar, but non-identic #### Examples: -| UMI type | Source | Pipeline parameters | -| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -| In read name | [Illumina BCL convert >3.7.5](https://emea.support.illumina.com/content/dam/illumina-support/documents/documentation/software_documentation/bcl_convert/bcl-convert-v3-7-5-software-guide-1000000163594-00.pdf) | `--with_umi --skip_umi_extract --umitools_umi_separator ":"` | -| In sequence | [Lexogen QuantSeq® 3’ mRNA-Seq V2 FWD](https://www.lexogen.com/quantseq-3mrna-sequencing) + [UMI Second Strand Synthesis Module](https://faqs.lexogen.com/faq/how-can-i-add-umis-to-my-quantseq-libraries) | `--with_umi --umitools_extract_method "regex" --umitools_bc_pattern "^(?P.{6})(?P.{4}).*"` | -| In sequence | [Lexogen CORALL® Total RNA-Seq V1](https://www.lexogen.com/corall-total-rna-seq/)
> _mind [Appendix H](https://www.lexogen.com/wp-content/uploads/2020/04/095UG190V0130_CORALL-Total-RNA-Seq_2020-03-31.pdf) regarding optional trimming_ | `--with_umi --umitools_extract_method "regex" --umitools_bc_pattern "^(?P.{12}).*"`
Optional: `--clip_r2 9 --three_prime_clip_r2 12` | -| In sequence | [Takara Bio SMARTer® Stranded Total RNA-Seq Kit v3](https://www.takarabio.com/documents/User%20Manual/SMARTer%20Stranded%20Total%20RNA/SMARTer%20Stranded%20Total%20RNA-Seq%20Kit%20v3%20-%20Pico%20Input%20Mammalian%20User%20Manual-a_114949.pdf) | `--with_umi --umitools_extract_method "regex" --umitools_bc_pattern2 "^(?P.{8})(?P.{6}).*"` | +| UMI type | Source | Pipeline parameters | +| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| In read name | [Illumina BCL convert >3.7.5](https://emea.support.illumina.com/content/dam/illumina-support/documents/documentation/software_documentation/bcl_convert/bcl-convert-v3-7-5-software-guide-1000000163594-00.pdf) | `--with_umi --skip_umi_extract --umitools_umi_separator ":"` | +| In sequence | [Lexogen QuantSeq® 3’ mRNA-Seq V2 FWD](https://www.lexogen.com/quantseq-3mrna-sequencing) + [UMI Second Strand Synthesis Module](https://faqs.lexogen.com/faq/how-can-i-add-umis-to-my-quantseq-libraries) | `--with_umi --umitools_extract_method "regex" --umitools_bc_pattern "^(?P.{6})(?P.{4}).*"` | +| In sequence | [Lexogen CORALL® Total RNA-Seq V1](https://www.lexogen.com/corall-total-rna-seq/)
> _mind [Appendix H](https://www.lexogen.com/wp-content/uploads/2020/04/095UG190V0130_CORALL-Total-RNA-Seq_2020-03-31.pdf) regarding optional trimming_ | `--with_umi --umitools_extract_method "regex" --umitools_bc_pattern "^(?P.{12}).*"`
Optional: `--clip_r2 9 --three_prime_clip_r2 12` | +| In sequence | [Takara Bio SMARTer® Stranded Total RNA-Seq Kit v3](https://www.takarabio.com/documents/User%20Manual/SMARTer%20Stranded%20Total%20RNA/SMARTer%20Stranded%20Total%20RNA-Seq%20Kit%20v3%20-%20Pico%20Input%20Mammalian%20User%20Manual-a_114949.pdf) | `--with_umi --umitools_extract_method "regex" --umitools_bc_pattern2 "^(?P.{8})(?P.{6}).*"` | +| In sequence | [Watchmaker mRNA Library Prep Kit](https://watchmakergenomics.com/wp-content/uploads/2023/11/M223_mRNA-Library-Prep-Kit-_UG_WMUG214_v1-1-0823.pdf) with [Twist UMI Adapter System](https://www.twistbioscience.com/sites/default/files/resources/2023-03/DOC-001337_TechNote-ProcessingSequencingDataUtilizingUMI-REV1-singles.pdf) | `--with_umi --umitools_extract_method "regex" --umitools_bc_pattern "^(?P.{5})(?P.{2}).*" --umitools_bc_pattern2 "^(?P.{5})(?P.{2}).*"` | > _No warranty for the accuracy or completeness of the parameters is implied_ @@ -137,6 +191,12 @@ If unique molecular identifiers were used to prepare the library, add the follow Please refer to the [nf-core website](https://nf-co.re/usage/reference_genomes) for general usage docs and guidelines regarding reference genomes. +:::note +**Consistent reference resource usage** + +When supplying reference files as discussed below, it is important to be consistent in the reference resource used (Ensembl, GENCODE, UCSC etc), since differences in conventions between these resources can make their files incompatible. For example, UCSC prefixes chromosomes with `chr`, while Ensembl does not, so a GTF file from Ensembl should not be supplied alongside a genome FASTA from UCSC. GENCODE also attaches version identifiers to gene and transcript names (e.g. `ENSG00000254647.1`) while Ensembl does not. +::: + ### Explicit reference file specification (recommended) The minimum reference genome requirements for this pipeline are a FASTA and GTF file, all other files required to run the pipeline can be generated from these files. For example, the latest reference files for human can be derived from Ensembl like: @@ -158,6 +218,36 @@ Notes: - If `--additional_fasta` is provided then the features in this file (e.g. ERCC spike-ins) will be automatically concatenated onto both the reference FASTA file as well as the GTF annotation before building the appropriate indices. - When using `--aligner star_rsem`, both the STAR and RSEM indices should be present in the path specified by `--rsem_index` (see [#568](https://github.com/nf-core/rnaseq/issues/568)). +#### Reference genome + +It is recommended to provide the most complete reference genome for your species, without additional loci (haplotypes) or patches. For model organisms such as mouse or human, this is the "primary assembly", which includes the reference chromosomes and some additional scaffolds. For the human assembly GRCh38 (hg38), use the `GRCh38.primary_assembly.genome.fa.gz` file from GENCODE or the `Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz` file from Ensembl. These files cover the largest portion of the reference genome without including multiple copies of the same sequence, which would result in heavy mapping quality penalties. + +For most other species (e.g., fly, cow, dog), no primary assembly is published. This reflects inadequately characterized genomic variation and a lower degree of curation, meaning that there are no established alternative loci (haplotypes), and that the toplevel file is equivalent to a primary assembly. Therefore, while the toplevel assembly may be utilized for these organisms, it is nonetheless advisable to verify the absence of N-padded haplotype or patch regions first. + +#### Gene annotation + +Gene annotations are updated more frequently than the reference genome sequence, so you must choose an appropriate annotation version (e.g. Ensembl release). We recommend using sources with well-defined, versioned releases such as ENSEMBL or GENCODE. Generally, it is best to use the most recent release for the latest gene annotations. However, if you are combining your data with older datasets, use the annotation version previously used for consistency. + +Once you have chosen a release, select the annotation file that matches your reference genome. For the human primary assembly, use the comprehensive annotation (e.g., `gencode.{release}.primary_assembly.annotation.gtf.gz` from GENCODE or `Homo_sapiens.GRCh38.{release}.gtf.gz` from Ensembl). For other species, like fly, use the annotation matching the toplevel assembly (e.g., `Drosophila_melanogaster.BDGP6.46.{release}.gtf.gz` from Ensembl). + +Ensure that the annotation files use gene IDs as the primary identifier, not the gene name/symbol. For example, the Ensembl ID `ENSG00000254647` corresponds to the `INS` gene, which encodes the insulin protein. While gene names are more familiar, it is crucial to retain and use the primary identifiers as they are unique and easier to map between annotation versions or sources. + +To take advantage of all the quality control modules implemented in the pipeline, the gene annotation should include a `gene_biotype` field which describes the function of each feature (protein coding, long non-coding etc.). This is usually the case for annotations from GENCODE or Ensembl but may not be if your annotation comes from another source. If your annotation does not include this field, please set the `--skip_biotype_qc` option to avoid running the steps that rely on it. + +:::note +**GTF vs GFF** + +GFF (General Feature Format) is a tab-separated text file format for representing genomic annotations, while GTF (General Transfer Format) is a specific implementation of this format corresponding to GFF version 2. The pipeline can accept both GFF and GTF but any GFF files will be converted to GTF so if a GTF is available for your annotation of choice it is better to provide that directly. + +More information and links to further resources are [available from Ensembl](https://www.ensembl.org/info/website/upload/gff.html). +::: + +#### Reference transcriptome + +In addition to the reference genome sequence and annotation, you can provide a reference transcriptome FASTA file. These files can be obtained from GENCODE or Ensembl. However, these sequences only cover the reference chromosomes and can cause inconsistencies if you are using a primary or toplevel genome assembly and annotation. + +We recommend not providing a transcriptome FASTA file and instead allowing the pipeline to create it from the provided genome and annotation. Similar to aligner indexes, you can save the created transcriptome FASTA and BED files to a central location for future pipeline runs. This helps avoid redundant computation and having multiple copies on your system. Ensure that all genome, annotation, transcriptome, and index versions match to maintain consistency. + #### Indices By default, indices are generated dynamically by the workflow for tools such as STAR and Salmon. Since indexing is an expensive process in time and resources you should ensure that it is only done once, by retaining the indices generated from each batch of reference files: @@ -167,13 +257,17 @@ By default, indices are generated dynamically by the workflow for tools such as Once you have the indices from a workflow run you should save them somewhere central and reuse them in subsequent runs using custom config files or command line parameters such as `--star_index '/path/to/STAR/index/'`. -#### Gencode +Remember to note the genome and annotation versions as well as the versions of the software used for indexing, as an index created with one version may not be compatible with other versions. + +#### GENCODE If you are using [GENCODE](https://www.gencodegenes.org/) reference genome files please specify the `--gencode` parameter because the format of these files is slightly different to ENSEMBL genome files: - The `--gtf_group_features_type` parameter will automatically be set to `gene_type` as opposed to `gene_biotype`, respectively. - If you are running Salmon, the `--gencode` flag will also be passed to the index building step to overcome parsing issues resulting from the transcript IDs in GENCODE fasta files being separated by vertical pipes (`|`) instead of spaces (see [this issue](https://github.com/COMBINE-lab/salmon/issues/15)). +As well as the standard annotations, GENCODE also provides "basic" annotations, which include only representative transcripts, but we do not recommend using these. + #### Prokaryotic genome annotations This pipeline uses featureCounts to generate QC metrics based on [biotype](http://www.ensembl.org/info/genome/genebuild/biotypes.html) information available within GFF/GTF genome annotation files. The format of these annotation files can vary significantly depending on the source of the annotation and the type of organism. The default settings in the pipeline are tailored towards Ensembl GTF annotations available for eukaryotic genomes. Prokaryotic genome annotations tend to be distributed in GFF format which are structured differently in terms of the feature naming conventions. There are a number of ways you can tune the behaviour of the pipeline to cater for differences/absence of biotype information: @@ -213,8 +307,6 @@ nextflow run \ --outdir \ --gtf \ --fasta \ - --igenomes_ignore \ - --genome null \ -profile docker ``` @@ -316,6 +408,8 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) - `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. @@ -357,14 +451,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. diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy deleted file mode 100755 index 5cdc9a73c..000000000 --- a/lib/NfcoreTemplate.groovy +++ /dev/null @@ -1,398 +0,0 @@ -// -// This file holds several functions used within the nf-core pipeline template. -// - -import org.yaml.snakeyaml.Yaml -import groovy.json.JsonOutput -import nextflow.extension.FilesEx - -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 " - } - } - - // - // Warn if using custom configs to provide pipeline parameters - // - public static void warnParamsProvidedInConfig(workflow, log) { - if (workflow.configFiles.size() > 1) { - log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " Multiple config files detected!\n" + - " Please provide pipeline parameters via the CLI or Nextflow '-params-file' option.\n" + - " Custom config files including those provided by the '-c' Nextflow option can be\n" + - " used to provide any configuration except for parameters.\n\n" + - " Docs: https://nf-co.re/usage/configuration#custom-configuration-files\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=[], pass_mapped_reads=[:], pass_trimmed_reads=[:], pass_strand_check=[:]) { - - // Set up the e-mail variables - def fail_mapped_count = pass_mapped_reads.count { key, value -> value == false } - def fail_trimmed_count = pass_trimmed_reads.count { key, value -> value == false } - def fail_strand_count = pass_strand_check.count { key, value -> value == false } - - def subject = "[$workflow.manifest.name] Successful: $workflow.runName" - if (fail_mapped_count + fail_trimmed_count + fail_strand_count > 0) { - subject = "[$workflow.manifest.name] Partially successful - samples skipped: $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 - email_fields['skip_sample_count'] = fail_mapped_count + fail_trimmed_count + fail_strand_count - - // On success try attach the multiqc report - def mqc_report = null - try { - if (workflow.success && !params.skip_multiqc) { - 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.containsKey('max_multiqc_email_size') ? params.max_multiqc_email_size : 0) 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 - 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 (all) { - // Catch failures and try with plaintext - def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] - if ( mqc_report != null && 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_hf = new File(workflow.launchDir.toString(), ".pipeline_report.html") - output_hf.withWriter { w -> w << email_html } - FilesEx.copyTo(output_hf.toPath(), "${params.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 } - FilesEx.copyTo(output_tf.toPath(), "${params.outdir}/pipeline_info/pipeline_report.txt"); - output_tf.delete() - } - - // - // 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()); - } - } - - // - // Dump pipeline parameters in a json file - // - public static void dump_parameters(workflow, params) { - 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 = JsonOutput.toJson(params) - temp_pf.text = JsonOutput.prettyPrint(jsonStr) - - FilesEx.copyTo(temp_pf.toPath(), "${params.outdir}/pipeline_info/params_${timestamp}.json") - temp_pf.delete() - } - - // - // Print pipeline summary on completion - // - public static void summary(workflow, params, log, pass_mapped_reads=[:], pass_trimmed_reads=[:], pass_strand_check=[:]) { - Map colors = logColours(params.monochrome_logs) - - def fail_mapped_count = pass_mapped_reads.count { key, value -> value == false } - def fail_trimmed_count = pass_trimmed_reads.count { key, value -> value == false } - def fail_strand_count = pass_strand_check.count { key, value -> value == false } - if (workflow.success) { - def color = colors.green - def status = [] - if (workflow.stats.ignoredCount != 0) { - color = colors.yellow - status += ['with errored process(es)'] - } - if (fail_mapped_count > 0 || fail_trimmed_count > 0 || fail_strand_count > 0) { - color = colors.yellow - status += ['with skipped sampl(es)'] - } - log.info "-${colors.purple}[$workflow.manifest.name]${color} Pipeline completed successfully ${status.join(', ')}${colors.reset}-" - if (fail_trimmed_count > 0) { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Please check MultiQC report: ${fail_trimmed_count}/${pass_trimmed_reads.size()} samples skipped since they failed ${params.min_trimmed_reads} trimmed read threshold.${colors.reset}-" - } - if (fail_mapped_count > 0) { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Please check MultiQC report: ${fail_mapped_count}/${pass_mapped_reads.size()} samples skipped since they failed STAR ${params.min_mapped_reads}% mapped threshold.${colors.reset}-" - } - if (fail_strand_count > 0) { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Please check MultiQC report: ${fail_strand_count}/${pass_strand_check.size()} samples failed strandedness check.${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 8d030f4e8..000000000 --- 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/WorkflowMain.groovy b/lib/WorkflowMain.groovy deleted file mode 100755 index 4d94dfe08..000000000 --- a/lib/WorkflowMain.groovy +++ /dev/null @@ -1,60 +0,0 @@ -// -// This file holds several functions specific to the main.nf workflow in the nf-core/rnaseq 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.1400710\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" - } - - // - // Validate parameters and print summary to screen - // - public static void initialise(workflow, params, log) { - - // 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) - } - - // Warn about using custom configs to provide pipeline parameters - NfcoreTemplate.warnParamsProvidedInConfig(workflow, 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) - } - - // - // 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 - } -} diff --git a/lib/WorkflowRnaseq.groovy b/lib/WorkflowRnaseq.groovy deleted file mode 100755 index 29a1724e3..000000000 --- a/lib/WorkflowRnaseq.groovy +++ /dev/null @@ -1,474 +0,0 @@ -// -// This file holds several functions specific to the workflow/rnaseq.nf in the nf-core/rnaseq pipeline -// - -import nextflow.Nextflow -import groovy.json.JsonSlurper -import groovy.text.SimpleTemplateEngine - -class WorkflowRnaseq { - - // - // Check and validate parameters - // - public static void initialise(params, log) { - 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) { - Nextflow.error("No GTF or GFF3 annotation specified! The pipeline requires at least one of these files.") - } - - if (params.gtf) { - if (params.gff) { - gtfGffWarn(log) - } - if (params.genome == 'GRCh38' && params.gtf.contains('Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf')) { - ncbiGenomeWarn(log) - } - if (params.gtf.contains('/UCSC/') && params.gtf.contains('Annotation/Genes/genes.gtf')) { - ucscGenomeWarn(log) - } - } - - if (params.transcript_fasta) { - transcriptsFastaWarn(log) - } - - if (!params.skip_bbsplit && !params.bbsplit_index && !params.bbsplit_fasta_list) { - Nextflow.error("Please provide either --bbsplit_fasta_list / --bbsplit_index to run BBSplit.") - } - - if (params.remove_ribo_rna && !params.ribo_database_manifest) { - Nextflow.error("Please provide --ribo_database_manifest to remove ribosomal RNA with SortMeRNA.") - } - - - if (params.with_umi && !params.skip_umi_extract) { - if (!params.umitools_bc_pattern && !params.umitools_bc_pattern2) { - Nextflow.error("UMI-tools requires a barcode pattern to extract barcodes from the reads.") - } - } - - if (params.skip_alignment) { - skipAlignmentWarn(log) - } - - if (!params.skip_pseudo_alignment && params.pseudo_aligner) { - if (!(params.salmon_index || params.transcript_fasta || (params.fasta && (params.gtf || params.gff)))) { - Nextflow.error("To use `--pseudo_aligner 'salmon'`, you must provide either --salmon_index or --transcript_fasta or both --fasta and --gtf / --gff.") - } - } - - // Checks when running --aligner star_rsem - if (!params.skip_alignment && params.aligner == 'star_rsem') { - if (params.with_umi) { - rsemUmiError(log) - } - if (params.rsem_index && params.star_index) { - rsemStarIndexWarn(log) - } - if (params.aligner == 'star_rsem' && params.extra_star_align_args) { - rsemStarExtraArgumentsWarn(log) - } - } - - // Warn if --additional_fasta provided with aligner index - if (!params.skip_alignment && params.additional_fasta) { - def index = '' - if (params.aligner == 'star_salmon' && params.star_index) { - index = 'star' - } - if (params.aligner == 'star_rsem' && params.rsem_index) { - index = 'rsem' - } - if (params.aligner == 'hisat2' && params.hisat2_index) { - index = 'hisat2' - } - if (index) { - additionaFastaIndexWarn(index, log) - } - } - - // Check which RSeQC modules we are running - def valid_rseqc_modules = ['bam_stat', 'inner_distance', 'infer_experiment', 'junction_annotation', 'junction_saturation', 'read_distribution', 'read_duplication', 'tin'] - def rseqc_modules = params.rseqc_modules ? params.rseqc_modules.split(',').collect{ it.trim().toLowerCase() } : [] - if ((valid_rseqc_modules + rseqc_modules).unique().size() != valid_rseqc_modules.size()) { - Nextflow.error("Invalid option: ${params.rseqc_modules}. Valid options for '--rseqc_modules': ${valid_rseqc_modules.join(', ')}") - } - } - - // - // Function to validate channels from input samplesheet - // - public static ArrayList validateInput(input) { - def (metas, fastqs) = input[1..2] - - // Check that multiple runs of the same sample are of the same strandedness - def strandedness_ok = metas.collect{ it.strandedness }.unique().size == 1 - if (!strandedness_ok) { - Nextflow.error("Please check input samplesheet -> Multiple runs of a sample must have the same strandedness!: ${metas[0].id}") - } - - // Check that multiple runs of the same sample are of the same datatype i.e. single-end / paired-end - def endedness_ok = metas.collect{ it.single_end }.unique().size == 1 - if (!endedness_ok) { - Nextflow.error("Please check input samplesheet -> Multiple runs of a sample must be of the same datatype i.e. single-end or paired-end: ${metas[0].id}") - } - - return [ metas[0], fastqs ] - } - - // - // Function to check whether biotype field exists in GTF file - // - public static Boolean biotypeInGtf(gtf_file, biotype, log) { - def hits = 0 - gtf_file.eachLine { line -> - def attributes = line.split('\t')[-1].split() - if (attributes.contains(biotype)) { - hits += 1 - } - } - if (hits) { - return true - } else { - log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " Biotype attribute '${biotype}' not found in the last column of the GTF file!\n\n" + - " Biotype QC will be skipped to circumvent the issue below:\n" + - " https://github.com/nf-core/rnaseq/issues/460\n\n" + - " Amend '--featurecounts_group_type' to change this behaviour.\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - return false - } - } - - // - // Function to generate an error if contigs in genome fasta file > 512 Mbp - // - public static void checkMaxContigSize(fai_file, log) { - def max_size = 512000000 - fai_file.eachLine { line -> - def lspl = line.split('\t') - def chrom = lspl[0] - def size = lspl[1] - if (size.toInteger() > max_size) { - def error_string = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " Contig longer than ${max_size}bp found in reference genome!\n\n" + - " ${chrom}: ${size}\n\n" + - " Provide the '--bam_csi_index' parameter to use a CSI instead of BAI index.\n\n" + - " Please see:\n" + - " https://github.com/nf-core/rnaseq/issues/744\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - Nextflow.error(error_string) - } - } - } - - // - // Function that parses Salmon quant 'meta_info.json' output file to get inferred strandedness - // - public static String getSalmonInferredStrandedness(json_file) { - def lib_type = new JsonSlurper().parseText(json_file.text).get('library_types')[0] - def strandedness = 'reverse' - if (lib_type) { - if (lib_type in ['U', 'IU']) { - strandedness = 'unstranded' - } else if (lib_type in ['SF', 'ISF']) { - strandedness = 'forward' - } else if (lib_type in ['SR', 'ISR']) { - strandedness = 'reverse' - } - } - return strandedness - } - - // - // Function that parses TrimGalore log output file to get total number of reads after trimming - // - public static Integer getTrimGaloreReadsAfterFiltering(log_file) { - def total_reads = 0 - 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() - } - return total_reads - filtered_reads - } - - // - // Function that parses and returns the alignment rate from the STAR log output - // - public static ArrayList getStarPercentMapped(params, align_log) { - def percent_aligned = 0 - def pattern = /Uniquely mapped reads %\s*\|\s*([\d\.]+)%/ - align_log.eachLine { line -> - def matcher = line =~ pattern - if (matcher) { - percent_aligned = matcher[0][1].toFloat() - } - } - - def pass = false - if (percent_aligned >= params.min_mapped_reads.toFloat()) { - pass = true - } - return [ percent_aligned, pass ] - } - - // - // Function that parses and returns the predicted strandedness from the RSeQC infer_experiment.py output - // - public static ArrayList getInferexperimentStrandedness(inferexperiment_file, cutoff=30) { - def sense = 0 - def antisense = 0 - def undetermined = 0 - inferexperiment_file.eachLine { line -> - def undetermined_matcher = line =~ /Fraction of reads failed to determine:\s([\d\.]+)/ - def se_sense_matcher = line =~ /Fraction of reads explained by "\++,--":\s([\d\.]+)/ - def se_antisense_matcher = line =~ /Fraction of reads explained by "\+-,-\+":\s([\d\.]+)/ - def pe_sense_matcher = line =~ /Fraction of reads explained by "1\++,1--,2\+-,2-\+":\s([\d\.]+)/ - def pe_antisense_matcher = line =~ /Fraction of reads explained by "1\+-,1-\+,2\+\+,2--":\s([\d\.]+)/ - if (undetermined_matcher) undetermined = undetermined_matcher[0][1].toFloat() * 100 - if (se_sense_matcher) sense = se_sense_matcher[0][1].toFloat() * 100 - if (se_antisense_matcher) antisense = se_antisense_matcher[0][1].toFloat() * 100 - if (pe_sense_matcher) sense = pe_sense_matcher[0][1].toFloat() * 100 - if (pe_antisense_matcher) antisense = pe_antisense_matcher[0][1].toFloat() * 100 - } - def strandedness = 'unstranded' - if (sense >= 100-cutoff) { - strandedness = 'forward' - } else if (antisense >= 100-cutoff) { - strandedness = 'reverse' - } - return [ strandedness, sense, antisense, undetermined ] - } - - // - // 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 - } - - // - // Generate methods description for MultiQC - // - public static String toolCitationText(params) { - // 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 - } - - public static String toolBibliographyText(params) { - // TODO 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 - } - - public static String methodsDescriptionText(run_workflow, mqc_methods_yaml, params) { - // 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() - - // Pipeline DOI - 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.
  • " - - // Tool references - meta["tool_citations"] = "" - meta["tool_bibliography"] = "" - - // TODO Only uncomment below if logic in toolCitationText/toolBibliographyText has been filled! - //meta["tool_citations"] = toolCitationText(params).replaceAll(", \\.", ".").replaceAll("\\. \\.", ".").replaceAll(", \\.", ".") - //meta["tool_bibliography"] = toolBibliographyText(params) - - def methods_text = mqc_methods_yaml.text - - def engine = new SimpleTemplateEngine() - def description_html = engine.createTemplate(methods_text).make(meta) - - return description_html - } - - // - // Create MultiQC tsv custom content from a list of values - // - public static String multiqcTsvFromList(tsv_data, header) { - def tsv_string = "" - if (tsv_data.size() > 0) { - tsv_string += "${header.join('\t')}\n" - tsv_string += tsv_data.join('\n') - } - return tsv_string - } - - // - // 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 using GRCh38 assembly from igenomes.config - // - private static void ncbiGenomeWarn(log) { - log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " When using '--genome GRCh38' the assembly is from the NCBI and NOT Ensembl.\n" + - " Biotype QC will be skipped to circumvent the issue below:\n" + - " https://github.com/nf-core/rnaseq/issues/460\n\n" + - " If you would like to use the soft-masked Ensembl assembly instead please see:\n" + - " https://github.com/nf-core/rnaseq/issues/159#issuecomment-501184312\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - } - - // - // Print a warning if using a UCSC assembly from igenomes.config - // - private static void ucscGenomeWarn(log) { - log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " When using UCSC assemblies the 'gene_biotype' field is absent from the GTF file.\n" + - " Biotype QC will be skipped to circumvent the issue below:\n" + - " https://github.com/nf-core/rnaseq/issues/460\n\n" + - " If you would like to use the soft-masked Ensembl assembly instead please see:\n" + - " https://github.com/nf-core/rnaseq/issues/159#issuecomment-501184312\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - } - - // - // 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 using '--transcript_fasta' - // - private static void transcriptsFastaWarn(log) { - log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " '--transcript_fasta' parameter has been provided.\n" + - " Make sure transcript names in this file match those in the GFF/GTF file.\n\n" + - " Please see:\n" + - " https://github.com/nf-core/rnaseq/issues/753\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - } - - // - // Print a warning if --skip_alignment has been provided - // - private static void skipAlignmentWarn(log) { - log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " '--skip_alignment' parameter has been provided.\n" + - " Skipping alignment, genome-based quantification and all downstream QC processes.\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - } - - // - // Print a warning if using '--aligner star_rsem' and '--with_umi' - // - private static void rsemUmiError(log) { - def error_string = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " When using '--aligner star_rsem', STAR is run by RSEM itself and so it is\n" + - " not possible to remove UMIs before the quantification.\n\n" + - " If you would like to remove UMI barcodes using the '--with_umi' option\n" + - " please use either '--aligner star_salmon' or '--aligner hisat2'.\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - Nextflow.error(error_string) - } - - // - // Print a warning if using '--aligner star_rsem' and providing both '--rsem_index' and '--star_index' - // - private static void rsemStarIndexWarn(log) { - log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " When using '--aligner star_rsem', both the STAR and RSEM indices should\n" + - " be present in the path specified by '--rsem_index'.\n\n" + - " This warning has been generated because you have provided both\n" + - " '--rsem_index' and '--star_index'. The pipeline will ignore the latter.\n\n" + - " Please see:\n" + - " https://github.com/nf-core/rnaseq/issues/568\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - } - - // - // Print a warning if using '--aligner star_rsem' and providing '--star_extra_alignment_args' - // - private static void rsemStarExtraArgumentsWarn(log) { - log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " No additional arguments can be passed to STAR when using RSEM.\n" + - " Because RSEM enforces its own parameters for STAR, any extra arguments\n" + - " to STAR will be ignored. Alternatively, choose the STAR+Salmon route.\n\n" + - " This warning has been generated because you have provided both\n" + - " '--aligner star_rsem' and '--extra_star_align_args'.\n\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - } - - // - // Print a warning if using '--additional_fasta' and '--_index' - // - private static void additionaFastaIndexWarn(index, log) { - log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " When using '--additional_fasta ' the aligner index will not\n" + - " be re-built with the transgenes incorporated by default since you have \n" + - " already provided an index via '--${index}_index '.\n\n" + - " Set '--additional_fasta --${index}_index false --gene_bed false --save_reference'\n" + - " to re-build the index with transgenes included and the index and gene BED file will be saved in\n" + - " 'results/genome/index/${index}/' for re-use with '--${index}_index'.\n\n" + - " Ignore this warning if you know that the index already contains transgenes.\n\n" + - " Please see:\n" + - " https://github.com/nf-core/rnaseq/issues/556\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - } -} diff --git a/lib/nfcore_external_java_deps.jar b/lib/nfcore_external_java_deps.jar deleted file mode 100644 index 805c8bb5e..000000000 Binary files a/lib/nfcore_external_java_deps.jar and /dev/null differ diff --git a/main.nf b/main.nf index 69ae6c3b3..a0a6f1c7d 100755 --- a/main.nf +++ b/main.nf @@ -17,70 +17,184 @@ nextflow.enable.dsl = 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') -params.transcript_fasta = WorkflowMain.getGenomeAttribute(params, 'transcript_fasta') -params.additional_fasta = WorkflowMain.getGenomeAttribute(params, 'additional_fasta') -params.gtf = WorkflowMain.getGenomeAttribute(params, 'gtf') -params.gff = WorkflowMain.getGenomeAttribute(params, 'gff') -params.gene_bed = WorkflowMain.getGenomeAttribute(params, 'bed12') -params.bbsplit_index = WorkflowMain.getGenomeAttribute(params, 'bbsplit') -params.star_index = WorkflowMain.getGenomeAttribute(params, 'star') -params.hisat2_index = WorkflowMain.getGenomeAttribute(params, 'hisat2') -params.rsem_index = WorkflowMain.getGenomeAttribute(params, 'rsem') -params.salmon_index = WorkflowMain.getGenomeAttribute(params, 'salmon') -params.kallisto_index = WorkflowMain.getGenomeAttribute(params, 'kallisto') +params.fasta = getGenomeAttribute('fasta') +params.additional_fasta = getGenomeAttribute('additional_fasta') +params.transcript_fasta = getGenomeAttribute('transcript_fasta') +params.gff = getGenomeAttribute('gff') +params.gtf = getGenomeAttribute('gtf') +params.gene_bed = getGenomeAttribute('bed12') +params.bbsplit_index = getGenomeAttribute('bbsplit') +params.sortmerna_index = getGenomeAttribute('sortmerna') +params.star_index = getGenomeAttribute('star') +params.rsem_index = getGenomeAttribute('rsem') +params.hisat2_index = getGenomeAttribute('hisat2') +params.salmon_index = getGenomeAttribute('salmon') +params.kallisto_index = getGenomeAttribute('kallisto') /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - VALIDATE & PRINT PARAMETER SUMMARY + IMPORT FUNCTIONS / MODULES / SUBWORKFLOWS / WORKFLOWS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { validateParameters; paramsHelp } from 'plugin/nf-validation' +include { RNASEQ } from './workflows/rnaseq' +include { PREPARE_GENOME } from './subworkflows/local/prepare_genome' +include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_rnaseq_pipeline' +include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_rnaseq_pipeline' +include { checkMaxContigSize } from './subworkflows/local/utils_nfcore_rnaseq_pipeline' -// Print help message if needed -if (params.help) { - def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) - def citation = '\n' + WorkflowMain.citation(workflow) + '\n' - def String command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" - log.info logo + paramsHelp(command) + citation + NfcoreTemplate.dashedLine(params.monochrome_logs) - System.exit(0) -} +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + NAMED WORKFLOWS FOR PIPELINE +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ -// Validate input parameters -if (params.validate_params) { - validateParameters() -} +// +// WORKFLOW: Run main analysis pipeline +// +workflow NFCORE_RNASEQ { + + main: + + ch_versions = Channel.empty() + + // + // SUBWORKFLOW: Prepare reference genome files + // + PREPARE_GENOME ( + params.fasta, + params.gtf, + params.gff, + params.additional_fasta, + params.transcript_fasta, + params.gene_bed, + params.splicesites, + params.bbsplit_fasta_list, + params.ribo_database_manifest, + params.star_index, + params.rsem_index, + params.salmon_index, + params.kallisto_index, + params.hisat2_index, + params.bbsplit_index, + params.sortmerna_index, + params.gencode, + params.featurecounts_group_type, + params.aligner, + params.pseudo_aligner, + params.skip_gtf_filter, + params.skip_bbsplit, + !params.remove_ribo_rna, + params.skip_alignment, + params.skip_pseudo_alignment + ) + ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) + + // Check if contigs in genome fasta file > 512 Mbp + if (!params.skip_alignment && !params.bam_csi_index) { + PREPARE_GENOME + .out + .fai + .map { checkMaxContigSize(it) } + } -WorkflowMain.initialise(workflow, params, log) + // + // WORKFLOW: Run nf-core/rnaseq workflow + // + ch_samplesheet = Channel.value(file(params.input, checkIfExists: true)) + RNASEQ ( + ch_samplesheet, + ch_versions, + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.gtf, + PREPARE_GENOME.out.fai, + PREPARE_GENOME.out.chrom_sizes, + PREPARE_GENOME.out.gene_bed, + PREPARE_GENOME.out.transcript_fasta, + PREPARE_GENOME.out.star_index, + PREPARE_GENOME.out.rsem_index, + PREPARE_GENOME.out.hisat2_index, + PREPARE_GENOME.out.salmon_index, + PREPARE_GENOME.out.kallisto_index, + PREPARE_GENOME.out.bbsplit_index, + PREPARE_GENOME.out.rrna_fastas, + PREPARE_GENOME.out.sortmerna_index, + PREPARE_GENOME.out.splicesites, + !params.remove_ribo_rna && params.remove_ribo_rna + ) + ch_versions = ch_versions.mix(RNASEQ.out.versions) + + emit: + trim_status = RNASEQ.out.trim_status // channel: [id, boolean] + map_status = RNASEQ.out.map_status // channel: [id, boolean] + strand_status = RNASEQ.out.strand_status // channel: [id, boolean] + multiqc_report = RNASEQ.out.multiqc_report // channel: /path/to/multiqc_report.html + versions = ch_versions // channel: [version1, version2, ...] +} /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - NAMED WORKFLOW FOR PIPELINE + RUN MAIN WORKFLOW ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { RNASEQ } from './workflows/rnaseq' +workflow { -// -// WORKFLOW: Run main nf-core/rnaseq analysis pipeline -// -workflow NFCORE_RNASEQ { - RNASEQ () + main: + + // + // SUBWORKFLOW: Run initialisation tasks + // + PIPELINE_INITIALISATION ( + params.version, + params.help, + "nextflow_schema.json", + params.validate_params, + params.monochrome_logs, + args, + params.outdir + ) + + // + // WORKFLOW: Run main workflow + // + NFCORE_RNASEQ () + + // + // SUBWORKFLOW: Run completion tasks + // + PIPELINE_COMPLETION ( + "nextflow_schema.json", + params.email, + params.email_on_fail, + params.plaintext_email, + params.outdir, + params.monochrome_logs, + params.hook_url, + NFCORE_RNASEQ.out.multiqc_report, + NFCORE_RNASEQ.out.trim_status, + NFCORE_RNASEQ.out.map_status, + NFCORE_RNASEQ.out.strand_status + ) } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - RUN ALL WORKFLOWS + FUNCTIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // -// WORKFLOW: Execute a single named workflow for the pipeline -// See: https://github.com/nf-core/rnaseq/issues/619 +// Get attribute from genome config file e.g. fasta // -workflow { - NFCORE_RNASEQ () + +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 } /* diff --git a/modules.json b/modules.json index 113f5139f..6e266bc86 100644 --- a/modules.json +++ b/modules.json @@ -7,245 +7,267 @@ "nf-core": { "bbmap/bbsplit": { "branch": "master", - "git_sha": "de3e6fc949dcffb8d3508c015f435ace5773ff08", + "git_sha": "1ceaa8ba4d0fd886dbca0e545815d905b7407de7", + "installed_by": ["fastq_qc_trim_filter_setstrandedness", "modules"] + }, + "bedtools/genomecov": { + "branch": "master", + "git_sha": "9ba6b02bbcb322ff4265cc51fca0ee5d8420b929", "installed_by": ["modules"] }, "cat/fastq": { "branch": "master", - "git_sha": "5c460c5a4736974abde2843294f35307ee2b0e5e", - "installed_by": ["modules"] + "git_sha": "1ceaa8ba4d0fd886dbca0e545815d905b7407de7", + "installed_by": ["fastq_qc_trim_filter_setstrandedness", "modules"] }, - "custom/dumpsoftwareversions": { + "custom/catadditionalfasta": { "branch": "master", - "git_sha": "bba7e362e4afead70653f84d8700588ea28d0f9e", - "installed_by": ["modules"], - "patch": "modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff" + "git_sha": "1ceaa8ba4d0fd886dbca0e545815d905b7407de7", + "installed_by": ["modules"] }, "custom/getchromsizes": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "1ceaa8ba4d0fd886dbca0e545815d905b7407de7", + "installed_by": ["modules"] + }, + "custom/tx2gene": { + "branch": "master", + "git_sha": "4e5f4687318f24ba944a13609d3ea6ebd890737d", + "installed_by": ["modules", "quantify_pseudo_alignment"] + }, + "dupradar": { + "branch": "master", + "git_sha": "055416736dcb4955960ecc17dea61eb41b68c024", "installed_by": ["modules"] }, "fastp": { "branch": "master", - "git_sha": "d497a4868ace3302016ea8ed4b395072d5e833cd", - "installed_by": ["fastq_fastqc_umitools_fastp", "modules"], - "patch": "modules/nf-core/fastp/fastp.diff" + "git_sha": "1ceaa8ba4d0fd886dbca0e545815d905b7407de7", + "installed_by": ["fastq_fastqc_umitools_fastp", "modules"] }, "fastqc": { "branch": "master", - "git_sha": "102cc9b709a6da9f7cee2373563ab1464fca9c0a", - "installed_by": ["fastq_fastqc_umitools_trimgalore", "fastq_fastqc_umitools_fastp"], - "patch": "modules/nf-core/fastqc/fastqc.diff" + "git_sha": "b49b8992e5271ce427f3a7cdb29628fc58400eb5", + "installed_by": ["fastq_fastqc_umitools_fastp", "fastq_fastqc_umitools_trimgalore"] }, "fq/subsample": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules", "fastq_subsample_fq_salmon"] + "git_sha": "2c6b1144ed58b6184ad58fc4e6b6a90219b4bf4f", + "installed_by": ["fastq_subsample_fq_salmon", "modules"] }, "gffread": { "branch": "master", - "git_sha": "4ab13872435962dadc239979554d13709e20bf29", + "git_sha": "6c996d7fbe0816dcbb68ce587ad5f873313682a1", "installed_by": ["modules"] }, "gunzip": { "branch": "master", - "git_sha": "e06548bfa36ee31869b81041879dd6b3a83b1d57", + "git_sha": "4e5f4687318f24ba944a13609d3ea6ebd890737d", "installed_by": ["modules"] }, "hisat2/align": { "branch": "master", - "git_sha": "a1881f6374506f9e031b7af814768cdb44a6a7d3", + "git_sha": "2c6b1144ed58b6184ad58fc4e6b6a90219b4bf4f", "installed_by": ["fastq_align_hisat2"] }, "hisat2/build": { "branch": "master", - "git_sha": "f2f48836bf5c59434966a6c3b2211b29363f31ab", + "git_sha": "2c6b1144ed58b6184ad58fc4e6b6a90219b4bf4f", "installed_by": ["modules"] }, "hisat2/extractsplicesites": { "branch": "master", - "git_sha": "735e1e04e7e01751d2d6e97055bbdb6f70683cc1", + "git_sha": "2c6b1144ed58b6184ad58fc4e6b6a90219b4bf4f", "installed_by": ["modules"] }, "kallisto/index": { "branch": "master", - "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", + "git_sha": "fbe341e9af0bb98533757f536b26d38507d31724", "installed_by": ["modules"] }, "kallisto/quant": { "branch": "master", - "git_sha": "bdc2a97ced7adc423acfa390742db83cab98c1ad", + "git_sha": "fbe341e9af0bb98533757f536b26d38507d31724", + "installed_by": ["modules", "quantify_pseudo_alignment"] + }, + "multiqc": { + "branch": "master", + "git_sha": "19ca321db5d8bd48923262c2eca6422359633491", "installed_by": ["modules"] }, "picard/markduplicates": { "branch": "master", - "git_sha": "2ee934606f1fdf7fc1cb05d6e8abc13bec8ab448", - "installed_by": ["bam_markduplicates_picard"] + "git_sha": "46eca555142d6e597729fcb682adcc791796f514", + "installed_by": ["bam_markduplicates_picard"], + "patch": "modules/nf-core/picard/markduplicates/picard-markduplicates.diff" }, "preseq/lcextrap": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "2c6b1144ed58b6184ad58fc4e6b6a90219b4bf4f", "installed_by": ["modules"] }, "qualimap/rnaseq": { "branch": "master", - "git_sha": "4657d98bc9f565e067c4d924126ce107056f5e2f", - "installed_by": ["modules"], - "patch": "modules/nf-core/qualimap/rnaseq/qualimap-rnaseq.diff" + "git_sha": "46eca555142d6e597729fcb682adcc791796f514", + "installed_by": ["modules"] }, "rsem/calculateexpression": { "branch": "master", - "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", "installed_by": ["modules"] }, "rsem/preparereference": { "branch": "master", - "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", "installed_by": ["modules"] }, "rseqc/bamstat": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["bam_rseqc"], - "patch": "modules/nf-core/rseqc/bamstat/rseqc-bamstat.diff" + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", + "installed_by": ["bam_rseqc"] }, "rseqc/inferexperiment": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["bam_rseqc"], - "patch": "modules/nf-core/rseqc/inferexperiment/rseqc-inferexperiment.diff" + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", + "installed_by": ["bam_rseqc"] }, "rseqc/innerdistance": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["bam_rseqc"], - "patch": "modules/nf-core/rseqc/innerdistance/rseqc-innerdistance.diff" + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", + "installed_by": ["bam_rseqc"] }, "rseqc/junctionannotation": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["bam_rseqc"], - "patch": "modules/nf-core/rseqc/junctionannotation/rseqc-junctionannotation.diff" + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", + "installed_by": ["bam_rseqc"] }, "rseqc/junctionsaturation": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["bam_rseqc"], - "patch": "modules/nf-core/rseqc/junctionsaturation/rseqc-junctionsaturation.diff" + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", + "installed_by": ["bam_rseqc"] }, "rseqc/readdistribution": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["bam_rseqc"], - "patch": "modules/nf-core/rseqc/readdistribution/rseqc-readdistribution.diff" + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", + "installed_by": ["bam_rseqc"] }, "rseqc/readduplication": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["bam_rseqc"], - "patch": "modules/nf-core/rseqc/readduplication/rseqc-readduplication.diff" + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", + "installed_by": ["bam_rseqc"] }, "rseqc/tin": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["bam_rseqc"], - "patch": "modules/nf-core/rseqc/tin/rseqc-tin.diff" + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", + "installed_by": ["bam_rseqc"] }, "salmon/index": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "cb6b2b94fc40dea58f0b1e3dd095f3dd24f2ac8a", "installed_by": ["fastq_subsample_fq_salmon"] }, "salmon/quant": { "branch": "master", - "git_sha": "c5b528d0a51c31621b485ab3bcc008f483619ea6", - "installed_by": ["modules", "fastq_subsample_fq_salmon"] + "git_sha": "727232afb8294b53dd9d05bfe469b70cce1675bb", + "installed_by": ["fastq_subsample_fq_salmon", "modules", "quantify_pseudo_alignment"] }, "samtools/flagstat": { "branch": "master", - "git_sha": "570ec5bcfe19c49e16c9ca35a7a116563af6cc1c", + "git_sha": "46eca555142d6e597729fcb682adcc791796f514", "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", - "git_sha": "e662ab16e0c11f1e62983e21de9871f59371a639", + "git_sha": "46eca555142d6e597729fcb682adcc791796f514", "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "46eca555142d6e597729fcb682adcc791796f514", "installed_by": [ + "bam_dedup_stats_samtools_umitools", "bam_markduplicates_picard", - "bam_sort_stats_samtools", - "bam_dedup_stats_samtools_umitools" + "bam_sort_stats_samtools" ] }, "samtools/sort": { "branch": "master", - "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", + "git_sha": "46eca555142d6e597729fcb682adcc791796f514", "installed_by": ["bam_sort_stats_samtools"] }, "samtools/stats": { "branch": "master", - "git_sha": "735e1e04e7e01751d2d6e97055bbdb6f70683cc1", + "git_sha": "1fe379cf6e6c1e6fa5e32bcbeefea0f1e874dac6", "installed_by": ["bam_stats_samtools"] }, "sortmerna": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "git_sha": "df05c8db5195867c0bc7b92c1788115b66f0d17d", + "installed_by": ["fastq_qc_trim_filter_setstrandedness", "modules"] }, "star/align": { "branch": "master", - "git_sha": "cc08a888069f67cab8120259bddab8032d4c0fe3", + "git_sha": "46eca555142d6e597729fcb682adcc791796f514", "installed_by": ["modules"] }, "star/genomegenerate": { "branch": "master", - "git_sha": "cc08a888069f67cab8120259bddab8032d4c0fe3", + "git_sha": "46eca555142d6e597729fcb682adcc791796f514", "installed_by": ["modules"] }, "stringtie/stringtie": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "c789476080a150f87066ca3ed42a622339a26c0b", "installed_by": ["modules"] }, "subread/featurecounts": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", "installed_by": ["modules"] }, + "summarizedexperiment/summarizedexperiment": { + "branch": "master", + "git_sha": "4e5f4687318f24ba944a13609d3ea6ebd890737d", + "installed_by": ["modules", "quantify_pseudo_alignment"] + }, "trimgalore": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", "installed_by": ["fastq_fastqc_umitools_trimgalore"] }, + "tximeta/tximport": { + "branch": "master", + "git_sha": "d612c281cf2fae62cdd79c70a22fc6349108570c", + "installed_by": ["modules", "quantify_pseudo_alignment"] + }, "ucsc/bedclip": { "branch": "master", - "git_sha": "240937a2a9c30298110753292be041188891f2cb", + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", "installed_by": ["bedgraph_bedclip_bedgraphtobigwig"] }, "ucsc/bedgraphtobigwig": { "branch": "master", - "git_sha": "66290981ab6038ea86177ade40b9449bc790b0ce", + "git_sha": "46eca555142d6e597729fcb682adcc791796f514", "installed_by": ["bedgraph_bedclip_bedgraphtobigwig"] }, "umitools/dedup": { "branch": "master", - "git_sha": "7297204bf49273300a3dbfa4b7a4027c8683f1bd", - "installed_by": ["bam_dedup_stats_samtools_umitools"], - "patch": "modules/nf-core/umitools/dedup/umitools-dedup.diff" + "git_sha": "0eacd714effe5aac1c1de26593873960b3346cab", + "installed_by": ["bam_dedup_stats_samtools_umitools"] }, "umitools/extract": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["fastq_fastqc_umitools_fastp", "fastq_fastqc_umitools_trimgalore"], - "patch": "modules/nf-core/umitools/extract/umitools-extract.diff" + "git_sha": "b4919e9a2b4d8b71061e601633db4600a3858fa1", + "installed_by": ["fastq_fastqc_umitools_fastp", "fastq_fastqc_umitools_trimgalore"] + }, + "umitools/prepareforrsem": { + "branch": "master", + "git_sha": "fac6cc9b2bc4042225bd9247ec03b413f764b47f", + "installed_by": ["modules"] }, "untar": { "branch": "master", - "git_sha": "d0b4fc03af52a1cc8c6fb4493b921b57352b1dd8", + "git_sha": "4e5f4687318f24ba944a13609d3ea6ebd890737d", "installed_by": ["modules"] } } @@ -254,56 +276,81 @@ "nf-core": { "bam_dedup_stats_samtools_umitools": { "branch": "master", - "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", + "git_sha": "46eca555142d6e597729fcb682adcc791796f514", "installed_by": ["subworkflows"] }, "bam_markduplicates_picard": { "branch": "master", - "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", + "git_sha": "46eca555142d6e597729fcb682adcc791796f514", "installed_by": ["subworkflows"] }, "bam_rseqc": { "branch": "master", - "git_sha": "a9784afdd5dcda23b84e64db75dc591065d64653", + "git_sha": "0eacd714effe5aac1c1de26593873960b3346cab", "installed_by": ["subworkflows"] }, "bam_sort_stats_samtools": { "branch": "master", - "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", + "git_sha": "46eca555142d6e597729fcb682adcc791796f514", "installed_by": ["fastq_align_hisat2"] }, "bam_stats_samtools": { "branch": "master", - "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", + "git_sha": "0eacd714effe5aac1c1de26593873960b3346cab", "installed_by": [ - "bam_sort_stats_samtools", + "bam_dedup_stats_samtools_umitools", "bam_markduplicates_picard", - "bam_dedup_stats_samtools_umitools" + "bam_sort_stats_samtools" ] }, "bedgraph_bedclip_bedgraphtobigwig": { "branch": "master", - "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", + "git_sha": "0eacd714effe5aac1c1de26593873960b3346cab", "installed_by": ["subworkflows"] }, "fastq_align_hisat2": { "branch": "master", - "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", + "git_sha": "c789476080a150f87066ca3ed42a622339a26c0b", "installed_by": ["subworkflows"] }, "fastq_fastqc_umitools_fastp": { "branch": "master", - "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", - "installed_by": ["subworkflows"] + "git_sha": "46eca555142d6e597729fcb682adcc791796f514", + "installed_by": ["fastq_qc_trim_filter_setstrandedness", "subworkflows"] }, "fastq_fastqc_umitools_trimgalore": { "branch": "master", - "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", + "git_sha": "b49b8992e5271ce427f3a7cdb29628fc58400eb5", + "installed_by": ["fastq_qc_trim_filter_setstrandedness", "subworkflows"] + }, + "fastq_qc_trim_filter_setstrandedness": { + "branch": "master", + "git_sha": "8c47be6a114b82a6e6d2f5320b3b5c67579956c0", "installed_by": ["subworkflows"] }, "fastq_subsample_fq_salmon": { "branch": "master", - "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", + "git_sha": "fbe341e9af0bb98533757f536b26d38507d31724", + "installed_by": ["fastq_qc_trim_filter_setstrandedness", "subworkflows"] + }, + "quantify_pseudo_alignment": { + "branch": "master", + "git_sha": "fbe341e9af0bb98533757f536b26d38507d31724", + "installed_by": ["subworkflows"] + }, + "utils_nextflow_pipeline": { + "branch": "master", + "git_sha": "d20fb2a9cc3e2835e9d067d1046a63252eb17352", + "installed_by": ["subworkflows"] + }, + "utils_nfcore_pipeline": { + "branch": "master", + "git_sha": "2fdce49d30c0254f76bc0f13c55c17455c1251ab", + "installed_by": ["subworkflows"] + }, + "utils_nfvalidation_plugin": { + "branch": "master", + "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", "installed_by": ["subworkflows"] } } diff --git a/modules/local/bedtools_genomecov/main.nf b/modules/local/bedtools_genomecov/main.nf deleted file mode 100644 index 0a0fb3c8b..000000000 --- a/modules/local/bedtools_genomecov/main.nf +++ /dev/null @@ -1,53 +0,0 @@ -process BEDTOOLS_GENOMECOV { - 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("*.forward.bedGraph"), emit: bedgraph_forward - tuple val(meta), path("*.reverse.bedGraph"), emit: bedgraph_reverse - 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}" - - def prefix_forward = "${prefix}.forward" - def prefix_reverse = "${prefix}.reverse" - if (meta.strandedness == 'reverse') { - prefix_forward = "${prefix}.reverse" - prefix_reverse = "${prefix}.forward" - } - """ - bedtools \\ - genomecov \\ - -ibam $bam \\ - -bg \\ - -strand + \\ - $args \\ - | bedtools sort > ${prefix_forward}.bedGraph - - bedtools \\ - genomecov \\ - -ibam $bam \\ - -bg \\ - -strand - \\ - $args \\ - | bedtools sort > ${prefix_reverse}.bedGraph - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") - END_VERSIONS - """ -} diff --git a/modules/local/cat_additional_fasta/main.nf b/modules/local/cat_additional_fasta/main.nf deleted file mode 100644 index 72af4bc54..000000000 --- a/modules/local/cat_additional_fasta/main.nf +++ /dev/null @@ -1,42 +0,0 @@ -process CAT_ADDITIONAL_FASTA { - tag "$add_fasta" - - conda "conda-forge::python=3.9.5" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/python:3.9--1' : - 'biocontainers/python:3.9--1' }" - - input: - path fasta - path gtf - path add_fasta - val biotype - - output: - path "${name}.fasta", emit: fasta - path "${name}.gtf" , emit: gtf - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def genome_name = params.genome ? params.genome : fasta.getBaseName() - def biotype_name = biotype ? "-b $biotype" : '' - def add_name = add_fasta.getBaseName() - name = "${genome_name}_${add_name}" - """ - fasta2gtf.py \\ - -o ${add_fasta.baseName}.gtf \\ - $biotype_name \\ - $add_fasta - - cat $fasta $add_fasta > ${name}.fasta - cat $gtf ${add_fasta.baseName}.gtf > ${name}.gtf - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - python: \$(python --version | sed 's/Python //g') - END_VERSIONS - """ -} diff --git a/modules/local/deseq2_qc/environment.yml b/modules/local/deseq2_qc/environment.yml new file mode 100644 index 000000000..9daad310d --- /dev/null +++ b/modules/local/deseq2_qc/environment.yml @@ -0,0 +1,15 @@ +name: deseq2_qc +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::r-base + - conda-forge::r-optparse + - conda-forge::r-ggplot2 + - conda-forge::r-rcolorbrewer + - conda-forge::r-pheatmap + - bioconda::bioconductor-deseq2 + - bioconda::bioconductor-biocparallel + - bioconda::bioconductor-tximport + - bioconda::bioconductor-complexheatmap diff --git a/modules/local/deseq2_qc/main.nf b/modules/local/deseq2_qc/main.nf index 466194934..7aa81e9b5 100644 --- a/modules/local/deseq2_qc/main.nf +++ b/modules/local/deseq2_qc/main.nf @@ -3,7 +3,7 @@ process DESEQ2_QC { // (Bio)conda packages have intentionally not been pinned to a specific version // This was to avoid the pipeline failing due to package conflicts whilst creating the environment when using -profile conda - conda "conda-forge::r-base bioconda::bioconductor-deseq2 bioconda::bioconductor-biocparallel bioconda::bioconductor-tximport bioconda::bioconductor-complexheatmap conda-forge::r-optparse conda-forge::r-ggplot2 conda-forge::r-rcolorbrewer conda-forge::r-pheatmap" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0' : 'biocontainers/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0' }" @@ -57,4 +57,31 @@ process DESEQ2_QC { bioconductor-deseq2: \$(Rscript -e "library(DESeq2); cat(as.character(packageVersion('DESeq2')))") END_VERSIONS """ + + stub: + def args2 = task.ext.args2 ?: '' + def label_lower = args2.toLowerCase() + prefix = task.ext.prefix ?: "deseq2" + """ + touch ${label_lower}.pca.vals_mqc.tsv + touch ${label_lower}.sample.dists_mqc.tsv + touch ${prefix}.dds.RData + touch ${prefix}.pca.vals.txt + touch ${prefix}.plots.pdf + touch ${prefix}.sample.dists.txt + touch R_sessionInfo.log + + mkdir size_factors + touch size_factors/${prefix}.size_factors.RData + for i in `head $counts -n 1 | cut -f3-`; + do + touch size_factors/\${i}.size_factors.RData + done + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') + bioconductor-deseq2: \$(Rscript -e "library(DESeq2); cat(as.character(packageVersion('DESeq2')))") + END_VERSIONS + """ } diff --git a/modules/local/deseq2_qc/tests/main.nf.test b/modules/local/deseq2_qc/tests/main.nf.test new file mode 100644 index 000000000..a9d35997d --- /dev/null +++ b/modules/local/deseq2_qc/tests/main.nf.test @@ -0,0 +1,57 @@ +nextflow_process { + + name "Test Process DESEQ2_QC" + script "../main.nf" + process "DESEQ2_QC" + + test("parse count data correctly") { + + when { + process { + """ + input[0] = file(params.pipelines_testdata_base_path + "deseq2qc/countFile.tsv", checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + "deseq2qc/deseq2_pca_header.txt", checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + "deseq2qc/deseq2_clustering_header.txt", checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.dists_multiqc, + process.out.dists_txt, + process.out.log, + process.out.pca_multiqc, + process.out.pca_txt, + process.out.rdata, + process.out.size_factors, + process.out.versions + ).match() } + ) + } + } + + test("parse count data correctly - stub") { + + options "-stub" + + when { + process { + """ + input[0] = file(params.pipelines_testdata_base_path + "deseq2qc/countFile.tsv", checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + "deseq2qc/deseq2_pca_header.txt", checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + "deseq2qc/deseq2_clustering_header.txt", checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/deseq2_qc/tests/main.nf.test.snap b/modules/local/deseq2_qc/tests/main.nf.test.snap new file mode 100644 index 000000000..1c6bc7105 --- /dev/null +++ b/modules/local/deseq2_qc/tests/main.nf.test.snap @@ -0,0 +1,121 @@ +{ + "parse count data correctly - stub": { + "content": [ + { + "0": [ + "deseq2.plots.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "1": [ + "deseq2.dds.RData:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "2": [ + "deseq2.pca.vals.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "3": [ + + ], + "4": [ + "deseq2.sample.dists.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "5": [ + + ], + "6": [ + "R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "7": [ + [ + "RAP1_IAA_30M_REP1.size_factors.RData:md5,d41d8cd98f00b204e9800998ecf8427e", + "RAP1_UNINDUCED_REP1.size_factors.RData:md5,d41d8cd98f00b204e9800998ecf8427e", + "RAP1_UNINDUCED_REP2.size_factors.RData:md5,d41d8cd98f00b204e9800998ecf8427e", + "WT_REP1.size_factors.RData:md5,d41d8cd98f00b204e9800998ecf8427e", + "WT_REP2.size_factors.RData:md5,d41d8cd98f00b204e9800998ecf8427e", + "deseq2.size_factors.RData:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + "versions.yml:md5,60f8e4f473397a4b5d1a3dc490c93ec5" + ], + "dists_multiqc": [ + + ], + "dists_txt": [ + "deseq2.sample.dists.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "log": [ + "R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "pca_multiqc": [ + + ], + "pca_txt": [ + "deseq2.pca.vals.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "pdf": [ + "deseq2.plots.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "rdata": [ + "deseq2.dds.RData:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "size_factors": [ + [ + "RAP1_IAA_30M_REP1.size_factors.RData:md5,d41d8cd98f00b204e9800998ecf8427e", + "RAP1_UNINDUCED_REP1.size_factors.RData:md5,d41d8cd98f00b204e9800998ecf8427e", + "RAP1_UNINDUCED_REP2.size_factors.RData:md5,d41d8cd98f00b204e9800998ecf8427e", + "WT_REP1.size_factors.RData:md5,d41d8cd98f00b204e9800998ecf8427e", + "WT_REP2.size_factors.RData:md5,d41d8cd98f00b204e9800998ecf8427e", + "deseq2.size_factors.RData:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,60f8e4f473397a4b5d1a3dc490c93ec5" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T11:38:08.92794" + }, + "parse count data correctly": { + "content": [ + [ + + ], + [ + "deseq2.sample.dists.txt:md5,1616ce40eb58ee75640efed219c6bbec" + ], + [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676" + ], + [ + + ], + [ + "deseq2.pca.vals.txt:md5,4cda8e32ec39326c1350e77b4b607aad" + ], + [ + "deseq2.dds.RData:md5,c7c1872e7566321d0c3f7ca56c463088" + ], + [ + [ + "RAP1_IAA_30M_REP1.txt:md5,ce4ff0b74aeedc3dc12a764c3504c9df", + "RAP1_UNINDUCED_REP1.txt:md5,51c9b23be5e82670aceb14f7e58dd867", + "RAP1_UNINDUCED_REP2.txt:md5,2c56106abcd9d31980f672b6e2862ee8", + "WT_REP1.txt:md5,5e3fe5f7e9b7f300be43649a8b496352", + "WT_REP2.txt:md5,2ce093f2c2e92c1bde1cd3da91ac884c", + "deseq2.size_factors.RData:md5,51c6643a0f8a9edabbff8df0165451f2" + ] + ], + [ + "versions.yml:md5,60f8e4f473397a4b5d1a3dc490c93ec5" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T11:21:20.349616" + } +} diff --git a/modules/local/dupradar/main.nf b/modules/local/dupradar/main.nf deleted file mode 100644 index 9f9152d1e..000000000 --- a/modules/local/dupradar/main.nf +++ /dev/null @@ -1,48 +0,0 @@ -process DUPRADAR { - tag "$meta.id" - label 'process_long' - - conda "bioconda::bioconductor-dupradar=1.28.0" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dupradar:1.28.0--r42hdfd78af_0' : - 'biocontainers/bioconductor-dupradar:1.28.0--r42hdfd78af_0' }" - - input: - tuple val(meta), path(bam) - path gtf - - output: - tuple val(meta), path("*.pdf") , emit: pdf - tuple val(meta), path("*.txt") , emit: txt - tuple val(meta), path("*_mqc.txt"), emit: multiqc - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/ - def prefix = task.ext.prefix ?: "${meta.id}" - - def strandedness = 0 - if (meta.strandedness == 'forward') { - strandedness = 1 - } else if (meta.strandedness == 'reverse') { - strandedness = 2 - } - def paired_end = meta.single_end ? 'single' : 'paired' - """ - dupradar.r \\ - $bam \\ - $prefix \\ - $gtf \\ - $strandedness \\ - $paired_end \\ - $task.cpus - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') - bioconductor-dupradar: \$(Rscript -e "library(dupRadar); cat(as.character(packageVersion('dupRadar')))") - END_VERSIONS - """ -} diff --git a/modules/nf-core/custom/dumpsoftwareversions/environment.yml b/modules/local/gtf2bed/environment.yml similarity index 51% rename from modules/nf-core/custom/dumpsoftwareversions/environment.yml rename to modules/local/gtf2bed/environment.yml index f0c63f698..3c009b31b 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/environment.yml +++ b/modules/local/gtf2bed/environment.yml @@ -1,7 +1,7 @@ -name: custom_dumpsoftwareversions +name: gtf2bed channels: - conda-forge - bioconda - defaults dependencies: - - bioconda::multiqc=1.17 + - conda-forge::perl=5.26.2 diff --git a/modules/local/gtf2bed/main.nf b/modules/local/gtf2bed/main.nf index 8a4bae8ff..a2523c9cf 100644 --- a/modules/local/gtf2bed/main.nf +++ b/modules/local/gtf2bed/main.nf @@ -2,7 +2,7 @@ process GTF2BED { tag "$gtf" label 'process_low' - conda "conda-forge::perl=5.26.2" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/perl:5.26.2' : 'biocontainers/perl:5.26.2' }" @@ -28,4 +28,14 @@ process GTF2BED { perl: \$(echo \$(perl --version 2>&1) | sed 's/.*v\\(.*\\)) built.*/\\1/') END_VERSIONS """ + + stub: + """ + touch ${gtf.baseName}.bed + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + perl: \$(echo \$(perl --version 2>&1) | sed 's/.*v\\(.*\\)) built.*/\\1/') + END_VERSIONS + """ } diff --git a/modules/local/gtf2bed/tests/main.nf.test b/modules/local/gtf2bed/tests/main.nf.test new file mode 100644 index 000000000..b640d2053 --- /dev/null +++ b/modules/local/gtf2bed/tests/main.nf.test @@ -0,0 +1,44 @@ +nextflow_process { + + name "Test Process GTF2BED" + script "../main.nf" + process "GTF2BED" + + test("sarscov2 - bam") { + + when { + process { + """ + input[0] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/gtf2bed/tests/main.nf.test.snap b/modules/local/gtf2bed/tests/main.nf.test.snap new file mode 100644 index 000000000..66ec3bf9e --- /dev/null +++ b/modules/local/gtf2bed/tests/main.nf.test.snap @@ -0,0 +1,48 @@ +{ + "sarscov2 - bam - stub": { + "content": [ + { + "0": [ + "genome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "1": [ + "versions.yml:md5,d04d815c224b980b6f3818d4b2fd4fe3" + ], + "bed": [ + "genome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "versions": [ + "versions.yml:md5,d04d815c224b980b6f3818d4b2fd4fe3" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T11:46:28.123826" + }, + "sarscov2 - bam": { + "content": [ + { + "0": [ + "genome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "1": [ + "versions.yml:md5,d04d815c224b980b6f3818d4b2fd4fe3" + ], + "bed": [ + "genome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "versions": [ + "versions.yml:md5,d04d815c224b980b6f3818d4b2fd4fe3" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-07T15:00:44.458214" + } +} \ No newline at end of file diff --git a/modules/local/gtf_filter/environment.yml b/modules/local/gtf_filter/environment.yml new file mode 100644 index 000000000..c8b5ca202 --- /dev/null +++ b/modules/local/gtf_filter/environment.yml @@ -0,0 +1,7 @@ +name: gtf_filter +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::python=3.9.5 diff --git a/modules/local/gtf_filter/main.nf b/modules/local/gtf_filter/main.nf index d14e8ff42..60eb9a9bd 100644 --- a/modules/local/gtf_filter/main.nf +++ b/modules/local/gtf_filter/main.nf @@ -1,7 +1,7 @@ process GTF_FILTER { tag "$fasta" - conda "conda-forge::python=3.9.5" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : 'biocontainers/python:3.9--1' }" @@ -29,4 +29,14 @@ process GTF_FILTER { python: \$(python --version | sed 's/Python //g') END_VERSIONS """ + + stub: + """ + touch ${fasta.baseName}.filtered.gtf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + END_VERSIONS + """ } diff --git a/modules/local/gtf_filter/tests/main.nf.test b/modules/local/gtf_filter/tests/main.nf.test new file mode 100644 index 000000000..324ee6bb9 --- /dev/null +++ b/modules/local/gtf_filter/tests/main.nf.test @@ -0,0 +1,46 @@ +nextflow_process { + + name "Test Process GTF_FILTER" + script "../main.nf" + process "GTF_FILTER" + + test("sarscov2 - fasta - gtf") { + + when { + process { + """ + input[0] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + input[1] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - fasta - gtf - stub") { + + options "-stub" + + when { + process { + """ + input[0] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + input[1] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/gtf_filter/tests/main.nf.test.snap b/modules/local/gtf_filter/tests/main.nf.test.snap new file mode 100644 index 000000000..d22a4fa5b --- /dev/null +++ b/modules/local/gtf_filter/tests/main.nf.test.snap @@ -0,0 +1,48 @@ +{ + "sarscov2 - fasta - gtf": { + "content": [ + { + "0": [ + "genome.filtered.gtf:md5,aa8b2aa1e0b5fbbba3b04d471e1b0535" + ], + "1": [ + "versions.yml:md5,4adf55ec05d247fd6d253459bd80856f" + ], + "genome_gtf": [ + "genome.filtered.gtf:md5,aa8b2aa1e0b5fbbba3b04d471e1b0535" + ], + "versions": [ + "versions.yml:md5,4adf55ec05d247fd6d253459bd80856f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T11:47:56.314297" + }, + "sarscov2 - fasta - gtf - stub": { + "content": [ + { + "0": [ + "genome.filtered.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "1": [ + "versions.yml:md5,4adf55ec05d247fd6d253459bd80856f" + ], + "genome_gtf": [ + "genome.filtered.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "versions": [ + "versions.yml:md5,4adf55ec05d247fd6d253459bd80856f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T11:48:19.085835" + } +} \ No newline at end of file diff --git a/modules/local/multiqc/main.nf b/modules/local/multiqc/main.nf deleted file mode 100644 index be0dfe2c3..000000000 --- a/modules/local/multiqc/main.nf +++ /dev/null @@ -1,74 +0,0 @@ -process MULTIQC { - label 'process_medium' - - conda "bioconda::multiqc=1.19" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.19--pyhdfd78af_0' : - 'biocontainers/multiqc:1.19--pyhdfd78af_0' }" - - input: - path multiqc_config - path multiqc_custom_config - path software_versions - path workflow_summary - path methods_description - path logo - path fail_trimming_summary - path fail_mapping_summary - path fail_strand_check - path ('fastqc/raw/*') - path ('fastqc/trim/*') - path ('trim_log/*') - path ('sortmerna/*') - path ('star/*') - path ('hisat2/*') - path ('rsem/*') - path ('pseudoalignment/*') - path ('samtools/stats/*') - path ('samtools/flagstat/*') - path ('samtools/idxstats/*') - path ('picard/markduplicates/*') - path ('featurecounts/*') - path ('deseq2/aligner/*') - path ('deseq2/aligner/*') - path ('deseq2/pseudoaligner/*') - path ('deseq2/pseudoaligner/*') - path ('preseq/*') - path ('qualimap/*') - path ('dupradar/*') - path ('rseqc/bam_stat/*') - path ('rseqc/infer_experiment/*') - path ('rseqc/inner_distance/*') - path ('rseqc/junction_annotation/*') - path ('rseqc/junction_saturation/*') - path ('rseqc/read_distribution/*') - path ('rseqc/read_duplication/*') - path ('rseqc/tin/*') - - 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 custom_config = params.multiqc_config ? "--config $multiqc_custom_config" : '' - prefix = task.ext.prefix ?: "multiqc_report" - """ - multiqc \\ - -n ${prefix}.html \\ - -f \\ - $args \\ - $custom_config \\ - . - - 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_biotype/environment.yml b/modules/local/multiqc_custom_biotype/environment.yml new file mode 100644 index 000000000..7a6b5722e --- /dev/null +++ b/modules/local/multiqc_custom_biotype/environment.yml @@ -0,0 +1,7 @@ +name: multiqc_custom_biotype +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::python=3.9.5 diff --git a/modules/local/multiqc_custom_biotype/main.nf b/modules/local/multiqc_custom_biotype/main.nf index 9c0fe94eb..a4b923c3e 100644 --- a/modules/local/multiqc_custom_biotype/main.nf +++ b/modules/local/multiqc_custom_biotype/main.nf @@ -1,7 +1,7 @@ process MULTIQC_CUSTOM_BIOTYPE { tag "$meta.id" - conda "conda-forge::python=3.9.5" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : 'biocontainers/python:3.9--1' }" @@ -33,4 +33,16 @@ process MULTIQC_CUSTOM_BIOTYPE { python: \$(python --version | sed 's/Python //g') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.biotype_counts_mqc.tsv + touch ${prefix}.biotype_counts_rrna_mqc.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + END_VERSIONS + """ } diff --git a/modules/local/multiqc_custom_biotype/nextflow.config b/modules/local/multiqc_custom_biotype/nextflow.config new file mode 100644 index 000000000..68fecaa66 --- /dev/null +++ b/modules/local/multiqc_custom_biotype/nextflow.config @@ -0,0 +1,13 @@ +if (!params.skip_alignment && !params.skip_qc) { + if (!params.skip_biotype_qc && params.featurecounts_group_type) { + process { + withName: 'MULTIQC_CUSTOM_BIOTYPE' { + publishDir = [ + path: { "${params.outdir}/${params.aligner}/featurecounts" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } +} diff --git a/modules/local/multiqc_custom_biotype/tests/main.nf.test b/modules/local/multiqc_custom_biotype/tests/main.nf.test new file mode 100644 index 000000000..bd6cde6bc --- /dev/null +++ b/modules/local/multiqc_custom_biotype/tests/main.nf.test @@ -0,0 +1,56 @@ +nextflow_process { + + name "Test Process MULTIQC_CUSTOM_BIOTYPE" + script "../main.nf" + process "MULTIQC_CUSTOM_BIOTYPE" + + test("test sarscov2 count data succesfully completes") { + + when { + process { + """ + input[0] = Channel.of( + [ + [ id: 'test' ], + file(params.pipelines_testdata_base_path + 'multiqc_custom_biotype/test.featureCounts.txt', checkIfExists: true) + ] + ) + input[1] = file(params.pipelines_testdata_base_path + 'multiqc_custom_biotype/biotypes_header.txt', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success}, + { assert snapshot(process.out).match()} + ) + } + } + + test("test sarscov2 count data - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of( + [ + [ id: 'test' ], + file(params.pipelines_testdata_base_path + 'multiqc_custom_biotype/test.featureCounts.txt', checkIfExists: true) + ] + ) + input[1] = file(params.pipelines_testdata_base_path + 'multiqc_custom_biotype/biotypes_header.txt', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success}, + { assert snapshot(process.out).match()} + ) + } + } +} diff --git a/modules/local/multiqc_custom_biotype/tests/main.nf.test.snap b/modules/local/multiqc_custom_biotype/tests/main.nf.test.snap new file mode 100644 index 000000000..2fc5e4ab6 --- /dev/null +++ b/modules/local/multiqc_custom_biotype/tests/main.nf.test.snap @@ -0,0 +1,80 @@ +{ + "test sarscov2 count data succesfully completes": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + [ + "test.biotype_counts_mqc.tsv:md5,d996f27aeec64370cade26717aa22e1e", + "test.biotype_counts_rrna_mqc.tsv:md5,31c68d05ffe90d1e3eb2cb2ef9a7b4d9" + ] + ] + ], + "1": [ + "versions.yml:md5,575b3b4c8a8a6e508c8ceeca41331b6b" + ], + "tsv": [ + [ + { + "id": "test" + }, + [ + "test.biotype_counts_mqc.tsv:md5,d996f27aeec64370cade26717aa22e1e", + "test.biotype_counts_rrna_mqc.tsv:md5,31c68d05ffe90d1e3eb2cb2ef9a7b4d9" + ] + ] + ], + "versions": [ + "versions.yml:md5,575b3b4c8a8a6e508c8ceeca41331b6b" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-02T16:48:24.844934" + }, + "test sarscov2 count data - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + [ + "test.biotype_counts_mqc.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.biotype_counts_rrna_mqc.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + "versions.yml:md5,575b3b4c8a8a6e508c8ceeca41331b6b" + ], + "tsv": [ + [ + { + "id": "test" + }, + [ + "test.biotype_counts_mqc.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.biotype_counts_rrna_mqc.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,575b3b4c8a8a6e508c8ceeca41331b6b" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T11:50:15.104113" + } +} \ No newline at end of file diff --git a/modules/local/preprocess_transcripts_fasta_gencode/environment.yml b/modules/local/preprocess_transcripts_fasta_gencode/environment.yml new file mode 100644 index 000000000..06e4d9658 --- /dev/null +++ b/modules/local/preprocess_transcripts_fasta_gencode/environment.yml @@ -0,0 +1,7 @@ +name: preprocess_transcripts_fasta_gencode +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::sed=4.7 diff --git a/modules/local/preprocess_transcripts_fasta_gencode/main.nf b/modules/local/preprocess_transcripts_fasta_gencode/main.nf index 41f1d42f6..2722e66c7 100644 --- a/modules/local/preprocess_transcripts_fasta_gencode/main.nf +++ b/modules/local/preprocess_transcripts_fasta_gencode/main.nf @@ -1,7 +1,7 @@ process PREPROCESS_TRANSCRIPTS_FASTA_GENCODE { tag "$fasta" - conda "conda-forge::sed=4.7" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : 'nf-core/ubuntu:20.04' }" @@ -28,4 +28,16 @@ process PREPROCESS_TRANSCRIPTS_FASTA_GENCODE { sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') END_VERSIONS """ + + stub: + def gzipped = fasta.toString().endsWith('.gz') + def outfile = gzipped ? file(fasta.baseName).baseName : fasta.baseName + """ + touch ${outfile}.fixed.fa + + 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/preprocess_transcripts_fasta_gencode/tests/main.nf.test b/modules/local/preprocess_transcripts_fasta_gencode/tests/main.nf.test new file mode 100644 index 000000000..b07b4c001 --- /dev/null +++ b/modules/local/preprocess_transcripts_fasta_gencode/tests/main.nf.test @@ -0,0 +1,60 @@ +nextflow_process { + + name "Test Process PREPROCESS_TRANSCRIPTS_FASTA_GENCODE" + script "../main.nf" + process "PREPROCESS_TRANSCRIPTS_FASTA_GENCODE" + + test("gencode fasta") { + + when { + process { + """ + def fileContents = [ + '>chr22|removeme', + 'ACTCAAGATAATGATGAGTAAAGAATATATTTCTAACAACAAAAAGGAAATTTGATAGTA' + ] + def gencodeFasta = file("${workDir}/gencodeFasta.fasta") + gencodeFasta.withWriter{ out -> + fileContents.each {out.println it} + } + input[0] = gencodeFasta + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("gencode fasta - stub") { + + options "-stub" + + when { + process { + """ + def fileContents = [ + '>chr22|removeme', + 'ACTCAAGATAATGATGAGTAAAGAATATATTTCTAACAACAAAAAGGAAATTTGATAGTA' + ] + def gencodeFasta = file("${workDir}/gencodeFasta.fasta") + gencodeFasta.withWriter{ out -> + fileContents.each {out.println it} + } + input[0] = gencodeFasta + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/preprocess_transcripts_fasta_gencode/tests/main.nf.test.snap b/modules/local/preprocess_transcripts_fasta_gencode/tests/main.nf.test.snap new file mode 100644 index 000000000..eaef85b1b --- /dev/null +++ b/modules/local/preprocess_transcripts_fasta_gencode/tests/main.nf.test.snap @@ -0,0 +1,48 @@ +{ + "gencode fasta": { + "content": [ + { + "0": [ + "gencodeFasta.fixed.fa:md5,e9267fa40efc784cc92575b5ba8a441b" + ], + "1": [ + "versions.yml:md5,e2c7f636c472887a914b128d1444737e" + ], + "fasta": [ + "gencodeFasta.fixed.fa:md5,e9267fa40efc784cc92575b5ba8a441b" + ], + "versions": [ + "versions.yml:md5,e2c7f636c472887a914b128d1444737e" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T16:16:36.494744" + }, + "gencode fasta - stub": { + "content": [ + { + "0": [ + "gencodeFasta.fixed.fa:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "1": [ + "versions.yml:md5,e2c7f636c472887a914b128d1444737e" + ], + "fasta": [ + "gencodeFasta.fixed.fa:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "versions": [ + "versions.yml:md5,e2c7f636c472887a914b128d1444737e" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T11:54:20.291494" + } +} \ No newline at end of file diff --git a/modules/local/rsem_merge_counts/environment.yml b/modules/local/rsem_merge_counts/environment.yml new file mode 100644 index 000000000..eeeb3329a --- /dev/null +++ b/modules/local/rsem_merge_counts/environment.yml @@ -0,0 +1,7 @@ +name: rsem_merge_counts +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::sed=4.7 diff --git a/modules/local/rsem_merge_counts/main.nf b/modules/local/rsem_merge_counts/main.nf index 3f226f54d..c220e31de 100644 --- a/modules/local/rsem_merge_counts/main.nf +++ b/modules/local/rsem_merge_counts/main.nf @@ -1,7 +1,7 @@ process RSEM_MERGE_COUNTS { label "process_medium" - conda "conda-forge::sed=4.7" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : 'nf-core/ubuntu:20.04' }" @@ -52,4 +52,17 @@ process RSEM_MERGE_COUNTS { sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') END_VERSIONS """ + + stub: + """ + touch rsem.merged.gene_counts.tsv + touch rsem.merged.gene_tpm.tsv + touch rsem.merged.transcript_counts.tsv + touch rsem.merged.transcript_tpm.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/rsem_merge_counts/tests/main.nf.test b/modules/local/rsem_merge_counts/tests/main.nf.test new file mode 100644 index 000000000..61008082a --- /dev/null +++ b/modules/local/rsem_merge_counts/tests/main.nf.test @@ -0,0 +1,62 @@ +nextflow_process { + + name "Test Process RSEM_MERGE_COUNTS" + script "../main.nf" + process "RSEM_MERGE_COUNTS" + + test("Should run without failures") { + + when { + process { + """ + input[0] = Channel.of([ + file(params.pipelines_testdata_base_path + "rsem_merge_counts/genes/RAP1_IAA_30M_REP1.genes.results", checkIfExists: true), + file(params.pipelines_testdata_base_path + "rsem_merge_counts/genes/RAP1_UNINDUCED_REP1.genes.results", checkIfExists: true), + file(params.pipelines_testdata_base_path + "rsem_merge_counts/genes/RAP1_UNINDUCED_REP2.genes.results", checkIfExists: true) + ]).collect() + input[1] = Channel.of([ + file(params.pipelines_testdata_base_path + "rsem_merge_counts/isoforms/RAP1_IAA_30M_REP1.isoforms.results", checkIfExists: true), + file(params.pipelines_testdata_base_path + "rsem_merge_counts/isoforms/RAP1_UNINDUCED_REP1.isoforms.results", checkIfExists: true), + file(params.pipelines_testdata_base_path + "rsem_merge_counts/isoforms/RAP1_UNINDUCED_REP2.isoforms.results", checkIfExists: true) + ]).collect() + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + file(params.pipelines_testdata_base_path + "rsem_merge_counts/genes/RAP1_IAA_30M_REP1.genes.results", checkIfExists: true), + file(params.pipelines_testdata_base_path + "rsem_merge_counts/genes/RAP1_UNINDUCED_REP1.genes.results", checkIfExists: true), + file(params.pipelines_testdata_base_path + "rsem_merge_counts/genes/RAP1_UNINDUCED_REP2.genes.results", checkIfExists: true) + ]).collect() + input[1] = Channel.of([ + file(params.pipelines_testdata_base_path + "rsem_merge_counts/isoforms/RAP1_IAA_30M_REP1.isoforms.results", checkIfExists: true), + file(params.pipelines_testdata_base_path + "rsem_merge_counts/isoforms/RAP1_UNINDUCED_REP1.isoforms.results", checkIfExists: true), + file(params.pipelines_testdata_base_path + "rsem_merge_counts/isoforms/RAP1_UNINDUCED_REP2.isoforms.results", checkIfExists: true) + ]).collect() + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/rsem_merge_counts/tests/main.nf.test.snap b/modules/local/rsem_merge_counts/tests/main.nf.test.snap new file mode 100644 index 000000000..1715d1279 --- /dev/null +++ b/modules/local/rsem_merge_counts/tests/main.nf.test.snap @@ -0,0 +1,84 @@ +{ + "stub": { + "content": [ + { + "0": [ + "rsem.merged.gene_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "1": [ + "rsem.merged.gene_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "2": [ + "rsem.merged.transcript_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "3": [ + "rsem.merged.transcript_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "4": [ + "versions.yml:md5,48ca3e12c91829af8019462b3f6aa29c" + ], + "counts_gene": [ + "rsem.merged.gene_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "counts_transcript": [ + "rsem.merged.transcript_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "tpm_gene": [ + "rsem.merged.gene_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "tpm_transcript": [ + "rsem.merged.transcript_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "versions": [ + "versions.yml:md5,48ca3e12c91829af8019462b3f6aa29c" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T11:55:29.45389" + }, + "Should run without failures": { + "content": [ + { + "0": [ + "rsem.merged.gene_counts.tsv:md5,7d1da94077dc2f90cfb2c793ca5b7446" + ], + "1": [ + "rsem.merged.gene_tpm.tsv:md5,39bad606eb012456bba1d995fe0feb5f" + ], + "2": [ + "rsem.merged.transcript_counts.tsv:md5,e40bba0aafc5904361513b3513c217ad" + ], + "3": [ + "rsem.merged.transcript_tpm.tsv:md5,abbaac45f9938716c58d604299ea284e" + ], + "4": [ + "versions.yml:md5,48ca3e12c91829af8019462b3f6aa29c" + ], + "counts_gene": [ + "rsem.merged.gene_counts.tsv:md5,7d1da94077dc2f90cfb2c793ca5b7446" + ], + "counts_transcript": [ + "rsem.merged.transcript_counts.tsv:md5,e40bba0aafc5904361513b3513c217ad" + ], + "tpm_gene": [ + "rsem.merged.gene_tpm.tsv:md5,39bad606eb012456bba1d995fe0feb5f" + ], + "tpm_transcript": [ + "rsem.merged.transcript_tpm.tsv:md5,abbaac45f9938716c58d604299ea284e" + ], + "versions": [ + "versions.yml:md5,48ca3e12c91829af8019462b3f6aa29c" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-09T17:13:37.377348" + } +} \ No newline at end of file diff --git a/modules/local/star_align_igenomes/environment.yml b/modules/local/star_align_igenomes/environment.yml new file mode 100644 index 000000000..0d92f8dd5 --- /dev/null +++ b/modules/local/star_align_igenomes/environment.yml @@ -0,0 +1,9 @@ +name: star_align_igenomes +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::star=2.6.1d + - bioconda::samtools=1.10 + - conda-forge::gawk=5.1.0 diff --git a/modules/local/star_align_igenomes/main.nf b/modules/local/star_align_igenomes/main.nf index b412a7e5c..7bda3df84 100644 --- a/modules/local/star_align_igenomes/main.nf +++ b/modules/local/star_align_igenomes/main.nf @@ -2,13 +2,13 @@ process STAR_ALIGN_IGENOMES { tag "$meta.id" label 'process_high' - conda "bioconda::star=2.6.1d bioconda::samtools=1.10 conda-forge::gawk=5.1.0" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:59cdd445419f14abac76b31dd0d71217994cbcc9-0' : 'biocontainers/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:59cdd445419f14abac76b31dd0d71217994cbcc9-0' }" input: - tuple val(meta), path(reads) + tuple val(meta), path(reads, stageAs: "input*/*") tuple val(meta2), path(index) tuple val(meta3), path(gtf) val star_ignore_sjdbgtf @@ -16,12 +16,12 @@ process STAR_ALIGN_IGENOMES { val seq_center output: - tuple val(meta), path('*d.out.bam') , emit: bam tuple val(meta), path('*Log.final.out') , emit: log_final tuple val(meta), path('*Log.out') , emit: log_out tuple val(meta), path('*Log.progress.out'), emit: log_progress path "versions.yml" , emit: versions + tuple val(meta), path('*d.out.bam') , optional:true, emit: bam tuple val(meta), path('*sortedByCoord.out.bam') , optional:true, emit: bam_sorted tuple val(meta), path('*toTranscriptome.out.bam'), optional:true, emit: bam_transcript tuple val(meta), path('*Aligned.unsort.out.bam') , optional:true, emit: bam_unsorted @@ -36,6 +36,8 @@ process STAR_ALIGN_IGENOMES { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def reads1 = [], reads2 = [] + meta.single_end ? [reads].flatten().each{reads1 << it} : reads.eachWithIndex{ v, ix -> ( ix & 1 ? reads2 : reads1) << v } def ignore_gtf = star_ignore_sjdbgtf ? '' : "--sjdbGTFfile $gtf" def seq_platform = seq_platform ? "'PL:$seq_platform'" : "" def seq_center = seq_center ? "--outSAMattrRGline ID:$prefix 'CN:$seq_center' 'SM:$prefix' $seq_platform " : "--outSAMattrRGline ID:$prefix 'SM:$prefix' $seq_platform " @@ -44,7 +46,7 @@ process STAR_ALIGN_IGENOMES { """ STAR \\ --genomeDir $index \\ - --readFilesIn $reads \\ + --readFilesIn ${reads1.join(",")} ${reads2.join(",")} \\ --runThreadN $task.cpus \\ --outFileNamePrefix $prefix. \\ $out_sam_type \\ @@ -70,4 +72,33 @@ process STAR_ALIGN_IGENOMES { gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | gzip > ${prefix}.unmapped_1.fastq.gz + echo "" | gzip > ${prefix}.unmapped_2.fastq.gz + touch ${prefix}Xd.out.bam + touch ${prefix}.Log.final.out + touch ${prefix}.Log.out + touch ${prefix}.Log.progress.out + touch ${prefix}.sortedByCoord.out.bam + touch ${prefix}.toTranscriptome.out.bam + touch ${prefix}.Aligned.unsort.out.bam + touch ${prefix}.Aligned.sortedByCoord.out.bam + touch ${prefix}.tab + touch ${prefix}.SJ.out.tab + touch ${prefix}.ReadsPerGene.out.tab + touch ${prefix}.Chimeric.out.junction + touch ${prefix}.out.sam + touch ${prefix}.Signal.UniqueMultiple.str1.out.wig + touch ${prefix}.Signal.UniqueMultiple.str1.out.bg + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + star: \$(STAR --version | sed -e "s/STAR_//g") + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') + END_VERSIONS + """ } diff --git a/modules/local/star_align_igenomes/tests/main.nf.test b/modules/local/star_align_igenomes/tests/main.nf.test new file mode 100644 index 000000000..37f65930a --- /dev/null +++ b/modules/local/star_align_igenomes/tests/main.nf.test @@ -0,0 +1,534 @@ +nextflow_process { + + name "Test Process STAR_ALIGN_IGENOMES" + script "../main.nf" + process "STAR_ALIGN_IGENOMES" + + test("homo_sapiens - single_end") { + config "./nextflow.config" + setup { + run("STAR_GENOMEGENERATE_IGENOMES") { + script "../../star_genomegenerate_igenomes/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true) ] + ]) + input[1] = STAR_GENOMEGENERATE_IGENOMES.out.index.map{ [ [id:'star'], it ] } + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log_final[0][1]).name, + file(process.out.log_out[0][1]).name, + file(process.out.log_progress[0][1]).name, + process.out.bam, + process.out.bam_sorted, + process.out.bam_transcript, + process.out.bam_unsorted, + process.out.bedgraph, + process.out.fastq, + process.out.junction, + process.out.read_per_gene_tab, + process.out.sam, + process.out.spl_junc_tab, + process.out.tab, + process.out.wig, + process.out.versions + ).match() } + ) + } + } + + test("homo_sapiens - paired_end") { + config "./nextflow.config" + setup { + run("STAR_GENOMEGENERATE_IGENOMES") { + script "../../star_genomegenerate_igenomes/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE_IGENOMES.out.index.map{ [ [id:'star'], it ] } + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log_final[0][1]).name, + file(process.out.log_out[0][1]).name, + file(process.out.log_progress[0][1]).name, + process.out.bam, + process.out.bam_sorted, + process.out.bam_transcript, + process.out.bam_unsorted, + process.out.bedgraph, + process.out.fastq, + process.out.junction, + process.out.read_per_gene_tab, + process.out.sam, + process.out.spl_junc_tab, + process.out.tab, + process.out.wig, + process.out.versions + ).match() } + ) + } + } + + test("homo_sapiens - paired_end - arriba") { + config "./nextflow.arriba.config" + setup { + run("STAR_GENOMEGENERATE_IGENOMES") { + script "../../star_genomegenerate_igenomes/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE_IGENOMES.out.index.map{ [ [id:'star'], it ] } + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log_final[0][1]).name, + file(process.out.log_out[0][1]).name, + file(process.out.log_progress[0][1]).name, + process.out.bam, + process.out.bam_sorted, + process.out.bam_transcript, + process.out.bam_unsorted, + process.out.bedgraph, + process.out.fastq, + process.out.junction, + process.out.read_per_gene_tab, + process.out.sam, + process.out.spl_junc_tab, + process.out.tab, + process.out.wig, + process.out.versions + ).match() } + ) + } + } + + test("homo_sapiens - paired_end - starfusion") { + config "./nextflow.starfusion.config" + setup { + run("STAR_GENOMEGENERATE_IGENOMES") { + script "../../star_genomegenerate_igenomes/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE_IGENOMES.out.index.map{ [ [id:'star'], it ] } + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log_final[0][1]).name, + file(process.out.log_out[0][1]).name, + file(process.out.log_progress[0][1]).name, + process.out.bam, + process.out.bam_sorted, + process.out.bam_transcript, + process.out.bam_unsorted, + process.out.bedgraph, + process.out.fastq, + process.out.junction, + process.out.read_per_gene_tab, + process.out.sam, + process.out.spl_junc_tab, + process.out.tab, + process.out.wig, + process.out.versions + ).match() } + ) + } + } + + test("homo_sapiens - paired_end - multiple") { + config "./nextflow.config" + setup { + run("STAR_GENOMEGENERATE_IGENOMES") { + script "../../star_genomegenerate_igenomes/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE_IGENOMES.out.index.map{ [ [id:'star'], it ] } + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log_final[0][1]).name, + file(process.out.log_out[0][1]).name, + file(process.out.log_progress[0][1]).name, + process.out.bam, + process.out.bam_sorted, + process.out.bam_transcript, + process.out.bam_unsorted, + process.out.bedgraph, + process.out.fastq, + process.out.junction, + process.out.read_per_gene_tab, + process.out.sam, + process.out.spl_junc_tab, + process.out.tab, + process.out.wig, + process.out.versions + ).match() } + ) + } + } + + test("homo_sapiens - single_end - stub") { + options "-stub" + config "./nextflow.config" + setup { + run("STAR_GENOMEGENERATE_IGENOMES") { + script "../../star_genomegenerate_igenomes/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true) ] + ]) + input[1] = STAR_GENOMEGENERATE_IGENOMES.out.index.map{ [ [id:'star'], it ] } + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("homo_sapiens - paired_end - stub") { + options "-stub" + config "./nextflow.config" + setup { + run("STAR_GENOMEGENERATE_IGENOMES") { + script "../../star_genomegenerate_igenomes/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE_IGENOMES.out.index.map{ [ [id:'star'], it ] } + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("homo_sapiens - paired_end - arriba - stub") { + options "-stub" + config "./nextflow.arriba.config" + setup { + run("STAR_GENOMEGENERATE_IGENOMES") { + script "../../star_genomegenerate_igenomes/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE_IGENOMES.out.index.map{ [ [id:'star'], it ] } + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("homo_sapiens - paired_end - starfusion - stub") { + options "-stub" + config "./nextflow.starfusion.config" + setup { + run("STAR_GENOMEGENERATE_IGENOMES") { + script "../../star_genomegenerate_igenomes/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE_IGENOMES.out.index.map{ [ [id:'star'], it ] } + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("homo_sapiens - paired_end - multiple - stub") { + options "-stub" + config "./nextflow.config" + setup { + run("STAR_GENOMEGENERATE_IGENOMES") { + script "../../star_genomegenerate_igenomes/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE_IGENOMES.out.index.map{ [ [id:'star'], it ] } + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/star_align_igenomes/tests/main.nf.test.snap b/modules/local/star_align_igenomes/tests/main.nf.test.snap new file mode 100644 index 000000000..5a0b193b1 --- /dev/null +++ b/modules/local/star_align_igenomes/tests/main.nf.test.snap @@ -0,0 +1,1522 @@ +{ + "homo_sapiens - single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": true + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_sorted": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_transcript": [ + [ + { + "id": "test", + "single_end": true + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_unsorted": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "junction": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_final": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_out": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_progress": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tab": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:12:37.024869" + }, + "homo_sapiens - paired_end - arriba - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_sorted": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_transcript": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_unsorted": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "junction": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_final": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_out": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_progress": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tab": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:13:17.56838" + }, + "homo_sapiens - single_end": { + "content": [ + "test.Log.final.out", + "test.Log.out", + "test.Log.progress.out", + [ + [ + { + "id": "test", + "single_end": true + }, + "test.Aligned.sortedByCoord.out.bam:md5,e5060a8dd60584378786c588c3f25b4d" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.Aligned.sortedByCoord.out.bam:md5,e5060a8dd60584378786c588c3f25b4d" + ] + ], + [ + + ], + [ + + ], + null, + [ + + ], + [ + + ], + null, + [ + + ], + null, + [ + [ + { + "id": "test", + "single_end": true + }, + "test.SJ.out.tab:md5,75a516ab950fb958f40b29996474949c" + ] + ], + null, + [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:04:35.055193" + }, + "homo_sapiens - paired_end": { + "content": [ + "test.Log.final.out", + "test.Log.out", + "test.Log.progress.out", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.sortedByCoord.out.bam:md5,b6cec9bba6b04b9b92eddbef128bdfbb" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.sortedByCoord.out.bam:md5,b6cec9bba6b04b9b92eddbef128bdfbb" + ] + ], + [ + + ], + [ + + ], + null, + [ + + ], + [ + + ], + null, + [ + + ], + null, + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,844af19ab0fc8cd9a3f75228445aca0d" + ] + ], + null, + [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:05:25.626464" + }, + "homo_sapiens - paired_end - multiple - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_sorted": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_transcript": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_unsorted": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "junction": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_final": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_out": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_progress": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tab": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:14:00.135162" + }, + "homo_sapiens - paired_end - multiple": { + "content": [ + "test.Log.final.out", + "test.Log.out", + "test.Log.progress.out", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.sortedByCoord.out.bam:md5,7b20152380dbc52ec23d2e95a7953710" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.sortedByCoord.out.bam:md5,7b20152380dbc52ec23d2e95a7953710" + ] + ], + [ + + ], + [ + + ], + null, + [ + + ], + [ + + ], + null, + [ + + ], + null, + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,069877e053714e23010fe4e1c003b4a2" + ] + ], + null, + [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:12:16.618713" + }, + "homo_sapiens - paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_sorted": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_transcript": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_unsorted": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "junction": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_final": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_out": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_progress": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tab": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:12:56.326797" + }, + "homo_sapiens - paired_end - starfusion": { + "content": [ + "test.Log.final.out", + "test.Log.out", + "test.Log.progress.out", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.out.bam:md5,7806e69c537f72e494f9ce8e95f16355" + ] + ], + [ + + ], + [ + + ], + [ + + ], + null, + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,c6d4d8c641ebb1c152a10da44f0dbf20" + ] + ], + null, + [ + + ], + null, + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,19c3faa1bfa9a0cc5e4c45f17065b53a" + ] + ], + null, + [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:10:49.022723" + }, + "homo_sapiens - paired_end - arriba": { + "content": [ + "test.Log.final.out", + "test.Log.out", + "test.Log.progress.out", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.out.bam:md5,28ecaa85a5dec1a18c877c85d874adf2" + ] + ], + [ + + ], + [ + + ], + [ + + ], + null, + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,62760fd60371d5bacae324c370358944" + ] + ], + null, + [ + + ], + null, + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,5155c9fd1f787ad6d7d80987fb06219c" + ] + ], + null, + [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:07:19.724256" + }, + "homo_sapiens - paired_end - starfusion - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_sorted": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_transcript": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_unsorted": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "junction": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_final": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_out": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_progress": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tab": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,957a57604ceb366b7af0123738e13559" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:13:37.606866" + } +} \ No newline at end of file diff --git a/modules/local/star_align_igenomes/tests/nextflow.arriba.config b/modules/local/star_align_igenomes/tests/nextflow.arriba.config new file mode 100644 index 000000000..ece3c0cbf --- /dev/null +++ b/modules/local/star_align_igenomes/tests/nextflow.arriba.config @@ -0,0 +1,14 @@ +process { + + withName: STAR_GENOMEGENERATE_IGENOMES { + ext.args = '--genomeSAindexNbases 9' + } + + withName: STAR_ALIGN_IGENOMES { + ext.args = '--readFilesCommand zcat --outSAMtype BAM Unsorted --outSAMunmapped Within --outBAMcompression 0 --outFilterMultimapNmax 50 --peOverlapNbasesMin 10 --alignSplicedMateMapLminOverLmate 0.5 --alignSJstitchMismatchNmax 5 -1 5 5 --chimSegmentMin 10 WithinBAM HardClip --chimJunctionOverhangMin 10 --chimScoreDropMax 30 --chimScoreJunctionNonGTAG 0 --chimScoreSeparation 1 --chimSegmentReadGapMax 3 --chimMultimapNmax 50 --chimOutType Junctions' + } + +} + +// Fix chown issue for the output star folder +docker.runOptions = '--platform=linux/amd64 -u $(id -u):$(id -g)' diff --git a/modules/local/star_align_igenomes/tests/nextflow.config b/modules/local/star_align_igenomes/tests/nextflow.config new file mode 100644 index 000000000..7c663e414 --- /dev/null +++ b/modules/local/star_align_igenomes/tests/nextflow.config @@ -0,0 +1,14 @@ +process { + + withName: STAR_GENOMEGENERATE_IGENOMES { + ext.args = '--genomeSAindexNbases 9' + } + + withName: STAR_ALIGN_IGENOMES { + ext.args = '--readFilesCommand zcat --outSAMtype BAM SortedByCoordinate --outWigType bedGraph --outWigStrand Unstranded' + } + +} + +// Fix chown issue for the output star folder +docker.runOptions = '--platform=linux/amd64 -u $(id -u):$(id -g)' diff --git a/modules/local/star_align_igenomes/tests/nextflow.starfusion.config b/modules/local/star_align_igenomes/tests/nextflow.starfusion.config new file mode 100644 index 000000000..922520ca2 --- /dev/null +++ b/modules/local/star_align_igenomes/tests/nextflow.starfusion.config @@ -0,0 +1,14 @@ +process { + + withName: STAR_GENOMEGENERATE_IGENOMES { + ext.args = '--genomeSAindexNbases 9' + } + + withName: STAR_ALIGN_IGENOMES { + ext.args = '--readFilesCommand zcat --outSAMtype BAM Unsorted --outReadsUnmapped None --twopassMode Basic --outSAMstrandField intronMotif --outSAMunmapped Within --chimSegmentMin 12 --chimJunctionOverhangMin 8 --chimOutJunctionFormat 1 --alignSJDBoverhangMin 10 --alignMatesGapMax 100000 --alignIntronMax 100000 --alignSJstitchMismatchNmax 5 -1 5 5 --chimMultimapScoreRange 3 --chimScoreJunctionNonGTAG -4 --chimMultimapNmax 20 --chimNonchimScoreDropMin 10 --peOverlapNbasesMin 12 --peOverlapMMp 0.1 --alignInsertionFlush Right --alignSplicedMateMapLminOverLmate 0 --alignSplicedMateMapLmin 30' + } + +} + +// Fix chown issue for the output star folder +docker.runOptions = '--platform=linux/amd64 -u $(id -u):$(id -g)' diff --git a/modules/local/star_genomegenerate_igenomes/environment.yml b/modules/local/star_genomegenerate_igenomes/environment.yml new file mode 100644 index 000000000..c3c6c2481 --- /dev/null +++ b/modules/local/star_genomegenerate_igenomes/environment.yml @@ -0,0 +1,9 @@ +name: star_genomegenerate_igenomes +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::star=2.6.1d + - bioconda::samtools=1.10 + - conda-forge::gawk=5.1.0 diff --git a/modules/local/star_genomegenerate_igenomes/main.nf b/modules/local/star_genomegenerate_igenomes/main.nf index 7766faaaf..4e2fcf6bf 100644 --- a/modules/local/star_genomegenerate_igenomes/main.nf +++ b/modules/local/star_genomegenerate_igenomes/main.nf @@ -2,7 +2,7 @@ process STAR_GENOMEGENERATE_IGENOMES { tag "$fasta" label 'process_high' - conda "bioconda::star=2.6.1d bioconda::samtools=1.10 conda-forge::gawk=5.1.0" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:59cdd445419f14abac76b31dd0d71217994cbcc9-0' : 'biocontainers/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:59cdd445419f14abac76b31dd0d71217994cbcc9-0' }" @@ -22,6 +22,7 @@ process STAR_GENOMEGENERATE_IGENOMES { def args = task.ext.args ?: '' def args_list = args.tokenize() def memory = task.memory ? "--limitGenomeGenerateRAM ${task.memory.toBytes() - 100000000}" : '' + def include_gtf = gtf ? "--sjdbGTFfile $gtf" : '' if (args_list.contains('--genomeSAindexNbases')) { """ mkdir star @@ -29,7 +30,7 @@ process STAR_GENOMEGENERATE_IGENOMES { --runMode genomeGenerate \\ --genomeDir star/ \\ --genomeFastaFiles $fasta \\ - --sjdbGTFfile $gtf \\ + $include_gtf \\ --runThreadN $task.cpus \\ $memory \\ $args @@ -51,7 +52,7 @@ process STAR_GENOMEGENERATE_IGENOMES { --runMode genomeGenerate \\ --genomeDir star/ \\ --genomeFastaFiles $fasta \\ - --sjdbGTFfile $gtf \\ + $include_gtf \\ --runThreadN $task.cpus \\ --genomeSAindexNbases \$NUM_BASES \\ $memory \\ @@ -65,4 +66,54 @@ process STAR_GENOMEGENERATE_IGENOMES { END_VERSIONS """ } + + stub: + if (gtf) { + """ + mkdir star + touch star/Genome + touch star/Log.out + touch star/SA + touch star/SAindex + touch star/chrLength.txt + touch star/chrName.txt + touch star/chrNameLength.txt + touch star/chrStart.txt + touch star/exonGeTrInfo.tab + touch star/exonInfo.tab + touch star/geneInfo.tab + touch star/genomeParameters.txt + touch star/sjdbInfo.txt + touch star/sjdbList.fromGTF.out.tab + touch star/sjdbList.out.tab + touch star/transcriptInfo.tab + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + star: \$(STAR --version | sed -e "s/STAR_//g") + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') + END_VERSIONS + """ + } else { + """ + mkdir star + touch star/Genome + touch star/Log.out + touch star/SA + touch star/SAindex + touch star/chrLength.txt + touch star/chrName.txt + touch star/chrNameLength.txt + touch star/chrStart.txt + touch star/genomeParameters.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + star: \$(STAR --version | sed -e "s/STAR_//g") + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') + END_VERSIONS + """ + } } diff --git a/modules/local/star_genomegenerate_igenomes/tests/main.nf.test b/modules/local/star_genomegenerate_igenomes/tests/main.nf.test new file mode 100644 index 000000000..d3bd71891 --- /dev/null +++ b/modules/local/star_genomegenerate_igenomes/tests/main.nf.test @@ -0,0 +1,93 @@ +nextflow_process { + + name "Test Process STAR_GENOMEGENERATE_IGENOMES" + script "../main.nf" + process "STAR_GENOMEGENERATE_IGENOMES" + + test("fasta with gtf") { + + when { + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.index[0][1]).listFiles().collect { it.getName() }.sort().toString(), + process.out.versions + ).match() } + ) + } + } + + test("fasta no gtf") { + + when { + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([ ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.index[0][1]).listFiles().collect { it.getName() }.sort().toString(), + process.out.versions + ).match() } + ) + } + + } + + test("fasta with gtf - stub") { + + options '-stub' + + when { + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("fasta no gtf - stub") { + + options '-stub' + + when { + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([ ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/star_genomegenerate_igenomes/tests/main.nf.test.snap b/modules/local/star_genomegenerate_igenomes/tests/main.nf.test.snap new file mode 100644 index 000000000..1ba924611 --- /dev/null +++ b/modules/local/star_genomegenerate_igenomes/tests/main.nf.test.snap @@ -0,0 +1,128 @@ +{ + "fasta with gtf": { + "content": [ + "[]", + [ + "versions.yml:md5,562a70f12dd9e695449b59fbf604e98d" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:14:17.250178" + }, + "fasta no gtf - stub": { + "content": [ + { + "0": [ + [ + "Genome:md5,d41d8cd98f00b204e9800998ecf8427e", + "Log.out:md5,d41d8cd98f00b204e9800998ecf8427e", + "SA:md5,d41d8cd98f00b204e9800998ecf8427e", + "SAindex:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrName.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrNameLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrStart.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "genomeParameters.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,562a70f12dd9e695449b59fbf604e98d" + ], + "index": [ + [ + "Genome:md5,d41d8cd98f00b204e9800998ecf8427e", + "Log.out:md5,d41d8cd98f00b204e9800998ecf8427e", + "SA:md5,d41d8cd98f00b204e9800998ecf8427e", + "SAindex:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrName.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrNameLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrStart.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "genomeParameters.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,562a70f12dd9e695449b59fbf604e98d" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:15:09.671637" + }, + "fasta no gtf": { + "content": [ + "[]", + [ + "versions.yml:md5,562a70f12dd9e695449b59fbf604e98d" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:14:35.674278" + }, + "fasta with gtf - stub": { + "content": [ + { + "0": [ + [ + "Genome:md5,d41d8cd98f00b204e9800998ecf8427e", + "Log.out:md5,d41d8cd98f00b204e9800998ecf8427e", + "SA:md5,d41d8cd98f00b204e9800998ecf8427e", + "SAindex:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrName.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrNameLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrStart.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "exonGeTrInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "exonInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "geneInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "genomeParameters.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sjdbInfo.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sjdbList.fromGTF.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "sjdbList.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "transcriptInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,562a70f12dd9e695449b59fbf604e98d" + ], + "index": [ + [ + "Genome:md5,d41d8cd98f00b204e9800998ecf8427e", + "Log.out:md5,d41d8cd98f00b204e9800998ecf8427e", + "SA:md5,d41d8cd98f00b204e9800998ecf8427e", + "SAindex:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrName.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrNameLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrStart.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "exonGeTrInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "exonInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "geneInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "genomeParameters.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sjdbInfo.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sjdbList.fromGTF.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "sjdbList.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "transcriptInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,562a70f12dd9e695449b59fbf604e98d" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T20:14:52.732323" + } +} \ No newline at end of file diff --git a/modules/local/summarizedexperiment/main.nf b/modules/local/summarizedexperiment/main.nf deleted file mode 100644 index f278e2301..000000000 --- a/modules/local/summarizedexperiment/main.nf +++ /dev/null @@ -1,36 +0,0 @@ -process SUMMARIZEDEXPERIMENT { - tag "$tx2gene" - label "process_medium" - - conda "bioconda::bioconductor-summarizedexperiment=1.24.0" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-summarizedexperiment:1.24.0--r41hdfd78af_0' : - 'biocontainers/bioconductor-summarizedexperiment:1.24.0--r41hdfd78af_0' }" - - input: - path counts - path tpm - path tx2gene - - output: - path "*.rds" , emit: rds - path "versions.yml", emit: versions - - when: - task.ext.when == null || task.ext.when - - script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/ - """ - summarizedexperiment.r \\ - NULL \\ - $counts \\ - $tpm \\ - $tx2gene - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') - bioconductor-summarizedexperiment: \$(Rscript -e "library(SummarizedExperiment); cat(as.character(packageVersion('SummarizedExperiment')))") - END_VERSIONS - """ -} diff --git a/modules/local/tx2gene/main.nf b/modules/local/tx2gene/main.nf deleted file mode 100644 index 150e74afb..000000000 --- a/modules/local/tx2gene/main.nf +++ /dev/null @@ -1,37 +0,0 @@ -process TX2GENE { - tag "$gtf" - label "process_low" - - conda "conda-forge::python=3.9.5" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/python:3.9--1' : - 'biocontainers/python:3.9--1' }" - - input: - path ("quants/*") - val quant_type - path gtf - - output: - path "*.tsv" , emit: tsv - path "versions.yml", emit: versions - - when: - task.ext.when == null || task.ext.when - - script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/ - """ - tx2gene.py \\ - --quant_type $quant_type \\ - --gtf $gtf \\ - --quants quants \\ - --id $params.gtf_group_features \\ - --extra $params.gtf_extra_attributes \\ - -o tx2gene.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - python: \$(python --version | sed 's/Python //g') - END_VERSIONS - """ -} diff --git a/modules/local/tximport/main.nf b/modules/local/tximport/main.nf deleted file mode 100644 index cd97d139f..000000000 --- a/modules/local/tximport/main.nf +++ /dev/null @@ -1,44 +0,0 @@ -process TXIMPORT { - label "process_medium" - - conda "bioconda::bioconductor-tximeta=1.12.0" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-tximeta:1.12.0--r41hdfd78af_0' : - 'biocontainers/bioconductor-tximeta:1.12.0--r41hdfd78af_0' }" - - input: - path ("quants/*") - path tx2gene - val quant_type - - output: - path "*gene_tpm.tsv" , emit: tpm_gene - path "*gene_counts.tsv" , emit: counts_gene - path "*gene_counts_length_scaled.tsv", emit: counts_gene_length_scaled - path "*gene_counts_scaled.tsv" , emit: counts_gene_scaled - path "*gene_lengths.tsv" , emit: lengths_gene - path "*transcript_tpm.tsv" , emit: tpm_transcript - path "*transcript_counts.tsv" , emit: counts_transcript - path "*transcript_lengths.tsv" , emit: lengths_transcript - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/ - prefix = task.ext.prefix ?: "${quant_type}.merged" - """ - tximport.r \\ - NULL \\ - quants \\ - $prefix \\ - $quant_type \\ - $tx2gene - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') - bioconductor-tximeta: \$(Rscript -e "library(tximeta); cat(as.character(packageVersion('tximeta')))") - END_VERSIONS - """ -} diff --git a/modules/nf-core/bbmap/bbsplit/environment.yml b/modules/nf-core/bbmap/bbsplit/environment.yml new file mode 100644 index 000000000..4c6db6276 --- /dev/null +++ b/modules/nf-core/bbmap/bbsplit/environment.yml @@ -0,0 +1,7 @@ +name: bbmap_bbsplit +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::bbmap=39.01 diff --git a/modules/nf-core/bbmap/bbsplit/main.nf b/modules/nf-core/bbmap/bbsplit/main.nf index f82bb9e47..f308f6983 100644 --- a/modules/nf-core/bbmap/bbsplit/main.nf +++ b/modules/nf-core/bbmap/bbsplit/main.nf @@ -3,7 +3,7 @@ process BBMAP_BBSPLIT { label 'process_high' label 'error_retry' - conda "bioconda::bbmap=39.01" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/bbmap:39.01--h5c4e2a8_0': 'biocontainers/bbmap:39.01--h5c4e2a8_0' }" @@ -12,7 +12,7 @@ process BBMAP_BBSPLIT { tuple val(meta), path(reads) path index path primary_ref - tuple val(other_ref_names), path (other_ref_paths) + tuple val(other_ref_names), path(other_ref_paths) val only_build_index output: @@ -20,6 +20,7 @@ process BBMAP_BBSPLIT { tuple val(meta), path('*primary*fastq.gz'), optional:true, emit: primary_fastq tuple val(meta), path('*fastq.gz') , optional:true, emit: all_fastq tuple val(meta), path('*txt') , optional:true, emit: stats + tuple val(meta), path('*.log') , optional:true, emit: log path "versions.yml" , emit: versions when: @@ -40,27 +41,19 @@ process BBMAP_BBSPLIT { other_ref_names.eachWithIndex { name, index -> other_refs << "ref_${name}=${other_ref_paths[index]}" } + + def fastq_in='' + def fastq_out='' + def index_files='' + def refstats_cmd='' + if (only_build_index) { if (primary_ref && other_ref_names && other_ref_paths) { - """ - bbsplit.sh \\ - -Xmx${avail_mem}M \\ - ref_primary=$primary_ref \\ - ${other_refs.join(' ')} \\ - path=bbsplit \\ - threads=$task.cpus \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bbmap: \$(bbversion.sh | grep -v "Duplicate cpuset") - END_VERSIONS - """ + index_files = 'ref_primary=' +primary_ref + ' ' + other_refs.join(' ') + ' path=bbsplit' } else { log.error 'ERROR: Please specify as input a primary fasta file along with names and paths to non-primary fasta files.' } } else { - def index_files = '' if (index) { index_files = "path=$index" } else if (primary_ref && other_ref_names && other_ref_paths) { @@ -68,22 +61,71 @@ process BBMAP_BBSPLIT { } else { log.error 'ERROR: Please either specify a BBSplit index as input or a primary fasta file along with names and paths to non-primary fasta files.' } - def fastq_in = meta.single_end ? "in=${reads}" : "in=${reads[0]} in2=${reads[1]}" - def fastq_out = meta.single_end ? "basename=${prefix}_%.fastq.gz" : "basename=${prefix}_%_#.fastq.gz" - """ - bbsplit.sh \\ - -Xmx${avail_mem}M \\ - $index_files \\ - threads=$task.cpus \\ - $fastq_in \\ - $fastq_out \\ - refstats=${prefix}.stats.txt \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bbmap: \$(bbversion.sh | grep -v "Duplicate cpuset") - END_VERSIONS - """ + fastq_in = meta.single_end ? "in=${reads}" : "in=${reads[0]} in2=${reads[1]}" + fastq_out = meta.single_end ? "basename=${prefix}_%.fastq.gz" : "basename=${prefix}_%_#.fastq.gz" + refstats_cmd = 'refstats=' + prefix + '.stats.txt' + } + """ + + # When we stage in the index files the time stamps get disturbed, which + # bbsplit doesn't like. Fix the time stamps in its summaries. This needs to + # be done via Java to match what bbmap does + + if [ $index ]; then + for summary_file in \$(find $index/ref/genome -name summary.txt); do + src=\$(grep '^source' "\$summary_file" | cut -f2- -d\$'\\t' | sed 's|.*/bbsplit|bbsplit|') + mod=\$(echo "System.out.println(java.nio.file.Files.getLastModifiedTime(java.nio.file.Paths.get(\\"\$src\\")).toMillis());" | jshell -J-Djdk.lang.Process.launchMechanism=vfork -) + sed "s|^last modified.*|last modified\\t\$mod|" "\$summary_file" > \${summary_file}.tmp && mv \${summary_file}.tmp \${summary_file} + done + fi + + # Run BBSplit + + bbsplit.sh \\ + -Xmx${avail_mem}M \\ + $index_files \\ + threads=$task.cpus \\ + $fastq_in \\ + $fastq_out \\ + $refstats_cmd \\ + $args 2> >(tee ${prefix}.log >&2) + + # Summary files will have an absolute path that will make the index + # impossible to use in other processes- we can fix that + + for summary_file in \$(find bbsplit/ref/genome -name summary.txt); do + src=\$(grep '^source' "\$summary_file" | cut -f2- -d\$'\\t' | sed 's|.*/bbsplit|bbsplit|') + sed "s|^source.*|source\\t\$src|" "\$summary_file" > \${summary_file}.tmp && mv \${summary_file}.tmp \${summary_file} + done + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bbmap: \$(bbversion.sh | grep -v "Duplicate cpuset") + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def other_refs = '' + other_ref_names.eachWithIndex { name, index -> + other_refs += "echo '' | gzip > ${prefix}_${name}.fastq.gz" } + """ + if [ ! -d bbsplit ]; then + mkdir bbsplit + fi + + if ! (${only_build_index}); then + echo '' | gzip > ${prefix}_primary.fastq.gz + ${other_refs} + touch ${prefix}.stats.txt + fi + + touch ${prefix}.log + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bbmap: \$(bbversion.sh | grep -v "Duplicate cpuset") + END_VERSIONS + """ } diff --git a/modules/nf-core/bbmap/bbsplit/meta.yml b/modules/nf-core/bbmap/bbsplit/meta.yml index caa3dd66c..f4e0a5ed5 100644 --- a/modules/nf-core/bbmap/bbsplit/meta.yml +++ b/modules/nf-core/bbmap/bbsplit/meta.yml @@ -11,9 +11,7 @@ tools: description: BBMap is a short read aligner, as well as various other bioinformatic tools. homepage: https://jgi.doe.gov/data-and-tools/bbtools/bb-tools-user-guide/ documentation: https://jgi.doe.gov/data-and-tools/bbtools/bb-tools-user-guide/ - licence: ["UC-LBL license (see package)"] - input: - meta: type: map @@ -42,7 +40,6 @@ input: - only_build_index: type: string description: true = only build index; false = mapping - output: - meta: type: map @@ -69,7 +66,9 @@ output: type: file description: Tab-delimited text file containing mapping statistics pattern: "*.txt" - authors: - "@joseespinosa" - "@drpatelh" +maintainers: + - "@joseespinosa" + - "@drpatelh" diff --git a/modules/nf-core/bbmap/bbsplit/nextflow.config b/modules/nf-core/bbmap/bbsplit/nextflow.config new file mode 100644 index 000000000..8d71e9d85 --- /dev/null +++ b/modules/nf-core/bbmap/bbsplit/nextflow.config @@ -0,0 +1,20 @@ +if (!params.skip_bbsplit) { + process { + withName: 'BBMAP_BBSPLIT' { + ext.args = 'build=1 ambiguous2=all maxindel=150000 ow=f' + publishDir = [ + [ + path: { "${params.outdir}/bbsplit" }, + mode: params.publish_dir_mode, + pattern: '*.txt' + ], + [ + path: { params.save_bbsplit_reads ? "${params.outdir}/bbsplit" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.fastq.gz', + saveAs: { params.save_bbsplit_reads ? it : null } + ] + ] + } + } +} diff --git a/modules/nf-core/bbmap/bbsplit/tests/main.nf.test b/modules/nf-core/bbmap/bbsplit/tests/main.nf.test new file mode 100644 index 000000000..0674d247f --- /dev/null +++ b/modules/nf-core/bbmap/bbsplit/tests/main.nf.test @@ -0,0 +1,189 @@ +nextflow_process { + + name "Test Process BBMAP_BBSPLIT" + script "../main.nf" + process "BBMAP_BBSPLIT" + + test("sarscov2_se_fastq_fasta_chr22_fasta - index") { + + when { + process { + """ + input[0] = [[:], []] + input[1] = [] + input[2] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)) + input[3] = Channel.of([ + [ 'human' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr22/sequence/chr22_23800000-23980000.fa', checkIfExists: true) + ]) + input[4] = true + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path("${process.out.index[0]}").exists() }, + { assert path(process.out.log[0][1]).text.contains("No index available") }, + { assert snapshot(process.out.versions).match() } + ) + } + } + + test("sarscov2_se_fastq_fasta_chr22_fasta - index - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [[:], []] + input[1] = [] + input[2] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)) + input[3] = Channel.of([ + [ 'human' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr22/sequence/chr22_23800000-23980000.fa', checkIfExists: true) + ]) + input[4] = true + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2_se_fastq_fasta_chr22_fasta") { + + setup { + + run("BBMAP_BBSPLIT", alias: "BBMAP_BBSPLIT_INDEX") { + script "../main.nf" + process { + """ + input[0] = [[:], []] + input[1] = [] + input[2] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)) + input[3] = Channel.of([ + [ 'human' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr22/sequence/chr22_23800000-23980000.fa', checkIfExists: true) + ]) + input[4] = true + """ + } + } + } + + when { + process { + """ + 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] = BBMAP_BBSPLIT_INDEX.out.index + input[2] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)) + input[3] = Channel.of([ + [ 'human' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr22/sequence/chr22_23800000-23980000.fa', checkIfExists: true) + ]) + input[4] = false + """ + } + } + + then { + def filesToExclude = [ + "info.txt", + "reflist.txt", + "scaffolds.txt.gz", + "summary.txt" + ] + + def outputFiles = [] + def outputDirectory = new File(process.out.index[0]) + outputDirectory.eachFileRecurse { file -> + if (file.isFile()){ + outputFiles << file + } + } + + def filesExist = filesToExclude.every { excludeName -> + outputFiles.any { file -> + file.getName().endsWith(excludeName) && file.exists() + } + } + + def filteredFiles = outputFiles + .findAll { file -> + !filesToExclude.any { excludeName -> + file.getName().endsWith(excludeName) + } + }.sort{ it.getName()} + + assertAll( + { assert process.success }, + { assert path(process.out.log[0][1]).text.contains("If you wish to regenerate the index") }, + { assert filesExist : "One or more files to exclude do not exist" }, + { assert snapshot( + filteredFiles, + process.out.versions + ).match()} + ) + } + } + + test("sarscov2_se_fastq_fasta_chr22_fasta - stub") { + + options "-stub" + + setup { + + run("BBMAP_BBSPLIT", alias: "BBMAP_BBSPLIT_INDEX") { + script "../main.nf" + process { + """ + input[0] = [[:], []] + input[1] = [] + input[2] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)) + input[3] = Channel.of([ + [ 'human' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr22/sequence/chr22_23800000-23980000.fa', checkIfExists: true) + ]) + input[4] = true + """ + } + } + } + + when { + process { + """ + 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] = BBMAP_BBSPLIT_INDEX.out.index + input[2] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)) + input[3] = Channel.of([ + [ 'human' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr22/sequence/chr22_23800000-23980000.fa', checkIfExists: true) + ]) + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/bbmap/bbsplit/tests/main.nf.test.snap b/modules/nf-core/bbmap/bbsplit/tests/main.nf.test.snap new file mode 100644 index 000000000..0d648d7d6 --- /dev/null +++ b/modules/nf-core/bbmap/bbsplit/tests/main.nf.test.snap @@ -0,0 +1,199 @@ +{ + "sarscov2_se_fastq_fasta_chr22_fasta": { + "content": [ + [ + "chr1.chrom.gz:md5,8fec4c63ec642613ad10adf4cc2e6ade", + "chr1_index_k13_c13_b1.block:md5,385913c1e84b77dc7bf36288ee1c8706", + "chr1_index_k13_c13_b1.block2.gz:md5,2556b45206835a0ff7078d683b5fd6e2", + "merged_ref_9222711925172838098.fa.gz:md5,983cef447fb28394b88a5b49b3579f0c", + "namelist.txt:md5,45e7a4cdc7a11a39ada56844ca3a1e30" + ], + [ + "versions.yml:md5,cb7f0e697ab2537f8ced951bfade90d4" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T11:41:32.116928" + }, + "sarscov2_se_fastq_fasta_chr22_fasta - index": { + "content": [ + [ + "versions.yml:md5,cb7f0e697ab2537f8ced951bfade90d4" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T11:41:06.072212" + }, + "sarscov2_se_fastq_fasta_chr22_fasta - index - stub": { + "content": [ + { + "0": [ + [ + + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + { + + }, + "null.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + "versions.yml:md5,cb7f0e697ab2537f8ced951bfade90d4" + ], + "all_fastq": [ + + ], + "index": [ + [ + + ] + ], + "log": [ + [ + { + + }, + "null.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "primary_fastq": [ + + ], + "stats": [ + + ], + "versions": [ + "versions.yml:md5,cb7f0e697ab2537f8ced951bfade90d4" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T11:45:21.48352" + }, + "sarscov2_se_fastq_fasta_chr22_fasta - stub": { + "content": [ + { + "0": [ + [ + + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test_primary.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test_human.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_primary.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + "versions.yml:md5,cb7f0e697ab2537f8ced951bfade90d4" + ], + "all_fastq": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test_human.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_primary.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "index": [ + [ + + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "primary_fastq": [ + [ + { + "id": "test", + "single_end": true + }, + "test_primary.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,cb7f0e697ab2537f8ced951bfade90d4" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T11:51:38.805111" + } +} \ No newline at end of file diff --git a/modules/nf-core/bedtools/genomecov/environment.yml b/modules/nf-core/bedtools/genomecov/environment.yml new file mode 100644 index 000000000..8fbe20c31 --- /dev/null +++ b/modules/nf-core/bedtools/genomecov/environment.yml @@ -0,0 +1,7 @@ +name: bedtools_genomecov +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::bedtools=2.31.1 diff --git a/modules/nf-core/bedtools/genomecov/main.nf b/modules/nf-core/bedtools/genomecov/main.nf new file mode 100644 index 000000000..8403c5303 --- /dev/null +++ b/modules/nf-core/bedtools/genomecov/main.nf @@ -0,0 +1,77 @@ +process BEDTOOLS_GENOMECOV { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'oras://community.wave.seqera.io/library/bedtools_coreutils:ba273c06a3909a15': + 'community.wave.seqera.io/library/bedtools_coreutils:a623c13f66d5262b' }" + + input: + tuple val(meta), path(intervals), val(scale) + path sizes + val extension + val sort + + output: + tuple val(meta), path("*.${extension}"), emit: genomecov + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args_list = args.tokenize() + args += (scale > 0 && scale != 1) ? " -scale $scale" : "" + if (!args_list.contains('-bg') && (scale > 0 && scale != 1)) { + args += " -bg" + } + // Sorts output file by chromosome and position using additional options for performance and consistency + // See https://www.biostars.org/p/66927/ for further details + def buffer = task.memory ? "--buffer-size=${task.memory.toGiga().intdiv(2)}G" : '' + def sort_cmd = sort ? "| LC_ALL=C sort --parallel=$task.cpus $buffer -k1,1 -k2,2n" : '' + + def prefix = task.ext.prefix ?: "${meta.id}" + if (intervals.name =~ /\.bam/) { + """ + bedtools \\ + genomecov \\ + -ibam $intervals \\ + $args \\ + $sort_cmd \\ + > ${prefix}.${extension} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") + END_VERSIONS + """ + } else { + """ + bedtools \\ + genomecov \\ + -i $intervals \\ + -g $sizes \\ + $args \\ + $sort_cmd \\ + > ${prefix}.${extension} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") + END_VERSIONS + """ + } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.${extension} + + 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/genomecov/meta.yml b/modules/nf-core/bedtools/genomecov/meta.yml new file mode 100644 index 000000000..2b2385e3e --- /dev/null +++ b/modules/nf-core/bedtools/genomecov/meta.yml @@ -0,0 +1,59 @@ +name: bedtools_genomecov +description: Computes histograms (default), per-base reports (-d) and BEDGRAPH (-bg) summaries of feature coverage (e.g., aligned sequences) for a given genome. +keywords: + - bed + - bam + - genomecov + - bedtools + - histogram +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/genomecov.html + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - intervals: + type: file + description: BAM/BED/GFF/VCF + pattern: "*.{bam|bed|gff|vcf}" + - scale: + type: integer + description: Number containing the scale factor for the output. Set to 1 to disable. Setting to a value other than 1 will also get the -bg bedgraph output format as this is required for this command switch + - sizes: + type: file + description: Tab-delimited table of chromosome names in the first column and chromosome sizes in the second column + - extension: + type: string + description: Extension of the output file (e. g., ".bg", ".bedgraph", ".txt", ".tab", etc.) It is set arbitrarily by the user and corresponds to the file format which depends on arguments. +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - genomecov: + type: file + description: Computed genome coverage file + pattern: "*.${extension}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@edmundmiller" + - "@sruthipsuresh" + - "@drpatelh" + - "@sidorov-si" + - "@chris-cheshire" +maintainers: + - "@edmundmiller" + - "@sruthipsuresh" + - "@drpatelh" + - "@sidorov-si" + - "@chris-cheshire" diff --git a/modules/nf-core/bedtools/genomecov/tests/main.nf.test b/modules/nf-core/bedtools/genomecov/tests/main.nf.test new file mode 100644 index 000000000..b8caa1e11 --- /dev/null +++ b/modules/nf-core/bedtools/genomecov/tests/main.nf.test @@ -0,0 +1,169 @@ +nextflow_process { + name "Test Process BEDTOOLS_GENOMECOV" + script "../main.nf" + process "BEDTOOLS_GENOMECOV" + config "./nextflow.config" + + test("sarscov2 - no scale") { + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.bam", checkIfExists: true), + 1 + ] + // sizes + input[1] = [] + // extension + input[2] = "txt" + input[3] = true + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - dummy sizes") { + when { + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.bam", checkIfExists: true), + 0.5 + ] + // sizes + input[1] = file('dummy_chromosome_sizes') + // extension + input[2] = 'txt' + input[3] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - scale") { + when { + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/baits.bed", checkIfExists: true), + 0.5 + ] + // sizes + input[1] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.sizes", checkIfExists: true) + // extension + input[2] = 'txt' + input[3] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - no scale - stub") { + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.bam", checkIfExists: true), + 1 + ] + // sizes + input[1] = [] + // extension + input[2] = "txt" + input[3] = true + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - dummy sizes - stub") { + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.bam", checkIfExists: true), + 0.5 + ] + // sizes + input[1] = file('dummy_chromosome_sizes') + // extension + input[2] = 'txt' + input[3] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - scale - stub") { + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/baits.bed", checkIfExists: true), + 0.5 + ] + // sizes + input[1] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.sizes", checkIfExists: true) + // extension + input[2] = 'txt' + input[3] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + +} diff --git a/modules/nf-core/bedtools/genomecov/tests/main.nf.test.snap b/modules/nf-core/bedtools/genomecov/tests/main.nf.test.snap new file mode 100644 index 000000000..da6dbe875 --- /dev/null +++ b/modules/nf-core/bedtools/genomecov/tests/main.nf.test.snap @@ -0,0 +1,200 @@ +{ + "sarscov2 - dummy sizes": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.coverage.txt:md5,01291b6e1beab72e046653e709eb0e10" + ] + ], + "1": [ + "versions.yml:md5,5fd44452613992a6f71f2c73d2e117f2" + ], + "genomecov": [ + [ + { + "id": "test" + }, + "test.coverage.txt:md5,01291b6e1beab72e046653e709eb0e10" + ] + ], + "versions": [ + "versions.yml:md5,5fd44452613992a6f71f2c73d2e117f2" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T11:59:33.898146" + }, + "sarscov2 - no scale - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.coverage.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,5fd44452613992a6f71f2c73d2e117f2" + ], + "genomecov": [ + [ + { + "id": "test" + }, + "test.coverage.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,5fd44452613992a6f71f2c73d2e117f2" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T11:59:52.483371" + }, + "sarscov2 - scale": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.coverage.txt:md5,de3c59c0ea123bcdbbad27bc0a0a601e" + ] + ], + "1": [ + "versions.yml:md5,5fd44452613992a6f71f2c73d2e117f2" + ], + "genomecov": [ + [ + { + "id": "test" + }, + "test.coverage.txt:md5,de3c59c0ea123bcdbbad27bc0a0a601e" + ] + ], + "versions": [ + "versions.yml:md5,5fd44452613992a6f71f2c73d2e117f2" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T11:59:43.69501" + }, + "sarscov2 - scale - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.coverage.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,5fd44452613992a6f71f2c73d2e117f2" + ], + "genomecov": [ + [ + { + "id": "test" + }, + "test.coverage.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,5fd44452613992a6f71f2c73d2e117f2" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T12:00:09.930036" + }, + "sarscov2 - no scale": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.coverage.txt:md5,66083198daca6c001d328ba9616e9b53" + ] + ], + "1": [ + "versions.yml:md5,5fd44452613992a6f71f2c73d2e117f2" + ], + "genomecov": [ + [ + { + "id": "test" + }, + "test.coverage.txt:md5,66083198daca6c001d328ba9616e9b53" + ] + ], + "versions": [ + "versions.yml:md5,5fd44452613992a6f71f2c73d2e117f2" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T11:59:25.448817" + }, + "sarscov2 - dummy sizes - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.coverage.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,5fd44452613992a6f71f2c73d2e117f2" + ], + "genomecov": [ + [ + { + "id": "test" + }, + "test.coverage.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,5fd44452613992a6f71f2c73d2e117f2" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T12:00:01.086433" + } +} \ No newline at end of file diff --git a/modules/nf-core/bedtools/genomecov/tests/nextflow.config b/modules/nf-core/bedtools/genomecov/tests/nextflow.config new file mode 100644 index 000000000..bdb74ae5a --- /dev/null +++ b/modules/nf-core/bedtools/genomecov/tests/nextflow.config @@ -0,0 +1,7 @@ +process { + + withName: BEDTOOLS_GENOMECOV { + ext.prefix = { "${meta.id}.coverage" } + } + +} diff --git a/modules/nf-core/cat/fastq/environment.yml b/modules/nf-core/cat/fastq/environment.yml new file mode 100644 index 000000000..8c69b121f --- /dev/null +++ b/modules/nf-core/cat/fastq/environment.yml @@ -0,0 +1,7 @@ +name: cat_fastq +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::coreutils=8.30 diff --git a/modules/nf-core/cat/fastq/main.nf b/modules/nf-core/cat/fastq/main.nf index 5021e6fcb..b68e5f911 100644 --- a/modules/nf-core/cat/fastq/main.nf +++ b/modules/nf-core/cat/fastq/main.nf @@ -2,7 +2,7 @@ process CAT_FASTQ { tag "$meta.id" label 'process_single' - conda "conda-forge::sed=4.7" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : 'nf-core/ubuntu:20.04' }" @@ -53,9 +53,9 @@ process CAT_FASTQ { def prefix = task.ext.prefix ?: "${meta.id}" def readList = reads instanceof List ? reads.collect{ it.toString() } : [reads.toString()] if (meta.single_end) { - if (readList.size > 1) { + if (readList.size >= 1) { """ - touch ${prefix}.merged.fastq.gz + echo '' | gzip > ${prefix}.merged.fastq.gz cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -64,10 +64,10 @@ process CAT_FASTQ { """ } } else { - if (readList.size > 2) { + if (readList.size >= 2) { """ - touch ${prefix}_1.merged.fastq.gz - touch ${prefix}_2.merged.fastq.gz + echo '' | gzip > ${prefix}_1.merged.fastq.gz + echo '' | gzip > ${prefix}_2.merged.fastq.gz cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -76,5 +76,4 @@ process CAT_FASTQ { """ } } - } diff --git a/modules/nf-core/cat/fastq/meta.yml b/modules/nf-core/cat/fastq/meta.yml index 8a39e309f..db4ac3c79 100644 --- a/modules/nf-core/cat/fastq/meta.yml +++ b/modules/nf-core/cat/fastq/meta.yml @@ -34,7 +34,9 @@ output: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@joseespinosa" - "@drpatelh" +maintainers: + - "@joseespinosa" + - "@drpatelh" diff --git a/modules/nf-core/cat/fastq/nextflow.config b/modules/nf-core/cat/fastq/nextflow.config new file mode 100644 index 000000000..64de2e49c --- /dev/null +++ b/modules/nf-core/cat/fastq/nextflow.config @@ -0,0 +1,9 @@ +process { + withName: 'CAT_FASTQ' { + publishDir = [ + path: { params.save_merged_fastq ? "${params.outdir}/fastq" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename.endsWith('.fastq.gz') && params.save_merged_fastq) ? filename : null } + ] + } +} diff --git a/modules/nf-core/cat/fastq/tests/main.nf.test b/modules/nf-core/cat/fastq/tests/main.nf.test new file mode 100644 index 000000000..6cc7aad15 --- /dev/null +++ b/modules/nf-core/cat/fastq/tests/main.nf.test @@ -0,0 +1,244 @@ +// NOTE The version snaps may not be consistant +// https://github.com/nf-core/modules/pull/4087#issuecomment-1767948035 +nextflow_process { + + name "Test Process CAT_FASTQ" + script "../main.nf" + process "CAT_FASTQ" + + test("test_cat_fastq_single_end") { + + when { + process { + """ + 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), + 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("test_cat_fastq_paired_end") { + + 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("test_cat_fastq_single_end_same_name") { + + when { + process { + """ + 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), + 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("test_cat_fastq_paired_end_same_name") { + + 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/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("test_cat_fastq_single_end_single_file") { + + when { + process { + """ + 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)] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_cat_fastq_single_end - stub") { + + options "-stub" + + when { + process { + """ + 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), + 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("test_cat_fastq_paired_end - 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("test_cat_fastq_single_end_same_name - stub") { + + options "-stub" + + when { + process { + """ + 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), + 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("test_cat_fastq_paired_end_same_name - 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/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("test_cat_fastq_single_end_single_file - stub") { + + options "-stub" + + when { + process { + """ + 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)] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/cat/fastq/tests/main.nf.test.snap b/modules/nf-core/cat/fastq/tests/main.nf.test.snap new file mode 100644 index 000000000..aec119a94 --- /dev/null +++ b/modules/nf-core/cat/fastq/tests/main.nf.test.snap @@ -0,0 +1,376 @@ +{ + "test_cat_fastq_single_end": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,ee314a9bd568d06617171b0c85f508da" + ] + ], + "1": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ], + "reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,ee314a9bd568d06617171b0c85f508da" + ] + ], + "versions": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-01-17T17:30:39.816981" + }, + "test_cat_fastq_single_end_same_name": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,3ad9406595fafec8172368f9cd0b6a22" + ] + ], + "1": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ], + "reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,3ad9406595fafec8172368f9cd0b6a22" + ] + ], + "versions": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-01-17T17:32:35.229332" + }, + "test_cat_fastq_single_end_single_file": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "1": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ], + "reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "versions": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-01-17T17:34:00.058829" + }, + "test_cat_fastq_paired_end_same_name": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.merged.fastq.gz:md5,3ad9406595fafec8172368f9cd0b6a22", + "test_2.merged.fastq.gz:md5,a52cab0b840c7178b0ea83df1fdbe8d5" + ] + ] + ], + "1": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.merged.fastq.gz:md5,3ad9406595fafec8172368f9cd0b6a22", + "test_2.merged.fastq.gz:md5,a52cab0b840c7178b0ea83df1fdbe8d5" + ] + ] + ], + "versions": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-01-17T17:33:33.031555" + }, + "test_cat_fastq_single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ], + "reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T12:07:28.244999" + }, + "test_cat_fastq_paired_end_same_name - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "versions": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T12:07:57.070911" + }, + "test_cat_fastq_single_end_same_name - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ], + "reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T12:07:46.796254" + }, + "test_cat_fastq_paired_end": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.merged.fastq.gz:md5,3ad9406595fafec8172368f9cd0b6a22", + "test_2.merged.fastq.gz:md5,a52cab0b840c7178b0ea83df1fdbe8d5" + ] + ] + ], + "1": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.merged.fastq.gz:md5,3ad9406595fafec8172368f9cd0b6a22", + "test_2.merged.fastq.gz:md5,a52cab0b840c7178b0ea83df1fdbe8d5" + ] + ] + ], + "versions": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-01-17T17:32:02.270935" + }, + "test_cat_fastq_paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "versions": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T12:07:37.807553" + }, + "test_cat_fastq_single_end_single_file - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ], + "reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,d42d6e24d67004608495883e00bd501b" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T12:14:51.861264" + } +} \ No newline at end of file diff --git a/modules/nf-core/custom/catadditionalfasta/environment.yml b/modules/nf-core/custom/catadditionalfasta/environment.yml new file mode 100644 index 000000000..e587338b5 --- /dev/null +++ b/modules/nf-core/custom/catadditionalfasta/environment.yml @@ -0,0 +1,9 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +name: "custom_catadditionalfasta" +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::python=3.9.5 diff --git a/modules/nf-core/custom/catadditionalfasta/main.nf b/modules/nf-core/custom/catadditionalfasta/main.nf new file mode 100644 index 000000000..88ce4954b --- /dev/null +++ b/modules/nf-core/custom/catadditionalfasta/main.nf @@ -0,0 +1,37 @@ +process CUSTOM_CATADDITIONALFASTA { + tag "$meta.id" + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.9--1' : + 'biocontainers/python:3.9--1' }" + + input: + tuple val(meta), path(fasta), path(gtf) + tuple val(meta2), path(add_fasta) + val biotype + + output: + tuple val(meta), path("*/*.fasta") , emit: fasta + tuple val(meta), path("*/*.gtf") , emit: gtf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'fasta2gtf.py' + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + mkdir out + touch out/genome_transcriptome.fasta + touch out/genome_transcriptome.gtf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | grep -v "Python ") + END_VERSIONS + """ +} diff --git a/modules/nf-core/custom/catadditionalfasta/meta.yml b/modules/nf-core/custom/catadditionalfasta/meta.yml new file mode 100644 index 000000000..8a9505d30 --- /dev/null +++ b/modules/nf-core/custom/catadditionalfasta/meta.yml @@ -0,0 +1,61 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "custom_catadditionalfasta" +description: Custom module to Add a new fasta file to an old one and update an associated GTF +keywords: + - fasta + - gtf + - genomics +tools: + - "custom": + description: "Custom module to Add a new fasta file to an old one and update an associated GTF" + tool_dev_url: "https://github.com/nf-core/modules/blob/master/modules/nf-core/custom/catadditionalfasta/main.nf" + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing fasta information + - meta2: + type: map + description: | + Groovy Map containing additional fasta information + - fasta: + type: file + description: FASTA-format sequence file + pattern: "*.{fasta,fa}" + - gtf: + type: file + description: GTF-format annotation file for fasta + pattern: "*.gtf" + - add_fasta: + type: file + description: FASTA-format file of additional sequences + pattern: "*.fa" + - biotype: + type: string + description: Biotype to apply to new GTF entries + +output: + - meta: + type: map + description: | + Groovy Map containing fasta information + - fasta: + type: file + description: FASTA-format combined sequence file + pattern: "*.{fasta,fa}" + - gtf: + type: file + description: GTF-format combined annotation file + pattern: "*.gtf" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@pinin4fjords" +maintainers: + - "@pinin4fjords" diff --git a/modules/nf-core/custom/catadditionalfasta/templates/fasta2gtf.py b/modules/nf-core/custom/catadditionalfasta/templates/fasta2gtf.py new file mode 100755 index 000000000..194a04160 --- /dev/null +++ b/modules/nf-core/custom/catadditionalfasta/templates/fasta2gtf.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 + +# Written by Pranathi Vemuri, later modified by Jonathan Manning and released under the MIT license. + +import os +import logging +import platform +from typing import Iterator, Tuple +from itertools import groupby + + +def setup_logging() -> logging.Logger: + """Configure logging for the script. + + Returns: + logging.Logger: Configured logger instance. + """ + logging.basicConfig(format="%(name)s - %(asctime)s %(levelname)s: %(message)s") + logger = logging.getLogger(__file__) + logger.setLevel(logging.INFO) + return logger + + +def format_yaml_like(data: dict, indent: int = 0) -> str: + """Formats a dictionary to a YAML-like string. + + Args: + data (dict): The dictionary to format. + indent (int): The current indentation level. + + Returns: + str: A string formatted as YAML. + """ + yaml_str = "" + for key, value in data.items(): + spaces = " " * indent + if isinstance(value, dict): + yaml_str += f"{spaces}{key}:\\n{format_yaml_like(value, indent + 1)}" + else: + yaml_str += f"{spaces}{key}: {value}\\n" + return yaml_str + + +def parse_fasta(fasta_file: str) -> Iterator[Tuple[str, str]]: + """Parse a fasta file and yield tuples of header and sequence. + + Args: + fasta_file (str): Path to the fasta file. + + Yields: + Iterator[Tuple[str, str]]: Tuples of header and sequence from the fasta file. + + + modified from Brent Pedersen + Correct Way To Parse A Fasta File In Python + given a fasta file. yield tuples of header, sequence + + Fasta iterator from https://www.biostars.org/p/710/#120760 + """ + with open(fasta_file) as file_handle: + fasta_iter = (x[1] for x in groupby(file_handle, lambda line: line[0] == ">")) + for header in fasta_iter: + header_str = next(header)[1:].strip() + sequence = "".join(s.strip() for s in next(fasta_iter)) + yield (header_str, sequence) + + +def fasta_to_gtf(fasta: str, output_file: str, biotype: str) -> None: + """ + Read a fasta file and create a GTF file. + + Args: + fasta (str): Path to the fasta file. + output_file (str): Path for the output GTF file. + biotype (str): The biotype to use in the GTF. + """ + fasta_iter = parse_fasta(fasta) + lines = [] + + for header, sequence in fasta_iter: + seq_name = header.split()[0].replace(" ", "_") + line = generate_gtf_line(seq_name, len(sequence), biotype) + lines.append(line) + + with open(output_file, "w") as file_handle: + file_handle.writelines(lines) + + +def generate_gtf_line(name: str, length: int, biotype: str) -> str: + """Generate a single GTF line given sequence name, length, and biotype. + + Args: + name (str): Name of the sequence. + length (int): Length of the sequence. + biotype (str): Biotype of the sequence. + + Returns: + str: A formatted GTF line. + """ + biotype_attr = f' {biotype} "transgene";' if biotype else "" + attributes = f'exon_id "{name}.1"; exon_number "1";{biotype_attr} gene_id "{name}_gene"; gene_name "{name}_gene"; gene_source "custom"; transcript_id "{name}_gene"; transcript_name "{name}_gene";\\n' + return f"{name}\\ttransgene\\texon\\t1\\t{length}\\t.\\t+\\t.\\t{attributes}" + + +def main() -> None: + # Parse arguments using argparse (not shown for brevity) + # Example: args = parser.parse_args() + + logger = setup_logging() + logger.info("Starting fasta to GTF conversion.") + + # Add fasta lines to GTF + add_name = os.path.splitext(os.path.basename("$add_fasta"))[0] + fasta_to_gtf("$add_fasta", f"{add_name}.gtf", "$biotype") + + # Concatenate new fasta to existing fasta, and the GTF we just generated to the GTF + genome_name = "$params.genome" if "$params.genome" != "null" else os.path.splitext(os.path.basename("$fasta"))[0] + output_prefix = "$task.ext.prefix" if "$task.ext.prefix" != "null" else f"{genome_name}_{add_name}" + + os.mkdir("out") + os.system(f"cat $fasta $add_fasta > out/{output_prefix}.fasta") + os.system(f"cat $gtf {add_name}.gtf > out/{output_prefix}.gtf") + + logger.info("Conversion completed successfully.") + + # Write the versions + versions_this_module = {} + versions_this_module["${task.process}"] = {"python": platform.python_version()} + with open("versions.yml", "w") as f: + f.write(format_yaml_like(versions_this_module)) + + +if __name__ == "__main__": + main() diff --git a/modules/nf-core/custom/catadditionalfasta/tests/main.nf.test b/modules/nf-core/custom/catadditionalfasta/tests/main.nf.test new file mode 100644 index 000000000..878c05d16 --- /dev/null +++ b/modules/nf-core/custom/catadditionalfasta/tests/main.nf.test @@ -0,0 +1,69 @@ +nextflow_process { + + name "Test Process CUSTOM_CATADDITIONALFASTA" + script "../main.nf" + process "CUSTOM_CATADDITIONALFASTA" + + test("sarscov2 - fastq - gtf") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/transcriptome.fasta', checkIfExists: true) + ]) + input[2] = 'test_biotype' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.fasta, + process.out.gtf, + process.out.versions + ).match() } + ) + } + } + + test("sarscov2 - fastq - gtf - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/transcriptome.fasta', checkIfExists: true) + ]) + input[2] = 'test_biotype' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/custom/catadditionalfasta/tests/main.nf.test.snap b/modules/nf-core/custom/catadditionalfasta/tests/main.nf.test.snap new file mode 100644 index 000000000..4767fd9a0 --- /dev/null +++ b/modules/nf-core/custom/catadditionalfasta/tests/main.nf.test.snap @@ -0,0 +1,85 @@ +{ + "sarscov2 - fastq - gtf": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "genome_transcriptome.fasta:md5,6a20c1a2e465519320a0d01f338f5cb5" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "genome_transcriptome.gtf:md5,bc88d95e7f27540e6b9906105d5be361" + ] + ], + [ + "versions.yml:md5,26f47339777a265af57338ac7f0f8798" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T12:19:28.965471" + }, + "sarscov2 - fastq - gtf - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,451e5a1afee71b2b916b6f2ccc47e508" + ], + "fasta": [ + [ + { + "id": "test", + "single_end": false + }, + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gtf": [ + [ + { + "id": "test", + "single_end": false + }, + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,451e5a1afee71b2b916b6f2ccc47e508" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T12:19:38.549677" + } +} \ No newline at end of file diff --git a/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff b/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff deleted file mode 100644 index 2ec89807d..000000000 --- a/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff +++ /dev/null @@ -1,19 +0,0 @@ -Changes in module 'nf-core/custom/dumpsoftwareversions' ---- modules/nf-core/custom/dumpsoftwareversions/main.nf -+++ modules/nf-core/custom/dumpsoftwareversions/main.nf -@@ -2,10 +2,10 @@ - label 'process_single' - - // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container -- conda "${moduleDir}/environment.yml" -+ conda "bioconda::multiqc=1.19" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://depot.galaxyproject.org/singularity/multiqc:1.17--pyhdfd78af_0' : -- 'biocontainers/multiqc:1.17--pyhdfd78af_0' }" -+ 'https://depot.galaxyproject.org/singularity/multiqc:1.19--pyhdfd78af_0' : -+ 'biocontainers/multiqc:1.19--pyhdfd78af_0' }" - - input: - path versions - -************************************************************ diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf deleted file mode 100644 index b2dcf480e..000000000 --- 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.19" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.19--pyhdfd78af_0' : - 'biocontainers/multiqc:1.19--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 5f15a5fde..000000000 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ /dev/null @@ -1,37 +0,0 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-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" -maintainers: - - "@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 da0334085..000000000 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python - - -"""Provide functions to merge multiple versions.yml files.""" - - -import yaml -import platform -from textwrap import dedent - - -def _make_versions_html(versions): - """Generate a tabular HTML output of all versions for MultiQC.""" - html = [ - dedent( - """\\ - - - - - - - - - - """ - ) - ] - for process, tmp_versions in sorted(versions.items()): - html.append("") - for i, (tool, version) in enumerate(sorted(tmp_versions.items())): - html.append( - dedent( - f"""\\ - - - - - - """ - ) - ) - html.append("") - html.append("
    Process Name Software Version
    {process if (i == 0) else ''}{tool}{version}
    ") - return "\\n".join(html) - - -def main(): - """Load all version files and generate merged output.""" - versions_this_module = {} - versions_this_module["${task.process}"] = { - "python": platform.python_version(), - "yaml": yaml.__version__, - } - - with open("$versions") as f: - versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module - - # aggregate versions by the module name (derived from fully-qualified process name) - versions_by_module = {} - for process, process_versions in versions_by_process.items(): - module = process.split(":")[-1] - try: - if versions_by_module[module] != process_versions: - raise AssertionError( - "We assume that software versions are the same between all modules. " - "If you see this error-message it means you discovered an edge-case " - "and should open an issue in nf-core/tools. " - ) - except KeyError: - versions_by_module[module] = process_versions - - versions_by_module["Workflow"] = { - "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version", - } - - versions_mqc = { - "id": "software_versions", - "section_name": "${workflow.manifest.name} Software Versions", - "section_href": "https://github.com/${workflow.manifest.name}", - "plot_type": "html", - "description": "are collected at run time from the software output.", - "data": _make_versions_html(versions_by_module), - } - - with open("software_versions.yml", "w") as f: - yaml.dump(versions_by_module, f, default_flow_style=False) - with open("software_versions_mqc.yml", "w") as f: - yaml.dump(versions_mqc, f, default_flow_style=False) - - with open("versions.yml", "w") as f: - yaml.dump(versions_this_module, f, default_flow_style=False) - - -if __name__ == "__main__": - main() diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test deleted file mode 100644 index eec1db10a..000000000 --- a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test +++ /dev/null @@ -1,38 +0,0 @@ -nextflow_process { - - name "Test Process CUSTOM_DUMPSOFTWAREVERSIONS" - script "../main.nf" - process "CUSTOM_DUMPSOFTWAREVERSIONS" - tag "modules" - tag "modules_nfcore" - tag "custom" - tag "dumpsoftwareversions" - tag "custom/dumpsoftwareversions" - - test("Should run without failures") { - when { - process { - """ - def tool1_version = ''' - TOOL1: - tool1: 0.11.9 - '''.stripIndent() - - def tool2_version = ''' - TOOL2: - tool2: 1.9 - '''.stripIndent() - - input[0] = Channel.of(tool1_version, tool2_version).collectFile() - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap deleted file mode 100644 index 4274ed57a..000000000 --- a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap +++ /dev/null @@ -1,27 +0,0 @@ -{ - "Should run without failures": { - "content": [ - { - "0": [ - "software_versions.yml:md5,1c851188476409cda5752ce971b20b58" - ], - "1": [ - "software_versions_mqc.yml:md5,2570f4ba271ad08357b0d3d32a9cf84d" - ], - "2": [ - "versions.yml:md5,3843ac526e762117eedf8825b40683df" - ], - "mqc_yml": [ - "software_versions_mqc.yml:md5,2570f4ba271ad08357b0d3d32a9cf84d" - ], - "versions": [ - "versions.yml:md5,3843ac526e762117eedf8825b40683df" - ], - "yml": [ - "software_versions.yml:md5,1c851188476409cda5752ce971b20b58" - ] - } - ], - "timestamp": "2023-11-03T14:43:22.157011" - } -} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml b/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml deleted file mode 100644 index 405aa24ae..000000000 --- a/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -custom/dumpsoftwareversions: - - modules/nf-core/custom/dumpsoftwareversions/** diff --git a/modules/nf-core/custom/getchromsizes/environment.yml b/modules/nf-core/custom/getchromsizes/environment.yml new file mode 100644 index 000000000..2ecd0128f --- /dev/null +++ b/modules/nf-core/custom/getchromsizes/environment.yml @@ -0,0 +1,8 @@ +name: custom_getchromsizes +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::samtools=1.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/custom/getchromsizes/main.nf b/modules/nf-core/custom/getchromsizes/main.nf index 060a2e885..3edf7c221 100644 --- a/modules/nf-core/custom/getchromsizes/main.nf +++ b/modules/nf-core/custom/getchromsizes/main.nf @@ -2,10 +2,10 @@ process CUSTOM_GETCHROMSIZES { tag "$fasta" label 'process_single' - conda "bioconda::samtools=1.16.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : - 'biocontainers/samtools:1.16.1--h6899075_1' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--h50ea8bc_0' }" input: tuple val(meta), path(fasta) @@ -35,6 +35,9 @@ process CUSTOM_GETCHROMSIZES { """ touch ${fasta}.fai touch ${fasta}.sizes + if [[ "${fasta.extension}" == "gz" ]]; then + touch ${fasta}.gzi + fi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/custom/getchromsizes/meta.yml b/modules/nf-core/custom/getchromsizes/meta.yml index 219ca1d8e..529be07e4 100644 --- a/modules/nf-core/custom/getchromsizes/meta.yml +++ b/modules/nf-core/custom/getchromsizes/meta.yml @@ -12,7 +12,6 @@ tools: tool_dev_url: https://github.com/samtools/samtools doi: 10.1093/bioinformatics/btp352 licence: ["MIT"] - input: - meta: type: map @@ -23,7 +22,6 @@ input: type: file description: FASTA file pattern: "*.{fa,fasta,fna,fas}" - output: - meta: type: map @@ -46,8 +44,11 @@ output: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@tamara-hodgetts" - "@chris-cheshire" - "@muffato" +maintainers: + - "@tamara-hodgetts" + - "@chris-cheshire" + - "@muffato" diff --git a/modules/nf-core/custom/getchromsizes/tests/main.nf.test b/modules/nf-core/custom/getchromsizes/tests/main.nf.test new file mode 100644 index 000000000..2dadc1a55 --- /dev/null +++ b/modules/nf-core/custom/getchromsizes/tests/main.nf.test @@ -0,0 +1,94 @@ +nextflow_process { + + name "Test Process CUSTOM_GETCHROMSIZES" + script "../main.nf" + process "CUSTOM_GETCHROMSIZES" + + test("test_custom_getchromsizes") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // 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("test_custom_getchromsizes_bgzip") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_custom_getchromsizes - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // 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("test_custom_getchromsizes_bgzip - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/custom/getchromsizes/tests/main.nf.test.snap b/modules/nf-core/custom/getchromsizes/tests/main.nf.test.snap new file mode 100644 index 000000000..c37b284d7 --- /dev/null +++ b/modules/nf-core/custom/getchromsizes/tests/main.nf.test.snap @@ -0,0 +1,242 @@ +{ + "test_custom_getchromsizes_bgzip - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,0d5a7c33bddcb1edad6bf0705b258e6f" + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gzi": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,0d5a7c33bddcb1edad6bf0705b258e6f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T12:38:36.927106" + }, + "test_custom_getchromsizes": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,0d5a7c33bddcb1edad6bf0705b258e6f" + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] + ], + "versions": [ + "versions.yml:md5,0d5a7c33bddcb1edad6bf0705b258e6f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-20T13:22:34.14237" + }, + "test_custom_getchromsizes_bgzip": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "3": [ + "versions.yml:md5,0d5a7c33bddcb1edad6bf0705b258e6f" + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] + ], + "versions": [ + "versions.yml:md5,0d5a7c33bddcb1edad6bf0705b258e6f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-20T13:23:06.241379" + }, + "test_custom_getchromsizes - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,0d5a7c33bddcb1edad6bf0705b258e6f" + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gzi": [ + + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,0d5a7c33bddcb1edad6bf0705b258e6f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T12:24:05.697845" + } +} \ No newline at end of file diff --git a/modules/nf-core/custom/tx2gene/environment.yml b/modules/nf-core/custom/tx2gene/environment.yml new file mode 100644 index 000000000..a859dc881 --- /dev/null +++ b/modules/nf-core/custom/tx2gene/environment.yml @@ -0,0 +1,9 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +name: "custom_tx2gene" +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - python=3.9.5 diff --git a/modules/nf-core/custom/tx2gene/main.nf b/modules/nf-core/custom/tx2gene/main.nf new file mode 100644 index 000000000..99c00aa06 --- /dev/null +++ b/modules/nf-core/custom/tx2gene/main.nf @@ -0,0 +1,36 @@ +process CUSTOM_TX2GENE { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.9--1' : + 'biocontainers/python:3.9--1' }" + + input: + tuple val(meta), path(gtf) + tuple val(meta2), path ("quants/*") + val quant_type + val id + val extra + + output: + tuple val(meta), path("*tx2gene.tsv"), emit: tx2gene + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'tx2gene.py' + + stub: + """ + touch ${meta.id}.tx2gene.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + END_VERSIONS + """ +} diff --git a/modules/nf-core/custom/tx2gene/meta.yml b/modules/nf-core/custom/tx2gene/meta.yml new file mode 100644 index 000000000..d991bf1be --- /dev/null +++ b/modules/nf-core/custom/tx2gene/meta.yml @@ -0,0 +1,65 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "custom_tx2gene" +description: Make a transcript/gene mapping from a GTF and cross-reference with transcript quantifications. +keywords: + - gene + - gtf + - pseudoalignment + - transcript +tools: + - "custom": + description: | + "Custom module to create a transcript to gene mapping from a GTF and + check it against transcript quantifications" + tool_dev_url: "https://github.com/nf-core/modules/blob/master/modules/nf-core/custom/tx2gene/main.nf" + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing reference information related to the GTF file + e.g. `[ id:'yeast' ]` + - gtf: + type: file + description: An annotation file of the reference genome in GTF format + pattern: "*.gtf" + - meta2: + type: map + description: | + Groovy Map containing information related to the experiment as a whole + e.g. `[ id:'SRP123456' ]` + - quants: + type: directory + description: Paths to subdirectories corresponding to + sample-wise runs of Salmon or Kallisto + - quant_type: + type: string + description: Quantification type, 'kallisto' or 'salmon' + - id: + type: string + description: Gene ID attribute in the GTF file (default= gene_id) + - extra: + type: string + description: Extra gene attribute in the GTF file (default= gene_name) + +output: + - meta: + type: map + description: | + Groovy Map containing reference information related to the GTF file + e.g. `[ id:'yeast' ]` + - tx2gene: + type: file + description: A transcript/ gene mapping table in TSV format + pattern: "*.tx2gene.tsv" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@pinin4fjords" +maintainers: + - "@pinin4fjords" diff --git a/bin/tx2gene.py b/modules/nf-core/custom/tx2gene/templates/tx2gene.py similarity index 75% rename from bin/tx2gene.py rename to modules/nf-core/custom/tx2gene/templates/tx2gene.py index d8256f5f9..8c2e3b1f4 100755 --- a/bin/tx2gene.py +++ b/modules/nf-core/custom/tx2gene/templates/tx2gene.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Written by Lorena Pantano with subsequent reworking by Jonathan Manning. Released under the MIT license. @@ -6,6 +6,7 @@ import argparse import glob import os +import platform import re from collections import Counter, defaultdict, OrderedDict from collections.abc import Set @@ -17,6 +18,26 @@ logger.setLevel(logging.INFO) +def format_yaml_like(data: dict, indent: int = 0) -> str: + """Formats a dictionary to a YAML-like string. + + Args: + data (dict): The dictionary to format. + indent (int): The current indentation level. + + Returns: + str: A string formatted as YAML. + """ + yaml_str = "" + for key, value in data.items(): + spaces = " " * indent + if isinstance(value, dict): + yaml_str += f"{spaces}{key}:\\n{format_yaml_like(value, indent + 1)}" + else: + yaml_str += f"{spaces}{key}: {value}\\n" + return yaml_str + + def read_top_transcripts(quant_dir: str, file_pattern: str) -> Set[str]: """ Read the top 100 transcripts from the quantification file. @@ -56,18 +77,17 @@ def discover_transcript_attribute(gtf_file: str, transcripts: Set[str]) -> str: with open(gtf_file) as inh: # Read GTF file, skipping header lines for line in filter(lambda x: not x.startswith("#"), inh): - cols = line.split("\t") + cols = line.split("\\t") # Use regular expression to correctly split the attributes string attributes_str = cols[8] - attributes = dict(re.findall(r'(\S+) "(.*?)(? Dict[str, str]: def map_transcripts_to_gene( - quant_type: str, gtf_file: str, quant_dir: str, gene_id: str, extra_id_field: str, output_file: str + quant_type: str, + gtf_file: str, + quant_dir: str, + gene_id: str, + extra_id_field: str, + output_file: str, ) -> bool: """ Map transcripts to gene names and write the output to a file. @@ -126,28 +151,28 @@ def map_transcripts_to_gene( # Discover the attribute that corresponds to transcripts in the GTF transcript_attribute = discover_transcript_attribute(gtf_file, transcripts) - if not transcript_attribute: - # If no attribute is found, return False - return False - # Open GTF and output file to write the mappings # Initialize the set to track seen combinations seen = set() with open(gtf_file) as inh, open(output_file, "w") as output_handle: + output_handle.write(f"{transcript_attribute}\\t{gene_id}\\t{extra_id_field}\\n") # Parse each line of the GTF, mapping transcripts to genes for line in filter(lambda x: not x.startswith("#"), inh): - cols = line.split("\t") + cols = line.split("\\t") attr_dict = parse_attributes(cols[8]) if gene_id in attr_dict and transcript_attribute in attr_dict: # Create a unique identifier for the transcript-gene combination - transcript_gene_pair = (attr_dict[transcript_attribute], attr_dict[gene_id]) + transcript_gene_pair = ( + attr_dict[transcript_attribute], + attr_dict[gene_id], + ) # Check if the combination has already been seen if transcript_gene_pair not in seen: # If it's a new combination, write it to the output and add to the seen set extra_id = attr_dict.get(extra_id_field, attr_dict[gene_id]) - output_handle.write(f"{attr_dict[transcript_attribute]}\t{attr_dict[gene_id]}\t{extra_id}\n") + output_handle.write(f"{attr_dict[transcript_attribute]}\\t{attr_dict[gene_id]}\\t{extra_id}\\n") seen.add(transcript_gene_pair) return True @@ -155,14 +180,18 @@ def map_transcripts_to_gene( # Main function to parse arguments and call the mapping function if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Map transcripts to gene names for tximport.") - parser.add_argument("--quant_type", type=str, help="Quantification type", default="salmon") - parser.add_argument("--gtf", type=str, help="GTF file", required=True) - parser.add_argument("--quants", type=str, help="Output of quantification", required=True) - parser.add_argument("--id", type=str, help="Gene ID in the GTF file", required=True) - parser.add_argument("--extra", type=str, help="Extra ID in the GTF file") - parser.add_argument("-o", "--output", dest="output", default="tx2gene.tsv", type=str, help="File with output") - - args = parser.parse_args() - if not map_transcripts_to_gene(args.quant_type, args.gtf, args.quants, args.id, args.extra, args.output): + if "${task.ext.prefix}" != "null": + prefix = "${task.ext.prefix}." + elif "$meta.id" != "null": + prefix = "${meta.id}." + else: + prefix = "" + + if not map_transcripts_to_gene("$quant_type", "$gtf", "quants", "$id", "$extra", f"{prefix}tx2gene.tsv"): logger.error("Failed to map transcripts to genes.") + + # Write the versions + versions_this_module = {} + versions_this_module["${task.process}"] = {"python": platform.python_version()} + with open("versions.yml", "w") as f: + f.write(format_yaml_like(versions_this_module)) diff --git a/modules/nf-core/custom/tx2gene/tests/main.nf.test b/modules/nf-core/custom/tx2gene/tests/main.nf.test new file mode 100644 index 000000000..e56a0b8fe --- /dev/null +++ b/modules/nf-core/custom/tx2gene/tests/main.nf.test @@ -0,0 +1,86 @@ +nextflow_process { + + name "Test Process CUSTOM_TX2GENE" + script "../main.nf" + process "CUSTOM_TX2GENE" + + test("saccharomyces_cerevisiae - gtf") { + + setup { + run("UNTAR") { + script "../../../untar/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/eukaryotes/saccharomyces_cerevisiae/kallisto_results.tar.gz', checkIfExists: true) + ]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/eukaryotes/saccharomyces_cerevisiae/genome_gfp.gtf', checkIfExists: true) + ]) + input[1] = UNTAR.out.untar.map { meta, dir -> [ meta, dir.listFiles().collect() ] } + input[2] = 'kallisto' + input[3] = 'gene_id' + input[4] = 'gene_name' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("saccharomyces_cerevisiae - gtf - stub") { + + options "-stub" + + setup { + run("UNTAR") { + script "../../../untar/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/eukaryotes/saccharomyces_cerevisiae/kallisto_results.tar.gz', checkIfExists: true) + ]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/eukaryotes/saccharomyces_cerevisiae/genome_gfp.gtf', checkIfExists: true) + ]) + input[1] = UNTAR.out.untar.map { meta, dir -> [ meta, dir.listFiles().collect() ] } + input[2] = 'kallisto' + input[3] = 'gene_id' + input[4] = 'gene_name' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} \ No newline at end of file diff --git a/modules/nf-core/custom/tx2gene/tests/main.nf.test.snap b/modules/nf-core/custom/tx2gene/tests/main.nf.test.snap new file mode 100644 index 000000000..c19f10f71 --- /dev/null +++ b/modules/nf-core/custom/tx2gene/tests/main.nf.test.snap @@ -0,0 +1,68 @@ +{ + "saccharomyces_cerevisiae - gtf": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe" + ] + ], + "1": [ + "versions.yml:md5,fb8145d7fbc6043ba031249b23ecda50" + ], + "tx2gene": [ + [ + { + "id": "test" + }, + "test.tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe" + ] + ], + "versions": [ + "versions.yml:md5,fb8145d7fbc6043ba031249b23ecda50" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:13:11.305047" + }, + "saccharomyces_cerevisiae - gtf - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.tx2gene.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,5613eefbca41377128f1d8dc09b9fb60" + ], + "tx2gene": [ + [ + { + "id": "test" + }, + "test.tx2gene.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,5613eefbca41377128f1d8dc09b9fb60" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-10T15:15:34.064489" + } +} \ No newline at end of file diff --git a/modules/nf-core/dupradar/environment.yml b/modules/nf-core/dupradar/environment.yml new file mode 100644 index 000000000..58b2bf11d --- /dev/null +++ b/modules/nf-core/dupradar/environment.yml @@ -0,0 +1,9 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +name: "dupradar" +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - "bioconda::bioconductor-dupradar=1.32.0" diff --git a/modules/nf-core/dupradar/main.nf b/modules/nf-core/dupradar/main.nf new file mode 100644 index 000000000..8f3665a67 --- /dev/null +++ b/modules/nf-core/dupradar/main.nf @@ -0,0 +1,46 @@ +process DUPRADAR { + tag "$meta.id" + label 'process_long' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bioconductor-dupradar:1.32.0--r43hdfd78af_0' : + 'biocontainers/bioconductor-dupradar:1.32.0--r43hdfd78af_0' }" + + input: + tuple val(meta), path(bam) + tuple val(meta2), path(gtf) + + output: + tuple val(meta), path("*_duprateExpDens.pdf") , emit: scatter2d + tuple val(meta), path("*_duprateExpBoxplot.pdf"), emit: boxplot + tuple val(meta), path("*_expressionHist.pdf") , emit: hist + tuple val(meta), path("*_dupMatrix.txt") , emit: dupmatrix + tuple val(meta), path("*_intercept_slope.txt") , emit: intercept_slope + tuple val(meta), path("*_mqc.txt") , emit: multiqc + tuple val(meta), path("*.R_sessionInfo.log") , emit: session_info + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'dupradar.r' + + stub: + """ + touch ${meta.id}_duprateExpDens.pdf + touch ${meta.id}_duprateExpBoxplot.pdf + touch ${meta.id}_expressionHist.pdf + touch ${meta.id}_dupMatrix.txt + touch ${meta.id}_intercept_slope.txt + touch ${meta.id}_dup_intercept_mqc.txt + touch ${meta.id}_duprateExpDensCurve_mqc.txt + touch ${meta.id}.R_sessionInfo.log + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bioconductor-dupradar: \$(Rscript -e "library(dupRadar); cat(as.character(packageVersion('dupRadar')))") + END_VERSIONS + """ +} diff --git a/modules/nf-core/dupradar/meta.yml b/modules/nf-core/dupradar/meta.yml new file mode 100644 index 000000000..95960ae98 --- /dev/null +++ b/modules/nf-core/dupradar/meta.yml @@ -0,0 +1,85 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "dupradar" +description: Assessment of duplication rates in RNA-Seq datasets +keywords: + - rnaseq + - duplication + - genomics +tools: + - "dupradar": + description: "Assessment of duplication rates in RNA-Seq datasets" + homepage: "https://bioconductor.org/packages/release/bioc/html/dupRadar.html" + documentation: "https://bioconductor.org/packages/release/bioc/vignettes/dupRadar/inst/doc/dupRadar.html" + tool_dev_url: "https://github.com/ssayols/dupRadar" + doi: "10.1186/s12859-016-1276-2" + licence: ["GPL v3"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/SAM file containing read alignments + pattern: "*.{bam}" + - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'human' ] + - gtf: + type: file + description: Genomic features annotation in GTF or SAF + pattern: "*.{gtf}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - scatter2d: + type: file + description: PDF duplication rate against total read count plot + pattern: "*_duprateExpDens.pdf" + - boxplot: + type: file + description: | + PDF duplication rate ~ total reads per kilobase (RPK) boxplot + pattern: "*_duprateExpBoxplot.pdf" + - hist: + type: file + description: | + PDF expression histogram + pattern: "*.pdf" + - dupmatrix: + type: file + description: | + Text file containing tags falling on the features described in the GTF + file + pattern: "*_dupMatrix.txt" + - intercept_slope: + type: file + description: | + Text file containing intercept and slope from dupRadar modelling + pattern: "*_intercept_slope.txt" + - multiqc: + type: file + description: | + dupRadar files for passing to MultiQC + pattern: "*_multiqc.txt" + - session_info: + type: file + description: dump of R SessionInfo + pattern: "*.log" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@pinin4fjords" +maintainers: + - "@pinin4fjords" diff --git a/modules/nf-core/dupradar/nextflow.config b/modules/nf-core/dupradar/nextflow.config new file mode 100644 index 000000000..3ade56ad5 --- /dev/null +++ b/modules/nf-core/dupradar/nextflow.config @@ -0,0 +1,35 @@ +if (!params.skip_alignment && !params.skip_qc) { + if (!params.skip_dupradar) { + process { + withName: 'DUPRADAR' { + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}/dupradar/scatter_plot" }, + mode: params.publish_dir_mode, + pattern: "*Dens.pdf" + ], + [ + path: { "${params.outdir}/${params.aligner}/dupradar/box_plot" }, + mode: params.publish_dir_mode, + pattern: "*Boxplot.pdf" + ], + [ + path: { "${params.outdir}/${params.aligner}/dupradar/histogram" }, + mode: params.publish_dir_mode, + pattern: "*Hist.pdf" + ], + [ + path: { "${params.outdir}/${params.aligner}/dupradar/gene_data" }, + mode: params.publish_dir_mode, + pattern: "*Matrix.txt" + ], + [ + path: { "${params.outdir}/${params.aligner}/dupradar/intercepts_slope" }, + mode: params.publish_dir_mode, + pattern: "*slope.txt" + ] + ] + } + } + } +} diff --git a/modules/nf-core/dupradar/templates/dupradar.r b/modules/nf-core/dupradar/templates/dupradar.r new file mode 100755 index 000000000..7653e5873 --- /dev/null +++ b/modules/nf-core/dupradar/templates/dupradar.r @@ -0,0 +1,187 @@ +#!/usr/bin/env Rscript + +# Written by Phil Ewels and released under the MIT license. +# Ported to nf-core/modules with template by Jonathan Manning + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse + +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +################################################ +################################################ +## Pull in module inputs ## +################################################ +################################################ + +input_bam <- '$bam' +output_prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix') +annotation_gtf <- '$gtf' +threads <- $task.cpus +args_opt <- parse_args('$task.ext.args') +feature_type <- ifelse('feature_type' %in% names(args_opt), args_opt[['feature_type']], 'exon') + +stranded <- 0 +if ('${meta.strandedness}' == 'forward') { + stranded <- 1 +} else if ('${meta.strandedness}' == 'reverse') { + stranded <- 2 +} + +paired_end <- TRUE +if ('${meta.single_end}' == 'true'){ + paired_end <- FALSE +} + +# Debug messages (stderr) +message("Input bam : ", input_bam) +message("Input gtf : ", annotation_gtf) +message("Strandness : ", c("unstranded", "forward", "reverse")[stranded+1]) +message("paired/single : ", ifelse(paired_end, 'paired', 'single')) +message("feature type : ", ifelse(paired_end, 'paired', 'single')) +message("Nb threads : ", threads) +message("Output basename: ", output_prefix) + +# Load / install packages +library("dupRadar") +library("parallel") + +# Duplicate stats +dm <- analyzeDuprates(input_bam, annotation_gtf, stranded, paired_end, threads, GTF.featureType = feature_type, verbose = TRUE) +write.table(dm, file=paste(output_prefix, "_dupMatrix.txt", sep=""), quote=F, row.name=F, sep="\t") + +# 2D density scatter plot +pdf(paste0(output_prefix, "_duprateExpDens.pdf")) +duprateExpDensPlot(DupMat=dm) +title("Density scatter plot") +mtext(output_prefix, side=3) +dev.off() +fit <- duprateExpFit(DupMat=dm) +cat( + paste("- dupRadar Int (duprate at low read counts):", fit\$intercept), + paste("- dupRadar Sl (progression of the duplication rate):", fit\$slope), + fill=TRUE, labels=output_prefix, + file=paste0(output_prefix, "_intercept_slope.txt"), append=FALSE +) + +# Create a multiqc file dupInt +sample_name <- gsub("Aligned.sortedByCoord.out.markDups", "", output_prefix) +line="#id: DupInt +#plot_type: 'generalstats' +#pconfig: +# dupRadar_intercept: +# title: 'dupInt' +# namespace: 'DupRadar' +# description: 'Intercept value from DupRadar' +# max: 100 +# min: 0 +# scale: 'RdYlGn-rev' +Sample dupRadar_intercept" + +write(line,file=paste0(output_prefix, "_dup_intercept_mqc.txt"),append=TRUE) +write(paste(sample_name, fit\$intercept),file=paste0(output_prefix, "_dup_intercept_mqc.txt"),append=TRUE) + +# Get numbers from dupRadar GLM +curve_x <- sort(log10(dm\$RPK)) +curve_y = 100*predict(fit\$glm, data.frame(x=curve_x), type="response") +# Remove all of the infinite values +infs = which(curve_x %in% c(-Inf,Inf)) +curve_x = curve_x[-infs] +curve_y = curve_y[-infs] +# Reduce number of data points +curve_x <- curve_x[seq(1, length(curve_x), 10)] +curve_y <- curve_y[seq(1, length(curve_y), 10)] +# Convert x values back to real counts +curve_x = 10^curve_x +# Write to file +line="#id: dupradar +#plot_type: 'linegraph' +#section_name: 'DupRadar' +#section_href: 'bioconductor.org/packages/release/bioc/html/dupRadar.html' +#description: \"provides duplication rate quality control for RNA-Seq datasets. Highly expressed genes can be expected to have a lot of duplicate reads, but high numbers of duplicates at low read counts can indicate low library complexity with technical duplication. +# This plot shows the general linear models - a summary of the gene duplication distributions. \" +#pconfig: +# title: 'DupRadar General Linear Model' +# xlog: True +# xlab: 'expression (reads/kbp)' +# ylab: '% duplicate reads' +# ymax: 100 +# ymin: 0 +# tt_label: '{point.x:.1f} reads/kbp: {point.y:,.2f}% duplicates' +# x_lines: +# - color: 'green' +# dash: 'LongDash' +# label: +# text: '0.5 RPKM' +# value: 0.5 +# width: 1 +# - color: 'red' +# dash: 'LongDash' +# label: +# text: '1 read/bp' +# value: 1000 +# width: 1" + +write(line,file=paste0(output_prefix, "_duprateExpDensCurve_mqc.txt"),append=TRUE) +write.table( + cbind(curve_x, curve_y), + file=paste0(output_prefix, "_duprateExpDensCurve_mqc.txt"), + quote=FALSE, row.names=FALSE, col.names=FALSE, append=TRUE, +) + +# Distribution of expression box plot +pdf(paste0(output_prefix, "_duprateExpBoxplot.pdf")) +duprateExpBoxplot(DupMat=dm) +title("Percent Duplication by Expression") +mtext(output_prefix, side=3) +dev.off() + +# Distribution of RPK values per gene +pdf(paste0(output_prefix, "_expressionHist.pdf")) +expressionHist(DupMat=dm) +title("Distribution of RPK values per gene") +mtext(output_prefix, side=3) +dev.off() + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste(output_prefix, "R_sessionInfo.log", sep = '.')) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +r.version <- strsplit(version[['version.string']], ' ')[[1]][3] +dupradar.version <- as.character(packageVersion('dupRadar')) + +writeLines( + c( + '"${task.process}":', + paste(' bioconductor-dupradar:', dupradar.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/nf-core/dupradar/tests/main.nf.test b/modules/nf-core/dupradar/tests/main.nf.test new file mode 100644 index 000000000..60f8dfb7d --- /dev/null +++ b/modules/nf-core/dupradar/tests/main.nf.test @@ -0,0 +1,134 @@ +nextflow_process { + + name "Test Process DUPRADAR" + script "../main.nf" + process "DUPRADAR" + + test("sarscov2 - bam - single_end") { + + config './nextflow.config' + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'forward' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true) + ] + input[1] = [ + [ id:'sarscov2' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.boxplot[0][1]).name, + file(process.out.hist[0][1]).name, + file(process.out.scatter2d[0][1]).name, + process.out.dupmatrix, + process.out.intercept_slopt, + process.out.multiqc, + process.out.versions + ).match() } + ) + } + } + + test("sarscov2 - bam - single_end - stub") { + + config './nextflow.config' + + options '-stub' + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'forward' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true) + ] + input[1] = [ + [ id:'sarscov2' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - bam - paired_end") { + + config './nextflow.config' + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false, strandedness:'forward' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.bam", checkIfExists: true) + ] + input[1] = [ + [ id:'sarscov2' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.boxplot[0][1]).name, + file(process.out.hist[0][1]).name, + file(process.out.scatter2d[0][1]).name, + process.out.dupmatrix, + process.out.intercept_slopt, + process.out.multiqc, + process.out.versions + ).match() } + ) + } + } + + test("sarscov2 - bam - paired_end - stub") { + + config './nextflow.config' + + options '-stub' + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false, strandedness:'forward' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.bam", checkIfExists: true) + ] + input[1] = [ + [ id:'sarscov2' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/dupradar/tests/main.nf.test.snap b/modules/nf-core/dupradar/tests/main.nf.test.snap new file mode 100644 index 000000000..dc7aba4a5 --- /dev/null +++ b/modules/nf-core/dupradar/tests/main.nf.test.snap @@ -0,0 +1,406 @@ +{ + "sarscov2 - bam - single_end": { + "content": [ + "test_duprateExpBoxplot.pdf", + "test_expressionHist.pdf", + "test_duprateExpDens.pdf", + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test_dupMatrix.txt:md5,2beda4c140548a2b8c91bf6bde01ddc6" + ] + ], + null, + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + [ + "test_dup_intercept_mqc.txt:md5,11961f0962ffc70e42aa57a12984e0fc", + "test_duprateExpDensCurve_mqc.txt:md5,f7d3432ef52047336b156446281aa6ac" + ] + ] + ], + [ + "versions.yml:md5,cd524e9e74304c2930cf28e2d741d351" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-11T11:21:44.31238184" + }, + "sarscov2 - bam - single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test_duprateExpDens.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test_duprateExpBoxplot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test_expressionHist.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test_dupMatrix.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test_intercept_slope.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + [ + "test_dup_intercept_mqc.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_duprateExpDensCurve_mqc.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + "versions.yml:md5,cd524e9e74304c2930cf28e2d741d351" + ], + "boxplot": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test_duprateExpBoxplot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "dupmatrix": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test_dupMatrix.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "hist": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test_expressionHist.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "intercept_slope": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test_intercept_slope.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "multiqc": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + [ + "test_dup_intercept_mqc.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_duprateExpDensCurve_mqc.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "scatter2d": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test_duprateExpDens.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "session_info": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,cd524e9e74304c2930cf28e2d741d351" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-11T11:21:56.741878886" + }, + "sarscov2 - bam - paired_end": { + "content": [ + "test_duprateExpBoxplot.pdf", + "test_expressionHist.pdf", + "test_duprateExpDens.pdf", + [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + "test_dupMatrix.txt:md5,5a327feaba56e5ea96a2cb7e8577e196" + ] + ], + null, + [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + [ + "test_dup_intercept_mqc.txt:md5,002855b42a71aa0f407ef7fa19df9ac3", + "test_duprateExpDensCurve_mqc.txt:md5,e797d8e256c5b2ab3aad1801360f1a77" + ] + ] + ], + [ + "versions.yml:md5,cd524e9e74304c2930cf28e2d741d351" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-11T11:22:10.053957095" + }, + "sarscov2 - bam - paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + "test_duprateExpDens.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + "test_duprateExpBoxplot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + "test_expressionHist.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + "test_dupMatrix.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + "test_intercept_slope.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + [ + "test_dup_intercept_mqc.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_duprateExpDensCurve_mqc.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + "test.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + "versions.yml:md5,cd524e9e74304c2930cf28e2d741d351" + ], + "boxplot": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + "test_duprateExpBoxplot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "dupmatrix": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + "test_dupMatrix.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "hist": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + "test_expressionHist.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "intercept_slope": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + "test_intercept_slope.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "multiqc": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + [ + "test_dup_intercept_mqc.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_duprateExpDensCurve_mqc.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "scatter2d": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + "test_duprateExpDens.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "session_info": [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "forward" + }, + "test.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,cd524e9e74304c2930cf28e2d741d351" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-11T11:22:22.134058061" + } +} \ No newline at end of file diff --git a/modules/nf-core/dupradar/tests/nextflow.config b/modules/nf-core/dupradar/tests/nextflow.config new file mode 100644 index 000000000..1b44170a0 --- /dev/null +++ b/modules/nf-core/dupradar/tests/nextflow.config @@ -0,0 +1,7 @@ +process { + + withName: DUPRADAR { + ext.args = { "--feature_type CDS" } + } + +} diff --git a/modules/nf-core/fastp/environment.yml b/modules/nf-core/fastp/environment.yml new file mode 100644 index 000000000..70389e664 --- /dev/null +++ b/modules/nf-core/fastp/environment.yml @@ -0,0 +1,7 @@ +name: fastp +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::fastp=0.23.4 diff --git a/modules/nf-core/fastp/fastp.diff b/modules/nf-core/fastp/fastp.diff deleted file mode 100644 index b50d8e387..000000000 --- a/modules/nf-core/fastp/fastp.diff +++ /dev/null @@ -1,32 +0,0 @@ -Changes in module 'nf-core/fastp' ---- modules/nf-core/fastp/main.nf -+++ modules/nf-core/fastp/main.nf -@@ -45,7 +45,7 @@ - $adapter_list \\ - $fail_fastq \\ - $args \\ -- 2> ${prefix}.fastp.log \\ -+ 2> >(tee ${prefix}.fastp.log >&2) \\ - | gzip -c > ${prefix}.fastp.fastq.gz - - cat <<-END_VERSIONS > versions.yml -@@ -66,7 +66,7 @@ - $adapter_list \\ - $fail_fastq \\ - $args \\ -- 2> ${prefix}.fastp.log -+ 2> >(tee ${prefix}.fastp.log >&2) - - cat <<-END_VERSIONS > versions.yml - "${task.process}": -@@ -91,7 +91,7 @@ - --thread $task.cpus \\ - --detect_adapter_for_pe \\ - $args \\ -- 2> ${prefix}.fastp.log -+ 2> >(tee ${prefix}.fastp.log >&2) - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - -************************************************************ diff --git a/modules/nf-core/fastp/main.nf b/modules/nf-core/fastp/main.nf index 8cade07f0..e1b9f5656 100644 --- a/modules/nf-core/fastp/main.nf +++ b/modules/nf-core/fastp/main.nf @@ -2,7 +2,7 @@ process FASTP { tag "$meta.id" label 'process_medium' - conda "bioconda::fastp=0.23.4" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/fastp:0.23.4--h5f740d0_0' : 'biocontainers/fastp:0.23.4--h5f740d0_0' }" @@ -10,6 +10,7 @@ process FASTP { input: tuple val(meta), path(reads) path adapter_fasta + val discard_trimmed_pass val save_trimmed_fail val save_merged @@ -18,9 +19,9 @@ process FASTP { tuple val(meta), path('*.json') , emit: json tuple val(meta), path('*.html') , emit: html tuple val(meta), path('*.log') , emit: log - path "versions.yml" , emit: versions tuple val(meta), path('*.fail.fastq.gz') , optional:true, emit: reads_fail tuple val(meta), path('*.merged.fastq.gz'), optional:true, emit: reads_merged + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -29,7 +30,9 @@ process FASTP { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def adapter_list = adapter_fasta ? "--adapter_fasta ${adapter_fasta}" : "" - def fail_fastq = save_trimmed_fail && meta.single_end ? "--failed_out ${prefix}.fail.fastq.gz" : save_trimmed_fail && !meta.single_end ? "--unpaired1 ${prefix}_1.fail.fastq.gz --unpaired2 ${prefix}_2.fail.fastq.gz" : '' + def fail_fastq = save_trimmed_fail && meta.single_end ? "--failed_out ${prefix}.fail.fastq.gz" : save_trimmed_fail && !meta.single_end ? "--failed_out ${prefix}.paired.fail.fastq.gz --unpaired1 ${prefix}_1.fail.fastq.gz --unpaired2 ${prefix}_2.fail.fastq.gz" : '' + def out_fq1 = discard_trimmed_pass ?: ( meta.single_end ? "--out1 ${prefix}.fastp.fastq.gz" : "--out1 ${prefix}_1.fastp.fastq.gz" ) + def out_fq2 = discard_trimmed_pass ?: "--out2 ${prefix}_2.fastp.fastq.gz" // Added soft-links to original fastqs for consistent naming in MultiQC // Use single ended for interleaved. Add --interleaved_in in config. if ( task.ext.args?.contains('--interleaved_in') ) { @@ -59,7 +62,7 @@ process FASTP { fastp \\ --in1 ${prefix}.fastq.gz \\ - --out1 ${prefix}.fastp.fastq.gz \\ + $out_fq1 \\ --thread $task.cpus \\ --json ${prefix}.fastp.json \\ --html ${prefix}.fastp.html \\ @@ -81,8 +84,8 @@ process FASTP { fastp \\ --in1 ${prefix}_1.fastq.gz \\ --in2 ${prefix}_2.fastq.gz \\ - --out1 ${prefix}_1.fastp.fastq.gz \\ - --out2 ${prefix}_2.fastp.fastq.gz \\ + $out_fq1 \\ + $out_fq2 \\ --json ${prefix}.fastp.json \\ --html ${prefix}.fastp.html \\ $adapter_list \\ @@ -99,4 +102,24 @@ process FASTP { END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def is_single_output = task.ext.args?.contains('--interleaved_in') || meta.single_end + def touch_reads = (discard_trimmed_pass) ? "" : (is_single_output) ? "echo '' | gzip > ${prefix}.fastp.fastq.gz" : "echo '' | gzip > ${prefix}_1.fastp.fastq.gz ; echo '' | gzip > ${prefix}_2.fastp.fastq.gz" + def touch_merged = (!is_single_output && save_merged) ? "echo '' | gzip > ${prefix}.merged.fastq.gz" : "" + def touch_fail_fastq = (!save_trimmed_fail) ? "" : meta.single_end ? "echo '' | gzip > ${prefix}.fail.fastq.gz" : "echo '' | gzip > ${prefix}.paired.fail.fastq.gz ; echo '' | gzip > ${prefix}_1.fail.fastq.gz ; echo '' | gzip > ${prefix}_2.fail.fastq.gz" + """ + $touch_reads + $touch_fail_fastq + $touch_merged + touch "${prefix}.fastp.json" + touch "${prefix}.fastp.html" + touch "${prefix}.fastp.log" + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastp: \$(fastp --version 2>&1 | sed -e "s/fastp //g") + END_VERSIONS + """ } diff --git a/modules/nf-core/fastp/meta.yml b/modules/nf-core/fastp/meta.yml index 197ea7ca6..8dfecc184 100644 --- a/modules/nf-core/fastp/meta.yml +++ b/modules/nf-core/fastp/meta.yml @@ -27,13 +27,16 @@ input: type: file description: File in FASTA format containing possible adapters to remove. pattern: "*.{fasta,fna,fas,fa}" + - discard_trimmed_pass: + type: boolean + description: Specify true to not write any reads that pass trimming thresholds. | + This can be used to use fastp for the output report only. - save_trimmed_fail: type: boolean description: Specify true to save files that failed to pass trimming thresholds ending in `*.fail.fastq.gz` - save_merged: type: boolean - description: Specify true to save all merged reads to the a file ending in `*.merged.fastq.gz` - + description: Specify true to save all merged reads to a file ending in `*.merged.fastq.gz` output: - meta: type: map @@ -71,3 +74,6 @@ output: authors: - "@drpatelh" - "@kevinmenden" +maintainers: + - "@drpatelh" + - "@kevinmenden" diff --git a/modules/nf-core/fastp/tests/main.nf.test b/modules/nf-core/fastp/tests/main.nf.test new file mode 100644 index 000000000..c4e119aff --- /dev/null +++ b/modules/nf-core/fastp/tests/main.nf.test @@ -0,0 +1,573 @@ +nextflow_process { + + name "Test Process FASTP" + script "../main.nf" + process "FASTP" + + test("test_fastp_single_end") { + + 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) ] + ]) + input[1] = [] + input[2] = false + input[3] = false + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.html.get(0).get(1)).getText().contains("single end (151 cycles)") }, + { assert path(process.out.log.get(0).get(1)).getText().contains("reads passed filter: 99") }, + { assert snapshot( + process.out.json, + process.out.reads, + process.out.reads_fail, + process.out.reads_merged, + process.out.versions).match() } + ) + } + } + + test("test_fastp_paired_end") { + + when { + + process { + """ + adapter_fasta = [] + save_trimmed_pass = true + save_trimmed_fail = false + save_merged = false + + 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] = [] + input[2] = false + input[3] = false + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.html.get(0).get(1)).getText().contains("The input has little adapter percentage (~0.000000%), probably it's trimmed before.") }, + { assert path(process.out.log.get(0).get(1)).getText().contains("Q30 bases: 12281(88.3716%)") }, + { assert snapshot( + process.out.json, + process.out.reads, + process.out.reads_fail, + process.out.reads_merged, + process.out.versions).match() } + ) + } + } + + test("fastp test_fastp_interleaved") { + + config './nextflow.interleaved.config' + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) ] + ]) + input[1] = [] + input[2] = false + input[3] = false + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.html.get(0).get(1)).getText().contains("paired end (151 cycles + 151 cycles)") }, + { assert path(process.out.log.get(0).get(1)).getText().contains("reads passed filter: 162") }, + { assert process.out.reads_fail == [] }, + { assert process.out.reads_merged == [] }, + { assert snapshot( + process.out.reads, + process.out.json, + process.out.versions).match() } + ) + } + } + + test("test_fastp_single_end_trim_fail") { + + when { + + process { + """ + 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] = [] + input[2] = false + input[3] = true + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.html.get(0).get(1)).getText().contains("single end (151 cycles)") }, + { assert path(process.out.log.get(0).get(1)).getText().contains("reads passed filter: 99") }, + { assert snapshot( + process.out.json, + process.out.reads, + process.out.reads_fail, + process.out.reads_merged, + process.out.versions).match() } + ) + } + } + + test("test_fastp_paired_end_trim_fail") { + + config './nextflow.save_failed.config' + 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)] + ]) + input[1] = [] + input[2] = false + input[3] = true + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.html.get(0).get(1)).getText().contains("The input has little adapter percentage (~0.000000%), probably it's trimmed before.") }, + { assert path(process.out.log.get(0).get(1)).getText().contains("reads passed filter: 162") }, + { assert snapshot( + process.out.reads, + process.out.reads_fail, + process.out.reads_merged, + process.out.json, + process.out.versions).match() } + ) + } + } + + test("test_fastp_paired_end_merged") { + + 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) ] + ]) + input[1] = [] + input[2] = false + input[3] = false + input[4] = true + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.html.get(0).get(1)).getText().contains("The input has little adapter percentage (~0.000000%), probably it's trimmed before.") }, + { assert path(process.out.log.get(0).get(1)).getText().contains("total reads: 75") }, + { assert snapshot( + process.out.json, + process.out.reads, + process.out.reads_fail, + process.out.reads_merged, + process.out.versions).match() }, + ) + } + } + + test("test_fastp_paired_end_merged_adapterlist") { + + 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) ] + ]) + input[1] = Channel.of([ file(params.modules_testdata_base_path + 'delete_me/fastp/adapters.fasta', checkIfExists: true) ]) + input[2] = false + input[3] = false + input[4] = true + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.html.get(0).get(1)).getText().contains("
    ") }, + { assert path(process.out.log.get(0).get(1)).getText().contains("total bases: 13683") }, + { assert snapshot( + process.out.json, + process.out.reads, + process.out.reads_fail, + process.out.reads_merged, + process.out.versions).match() } + ) + } + } + + test("test_fastp_single_end_qc_only") { + + 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) ] + ]) + input[1] = [] + input[2] = true + input[3] = false + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.html.get(0).get(1)).getText().contains("single end (151 cycles)") }, + { assert path(process.out.log.get(0).get(1)).getText().contains("reads passed filter: 99") }, + { assert snapshot( + process.out.json, + process.out.reads, + process.out.reads, + process.out.reads_fail, + process.out.reads_fail, + process.out.reads_merged, + process.out.reads_merged, + process.out.versions).match() } + ) + } + } + + test("test_fastp_paired_end_qc_only") { + + 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) ] + ]) + input[1] = [] + input[2] = true + input[3] = false + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.html.get(0).get(1)).getText().contains("The input has little adapter percentage (~0.000000%), probably it's trimmed before.") }, + { assert path(process.out.log.get(0).get(1)).getText().contains("Q30 bases: 12281(88.3716%)") }, + { assert snapshot( + process.out.json, + process.out.reads, + process.out.reads, + process.out.reads_fail, + process.out.reads_fail, + process.out.reads_merged, + process.out.reads_merged, + process.out.versions).match() } + ) + } + } + + test("test_fastp_single_end - 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) ] + ]) + input[1] = [] + input[2] = false + input[3] = false + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_fastp_paired_end - stub") { + + options "-stub" + + when { + + process { + """ + adapter_fasta = [] + save_trimmed_pass = true + save_trimmed_fail = false + save_merged = false + + 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] = [] + input[2] = false + input[3] = false + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("fastp - stub test_fastp_interleaved") { + + options "-stub" + + config './nextflow.interleaved.config' + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) ] + ]) + input[1] = [] + input[2] = false + input[3] = false + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_fastp_single_end_trim_fail - stub") { + + options "-stub" + + when { + + process { + """ + 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] = [] + input[2] = false + input[3] = true + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_fastp_paired_end_trim_fail - stub") { + + options "-stub" + + config './nextflow.save_failed.config' + 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)] + ]) + input[1] = [] + input[2] = false + input[3] = true + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_fastp_paired_end_merged - 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) ] + ]) + input[1] = [] + input[2] = false + input[3] = false + input[4] = true + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_fastp_paired_end_merged_adapterlist - 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) ] + ]) + input[1] = Channel.of([ file(params.modules_testdata_base_path + 'delete_me/fastp/adapters.fasta', checkIfExists: true) ]) + input[2] = false + input[3] = false + input[4] = true + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_fastp_single_end_qc_only - 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) ] + ]) + input[1] = [] + input[2] = true + input[3] = false + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_fastp_paired_end_qc_only - 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) ] + ]) + input[1] = [] + input[2] = true + input[3] = false + input[4] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} \ No newline at end of file diff --git a/modules/nf-core/fastp/tests/main.nf.test.snap b/modules/nf-core/fastp/tests/main.nf.test.snap new file mode 100644 index 000000000..54be7e45f --- /dev/null +++ b/modules/nf-core/fastp/tests/main.nf.test.snap @@ -0,0 +1,1331 @@ +{ + "test_fastp_single_end_qc_only - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + + ], + "5": [ + + ], + "6": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ], + "html": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "json": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + + ], + "reads_fail": [ + + ], + "reads_merged": [ + + ], + "versions": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T14:31:10.841098" + }, + "test_fastp_paired_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,1e0f8e27e71728e2b63fc64086be95cd" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,67b2bbae47f073e05a97a9c2edce23c7", + "test_2.fastp.fastq.gz:md5,25cbdca08e2083dbd4f0502de6b62f39" + ] + ] + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:43:28.665779" + }, + "test_fastp_paired_end_merged_adapterlist": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,5914ca3f21ce162123a824e33e8564f6" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,54b726a55e992a869fd3fa778afe1672", + "test_2.fastp.fastq.gz:md5,29d3b33b869f7b63417b8ff07bb128ba" + ] + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.merged.fastq.gz:md5,c873bb1ab3fa859dcc47306465e749d5" + ] + ], + [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:44:18.210375" + }, + "test_fastp_single_end_qc_only": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,5cc5f01e449309e0e689ed6f51a2294a" + ] + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:44:27.380974" + }, + "test_fastp_paired_end_trim_fail": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,6ff32a64c5188b9a9192be1398c262c7", + "test_2.fastp.fastq.gz:md5,db0cb7c9977e94ac2b4b446ebd017a8a" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.paired.fail.fastq.gz:md5,409b687c734cedd7a1fec14d316e1366", + "test_1.fail.fastq.gz:md5,4f273cf3159c13f79e8ffae12f5661f6", + "test_2.fail.fastq.gz:md5,f97b9edefb5649aab661fbc9e71fc995" + ] + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,4c3268ddb50ea5b33125984776aa3519" + ] + ], + [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:43:58.749589" + }, + "fastp - stub test_fastp_interleaved": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + + ], + "5": [ + + ], + "6": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ], + "html": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "json": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "reads_fail": [ + + ], + "reads_merged": [ + + ], + "versions": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:50:00.270029" + }, + "test_fastp_single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + + ], + "5": [ + + ], + "6": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ], + "html": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "json": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "reads_fail": [ + + ], + "reads_merged": [ + + ], + "versions": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:49:42.502789" + }, + "test_fastp_paired_end_merged_adapterlist - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "6": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "reads_fail": [ + + ], + "reads_merged": [ + [ + { + "id": "test", + "single_end": false + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:54:53.458252" + }, + "test_fastp_paired_end_merged - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "6": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "reads_fail": [ + + ], + "reads_merged": [ + [ + { + "id": "test", + "single_end": false + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:50:27.689379" + }, + "test_fastp_paired_end_merged": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,b712fd68ed0322f4bec49ff2a5237fcc" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,54b726a55e992a869fd3fa778afe1672", + "test_2.fastp.fastq.gz:md5,29d3b33b869f7b63417b8ff07bb128ba" + ] + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.merged.fastq.gz:md5,c873bb1ab3fa859dcc47306465e749d5" + ] + ], + [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:44:08.68476" + }, + "test_fastp_paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + + ], + "5": [ + + ], + "6": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "reads_fail": [ + + ], + "reads_merged": [ + + ], + "versions": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:49:51.679221" + }, + "test_fastp_single_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,c852d7a6dba5819e4ac8d9673bedcacc" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.fastq.gz:md5,67b2bbae47f073e05a97a9c2edce23c7" + ] + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:43:18.834322" + }, + "test_fastp_single_end_trim_fail - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "5": [ + + ], + "6": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ], + "html": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "json": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "reads_fail": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "reads_merged": [ + + ], + "versions": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T14:05:36.898142" + }, + "test_fastp_paired_end_trim_fail - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.paired.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_1.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "5": [ + + ], + "6": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "reads_fail": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.paired.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_1.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "reads_merged": [ + + ], + "versions": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T14:05:49.212847" + }, + "fastp test_fastp_interleaved": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.fastq.gz:md5,217d62dc13a23e92513a1bd8e1bcea39" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,b24e0624df5cc0b11cd5ba21b726fb22" + ] + ], + [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:43:38.910832" + }, + "test_fastp_single_end_trim_fail": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,9a7ee180f000e8d00c7fb67f06293eb5" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.fastq.gz:md5,67b2bbae47f073e05a97a9c2edce23c7" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.fail.fastq.gz:md5,3e4aaadb66a5b8fc9b881bf39c227abd" + ] + ], + [ + + ], + [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:43:48.22378" + }, + "test_fastp_paired_end_qc_only": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,623064a45912dac6f2b64e3f2e9901df" + ] + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T13:44:36.334938" + }, + "test_fastp_paired_end_qc_only - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + + ], + "5": [ + + ], + "6": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + + ], + "reads_fail": [ + + ], + "reads_merged": [ + + ], + "versions": [ + "versions.yml:md5,48ffc994212fb1fc9f83a74fa69c9f02" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-05T14:31:27.096468" + } +} \ No newline at end of file diff --git a/modules/nf-core/fastp/tests/nextflow.interleaved.config b/modules/nf-core/fastp/tests/nextflow.interleaved.config new file mode 100644 index 000000000..4be8dbd2c --- /dev/null +++ b/modules/nf-core/fastp/tests/nextflow.interleaved.config @@ -0,0 +1,5 @@ +process { + withName: FASTP { + ext.args = "--interleaved_in -e 30" + } +} diff --git a/modules/nf-core/fastp/tests/nextflow.save_failed.config b/modules/nf-core/fastp/tests/nextflow.save_failed.config new file mode 100644 index 000000000..53b61b0c1 --- /dev/null +++ b/modules/nf-core/fastp/tests/nextflow.save_failed.config @@ -0,0 +1,5 @@ +process { + withName: FASTP { + ext.args = "-e 30" + } +} diff --git a/modules/nf-core/fastqc/environment.yml b/modules/nf-core/fastqc/environment.yml new file mode 100644 index 000000000..1787b38a9 --- /dev/null +++ b/modules/nf-core/fastqc/environment.yml @@ -0,0 +1,7 @@ +name: fastqc +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::fastqc=0.12.1 diff --git a/modules/nf-core/fastqc/fastqc.diff b/modules/nf-core/fastqc/fastqc.diff deleted file mode 100644 index 0518d2b8f..000000000 --- a/modules/nf-core/fastqc/fastqc.diff +++ /dev/null @@ -1,23 +0,0 @@ -Changes in module 'nf-core/fastqc' ---- modules/nf-core/fastqc/main.nf -+++ modules/nf-core/fastqc/main.nf -@@ -37,7 +37,7 @@ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": -- fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) -+ fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS - """ - -@@ -49,7 +49,7 @@ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": -- fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) -+ fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS - """ - } - -************************************************************ diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index c9f64702b..d8989f481 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -2,7 +2,7 @@ process FASTQC { tag "$meta.id" label 'process_medium' - conda "bioconda::fastqc=0.12.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' : 'biocontainers/fastqc:0.12.1--hdfd78af_0' }" @@ -25,6 +25,14 @@ process FASTQC { 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(' ') + + // 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.cpu allows to stick to requested amount of RAM in the label + def memory_in_mb = MemoryUnit.of("${task.memory}").toUnit('MB') / task.cpus + // FastQC memory value allowed range (100 - 10000) + def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) + """ printf "%s %s\\n" $rename_to | while read old_name new_name; do [ -f "\${new_name}" ] || ln -s \$old_name \$new_name @@ -33,6 +41,7 @@ process FASTQC { fastqc \\ $args \\ --threads $task.cpus \\ + --memory $fastqc_memory \\ $renamed_files cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index 4da5bb5a0..ee5507e06 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -50,3 +50,8 @@ authors: - "@grst" - "@ewels" - "@FelixKrueger" +maintainers: + - "@drpatelh" + - "@grst" + - "@ewels" + - "@FelixKrueger" diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test index badb67161..a67f92777 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test +++ b/modules/nf-core/fastqc/tests/main.nf.test @@ -1,39 +1,304 @@ nextflow_process { name "Test Process FASTQC" - script "modules/nf-core/fastqc/main.nf" + script "../main.nf" process "FASTQC" - tag "fastqc" - tag "modules_nfcore" - test("Single-Read") { + test("sarscov2 single-end [fastq]") { when { - params { - outdir = "$outputDir" + 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(process.out.versions).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(process.out.versions).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(process.out.versions).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(process.out.versions).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(process.out.versions).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(process.out.versions).match() } + ) + } + } + + test("sarscov2 single-end [fastq] - stub") { + + options "-stub" + when { process { """ - input[0] = [ + input[0] = Channel.of([ [ id: 'test', single_end:true ], - [ - file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: 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 }, - // 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.get(0).get(1) ==~ ".*/test_fastqc.html" }, - { assert path(process.out.html.get(0).get(1)).getText().contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match("versions") }, - { assert process.out.zip.get(0).get(1) ==~ ".*/test_fastqc.zip" } + { 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 index 636a32cea..d5db3092f 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test.snap +++ b/modules/nf-core/fastqc/tests/main.nf.test.snap @@ -1,10 +1,392 @@ { - "versions": { + "sarscov2 custom_prefix": { "content": [ [ "versions.yml:md5,e1cc25ca8af856014824abd842e93978" ] ], - "timestamp": "2023-10-09T23:40:54+0000" + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:02:16.374038" + }, + "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": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "html": [ + [ + { + "id": "test", + "single_end": true + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "zip": [ + [ + { + "id": "test", + "single_end": true + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:02:24.993809" + }, + "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": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "html": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "zip": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:03:10.93942" + }, + "sarscov2 interleaved [fastq]": { + "content": [ + [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:01:42.355718" + }, + "sarscov2 paired-end [bam]": { + "content": [ + [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:01:53.276274" + }, + "sarscov2 multiple [fastq]": { + "content": [ + [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:02:05.527626" + }, + "sarscov2 paired-end [fastq]": { + "content": [ + [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:01:31.188871" + }, + "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": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:02:34.273566" + }, + "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": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:03:02.304411" + }, + "sarscov2 single-end [fastq]": { + "content": [ + [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:01:19.095607" + }, + "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": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:02:44.640184" + }, + "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": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:02:53.550742" } } \ No newline at end of file diff --git a/modules/nf-core/fq/subsample/environment.yml b/modules/nf-core/fq/subsample/environment.yml new file mode 100644 index 000000000..c588de38a --- /dev/null +++ b/modules/nf-core/fq/subsample/environment.yml @@ -0,0 +1,7 @@ +name: fq_subsample +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::fq=0.9.1 diff --git a/modules/nf-core/fq/subsample/main.nf b/modules/nf-core/fq/subsample/main.nf index 8b4ff5be0..a8e647bb1 100644 --- a/modules/nf-core/fq/subsample/main.nf +++ b/modules/nf-core/fq/subsample/main.nf @@ -2,7 +2,7 @@ process FQ_SUBSAMPLE { tag "$meta.id" label 'process_single' - conda "bioconda::fq=0.9.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/fq:0.9.1--h9ee0642_0': 'biocontainers/fq:0.9.1--h9ee0642_0' }" @@ -52,4 +52,16 @@ process FQ_SUBSAMPLE { fq: \$(echo \$(fq subsample --version | sed 's/fq-subsample //g')) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo '' | gzip > ${prefix}_R1.fastq.gz + echo '' | gzip > ${prefix}_R2.fastq.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fq: \$(echo \$(fq subsample --version | sed 's/fq-subsample //g')) + END_VERSIONS + """ } diff --git a/modules/nf-core/fq/subsample/meta.yml b/modules/nf-core/fq/subsample/meta.yml index 9d93f8df0..6c5e87f3e 100644 --- a/modules/nf-core/fq/subsample/meta.yml +++ b/modules/nf-core/fq/subsample/meta.yml @@ -2,16 +2,15 @@ name: "fq_subsample" description: fq subsample outputs a subset of records from single or paired FASTQ files. This requires a seed (--seed) to be set in ext.args. keywords: - fastq - - sample + - fq + - subsample tools: - "fq": description: "fq is a library to generate and validate FASTQ file pairs." homepage: "https://github.com/stjude-rust-labs/fq" documentation: "https://github.com/stjude-rust-labs/fq" tool_dev_url: "https://github.com/stjude-rust-labs/fq" - - licence: "['MIT']" - + licence: ["MIT"] input: - meta: type: map @@ -22,7 +21,6 @@ input: type: file description: FASTQ file pattern: "*.{fq,fastq}{,.gz}" - output: - meta: type: map @@ -37,6 +35,7 @@ output: type: file description: Randomly sampled FASTQ files. pattern: "*_R[12].fastq.gz" - authors: - "@adamrtalbot" +maintainers: + - "@adamrtalbot" diff --git a/modules/nf-core/fq/subsample/tests/main.nf.test b/modules/nf-core/fq/subsample/tests/main.nf.test new file mode 100644 index 000000000..13bb75945 --- /dev/null +++ b/modules/nf-core/fq/subsample/tests/main.nf.test @@ -0,0 +1,206 @@ +nextflow_process { + + name "Test Process FQ_SUBSAMPLE" + script "../main.nf" + process "FQ_SUBSAMPLE" + + test("test_fq_subsample_no_args") { + config "./nextflow_no_args.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/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("test_fq_subsample_probability") { + config "./nextflow_probability.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/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("test_fq_subsample_probability - stub") { + config "./nextflow_probability.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/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("test_fq_subsample_record_count") { + config "./nextflow_record_count.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/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("test_fq_subsample_record_count - stub") { + config "./nextflow_record_count.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/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("test_fq_subsample_single") { + config "./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/fastq/test_1.fastq.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_fq_subsample_single - 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/fastq/test_1.fastq.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_fq_subsample_no_input") { + config "./nextflow.config" + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [] + ]) + """ + } + } + + then { + assertAll ( + { assert !process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} \ No newline at end of file diff --git a/modules/nf-core/fq/subsample/tests/main.nf.test.snap b/modules/nf-core/fq/subsample/tests/main.nf.test.snap new file mode 100644 index 000000000..739c626d7 --- /dev/null +++ b/modules/nf-core/fq/subsample/tests/main.nf.test.snap @@ -0,0 +1,411 @@ +{ + "test_fq_subsample_probability - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "versions": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T08:26:12.163153" + }, + "test_fq_subsample_probability": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,19326ff922a16c0cb81191f2a0a5c5fc", + "test_R2.fastq.gz:md5,ce7ff46296d89b68521ad55a3588bcfe" + ] + ] + ], + "1": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,19326ff922a16c0cb81191f2a0a5c5fc", + "test_R2.fastq.gz:md5,ce7ff46296d89b68521ad55a3588bcfe" + ] + ] + ], + "versions": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-01-17T17:57:15.446336" + }, + "test_fq_subsample_single - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "versions": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T08:26:55.736374" + }, + "test_fq_subsample_no_args - sub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "versions": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T08:25:42.190405" + }, + "test_fq_subsample_record_count": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,394c7a233f1c1c1a167a34cf2895d26d", + "test_R2.fastq.gz:md5,32724cbdb5ab954a0a659ebcd56ca422" + ] + ] + ], + "1": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,394c7a233f1c1c1a167a34cf2895d26d", + "test_R2.fastq.gz:md5,32724cbdb5ab954a0a659ebcd56ca422" + ] + ] + ], + "versions": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-01-17T17:57:23.920058" + }, + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "versions": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-20T17:16:10.090213" + }, + "test_fq_subsample_single": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastq.gz:md5,19326ff922a16c0cb81191f2a0a5c5fc" + ] + ], + "1": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastq.gz:md5,19326ff922a16c0cb81191f2a0a5c5fc" + ] + ], + "versions": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-01-17T17:57:31.908993" + }, + "test_fq_subsample_no_args": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "fastq": [ + + ], + "versions": [ + + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-10-17T11:17:09.761156" + }, + "test_fq_subsample_no_input": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "fastq": [ + + ], + "versions": [ + + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-10-17T11:17:37.555824" + }, + "test_fq_subsample_record_count - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "versions": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T08:26:33.873553" + }, + "test_fq_subsample_no_input - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "versions": [ + "versions.yml:md5,ffbf935bd0de512fbc9e83b187bf924f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T08:27:21.793136" + } +} \ No newline at end of file diff --git a/modules/nf-core/fq/subsample/tests/nextflow.config b/modules/nf-core/fq/subsample/tests/nextflow.config new file mode 100644 index 000000000..41edd9f1d --- /dev/null +++ b/modules/nf-core/fq/subsample/tests/nextflow.config @@ -0,0 +1,7 @@ +process { + + withName: FQ_SUBSAMPLE { + ext.args = '--probability 0.1 -s 123' + } + +} diff --git a/modules/nf-core/fq/subsample/tests/nextflow_no_args.config b/modules/nf-core/fq/subsample/tests/nextflow_no_args.config new file mode 100644 index 000000000..88990d20c --- /dev/null +++ b/modules/nf-core/fq/subsample/tests/nextflow_no_args.config @@ -0,0 +1,7 @@ +process { + + withName: FQ_SUBSAMPLE { + ext.args = '' + } + +} diff --git a/modules/nf-core/fq/subsample/tests/nextflow_probability.config b/modules/nf-core/fq/subsample/tests/nextflow_probability.config new file mode 100644 index 000000000..8cde0c77c --- /dev/null +++ b/modules/nf-core/fq/subsample/tests/nextflow_probability.config @@ -0,0 +1,7 @@ +process { + + withName: FQ_SUBSAMPLE { + ext.args = '-p 0.1 -s 123' + } + +} diff --git a/modules/nf-core/fq/subsample/tests/nextflow_record_count.config b/modules/nf-core/fq/subsample/tests/nextflow_record_count.config new file mode 100644 index 000000000..1ea624e54 --- /dev/null +++ b/modules/nf-core/fq/subsample/tests/nextflow_record_count.config @@ -0,0 +1,7 @@ +process { + + withName: FQ_SUBSAMPLE { + ext.args = '-n 10 -s 123' + } + +} diff --git a/modules/nf-core/gffread/environment.yml b/modules/nf-core/gffread/environment.yml new file mode 100644 index 000000000..c6df58ad0 --- /dev/null +++ b/modules/nf-core/gffread/environment.yml @@ -0,0 +1,7 @@ +name: gffread +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::gffread=0.12.7 diff --git a/modules/nf-core/gffread/main.nf b/modules/nf-core/gffread/main.nf index 68f8045b5..da55cbab7 100644 --- a/modules/nf-core/gffread/main.nf +++ b/modules/nf-core/gffread/main.nf @@ -1,30 +1,57 @@ process GFFREAD { - tag "$gff" + 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/gffread:0.12.1--h8b12597_0' : - 'biocontainers/gffread:0.12.1--h8b12597_0' }" + 'https://depot.galaxyproject.org/singularity/gffread:0.12.7--hdcf5f25_4' : + 'biocontainers/gffread:0.12.7--hdcf5f25_4' }" input: - path gff + tuple val(meta), path(gff) + path fasta output: - path "*.gtf" , emit: gtf - path "versions.yml" , emit: versions + tuple val(meta), path("*.gtf") , emit: gtf , optional: true + tuple val(meta), path("*.gff3") , emit: gffread_gff , optional: true + tuple val(meta), path("*.fasta"), emit: gffread_fasta , optional: true + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${gff.baseName}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("-T") ? 'gtf' : ( ( ['-w', '-x', '-y' ].any { args.contains(it) } ) ? 'fasta' : 'gff3' ) + def fasta_arg = fasta ? "-g $fasta" : '' + def output_name = "${prefix}.${extension}" + def output = extension == "fasta" ? "$output_name" : "-o $output_name" + def args_sorted = args.replaceAll(/(.*)(-[wxy])(.*)/) { all, pre, param, post -> "$pre $post $param" }.trim() + // args_sorted = Move '-w', '-x', and '-y' to the end of the args string as gffread expects the file name after these parameters + if ( "$output_name" in [ "$gff", "$fasta" ] ) error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" """ gffread \\ $gff \\ - $args \\ - -o ${prefix}.gtf + $fasta_arg \\ + $args_sorted \\ + $output + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gffread: \$(gffread --version 2>&1) + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("-T") ? 'gtf' : ( ( ['-w', '-x', '-y' ].any { args.contains(it) } ) ? 'fasta' : 'gff3' ) + def output_name = "${prefix}.${extension}" + if ( "$output_name" in [ "$gff", "$fasta" ] ) error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + """ + touch $output_name + cat <<-END_VERSIONS > versions.yml "${task.process}": gffread: \$(gffread --version 2>&1) diff --git a/modules/nf-core/gffread/meta.yml b/modules/nf-core/gffread/meta.yml index f486f8bb5..c06028208 100644 --- a/modules/nf-core/gffread/meta.yml +++ b/modules/nf-core/gffread/meta.yml @@ -13,20 +13,43 @@ tools: doi: 10.12688/f1000research.23297.1 licence: ["MIT"] input: + - meta: + type: map + description: | + Groovy Map containing meta data + e.g. [ id:'test' ] - gff: type: file description: A reference file in either the GFF3, GFF2 or GTF format. pattern: "*.{gff, gtf}" + - fasta: + type: file + description: A multi-fasta file with the genomic sequences + pattern: "*.{fasta,fa,faa,fas,fsa}" output: + - meta: + type: map + description: | + Groovy Map containing meta data + e.g. [ id:'test' ] - gtf: type: file - description: GTF file resulting from the conversion of the GFF input file + description: GTF file resulting from the conversion of the GFF input file if '-T' argument is present pattern: "*.{gtf}" + - gffread_gff: + type: file + description: GFF3 file resulting from the conversion of the GFF input file if '-T' argument is absent + pattern: "*.gff3" + - gffread_fasta: + type: file + description: Fasta file produced when either of '-w', '-x', '-y' parameters is present + pattern: "*.fasta" - versions: type: file description: File containing software versions pattern: "versions.yml" authors: - - "@emiller88" + - "@edmundmiller" maintainers: - - "@emiller88" + - "@edmundmiller" + - "@gallvp" diff --git a/modules/nf-core/gffread/tests/main.nf.test b/modules/nf-core/gffread/tests/main.nf.test new file mode 100644 index 000000000..e03820f4d --- /dev/null +++ b/modules/nf-core/gffread/tests/main.nf.test @@ -0,0 +1,219 @@ +nextflow_process { + + name "Test Process GFFREAD" + script "../main.nf" + process "GFFREAD" + + test("sarscov2-gff3-gtf") { + + config "./nextflow.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = [] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.gffread_gff == [] }, + { assert process.out.gffread_fasta == [] } + ) + } + + } + + test("sarscov2-gff3-gtf-stub") { + + options '-stub' + config "./nextflow.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = [] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.gffread_gff == [] }, + { assert process.out.gffread_fasta == [] } + ) + } + + } + + test("sarscov2-gff3-gff3") { + + config "./nextflow-gff3.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = [] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.gtf == [] }, + { assert process.out.gffread_fasta == [] } + ) + } + + } + + test("sarscov2-gff3-gff3-stub") { + + options '-stub' + config "./nextflow-gff3.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = [] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.gtf == [] }, + { assert process.out.gffread_fasta == [] } + ) + } + + } + + test("sarscov2-gff3-fasta") { + + config "./nextflow-fasta.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.gtf == [] }, + { assert process.out.gffread_gff == [] } + ) + } + + } + + test("sarscov2-gff3-fasta-stub") { + + options '-stub' + config "./nextflow-fasta.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.gtf == [] }, + { assert process.out.gffread_gff == [] } + ) + } + + } + + test("sarscov2-gff3-fasta-fail-catch") { + + options '-stub' + config "./nextflow-fasta.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [id: 'genome'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gff3", checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) + """ + } + } + + then { + assertAll ( + { assert ! process.success }, + { assert process.stdout.toString().contains("Input and output names are the same") } + ) + } + + } + +} diff --git a/modules/nf-core/gffread/tests/main.nf.test.snap b/modules/nf-core/gffread/tests/main.nf.test.snap new file mode 100644 index 000000000..15262320d --- /dev/null +++ b/modules/nf-core/gffread/tests/main.nf.test.snap @@ -0,0 +1,272 @@ +{ + "sarscov2-gff3-gtf": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.gtf:md5,1ea0ae98d3388e0576407dc4a24ef428" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,05f671c6c6e530acedad0af0a5948dbd" + ], + "gffread_fasta": [ + + ], + "gffread_gff": [ + + ], + "gtf": [ + [ + { + "id": "test" + }, + "test.gtf:md5,1ea0ae98d3388e0576407dc4a24ef428" + ] + ], + "versions": [ + "versions.yml:md5,05f671c6c6e530acedad0af0a5948dbd" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-09T10:48:56.496187" + }, + "sarscov2-gff3-gff3": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "test.gff3:md5,c4e5da6267c6bee5899a2c204ae1ad91" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,05f671c6c6e530acedad0af0a5948dbd" + ], + "gffread_fasta": [ + + ], + "gffread_gff": [ + [ + { + "id": "test" + }, + "test.gff3:md5,c4e5da6267c6bee5899a2c204ae1ad91" + ] + ], + "gtf": [ + + ], + "versions": [ + "versions.yml:md5,05f671c6c6e530acedad0af0a5948dbd" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-09T10:49:00.892782" + }, + "sarscov2-gff3-gtf-stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,05f671c6c6e530acedad0af0a5948dbd" + ], + "gffread_fasta": [ + + ], + "gffread_gff": [ + + ], + "gtf": [ + [ + { + "id": "test" + }, + "test.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,05f671c6c6e530acedad0af0a5948dbd" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-09T11:11:26.975666" + }, + "sarscov2-gff3-fasta-stub": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,05f671c6c6e530acedad0af0a5948dbd" + ], + "gffread_fasta": [ + [ + { + "id": "test" + }, + "test.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gffread_gff": [ + + ], + "gtf": [ + + ], + "versions": [ + "versions.yml:md5,05f671c6c6e530acedad0af0a5948dbd" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-09T11:11:44.34792" + }, + "sarscov2-gff3-gff3-stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "test.gff3:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,05f671c6c6e530acedad0af0a5948dbd" + ], + "gffread_fasta": [ + + ], + "gffread_gff": [ + [ + { + "id": "test" + }, + "test.gff3:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gtf": [ + + ], + "versions": [ + "versions.yml:md5,05f671c6c6e530acedad0af0a5948dbd" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-09T11:11:35.221671" + }, + "sarscov2-gff3-fasta": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test.fasta:md5,5f8108fb51739a0588ccf0a251de919a" + ] + ], + "3": [ + "versions.yml:md5,05f671c6c6e530acedad0af0a5948dbd" + ], + "gffread_fasta": [ + [ + { + "id": "test" + }, + "test.fasta:md5,5f8108fb51739a0588ccf0a251de919a" + ] + ], + "gffread_gff": [ + + ], + "gtf": [ + + ], + "versions": [ + "versions.yml:md5,05f671c6c6e530acedad0af0a5948dbd" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-09T10:54:02.88143" + } +} \ No newline at end of file diff --git a/modules/nf-core/gffread/tests/nextflow-fasta.config b/modules/nf-core/gffread/tests/nextflow-fasta.config new file mode 100644 index 000000000..ac6cb1484 --- /dev/null +++ b/modules/nf-core/gffread/tests/nextflow-fasta.config @@ -0,0 +1,5 @@ +process { + withName: GFFREAD { + ext.args = '-w -S' + } +} diff --git a/modules/nf-core/gffread/tests/nextflow-gff3.config b/modules/nf-core/gffread/tests/nextflow-gff3.config new file mode 100644 index 000000000..afe0830e5 --- /dev/null +++ b/modules/nf-core/gffread/tests/nextflow-gff3.config @@ -0,0 +1,5 @@ +process { + withName: GFFREAD { + ext.args = '' + } +} diff --git a/modules/nf-core/gffread/tests/nextflow.config b/modules/nf-core/gffread/tests/nextflow.config new file mode 100644 index 000000000..74b25094f --- /dev/null +++ b/modules/nf-core/gffread/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: GFFREAD { + ext.args = '-T' + } +} diff --git a/modules/nf-core/gunzip/environment.yml b/modules/nf-core/gunzip/environment.yml new file mode 100644 index 000000000..dfc02a7b5 --- /dev/null +++ b/modules/nf-core/gunzip/environment.yml @@ -0,0 +1,9 @@ +name: gunzip +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::grep=3.11 + - conda-forge::sed=4.8 + - conda-forge::tar=1.34 diff --git a/modules/nf-core/gunzip/main.nf b/modules/nf-core/gunzip/main.nf index 73bf08cde..5e67e3b9b 100644 --- a/modules/nf-core/gunzip/main.nf +++ b/modules/nf-core/gunzip/main.nf @@ -2,10 +2,10 @@ process GUNZIP { tag "$archive" label 'process_single' - conda "conda-forge::sed=4.7" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'nf-core/ubuntu:20.04' }" + 'https://depot.galaxyproject.org/singularity/ubuntu:22.04' : + 'nf-core/ubuntu:22.04' }" input: tuple val(meta), path(archive) @@ -18,8 +18,11 @@ process GUNZIP { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - gunzip = archive.toString() - '.gz' + def args = task.ext.args ?: '' + def extension = ( archive.toString() - '.gz' ).tokenize('.')[-1] + def name = archive.toString() - '.gz' - ".$extension" + def prefix = task.ext.prefix ?: name + gunzip = prefix + ".$extension" """ # Not calling gunzip itself because it creates files # with the original group ownership rather than the @@ -37,7 +40,11 @@ process GUNZIP { """ stub: - gunzip = archive.toString() - '.gz' + def args = task.ext.args ?: '' + def extension = ( archive.toString() - '.gz' ).tokenize('.')[-1] + def name = archive.toString() - '.gz' - ".$extension" + def prefix = task.ext.prefix ?: name + gunzip = prefix + ".$extension" """ touch $gunzip cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/gunzip/meta.yml b/modules/nf-core/gunzip/meta.yml index 4cdcdf4c4..f32973a0a 100644 --- a/modules/nf-core/gunzip/meta.yml +++ b/modules/nf-core/gunzip/meta.yml @@ -33,3 +33,8 @@ authors: - "@joseespinosa" - "@drpatelh" - "@jfy133" +maintainers: + - "@joseespinosa" + - "@drpatelh" + - "@jfy133" + - "@gallvp" diff --git a/modules/nf-core/gunzip/tests/main.nf.test b/modules/nf-core/gunzip/tests/main.nf.test new file mode 100644 index 000000000..384edf226 --- /dev/null +++ b/modules/nf-core/gunzip/tests/main.nf.test @@ -0,0 +1,118 @@ +nextflow_process { + + name "Test Process GUNZIP" + script "../main.nf" + process "GUNZIP" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + ) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("Should run without failures - prefix") { + + config './nextflow.config' + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + ) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("Should run without failures - stub") { + + options '-stub' + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + ) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("Should run without failures - prefix - stub") { + + options '-stub' + config './nextflow.config' + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + ) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/gunzip/tests/main.nf.test.snap b/modules/nf-core/gunzip/tests/main.nf.test.snap new file mode 100644 index 000000000..069967e76 --- /dev/null +++ b/modules/nf-core/gunzip/tests/main.nf.test.snap @@ -0,0 +1,134 @@ +{ + "Should run without failures - prefix - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.xyz.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,54376d32aca20e937a4ec26dac228e84" + ], + "gunzip": [ + [ + { + "id": "test" + }, + "test.xyz.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,54376d32aca20e937a4ec26dac228e84" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-25T11:35:10.861293" + }, + "Should run without failures - stub": { + "content": [ + { + "0": [ + [ + [ + + ], + "test_1.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,54376d32aca20e937a4ec26dac228e84" + ], + "gunzip": [ + [ + [ + + ], + "test_1.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,54376d32aca20e937a4ec26dac228e84" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-25T11:35:05.857145" + }, + "Should run without failures": { + "content": [ + { + "0": [ + [ + [ + + ], + "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "1": [ + "versions.yml:md5,54376d32aca20e937a4ec26dac228e84" + ], + "gunzip": [ + [ + [ + + ], + "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "versions": [ + "versions.yml:md5,54376d32aca20e937a4ec26dac228e84" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-10-17T15:35:37.690477896" + }, + "Should run without failures - prefix": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.xyz.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "1": [ + "versions.yml:md5,54376d32aca20e937a4ec26dac228e84" + ], + "gunzip": [ + [ + { + "id": "test" + }, + "test.xyz.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "versions": [ + "versions.yml:md5,54376d32aca20e937a4ec26dac228e84" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-25T11:33:32.921739" + } +} \ No newline at end of file diff --git a/modules/nf-core/gunzip/tests/nextflow.config b/modules/nf-core/gunzip/tests/nextflow.config new file mode 100644 index 000000000..dec776425 --- /dev/null +++ b/modules/nf-core/gunzip/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: GUNZIP { + ext.prefix = { "${meta.id}.xyz" } + } +} diff --git a/modules/nf-core/hisat2/align/environment.yml b/modules/nf-core/hisat2/align/environment.yml new file mode 100644 index 000000000..0c1415f94 --- /dev/null +++ b/modules/nf-core/hisat2/align/environment.yml @@ -0,0 +1,8 @@ +name: hisat2_align +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::hisat2=2.2.1 + - bioconda::samtools=1.16.1 diff --git a/modules/nf-core/hisat2/align/main.nf b/modules/nf-core/hisat2/align/main.nf index db8e8bb6d..ea186f62a 100644 --- a/modules/nf-core/hisat2/align/main.nf +++ b/modules/nf-core/hisat2/align/main.nf @@ -3,7 +3,7 @@ process HISAT2_ALIGN { label 'process_high' // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. - conda "bioconda::hisat2=2.2.1 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-a97e90b3b802d1da3d6958e0867610c718cb5eb1:2cdf6bf1e92acbeb9b2834b1c58754167173a410-0' : 'biocontainers/mulled-v2-a97e90b3b802d1da3d6958e0867610c718cb5eb1:2cdf6bf1e92acbeb9b2834b1c58754167173a410-0' }" @@ -90,4 +90,23 @@ process HISAT2_ALIGN { END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def unaligned = params.save_unaligned ? "echo '' | gzip > ${prefix}.unmapped_1.fastq.gz \n echo '' | gzip > ${prefix}.unmapped_2.fastq.gz" : '' + def VERSION = '2.2.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + """ + ${unaligned} + + touch ${prefix}.hisat2.summary.log + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + hisat2: $VERSION + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + } diff --git a/modules/nf-core/hisat2/align/meta.yml b/modules/nf-core/hisat2/align/meta.yml index 008a9611f..b23eab75b 100644 --- a/modules/nf-core/hisat2/align/meta.yml +++ b/modules/nf-core/hisat2/align/meta.yml @@ -5,7 +5,6 @@ keywords: - fasta - genome - reference - tools: - hisat2: description: HISAT2 is a fast and sensitive alignment program for mapping next-generation sequencing reads (both DNA and RNA) to a population of human genomes as well as to a single reference genome. @@ -13,7 +12,6 @@ tools: documentation: https://daehwankimlab.github.io/hisat2/manual/ doi: "10.1038/s41587-019-0201-4" licence: ["MIT"] - input: - meta: type: map @@ -43,7 +41,6 @@ input: type: file description: Splices sites in gtf file pattern: "*.{txt}" - output: - meta: type: map @@ -62,7 +59,9 @@ output: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@ntoda03" - "@ramprasadn" +maintainers: + - "@ntoda03" + - "@ramprasadn" diff --git a/modules/nf-core/hisat2/align/tests/main.nf.test b/modules/nf-core/hisat2/align/tests/main.nf.test new file mode 100644 index 000000000..8193c82d8 --- /dev/null +++ b/modules/nf-core/hisat2/align/tests/main.nf.test @@ -0,0 +1,414 @@ +nextflow_process { + + name "Test Process HISAT2_ALIGN" + script "../main.nf" + process "HISAT2_ALIGN" + + test("Single-End") { + + setup { + run("HISAT2_EXTRACTSPLICESITES") { + script "../../extractsplicesites/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + """ + } + } + + run("HISAT2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = Channel.of([ [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + input[2] = HISAT2_EXTRACTSPLICESITES.out.txt + """ + } + } + } + + when { + params { + outdir = "$outputDir" + } + process { + """ + 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] = HISAT2_BUILD.out.index + input[2] = HISAT2_EXTRACTSPLICESITES.out.txt + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.summary).match("se_summary") }, + { assert snapshot(process.out.fastq).match("se_fastq") }, + { assert snapshot(process.out.versions).match("se_versions") } + ) + } + } + + test("Single-End - stub") { + options "-stub" + + setup { + run("HISAT2_EXTRACTSPLICESITES") { + script "../../extractsplicesites/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + """ + } + } + + run("HISAT2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = Channel.of([ [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + input[2] = HISAT2_EXTRACTSPLICESITES.out.txt + """ + } + } + } + + when { + params { + outdir = "$outputDir" + } + process { + """ + 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] = HISAT2_BUILD.out.index + input[2] = HISAT2_EXTRACTSPLICESITES.out.txt + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("Paired-End") { + + setup { + run("HISAT2_EXTRACTSPLICESITES") { + script "../../extractsplicesites/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + """ + } + } + + run("HISAT2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = Channel.of([ [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + input[2] = HISAT2_EXTRACTSPLICESITES.out.txt + """ + } + } + } + + 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/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] = HISAT2_BUILD.out.index + input[2] = HISAT2_EXTRACTSPLICESITES.out.txt + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.summary).match("pe_summary") }, + { assert snapshot(process.out.fastq).match("pe_fastq") }, + { assert snapshot(process.out.versions).match("pe_versions") } + ) + } + } + + test("Paired-End - stub") { + options "-stub" + + setup { + run("HISAT2_EXTRACTSPLICESITES") { + script "../../extractsplicesites/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + """ + } + } + + run("HISAT2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = Channel.of([ [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + input[2] = HISAT2_EXTRACTSPLICESITES.out.txt + """ + } + } + } + + 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/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] = HISAT2_BUILD.out.index + input[2] = HISAT2_EXTRACTSPLICESITES.out.txt + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("Single-End No Splice Sites") { + + setup { + run("HISAT2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = [[:],[]] + input[2] = [[:],[]] + """ + } + } + } + + when { + params { + outdir = "$outputDir" + } + process { + """ + 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] = HISAT2_BUILD.out.index + input[2] = [[:],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.summary).match("se_no_ss_summary") }, + { assert snapshot(process.out.fastq).match("se_no_ss_fastq") }, + { assert snapshot(process.out.versions).match("se_no_ss_versions") } + ) + } + } + + test("Single-End No Splice Sites - stub") { + options "-stub" + + setup { + run("HISAT2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = [[:],[]] + input[2] = [[:],[]] + """ + } + } + } + + when { + params { + outdir = "$outputDir" + } + process { + """ + 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] = HISAT2_BUILD.out.index + input[2] = [[:],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("Paired-End No Splice Sites") { + + setup { + run("HISAT2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = [[:],[]] + input[2] = [[:],[]] + """ + } + } + } + + 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/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] = HISAT2_BUILD.out.index + input[2] = [[:],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.summary).match("pe_no_ss_summary") }, + { assert snapshot(process.out.fastq).match("pe_no_ss_fastq") }, + { assert snapshot(process.out.versions).match("pe_no_ss_versions") } + ) + } + } + + test("Paired-End No Splice Sites - stub") { + options "-stub" + + setup { + run("HISAT2_BUILD") { + script "../../build/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = [[:],[]] + input[2] = [[:],[]] + """ + } + } + } + + 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/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] = HISAT2_BUILD.out.index + input[2] = [[:],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/hisat2/align/tests/main.nf.test.snap b/modules/nf-core/hisat2/align/tests/main.nf.test.snap new file mode 100644 index 000000000..ff670d452 --- /dev/null +++ b/modules/nf-core/hisat2/align/tests/main.nf.test.snap @@ -0,0 +1,406 @@ +{ + "se_versions": { + "content": [ + [ + "versions.yml:md5,ceb638f44ebdaf09ba1f5c5c409585e2" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:08:33.735489" + }, + "Paired-End - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hisat2.summary.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,ceb638f44ebdaf09ba1f5c5c409585e2" + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + + ], + "summary": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hisat2.summary.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,ceb638f44ebdaf09ba1f5c5c409585e2" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:09:14.35626" + }, + "Single-End - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.hisat2.summary.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,ceb638f44ebdaf09ba1f5c5c409585e2" + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + + ], + "summary": [ + [ + { + "id": "test", + "single_end": true + }, + "test.hisat2.summary.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,ceb638f44ebdaf09ba1f5c5c409585e2" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:08:47.404885" + }, + "pe_no_ss_versions": { + "content": [ + [ + "versions.yml:md5,ceb638f44ebdaf09ba1f5c5c409585e2" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:09:52.076955" + }, + "Paired-End No Splice Sites - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hisat2.summary.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,ceb638f44ebdaf09ba1f5c5c409585e2" + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + + ], + "summary": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hisat2.summary.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,ceb638f44ebdaf09ba1f5c5c409585e2" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:10:03.739697" + }, + "pe_no_ss_summary": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.hisat2.summary.log:md5,9839b31db795958cc4b70711a3414e9c" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:09:52.068244" + }, + "pe_no_ss_fastq": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:09:52.072985" + }, + "se_summary": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.hisat2.summary.log:md5,7b8a9e61b7646da1089b041333c41a87" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:08:33.727355" + }, + "pe_summary": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.hisat2.summary.log:md5,9839b31db795958cc4b70711a3414e9c" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:09:01.495439" + }, + "pe_fastq": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:09:01.500755" + }, + "se_fastq": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:08:33.732523" + }, + "se_no_ss_summary": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.hisat2.summary.log:md5,7b8a9e61b7646da1089b041333c41a87" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:09:26.851884" + }, + "se_no_ss_versions": { + "content": [ + [ + "versions.yml:md5,ceb638f44ebdaf09ba1f5c5c409585e2" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:09:26.89234" + }, + "se_no_ss_fastq": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:09:26.871369" + }, + "Single-End No Splice Sites - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.hisat2.summary.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,ceb638f44ebdaf09ba1f5c5c409585e2" + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + + ], + "summary": [ + [ + { + "id": "test", + "single_end": true + }, + "test.hisat2.summary.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,ceb638f44ebdaf09ba1f5c5c409585e2" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:09:39.544807" + }, + "pe_versions": { + "content": [ + [ + "versions.yml:md5,ceb638f44ebdaf09ba1f5c5c409585e2" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:09:01.506346" + } +} \ No newline at end of file diff --git a/modules/nf-core/hisat2/build/environment.yml b/modules/nf-core/hisat2/build/environment.yml new file mode 100644 index 000000000..2e67cd3ea --- /dev/null +++ b/modules/nf-core/hisat2/build/environment.yml @@ -0,0 +1,7 @@ +name: hisat2_build +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::hisat2=2.2.1 diff --git a/modules/nf-core/hisat2/build/main.nf b/modules/nf-core/hisat2/build/main.nf index 90f8efcc6..17d8fdd5b 100644 --- a/modules/nf-core/hisat2/build/main.nf +++ b/modules/nf-core/hisat2/build/main.nf @@ -4,7 +4,7 @@ process HISAT2_BUILD { label 'process_high_memory' // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. - conda "bioconda::hisat2=2.2.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/hisat2:2.2.1--h1b792b2_3' : 'biocontainers/hisat2:2.2.1--h1b792b2_3' }" @@ -61,4 +61,15 @@ process HISAT2_BUILD { hisat2: $VERSION END_VERSIONS """ + + stub: + def VERSION = '2.2.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + """ + mkdir hisat2 + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + hisat2: $VERSION + END_VERSIONS + """ } diff --git a/modules/nf-core/hisat2/build/meta.yml b/modules/nf-core/hisat2/build/meta.yml index e61bf2a3f..6c28eb21c 100644 --- a/modules/nf-core/hisat2/build/meta.yml +++ b/modules/nf-core/hisat2/build/meta.yml @@ -13,7 +13,6 @@ tools: documentation: https://daehwankimlab.github.io/hisat2/manual/ doi: "10.1038/s41587-019-0201-4" licence: ["MIT"] - input: - meta: type: map @@ -42,7 +41,6 @@ input: type: file description: Splices sites in gtf file pattern: "*.{txt}" - output: - meta: type: map @@ -57,6 +55,7 @@ output: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@ntoda03" +maintainers: + - "@ntoda03" diff --git a/modules/nf-core/hisat2/build/tests/main.nf.test b/modules/nf-core/hisat2/build/tests/main.nf.test new file mode 100644 index 000000000..bd8e9dae0 --- /dev/null +++ b/modules/nf-core/hisat2/build/tests/main.nf.test @@ -0,0 +1,93 @@ +nextflow_process { + + name "Test Process HISAT2_BUILD" + script "../main.nf" + process "HISAT2_BUILD" + + test("Should run without failures") { + + setup { + run("HISAT2_EXTRACTSPLICESITES") { + script "../../extractsplicesites/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + """ + } + } + } + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = Channel.of([ [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + input[2] = HISAT2_EXTRACTSPLICESITES.out.txt + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("Should run without failures - stub") { + + options "-stub" + + setup { + run("HISAT2_EXTRACTSPLICESITES") { + script "../../extractsplicesites/main.nf" + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + """ + } + } + } + + when { + params { + outdir = "$outputDir" + } + + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = Channel.of([ [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + input[2] = HISAT2_EXTRACTSPLICESITES.out.txt + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} \ No newline at end of file diff --git a/modules/nf-core/hisat2/build/tests/main.nf.test.snap b/modules/nf-core/hisat2/build/tests/main.nf.test.snap new file mode 100644 index 000000000..0e3b5c57f --- /dev/null +++ b/modules/nf-core/hisat2/build/tests/main.nf.test.snap @@ -0,0 +1,113 @@ +{ + "test - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "index": [ + + ], + "versions": [ + + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-20T17:29:31.567024" + }, + "Should run without failures - stub": { + "content": [ + { + "0": [ + [ + { + "id": "genome" + }, + [ + + ] + ] + ], + "1": [ + "versions.yml:md5,e36ef3cd73d19ccf2378c9358fe942c0" + ], + "index": [ + [ + { + "id": "genome" + }, + [ + + ] + ] + ], + "versions": [ + "versions.yml:md5,e36ef3cd73d19ccf2378c9358fe942c0" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-20T18:18:08.896422" + }, + "Should run without failures": { + "content": [ + { + "0": [ + [ + { + "id": "genome" + }, + [ + "genome.1.ht2:md5,057cfa8a22b97ee9cff4c8d342498803", + "genome.2.ht2:md5,47b153cd1319abc88dda532462651fcf", + "genome.3.ht2:md5,4ed93abba181d8dfab2e303e33114777", + "genome.4.ht2:md5,c25be5f8b0378abf7a58c8a880b87626", + "genome.5.ht2:md5,91198831aaba993acac1734138c5f173", + "genome.6.ht2:md5,265e1284ce85686516fae5d35540994a", + "genome.7.ht2:md5,9013eccd91ad614d7893c739275a394f", + "genome.8.ht2:md5,33cdeccccebe80329f1fdbee7f5874cb" + ] + ] + ], + "1": [ + "versions.yml:md5,e36ef3cd73d19ccf2378c9358fe942c0" + ], + "index": [ + [ + { + "id": "genome" + }, + [ + "genome.1.ht2:md5,057cfa8a22b97ee9cff4c8d342498803", + "genome.2.ht2:md5,47b153cd1319abc88dda532462651fcf", + "genome.3.ht2:md5,4ed93abba181d8dfab2e303e33114777", + "genome.4.ht2:md5,c25be5f8b0378abf7a58c8a880b87626", + "genome.5.ht2:md5,91198831aaba993acac1734138c5f173", + "genome.6.ht2:md5,265e1284ce85686516fae5d35540994a", + "genome.7.ht2:md5,9013eccd91ad614d7893c739275a394f", + "genome.8.ht2:md5,33cdeccccebe80329f1fdbee7f5874cb" + ] + ] + ], + "versions": [ + "versions.yml:md5,e36ef3cd73d19ccf2378c9358fe942c0" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-10-16T14:42:22.381609786" + } +} diff --git a/modules/nf-core/hisat2/extractsplicesites/environment.yml b/modules/nf-core/hisat2/extractsplicesites/environment.yml new file mode 100644 index 000000000..4b03e5e46 --- /dev/null +++ b/modules/nf-core/hisat2/extractsplicesites/environment.yml @@ -0,0 +1,7 @@ +name: hisat2_extractsplicesites +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::hisat2=2.2.1 diff --git a/modules/nf-core/hisat2/extractsplicesites/main.nf b/modules/nf-core/hisat2/extractsplicesites/main.nf index a6e59e202..588a9947a 100644 --- a/modules/nf-core/hisat2/extractsplicesites/main.nf +++ b/modules/nf-core/hisat2/extractsplicesites/main.nf @@ -3,7 +3,7 @@ process HISAT2_EXTRACTSPLICESITES { label 'process_medium' // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. - conda "bioconda::hisat2=2.2.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/hisat2:2.2.1--h1b792b2_3' : 'biocontainers/hisat2:2.2.1--h1b792b2_3' }" @@ -28,4 +28,15 @@ process HISAT2_EXTRACTSPLICESITES { hisat2: $VERSION END_VERSIONS """ + + stub: + def VERSION = '2.2.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + """ + touch ${gtf.baseName}.splice_sites.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + hisat2: $VERSION + END_VERSIONS + """ } diff --git a/modules/nf-core/hisat2/extractsplicesites/meta.yml b/modules/nf-core/hisat2/extractsplicesites/meta.yml index f70de082a..40d77ce00 100644 --- a/modules/nf-core/hisat2/extractsplicesites/meta.yml +++ b/modules/nf-core/hisat2/extractsplicesites/meta.yml @@ -5,7 +5,6 @@ keywords: - gtf - genome - reference - tools: - hisat2: description: HISAT2 is a fast and sensitive alignment program for mapping next-generation sequencing reads (both DNA and RNA) to a population of human genomes as well as to a single reference genome. @@ -13,7 +12,6 @@ tools: documentation: https://daehwankimlab.github.io/hisat2/manual/ doi: "10.1038/s41587-019-0201-4" licence: ["MIT"] - input: - meta: type: map @@ -24,7 +22,6 @@ input: type: file description: Reference gtf annotation file pattern: "*.{gtf}" - output: - meta: type: map @@ -39,7 +36,9 @@ output: type: file description: Splices sites in gtf file pattern: "*.{splice_sites.txt}" - authors: - "@ntoda03" - "@ramprasadn" +maintainers: + - "@ntoda03" + - "@ramprasadn" diff --git a/modules/nf-core/hisat2/extractsplicesites/tests/main.nf.test b/modules/nf-core/hisat2/extractsplicesites/tests/main.nf.test new file mode 100644 index 000000000..a9f93ec52 --- /dev/null +++ b/modules/nf-core/hisat2/extractsplicesites/tests/main.nf.test @@ -0,0 +1,57 @@ +nextflow_process { + + name "Test Process HISAT2_EXTRACTSPLICESITES" + script "../main.nf" + process "HISAT2_EXTRACTSPLICESITES" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path("${process.out.txt[0][1]}").exists() }, + { assert snapshot(process.out.versions).match() } + ) + } + } + + test("test - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [id:'genome'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.gtf', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/hisat2/extractsplicesites/tests/main.nf.test.snap b/modules/nf-core/hisat2/extractsplicesites/tests/main.nf.test.snap new file mode 100644 index 000000000..1dcd8af23 --- /dev/null +++ b/modules/nf-core/hisat2/extractsplicesites/tests/main.nf.test.snap @@ -0,0 +1,47 @@ +{ + "test - stub": { + "content": [ + { + "0": [ + [ + { + "id": "genome" + }, + "genome.splice_sites.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,eeea7231fe197810659b8bad4133aff2" + ], + "txt": [ + [ + { + "id": "genome" + }, + "genome.splice_sites.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,eeea7231fe197810659b8bad4133aff2" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-20T17:34:13.229903" + }, + "Should run without failures": { + "content": [ + [ + "versions.yml:md5,eeea7231fe197810659b8bad4133aff2" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-01-18T20:56:30.71763" + } +} \ No newline at end of file diff --git a/modules/nf-core/kallisto/index/main.nf b/modules/nf-core/kallisto/index/main.nf index 28a47dbeb..bbd226c93 100644 --- a/modules/nf-core/kallisto/index/main.nf +++ b/modules/nf-core/kallisto/index/main.nf @@ -34,7 +34,7 @@ process KALLISTO_INDEX { stub: """ - touch kallisto + mkdir kallisto cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/kallisto/index/tests/main.nf.test b/modules/nf-core/kallisto/index/tests/main.nf.test index 97933d697..c5e86e87c 100644 --- a/modules/nf-core/kallisto/index/tests/main.nf.test +++ b/modules/nf-core/kallisto/index/tests/main.nf.test @@ -3,20 +3,16 @@ nextflow_process { name "Test Process KALLISTO_INDEX" script "../main.nf" process "KALLISTO_INDEX" - tag "modules" - tag "modules_nfcore" - tag "kallisto" - tag "kallisto/index" - test("homo_sapiens genome_fasta") { + test("sarscov2 transcriptome.fasta") { when { process { """ - input[0] = [ - [ id:'test_fasta' ], // meta map - [ file(params.test_data['homo_sapiens']['genome']['genome_fasta'], checkIfExists: true) ] - ] + input[0] = Channel.of([ + [ id:'transcriptome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/transcriptome.fasta', checkIfExists: true) + ]) """ } } @@ -27,7 +23,28 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } + test("sarscov2 transcriptome.fasta - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'transcriptome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/transcriptome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } } diff --git a/modules/nf-core/kallisto/index/tests/main.nf.test.snap b/modules/nf-core/kallisto/index/tests/main.nf.test.snap index c0f45ac45..b2891a4a3 100644 --- a/modules/nf-core/kallisto/index/tests/main.nf.test.snap +++ b/modules/nf-core/kallisto/index/tests/main.nf.test.snap @@ -1,13 +1,15 @@ { - "homo_sapiens genome_fasta": { + "sarscov2 transcriptome.fasta - stub": { "content": [ { "0": [ [ { - "id": "test_fasta" + "id": "transcriptome" }, - "kallisto:md5,2dab84e1456201beca5a43f4c514d67c" + [ + + ] ] ], "1": [ @@ -16,9 +18,11 @@ "index": [ [ { - "id": "test_fasta" + "id": "transcriptome" }, - "kallisto:md5,2dab84e1456201beca5a43f4c514d67c" + [ + + ] ] ], "versions": [ @@ -26,6 +30,43 @@ ] } ], - "timestamp": "2023-11-02T09:58:48.83625986" + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T15:27:54.464205" + }, + "sarscov2 transcriptome.fasta": { + "content": [ + { + "0": [ + [ + { + "id": "transcriptome" + }, + "kallisto:md5,ba657b396f8449f5c85b0563cdaa8346" + ] + ], + "1": [ + "versions.yml:md5,178f9b57d4228edc356911d571b958a4" + ], + "index": [ + [ + { + "id": "transcriptome" + }, + "kallisto:md5,ba657b396f8449f5c85b0563cdaa8346" + ] + ], + "versions": [ + "versions.yml:md5,178f9b57d4228edc356911d571b958a4" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-01-19T09:17:56.733532" } } \ No newline at end of file diff --git a/modules/nf-core/kallisto/index/tests/tags.yml b/modules/nf-core/kallisto/index/tests/tags.yml deleted file mode 100644 index 9f47b88a1..000000000 --- a/modules/nf-core/kallisto/index/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -kallisto/index: - - modules/nf-core/kallisto/index/** diff --git a/modules/nf-core/kallisto/quant/main.nf b/modules/nf-core/kallisto/quant/main.nf index f5444d791..acfc8c9c7 100644 --- a/modules/nf-core/kallisto/quant/main.nf +++ b/modules/nf-core/kallisto/quant/main.nf @@ -69,7 +69,13 @@ process KALLISTO_QUANT { """ stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + mkdir -p $prefix + touch ${prefix}.log + touch ${prefix}.run_info.json + cat <<-END_VERSIONS > versions.yml "${task.process}": kallisto: \$(echo \$(kallisto version) | sed "s/kallisto, version //g" ) diff --git a/modules/nf-core/kallisto/quant/tests/main.nf.test b/modules/nf-core/kallisto/quant/tests/main.nf.test index f716e5e6d..ec6e3d60c 100644 --- a/modules/nf-core/kallisto/quant/tests/main.nf.test +++ b/modules/nf-core/kallisto/quant/tests/main.nf.test @@ -3,44 +3,51 @@ nextflow_process { name "Test Process KALLISTO_QUANT" script "../main.nf" process "KALLISTO_QUANT" - tag "modules" - tag "modules_nfcore" - tag "kallisto" - tag "kallisto/quant" setup { run("KALLISTO_INDEX") { script "../../index/main.nf" process { - """ - input[0] = [ - [ id:'test_fasta' ], // meta map - [ file(params.test_data['sarscov2']['genome']['transcriptome_fasta'], checkIfExists: true) ] - ] - """ + """ + input[0] = Channel.of([ + [ id:'transcriptome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/transcriptome.fasta', checkIfExists: true) + ]) + """ + } } + + run("KALLISTO_INDEX", alias: "KALLISTO_INDEX_STUB") { + script "../../index/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'transcriptome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/transcriptome.fasta', checkIfExists: true) + ]) + """ + } } } test("sarscov2 single-end") { - config "./single_end.config" - when { - params{ - outdir = "$outputDir" - } - process { """ - input[0] = [ + gtf = [] + chromosomes = [] + fragment_length = 150 + fragment_length_sd = 75 + + input[0] = Channel.of([ [ id:'test', single_end:true ], - [ file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) ] - ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + ]) input[1] = KALLISTO_INDEX.out.index - input[2] = [] - input[3] = [] - input[4] = 150 - input[5] = 75 + input[2] = gtf + input[3] = chromosomes + input[4] = fragment_length + input[5] = fragment_length_sd """ } } @@ -48,44 +55,109 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(path("$outputDir/kallisto/test/abundance.tsv")).match("abundance_tsv_single") }, - { assert snapshot(process.out.log).match("se_log") }, - { assert snapshot(process.out.versions).match("se_versions") } + { assert snapshot( + path("${process.out.results[0][1]}/abundance.tsv"), + process.out.log, + process.out.versions).match() } ) } } test("sarscov2 paired-end") { - config "./paired_end.config" + when { + process { + """ + gtf = [] + chromosomes = [] + fragment_length = [] + fragment_length_sd = [] + + 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] = KALLISTO_INDEX.out.index + input[2] = gtf + input[3] = chromosomes + input[4] = fragment_length + input[5] = fragment_length_sd + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot( + path("${process.out.results[0][1]}/abundance.tsv"), + process.out.log, + process.out.versions).match() } + ) + } + } + + test("sarscov2 single-end - stub") { + + options "-stub" when { - params{ - outdir = "$outputDir" + process { + """ + gtf = [] + chromosomes = [] + fragment_length = 150 + fragment_length_sd = 75 + + input[0] = Channel.of([ + [ id:'test', single_end:true ], + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + ]) + input[1] = KALLISTO_INDEX_STUB.out.index + input[2] = gtf + input[3] = chromosomes + input[4] = fragment_length + input[5] = fragment_length_sd + """ } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + test("sarscov2 paired-end - stub") { + + options "-stub" + + when { process { """ - input[0] = [ + gtf = [] + chromosomes = [] + fragment_length = [] + fragment_length_sd = [] + + input[0] = Channel.of([ [ 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] = KALLISTO_INDEX.out.index - input[2] = [] - input[3] = [] - input[4] = [] - input[5] = [] + [ 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] = KALLISTO_INDEX_STUB.out.index + input[2] = gtf + input[3] = chromosomes + input[4] = fragment_length + input[5] = fragment_length_sd """ } } then { assertAll( { assert process.success }, - { assert snapshot(path("$outputDir/kallisto/test/abundance.tsv")).match("abundance_tsv_paired") }, - { assert snapshot(process.out.log).match("pe_log") }, - { assert snapshot(process.out.versions).match("pe_versions") } + { assert snapshot(process.out).match() } ) } } diff --git a/modules/nf-core/kallisto/quant/tests/main.nf.test.snap b/modules/nf-core/kallisto/quant/tests/main.nf.test.snap index d59d7f06f..cf0d73304 100644 --- a/modules/nf-core/kallisto/quant/tests/main.nf.test.snap +++ b/modules/nf-core/kallisto/quant/tests/main.nf.test.snap @@ -1,6 +1,7 @@ { - "pe_log": { + "sarscov2 paired-end": { "content": [ + "abundance.tsv:md5,f0a9a2543f8fc0c8442be0a939d70f66", [ [ { @@ -9,26 +10,170 @@ }, "test.log:md5,8a5987f8e779cd12ca708e2212f771f5" ] + ], + [ + "versions.yml:md5,f981ad0cc089194a8fb00a47948eea94" ] ], - "timestamp": "2023-11-02T09:16:05.163403975" + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T15:25:27.043048" }, - "se_versions": { + "sarscov2 paired-end - stub": { "content": [ - [ - "versions.yml:md5,f981ad0cc089194a8fb00a47948eea94" - ] + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.run_info.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,f981ad0cc089194a8fb00a47948eea94" + ], + "json_info": [ + [ + { + "id": "test", + "single_end": false + }, + "test.run_info.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "results": [ + [ + { + "id": "test", + "single_end": false + }, + [ + + ] + ] + ], + "versions": [ + "versions.yml:md5,f981ad0cc089194a8fb00a47948eea94" + ] + } ], - "timestamp": "2023-10-30T22:11:17.982220232" + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T15:26:04.484652" }, - "abundance_tsv_paired": { + "sarscov2 single-end - stub": { "content": [ - "abundance.tsv:md5,f0a9a2543f8fc0c8442be0a939d70f66" + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + [ + + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.run_info.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,f981ad0cc089194a8fb00a47948eea94" + ], + "json_info": [ + [ + { + "id": "test", + "single_end": true + }, + "test.run_info.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "results": [ + [ + { + "id": "test", + "single_end": true + }, + [ + + ] + ] + ], + "versions": [ + "versions.yml:md5,f981ad0cc089194a8fb00a47948eea94" + ] + } ], - "timestamp": "2023-11-02T09:16:05.157883165" + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T15:25:46.479136" }, - "se_log": { + "sarscov2 single-end": { "content": [ + "abundance.tsv:md5,8a4afe91e6a75b4e619daaf664eb7d9b", [ [ { @@ -37,22 +182,15 @@ }, "test.log:md5,9c166f0c50cd4fdbdbf1bff9d5d8aba2" ] - ] - ], - "timestamp": "2023-10-30T22:11:17.973230763" - }, - "abundance_tsv_single": { - "content": [ - "abundance.tsv:md5,8a4afe91e6a75b4e619daaf664eb7d9b" - ], - "timestamp": "2023-11-02T09:01:51.48615229" - }, - "pe_versions": { - "content": [ + ], [ "versions.yml:md5,f981ad0cc089194a8fb00a47948eea94" ] ], - "timestamp": "2023-11-02T09:16:05.168753684" + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T15:25:08.348876" } -} +} \ No newline at end of file diff --git a/modules/nf-core/kallisto/quant/tests/tags.yml b/modules/nf-core/kallisto/quant/tests/tags.yml deleted file mode 100644 index 460936583..000000000 --- a/modules/nf-core/kallisto/quant/tests/tags.yml +++ /dev/null @@ -1,3 +0,0 @@ -kallisto/quant: - - modules/nf-core/kallisto/index/** - - modules/nf-core/kallisto/quant/** diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml new file mode 100644 index 000000000..a31464c97 --- /dev/null +++ b/modules/nf-core/multiqc/environment.yml @@ -0,0 +1,7 @@ +name: multiqc +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::multiqc=1.24.1 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf new file mode 100644 index 000000000..ceaec139e --- /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://depot.galaxyproject.org/singularity/multiqc:1.24.1--pyhdfd78af_0' : + 'biocontainers/multiqc:1.24.1--pyhdfd78af_0' }" + + 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 + touch 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 000000000..382c08cbc --- /dev/null +++ b/modules/nf-core/multiqc/meta.yml @@ -0,0 +1,71 @@ +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"] +input: + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + - extra_multiqc_config: + type: file + description: Second optional config yml for MultiQC. Will override common sections in multiqc_config. + pattern: "*.{yml,yaml}" + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + - 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}" + - sample_names: + type: file + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" +output: + - report: + type: file + description: MultiQC report file + pattern: "multiqc_report.html" + - data: + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + - plots: + type: file + description: Plots created by MultiQC + pattern: "*_data" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@abhi18av" + - "@bunop" + - "@drpatelh" + - "@jfy133" +maintainers: + - "@abhi18av" + - "@bunop" + - "@drpatelh" + - "@jfy133" diff --git a/modules/nf-core/multiqc/nextflow.config b/modules/nf-core/multiqc/nextflow.config new file mode 100644 index 000000000..ac178787c --- /dev/null +++ b/modules/nf-core/multiqc/nextflow.config @@ -0,0 +1,16 @@ +if (!params.skip_multiqc) { + process { + withName: 'MULTIQC' { + ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } + ext.prefix = "multiqc_report" + publishDir = [ + path: { [ + "${params.outdir}/multiqc", + params.skip_alignment? '' : "/${params.aligner}" + ].join('') }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } +} \ No newline at end of file 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 000000000..f815b6de3 --- /dev/null +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -0,0 +1,87 @@ +nextflow_process { + + name "Test Process MULTIQC" + script "../main.nf" + process "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 000000000..83fa080c8 --- /dev/null +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -0,0 +1,41 @@ +{ + "multiqc_versions_single": { + "content": [ + [ + "versions.yml:md5,6eb13f3b11bbcbfc98ad3166420ff760" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-10T12:41:34.562023" + }, + "multiqc_stub": { + "content": [ + [ + "multiqc_report.html", + "multiqc_data", + "multiqc_plots", + "versions.yml:md5,6eb13f3b11bbcbfc98ad3166420ff760" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-10T11:27:11.933869532" + }, + "multiqc_versions_config": { + "content": [ + [ + "versions.yml:md5,6eb13f3b11bbcbfc98ad3166420ff760" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-10T11:26:56.709849369" + } +} diff --git a/modules/nf-core/multiqc/tests/nextflow.config b/modules/nf-core/multiqc/tests/nextflow.config new file mode 100644 index 000000000..c537a6a3e --- /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 000000000..58b795f54 --- /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 ebfa0864d..ad0b29636 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,6 +25,8 @@ 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.' @@ -31,16 +34,16 @@ process PICARD_MARKDUPLICATES { avail_mem = (task.memory.mega*0.8).intValue() } - if ("$bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + 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 @@ -51,10 +54,10 @@ process PICARD_MARKDUPLICATES { stub: def prefix = task.ext.prefix ?: "${meta.id}" - if ("$bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + 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 f7693d2f0..1f0ffe16c 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/picard-markduplicates.diff b/modules/nf-core/picard/markduplicates/picard-markduplicates.diff new file mode 100644 index 000000000..bf684640d --- /dev/null +++ b/modules/nf-core/picard/markduplicates/picard-markduplicates.diff @@ -0,0 +1,25 @@ +Changes in module 'nf-core/picard/markduplicates' +--- modules/nf-core/picard/markduplicates/main.nf ++++ modules/nf-core/picard/markduplicates/main.nf +@@ -4,8 +4,8 @@ + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? +- 'https://depot.galaxyproject.org/singularity/picard:3.2.0--hdfd78af_0' : +- 'biocontainers/picard:3.2.0--hdfd78af_0' }" ++ 'https://depot.galaxyproject.org/singularity/picard:3.1.1--hdfd78af_0' : ++ 'biocontainers/picard:3.1.1--hdfd78af_0' }" + + input: + tuple val(meta), path(reads) + +--- modules/nf-core/picard/markduplicates/environment.yml ++++ modules/nf-core/picard/markduplicates/environment.yml +@@ -4,4 +4,4 @@ + - bioconda + - defaults + dependencies: +- - bioconda::picard=3.2.0 ++ - bioconda::picard=3.1.1 + +************************************************************ 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 000000000..1abea33e3 --- /dev/null +++ b/modules/nf-core/picard/markduplicates/tests/main.nf.test @@ -0,0 +1,169 @@ +nextflow_process { + + name "Test Process PICARD_MARKDUPLICATES" + script "../main.nf" + process "PICARD_MARKDUPLICATES" + config "./nextflow.config" + + 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, + path(process.out.metrics.get(0).get(1)).readLines()[0..2], + process.out.versions) + .match() } + ) + } + } + + test("sarscov2 [sorted bam]") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + input[1] = [ [:], [] ] + input[2] = [ [:], [] ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.bam[0][1]).name, + path(process.out.metrics.get(0).get(1)).readLines()[0..2], + process.out.versions) + .match() } + ) + } + } + + test("homo_sapiens [cram]") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + 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, + path(process.out.metrics.get(0).get(1)).readLines()[0..2], + process.out.versions) + .match() } + ) + } + } + + test("sarscov2 [unsorted bam] - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true) + ]) + input[1] = [ [:], [] ] + input[2] = [ [:], [] ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 [sorted bam] - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + input[1] = [ [:], [] ] + input[2] = [ [:], [] ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("homo_sapiens [cram] - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + 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(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/picard/markduplicates/tests/main.nf.test.snap b/modules/nf-core/picard/markduplicates/tests/main.nf.test.snap new file mode 100644 index 000000000..1a6598aa9 --- /dev/null +++ b/modules/nf-core/picard/markduplicates/tests/main.nf.test.snap @@ -0,0 +1,251 @@ +{ + "sarscov2 [sorted bam] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.marked.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.marked.MarkDuplicates.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + "versions.yml:md5,b699af51b1956f3810f8a7c066e0ab17" + ], + "bai": [ + + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.marked.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + + ], + "metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.marked.MarkDuplicates.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,b699af51b1956f3810f8a7c066e0ab17" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:34:20.663558" + }, + "sarscov2 [unsorted bam] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.marked.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.marked.MarkDuplicates.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + "versions.yml:md5,b699af51b1956f3810f8a7c066e0ab17" + ], + "bai": [ + + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.marked.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + + ], + "metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.marked.MarkDuplicates.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,b699af51b1956f3810f8a7c066e0ab17" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:34:01.021052" + }, + "sarscov2 [unsorted bam]": { + "content": [ + "test.marked.bam", + [ + "## 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" + ], + [ + "versions.yml:md5,b699af51b1956f3810f8a7c066e0ab17" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:32:49.777427" + }, + "sarscov2 [sorted bam]": { + "content": [ + "test.marked.bam", + [ + "## 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" + ], + [ + "versions.yml:md5,b699af51b1956f3810f8a7c066e0ab17" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:33:14.462596" + }, + "homo_sapiens [cram]": { + "content": [ + "test.marked.cram", + [ + "## 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" + ], + [ + "versions.yml:md5,b699af51b1956f3810f8a7c066e0ab17" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:33:40.215159" + }, + "homo_sapiens [cram] - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.marked.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.marked.MarkDuplicates.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + "versions.yml:md5,b699af51b1956f3810f8a7c066e0ab17" + ], + "bai": [ + + ], + "bam": [ + + ], + "cram": [ + [ + { + "id": "test", + "single_end": false + }, + "test.marked.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.marked.MarkDuplicates.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,b699af51b1956f3810f8a7c066e0ab17" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:34:51.753515" + } +} \ 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 000000000..02818dd6e --- /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/preseq/lcextrap/environment.yml b/modules/nf-core/preseq/lcextrap/environment.yml new file mode 100644 index 000000000..57b8b9c67 --- /dev/null +++ b/modules/nf-core/preseq/lcextrap/environment.yml @@ -0,0 +1,7 @@ +name: preseq_lcextrap +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::preseq=3.1.2 diff --git a/modules/nf-core/preseq/lcextrap/main.nf b/modules/nf-core/preseq/lcextrap/main.nf index 12546f0a2..3fec468e9 100644 --- a/modules/nf-core/preseq/lcextrap/main.nf +++ b/modules/nf-core/preseq/lcextrap/main.nf @@ -1,9 +1,9 @@ process PRESEQ_LCEXTRAP { tag "$meta.id" label 'process_single' - label 'error_ignore' + label 'error_retry' - conda "bioconda::preseq=3.1.2" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/preseq:3.1.2--h445547b_2': 'biocontainers/preseq:3.1.2--h445547b_2' }" @@ -21,6 +21,7 @@ process PRESEQ_LCEXTRAP { script: def args = task.ext.args ?: '' + args = task.attempt > 1 ? args.join(' -defects') : args // Disable testing for defects def prefix = task.ext.prefix ?: "${meta.id}" def paired_end = meta.single_end ? '' : '-pe' """ @@ -37,4 +38,16 @@ process PRESEQ_LCEXTRAP { preseq: \$(echo \$(preseq 2>&1) | sed 's/^.*Version: //; s/Usage:.*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.lc_extrap.txt + touch ${prefix}.command.log + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + preseq: \$(echo \$(preseq 2>&1) | sed 's/^.*Version: //; s/Usage:.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/preseq/lcextrap/meta.yml b/modules/nf-core/preseq/lcextrap/meta.yml old mode 100755 new mode 100644 index 1391961c8..c00fa8eef --- a/modules/nf-core/preseq/lcextrap/meta.yml +++ b/modules/nf-core/preseq/lcextrap/meta.yml @@ -10,9 +10,7 @@ tools: homepage: http://smithlabresearch.org/software/preseq/ documentation: http://smithlabresearch.org/wp-content/uploads/manual.pdf tool_dev_url: https://github.com/smithlabcode/preseq - licence: ["GPL"] - input: - meta: type: map @@ -23,7 +21,6 @@ input: type: file description: BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" - output: - meta: type: map @@ -42,7 +39,9 @@ output: type: file description: Log file containing stderr produced by Preseq pattern: "*.{log}" - authors: - "@drpatelh" - - "@Emiller88" + - "@edmundmiller" +maintainers: + - "@drpatelh" + - "@edmundmiller" diff --git a/modules/nf-core/preseq/lcextrap/nextflow.config b/modules/nf-core/preseq/lcextrap/nextflow.config new file mode 100644 index 000000000..e203e87e7 --- /dev/null +++ b/modules/nf-core/preseq/lcextrap/nextflow.config @@ -0,0 +1,21 @@ +if (!params.skip_alignment && !params.skip_qc) { + if (!params.skip_preseq) { + process { + withName: 'PRESEQ_LCEXTRAP' { + ext.args = '-verbose -bam -seed 1 -seg_len 100000000' + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}/preseq" }, + mode: params.publish_dir_mode, + pattern: "*.txt" + ], + [ + path: { "${params.outdir}/${params.aligner}/preseq/log" }, + mode: params.publish_dir_mode, + pattern: "*.log" + ] + ] + } + } + } +} \ No newline at end of file diff --git a/modules/nf-core/preseq/lcextrap/tests/main.nf.test b/modules/nf-core/preseq/lcextrap/tests/main.nf.test new file mode 100644 index 000000000..50e44157e --- /dev/null +++ b/modules/nf-core/preseq/lcextrap/tests/main.nf.test @@ -0,0 +1,96 @@ +nextflow_process { + + name "Test Process PRESEQ_LCEXTRAP" + script "../main.nf" + process "PRESEQ_LCEXTRAP" + + test("sarscov2 - single_end") { + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + 'delete_me/preseq/SRR1003759_5M_subset.mr', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.log[0][1]).name).match("single_end - log") }, + { assert snapshot(process.out.lc_extrap).match("single_end - lc_extrap") }, + { assert snapshot(process.out.versions).match("single_end - versions") } + ) + } + } + + test("sarscov2 - single_end - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + 'delete_me/preseq/SRR1003759_5M_subset.mr', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - paired_end") { + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + 'delete_me/preseq/SRR1003759_5M_subset.mr', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.log[0][1]).name).match("paired_end - log") }, + { assert snapshot(process.out.lc_extrap).match("paired_end - lc_extrap") }, + { assert snapshot(process.out.versions).match("paired_end - versions") } + ) + } + } + + test("sarscov2 - paired_end - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + 'delete_me/preseq/SRR1003759_5M_subset.mr', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} \ No newline at end of file diff --git a/modules/nf-core/preseq/lcextrap/tests/main.nf.test.snap b/modules/nf-core/preseq/lcextrap/tests/main.nf.test.snap new file mode 100644 index 000000000..3f95cd498 --- /dev/null +++ b/modules/nf-core/preseq/lcextrap/tests/main.nf.test.snap @@ -0,0 +1,188 @@ +{ + "single_end - lc_extrap": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.lc_extrap.txt:md5,1fa5cdd601079329618f61660bee00de" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T17:20:40.735535" + }, + "paired_end - log": { + "content": [ + "test.command.log" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T17:20:51.981746" + }, + "single_end - versions": { + "content": [ + [ + "versions.yml:md5,9a62ff1c212c53573808ccd2137b8922" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T17:20:40.74601" + }, + "sarscov2 - single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.lc_extrap.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.command.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,9a62ff1c212c53573808ccd2137b8922" + ], + "lc_extrap": [ + [ + { + "id": "test", + "single_end": true + }, + "test.lc_extrap.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.command.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,9a62ff1c212c53573808ccd2137b8922" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-20T18:43:12.689062" + }, + "paired_end - versions": { + "content": [ + [ + "versions.yml:md5,9a62ff1c212c53573808ccd2137b8922" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T17:20:52.02843" + }, + "single_end - log": { + "content": [ + "test.command.log" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T17:20:40.72985" + }, + "paired_end - lc_extrap": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.lc_extrap.txt:md5,10e5ea860e87fb6f5dc10f4f20c62040" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T17:20:51.998533" + }, + "sarscov2 - paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.lc_extrap.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.command.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,9a62ff1c212c53573808ccd2137b8922" + ], + "lc_extrap": [ + [ + { + "id": "test", + "single_end": false + }, + "test.lc_extrap.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.command.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,9a62ff1c212c53573808ccd2137b8922" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-20T18:43:32.569811" + } +} \ No newline at end of file diff --git a/modules/nf-core/qualimap/rnaseq/environment.yml b/modules/nf-core/qualimap/rnaseq/environment.yml new file mode 100644 index 000000000..590ae85f7 --- /dev/null +++ b/modules/nf-core/qualimap/rnaseq/environment.yml @@ -0,0 +1,7 @@ +name: qualimap_rnaseq +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::qualimap=2.3 diff --git a/modules/nf-core/qualimap/rnaseq/main.nf b/modules/nf-core/qualimap/rnaseq/main.nf index b8a370973..4411d8689 100644 --- a/modules/nf-core/qualimap/rnaseq/main.nf +++ b/modules/nf-core/qualimap/rnaseq/main.nf @@ -2,7 +2,7 @@ process QUALIMAP_RNASEQ { tag "$meta.id" label 'process_medium' - conda "bioconda::qualimap=2.3" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/qualimap:2.3--hdfd78af_0' : 'biocontainers/qualimap:2.3--hdfd78af_0' }" diff --git a/modules/nf-core/qualimap/rnaseq/meta.yml b/modules/nf-core/qualimap/rnaseq/meta.yml index 7738f08d8..6f766e4f5 100644 --- a/modules/nf-core/qualimap/rnaseq/meta.yml +++ b/modules/nf-core/qualimap/rnaseq/meta.yml @@ -50,3 +50,5 @@ output: pattern: "versions.yml" authors: - "@FriederikeHanssen" +maintainers: + - "@FriederikeHanssen" diff --git a/modules/nf-core/qualimap/rnaseq/nextflow.config b/modules/nf-core/qualimap/rnaseq/nextflow.config new file mode 100644 index 000000000..9c05fb25a --- /dev/null +++ b/modules/nf-core/qualimap/rnaseq/nextflow.config @@ -0,0 +1,13 @@ +if (!params.skip_alignment && !params.skip_qc) { + if (!params.skip_qualimap) { + process { + withName: 'QUALIMAP_RNASEQ' { + publishDir = [ + path: { "${params.outdir}/${params.aligner}/qualimap" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } +} diff --git a/modules/nf-core/qualimap/rnaseq/qualimap-rnaseq.diff b/modules/nf-core/qualimap/rnaseq/qualimap-rnaseq.diff deleted file mode 100644 index 48f498081..000000000 --- a/modules/nf-core/qualimap/rnaseq/qualimap-rnaseq.diff +++ /dev/null @@ -1,19 +0,0 @@ -Changes in module 'nf-core/qualimap/rnaseq' ---- modules/nf-core/qualimap/rnaseq/main.nf -+++ modules/nf-core/qualimap/rnaseq/main.nf -@@ -2,10 +2,10 @@ - tag "$meta.id" - label 'process_medium' - -- conda "bioconda::qualimap=2.2.2d" -+ conda "bioconda::qualimap=2.3" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://depot.galaxyproject.org/singularity/qualimap:2.2.2d--1' : -- 'biocontainers/qualimap:2.2.2d--1' }" -+ 'https://depot.galaxyproject.org/singularity/qualimap:2.3--hdfd78af_0' : -+ 'biocontainers/qualimap:2.3--hdfd78af_0' }" - - input: - tuple val(meta), path(bam) - -************************************************************ diff --git a/modules/nf-core/qualimap/rnaseq/tests/main.nf.test b/modules/nf-core/qualimap/rnaseq/tests/main.nf.test new file mode 100644 index 000000000..ff4197eeb --- /dev/null +++ b/modules/nf-core/qualimap/rnaseq/tests/main.nf.test @@ -0,0 +1,61 @@ +nextflow_process { + + name "Test Process QUALIMAP_RNASEQ" + script "../main.nf" + process "QUALIMAP_RNASEQ" + + test("homo_sapiens [bam]") { + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'test_fasta_gtf' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + file("${process.out.results[0][1]}/qualimapReport.html").name, + path("${process.out.results[0][1]}/rnaseq_qc_results.txt"), + process.out.versions + ).match() } + ) + } + } + + test("homo_sapiens [bam] - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'test_fasta_gtf' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/qualimap/rnaseq/tests/main.nf.test.snap b/modules/nf-core/qualimap/rnaseq/tests/main.nf.test.snap new file mode 100644 index 000000000..682462639 --- /dev/null +++ b/modules/nf-core/qualimap/rnaseq/tests/main.nf.test.snap @@ -0,0 +1,55 @@ +{ + "homo_sapiens [bam] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + + ] + ] + ], + "1": [ + "versions.yml:md5,a6868ab89f7d31361a7791db2dea98e7" + ], + "results": [ + [ + { + "id": "test", + "single_end": false + }, + [ + + ] + ] + ], + "versions": [ + "versions.yml:md5,a6868ab89f7d31361a7791db2dea98e7" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:27:41.158111" + }, + "homo_sapiens [bam]": { + "content": [ + "qualimapReport.html", + "rnaseq_qc_results.txt:md5,b77878cac45beaa79a892af54aad2da3", + [ + "versions.yml:md5,a6868ab89f7d31361a7791db2dea98e7" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:27:30.782304" + } +} \ No newline at end of file diff --git a/modules/nf-core/rsem/calculateexpression/environment.yml b/modules/nf-core/rsem/calculateexpression/environment.yml new file mode 100644 index 000000000..b811fa6fe --- /dev/null +++ b/modules/nf-core/rsem/calculateexpression/environment.yml @@ -0,0 +1,8 @@ +name: rsem_calculateexpression +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::rsem=1.3.3 + - bioconda::star=2.7.10a diff --git a/modules/nf-core/rsem/calculateexpression/main.nf b/modules/nf-core/rsem/calculateexpression/main.nf index 54041aedb..40bddc5e5 100644 --- a/modules/nf-core/rsem/calculateexpression/main.nf +++ b/modules/nf-core/rsem/calculateexpression/main.nf @@ -2,7 +2,7 @@ process RSEM_CALCULATEEXPRESSION { tag "$meta.id" label 'process_high' - conda "bioconda::rsem=1.3.3 bioconda::star=2.7.10a" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-cf0123ef83b3c38c13e3b0696a3f285d3f20f15b:64aad4a4e144878400649e71f42105311be7ed87-0' : 'biocontainers/mulled-v2-cf0123ef83b3c38c13e3b0696a3f285d3f20f15b:64aad4a4e144878400649e71f42105311be7ed87-0' }" @@ -54,4 +54,22 @@ process RSEM_CALCULATEEXPRESSION { star: \$(STAR --version | sed -e "s/STAR_//g") END_VERSIONS """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.genes.results + touch ${prefix}.isoforms.results + touch ${prefix}.stat + touch ${prefix}.log + touch ${prefix}.STAR.genome.bam + touch ${prefix}.genome.bam + touch ${prefix}.transcript.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + rsem: \$(rsem-calculate-expression --version | sed -e "s/Current version: RSEM v//g") + star: \$(STAR --version | sed -e "s/STAR_//g") + END_VERSIONS + """ } diff --git a/modules/nf-core/rsem/calculateexpression/meta.yml b/modules/nf-core/rsem/calculateexpression/meta.yml index 680ede2e2..e6d580e9b 100644 --- a/modules/nf-core/rsem/calculateexpression/meta.yml +++ b/modules/nf-core/rsem/calculateexpression/meta.yml @@ -62,3 +62,6 @@ output: authors: - "@drpatelh" - "@kevinmenden" +maintainers: + - "@drpatelh" + - "@kevinmenden" diff --git a/modules/nf-core/rsem/calculateexpression/tests/main.nf.test b/modules/nf-core/rsem/calculateexpression/tests/main.nf.test new file mode 100644 index 000000000..7af876dd8 --- /dev/null +++ b/modules/nf-core/rsem/calculateexpression/tests/main.nf.test @@ -0,0 +1,88 @@ +nextflow_process { + + name "Test Process RSEM_CALCULATEEXPRESSION" + script "../main.nf" + process "RSEM_CALCULATEEXPRESSION" + config "./nextflow.config" + + test("homo_sapiens") { + + setup { + run("RSEM_PREPAREREFERENCE") { + script "../../../rsem/preparereference/main.nf" + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)) + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)) + """ + } + } + } + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [ id:'test', strandedness: 'forward' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = RSEM_PREPAREREFERENCE.out.index + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.counts_gene).match("counts_gene") }, + { assert snapshot(process.out.counts_transcript).match("counts_transcript") }, + { assert snapshot(process.out.stat).match("stat") }, + { assert path(process.out.logs.get(0).get(1)).exists() }, + { assert snapshot(process.out.versions).match("versions") } + ) + } + } + + test("homo_sapiens - stub") { + + options "-stub" + + setup { + run("RSEM_PREPAREREFERENCE") { + script "../../../rsem/preparereference/main.nf" + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)) + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', strandedness: 'forward' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = RSEM_PREPAREREFERENCE.out.index + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/rsem/calculateexpression/tests/main.nf.test.snap b/modules/nf-core/rsem/calculateexpression/tests/main.nf.test.snap new file mode 100644 index 000000000..61647071d --- /dev/null +++ b/modules/nf-core/rsem/calculateexpression/tests/main.nf.test.snap @@ -0,0 +1,215 @@ +{ + "stat": { + "content": [ + [ + [ + { + "id": "test", + "strandedness": "forward" + }, + [ + "test.cnt:md5,76249e6b2f3c104f414aae596ba2c2f4", + "test.model:md5,a7a4bc1734918ef5848604e3362b83e2", + "test.theta:md5,de2e4490c98cc5383a86ae8225fd0a28" + ] + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-22T13:14:18.68683" + }, + "homo_sapiens - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.genes.results:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.isoforms.results:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.stat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + "versions.yml:md5,823e53afe1ff4f3930ae8392f9f8dd5c" + ], + "5": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.STAR.genome.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.genome.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.transcript.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_genome": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.genome.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_star": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.STAR.genome.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_transcript": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.transcript.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "counts_gene": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.genes.results:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "counts_transcript": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.isoforms.results:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "logs": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stat": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.stat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,823e53afe1ff4f3930ae8392f9f8dd5c" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:04:38.064594" + }, + "counts_transcript": { + "content": [ + [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.isoforms.results:md5,99f7f80aa505b44ca429fdebbd7dd5d8" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-22T13:14:18.682898" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,823e53afe1ff4f3930ae8392f9f8dd5c" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-22T13:14:18.700958" + }, + "counts_gene": { + "content": [ + [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.genes.results:md5,c7ec226f76736ea805771e73553ae359" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-22T13:14:18.670998" + } +} \ No newline at end of file diff --git a/modules/nf-core/rsem/calculateexpression/tests/nextflow.config b/modules/nf-core/rsem/calculateexpression/tests/nextflow.config new file mode 100644 index 000000000..b17a1cf2e --- /dev/null +++ b/modules/nf-core/rsem/calculateexpression/tests/nextflow.config @@ -0,0 +1,13 @@ +process { + + publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" } + + withName: RSEM_PREPAREREFERENCE { + ext.args = '--star' + } + + withName: RSEM_CALCULATEEXPRESSION { + ext.args = '--star --star-gzipped-read-file' + } + +} diff --git a/modules/nf-core/rsem/preparereference/environment.yml b/modules/nf-core/rsem/preparereference/environment.yml new file mode 100644 index 000000000..c80e69106 --- /dev/null +++ b/modules/nf-core/rsem/preparereference/environment.yml @@ -0,0 +1,8 @@ +name: rsem_preparereference +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::rsem=1.3.3 + - bioconda::star=2.7.10a diff --git a/modules/nf-core/rsem/preparereference/main.nf b/modules/nf-core/rsem/preparereference/main.nf index 62b93d08a..1acfbdedb 100644 --- a/modules/nf-core/rsem/preparereference/main.nf +++ b/modules/nf-core/rsem/preparereference/main.nf @@ -2,7 +2,7 @@ process RSEM_PREPAREREFERENCE { tag "$fasta" label 'process_high' - conda "bioconda::rsem=1.3.3 bioconda::star=2.7.10a" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-cf0123ef83b3c38c13e3b0696a3f285d3f20f15b:64aad4a4e144878400649e71f42105311be7ed87-0' : 'biocontainers/mulled-v2-cf0123ef83b3c38c13e3b0696a3f285d3f20f15b:64aad4a4e144878400649e71f42105311be7ed87-0' }" @@ -69,4 +69,15 @@ process RSEM_PREPAREREFERENCE { END_VERSIONS """ } + + stub: + """ + touch genome.transcripts.fa + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + rsem: \$(rsem-calculate-expression --version | sed -e "s/Current version: RSEM v//g") + star: \$(STAR --version | sed -e "s/STAR_//g") + END_VERSIONS + """ } diff --git a/modules/nf-core/rsem/preparereference/meta.yml b/modules/nf-core/rsem/preparereference/meta.yml index 3568e1911..05aa44fe6 100644 --- a/modules/nf-core/rsem/preparereference/meta.yml +++ b/modules/nf-core/rsem/preparereference/meta.yml @@ -37,3 +37,6 @@ output: authors: - "@drpatelh" - "@kevinmenden" +maintainers: + - "@drpatelh" + - "@kevinmenden" diff --git a/modules/nf-core/rsem/preparereference/tests/main.nf.test b/modules/nf-core/rsem/preparereference/tests/main.nf.test new file mode 100644 index 000000000..210e03e87 --- /dev/null +++ b/modules/nf-core/rsem/preparereference/tests/main.nf.test @@ -0,0 +1,51 @@ +nextflow_process { + + name "Test Process RSEM_PREPAREREFERENCE" + script "../main.nf" + process "RSEM_PREPAREREFERENCE" + + test("homo_sapiens") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)) + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.index).match("index")}, + { assert snapshot(process.out.transcript_fasta).match("transcript_fasta")}, + { assert snapshot(process.out.versions).match("versions") } + ) + } + } + + test("homo_sapiens - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)) + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/rsem/preparereference/tests/main.nf.test.snap b/modules/nf-core/rsem/preparereference/tests/main.nf.test.snap new file mode 100644 index 000000000..667416bff --- /dev/null +++ b/modules/nf-core/rsem/preparereference/tests/main.nf.test.snap @@ -0,0 +1,80 @@ +{ + "homo_sapiens - stub": { + "content": [ + { + "0": [ + [ + "genome.fasta:md5,f315020d899597c1b57e5fe9f60f4c3e" + ] + ], + "1": [ + "genome.transcripts.fa:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "2": [ + "versions.yml:md5,517611c42f6354d3609db1b35fffa397" + ], + "index": [ + [ + "genome.fasta:md5,f315020d899597c1b57e5fe9f60f4c3e" + ] + ], + "transcript_fasta": [ + "genome.transcripts.fa:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "versions": [ + "versions.yml:md5,517611c42f6354d3609db1b35fffa397" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:00:50.389847" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,517611c42f6354d3609db1b35fffa397" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-22T13:16:49.170587" + }, + "index": { + "content": [ + [ + [ + "genome.chrlist:md5,b190587cae0531f3cf25552d8aa674db", + "genome.fasta:md5,f315020d899597c1b57e5fe9f60f4c3e", + "genome.grp:md5,c2848a8b6d495956c11ec53efc1de67e", + "genome.idx.fa:md5,050c521a2719c2ae48267c1e65218f29", + "genome.n2g.idx.fa:md5,050c521a2719c2ae48267c1e65218f29", + "genome.seq:md5,94da0c6b88c33e63c9a052a11f4f57c1", + "genome.ti:md5,c9e4ae8d4d13a504eec2acf1b8589a66", + "genome.transcripts.fa:md5,050c521a2719c2ae48267c1e65218f29" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-22T13:16:49.140398" + }, + "transcript_fasta": { + "content": [ + [ + "genome.transcripts.fa:md5,050c521a2719c2ae48267c1e65218f29" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-22T13:16:49.159946" + } +} \ No newline at end of file diff --git a/modules/nf-core/rseqc/bamstat/environment.yml b/modules/nf-core/rseqc/bamstat/environment.yml new file mode 100644 index 000000000..e960c9943 --- /dev/null +++ b/modules/nf-core/rseqc/bamstat/environment.yml @@ -0,0 +1,8 @@ +name: rseqc_bamstat +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::rseqc=5.0.3 + - conda-forge::r-base>=3.5 diff --git a/modules/nf-core/rseqc/bamstat/main.nf b/modules/nf-core/rseqc/bamstat/main.nf index 66c9a7451..167240c46 100644 --- a/modules/nf-core/rseqc/bamstat/main.nf +++ b/modules/nf-core/rseqc/bamstat/main.nf @@ -2,7 +2,7 @@ process RSEQC_BAMSTAT { tag "$meta.id" label 'process_medium' - conda "bioconda::rseqc=5.0.3" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" @@ -31,4 +31,15 @@ process RSEQC_BAMSTAT { rseqc: \$(bam_stat.py --version | sed -e "s/bam_stat.py //g") END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam_stat.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + rseqc: \$(bam_stat.py --version | sed -e "s/bam_stat.py //g") + END_VERSIONS + """ } diff --git a/modules/nf-core/rseqc/bamstat/meta.yml b/modules/nf-core/rseqc/bamstat/meta.yml index 2d7fa7996..72745310c 100644 --- a/modules/nf-core/rseqc/bamstat/meta.yml +++ b/modules/nf-core/rseqc/bamstat/meta.yml @@ -35,3 +35,6 @@ output: authors: - "@drpatelh" - "@kevinmenden" +maintainers: + - "@drpatelh" + - "@kevinmenden" diff --git a/modules/nf-core/rseqc/bamstat/rseqc-bamstat.diff b/modules/nf-core/rseqc/bamstat/rseqc-bamstat.diff deleted file mode 100644 index a8ee45a91..000000000 --- a/modules/nf-core/rseqc/bamstat/rseqc-bamstat.diff +++ /dev/null @@ -1,19 +0,0 @@ -Changes in module 'nf-core/rseqc/bamstat' ---- modules/nf-core/rseqc/bamstat/main.nf -+++ modules/nf-core/rseqc/bamstat/main.nf -@@ -2,10 +2,10 @@ - tag "$meta.id" - label 'process_medium' - -- conda "bioconda::rseqc=3.0.1 'conda-forge::r-base>=3.5'" -+ conda "bioconda::rseqc=5.0.3" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://depot.galaxyproject.org/singularity/rseqc:3.0.1--py37h516909a_1' : -- 'biocontainers/rseqc:3.0.1--py37h516909a_1' }" -+ 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : -+ 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" - - input: - tuple val(meta), path(bam) - -************************************************************ diff --git a/modules/nf-core/rseqc/bamstat/tests/main.nf.test b/modules/nf-core/rseqc/bamstat/tests/main.nf.test new file mode 100644 index 000000000..fd6fc0811 --- /dev/null +++ b/modules/nf-core/rseqc/bamstat/tests/main.nf.test @@ -0,0 +1,47 @@ +nextflow_process { + + name "Test Process RSEQC_BAMSTAT" + script "../main.nf" + process "RSEQC_BAMSTAT" + config "./nextflow.config" + + test("sarscov2 - [meta] - bam") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam') + ] + """ + } + } + + then { + assert process.success + assert snapshot(process.out).match() + } + } + + test("sarscov2 - [meta] - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam') + ] + """ + } + } + + then { + assert process.success + assert snapshot(process.out).match() + } + } +} diff --git a/modules/nf-core/rseqc/bamstat/tests/main.nf.test.snap b/modules/nf-core/rseqc/bamstat/tests/main.nf.test.snap new file mode 100644 index 000000000..deae0e80d --- /dev/null +++ b/modules/nf-core/rseqc/bamstat/tests/main.nf.test.snap @@ -0,0 +1,68 @@ +{ + "sarscov2 - [meta] - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bam_stat.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,58f74a7ff9d2966142c81a4a4735dbf3" + ], + "txt": [ + [ + { + "id": "test" + }, + "test.bam_stat.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,58f74a7ff9d2966142c81a4a4735dbf3" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:16:13.970299" + }, + "sarscov2 - [meta] - bam": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bam_stat.txt:md5,2675857864c1d1139b2a19d25dc36b09" + ] + ], + "1": [ + "versions.yml:md5,58f74a7ff9d2966142c81a4a4735dbf3" + ], + "txt": [ + [ + { + "id": "test" + }, + "test.bam_stat.txt:md5,2675857864c1d1139b2a19d25dc36b09" + ] + ], + "versions": [ + "versions.yml:md5,58f74a7ff9d2966142c81a4a4735dbf3" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2023-12-14T17:00:23.830276754" + } +} \ No newline at end of file diff --git a/modules/nf-core/kallisto/quant/tests/paired_end.config b/modules/nf-core/rseqc/bamstat/tests/nextflow.config similarity index 100% rename from modules/nf-core/kallisto/quant/tests/paired_end.config rename to modules/nf-core/rseqc/bamstat/tests/nextflow.config diff --git a/modules/nf-core/rseqc/inferexperiment/environment.yml b/modules/nf-core/rseqc/inferexperiment/environment.yml new file mode 100644 index 000000000..78215985a --- /dev/null +++ b/modules/nf-core/rseqc/inferexperiment/environment.yml @@ -0,0 +1,8 @@ +name: rseqc_inferexperiment +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::rseqc=5.0.3 + - conda-forge::r-base>=3.5 diff --git a/modules/nf-core/rseqc/inferexperiment/main.nf b/modules/nf-core/rseqc/inferexperiment/main.nf index df24d7262..87c676ada 100644 --- a/modules/nf-core/rseqc/inferexperiment/main.nf +++ b/modules/nf-core/rseqc/inferexperiment/main.nf @@ -2,7 +2,7 @@ process RSEQC_INFEREXPERIMENT { tag "$meta.id" label 'process_medium' - conda "bioconda::rseqc=5.0.3" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" @@ -33,4 +33,15 @@ process RSEQC_INFEREXPERIMENT { rseqc: \$(infer_experiment.py --version | sed -e "s/infer_experiment.py //g") END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.infer_experiment.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + rseqc: \$(infer_experiment.py --version | sed -e "s/infer_experiment.py //g") + END_VERSIONS + """ } diff --git a/modules/nf-core/rseqc/inferexperiment/meta.yml b/modules/nf-core/rseqc/inferexperiment/meta.yml index b4162059d..d9b9ff63e 100644 --- a/modules/nf-core/rseqc/inferexperiment/meta.yml +++ b/modules/nf-core/rseqc/inferexperiment/meta.yml @@ -2,6 +2,7 @@ name: rseqc_inferexperiment description: Infer strandedness from sequencing reads keywords: - rnaseq + - strandedness - experiment tools: - rseqc: @@ -38,3 +39,6 @@ output: authors: - "@drpatelh" - "@kevinmenden" +maintainers: + - "@drpatelh" + - "@kevinmenden" diff --git a/modules/nf-core/rseqc/inferexperiment/rseqc-inferexperiment.diff b/modules/nf-core/rseqc/inferexperiment/rseqc-inferexperiment.diff deleted file mode 100644 index 728b4799f..000000000 --- a/modules/nf-core/rseqc/inferexperiment/rseqc-inferexperiment.diff +++ /dev/null @@ -1,19 +0,0 @@ -Changes in module 'nf-core/rseqc/inferexperiment' ---- modules/nf-core/rseqc/inferexperiment/main.nf -+++ modules/nf-core/rseqc/inferexperiment/main.nf -@@ -2,10 +2,10 @@ - tag "$meta.id" - label 'process_medium' - -- conda "bioconda::rseqc=3.0.1 'conda-forge::r-base>=3.5'" -+ conda "bioconda::rseqc=5.0.3" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://depot.galaxyproject.org/singularity/rseqc:3.0.1--py37h516909a_1' : -- 'biocontainers/rseqc:3.0.1--py37h516909a_1' }" -+ 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : -+ 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" - - input: - tuple val(meta), path(bam) - -************************************************************ diff --git a/modules/nf-core/rseqc/inferexperiment/tests/main.nf.test b/modules/nf-core/rseqc/inferexperiment/tests/main.nf.test new file mode 100644 index 000000000..375f65357 --- /dev/null +++ b/modules/nf-core/rseqc/inferexperiment/tests/main.nf.test @@ -0,0 +1,49 @@ +nextflow_process { + + name "Test Process RSEQC_INFEREXPERIMENT" + script "../main.nf" + process "RSEQC_INFEREXPERIMENT" + config "./nextflow.config" + + test("sarscov2 - [[meta] - bam] - bed") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/test.bed", checkIfExists: true)) + """ + } + } + + then { + assert process.success + assert snapshot(process.out).match() + } + } + + test("sarscov2 - [[meta] - bam] - bed - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/test.bed", checkIfExists: true)) + """ + } + } + + then { + assert process.success + assert snapshot(process.out).match() + } + } +} diff --git a/modules/nf-core/rseqc/inferexperiment/tests/main.nf.test.snap b/modules/nf-core/rseqc/inferexperiment/tests/main.nf.test.snap new file mode 100644 index 000000000..e31c1129f --- /dev/null +++ b/modules/nf-core/rseqc/inferexperiment/tests/main.nf.test.snap @@ -0,0 +1,68 @@ +{ + "sarscov2 - [[meta] - bam] - bed - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.infer_experiment.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,f56ba5c6208ae720dd730f3a432e3ba7" + ], + "txt": [ + [ + { + "id": "test" + }, + "test.infer_experiment.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,f56ba5c6208ae720dd730f3a432e3ba7" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:34:31.050305" + }, + "sarscov2 - [[meta] - bam] - bed": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.infer_experiment.txt:md5,f9d0bfc239df637cd8aeda40ade3c59a" + ] + ], + "1": [ + "versions.yml:md5,f56ba5c6208ae720dd730f3a432e3ba7" + ], + "txt": [ + [ + { + "id": "test" + }, + "test.infer_experiment.txt:md5,f9d0bfc239df637cd8aeda40ade3c59a" + ] + ], + "versions": [ + "versions.yml:md5,f56ba5c6208ae720dd730f3a432e3ba7" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:33:19.853327" + } +} \ No newline at end of file diff --git a/modules/nf-core/kallisto/quant/tests/single_end.config b/modules/nf-core/rseqc/inferexperiment/tests/nextflow.config similarity index 92% rename from modules/nf-core/kallisto/quant/tests/single_end.config rename to modules/nf-core/rseqc/inferexperiment/tests/nextflow.config index 7022246bc..8730f1c4b 100644 --- a/modules/nf-core/kallisto/quant/tests/single_end.config +++ b/modules/nf-core/rseqc/inferexperiment/tests/nextflow.config @@ -1,5 +1,5 @@ process { - + publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" } - + } diff --git a/modules/nf-core/rseqc/innerdistance/environment.yml b/modules/nf-core/rseqc/innerdistance/environment.yml new file mode 100644 index 000000000..fb6e9e925 --- /dev/null +++ b/modules/nf-core/rseqc/innerdistance/environment.yml @@ -0,0 +1,8 @@ +name: rseqc_innerdistance +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::rseqc=5.0.3 + - conda-forge::r-base>=3.5 diff --git a/modules/nf-core/rseqc/innerdistance/main.nf b/modules/nf-core/rseqc/innerdistance/main.nf index b84115cee..207f5fb4d 100644 --- a/modules/nf-core/rseqc/innerdistance/main.nf +++ b/modules/nf-core/rseqc/innerdistance/main.nf @@ -2,7 +2,7 @@ process RSEQC_INNERDISTANCE { tag "$meta.id" label 'process_medium' - conda "bioconda::rseqc=5.0.3" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" @@ -48,4 +48,19 @@ process RSEQC_INNERDISTANCE { END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.inner_distance.txt + touch ${prefix}.inner_distance_freq.txt + touch ${prefix}.inner_distance_mean.txt + touch ${prefix}.inner_distance_plot.pdf + touch ${prefix}.inner_distance_plot.r + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + rseqc: \$(inner_distance.py --version | sed -e "s/inner_distance.py //g") + END_VERSIONS + """ } diff --git a/modules/nf-core/rseqc/innerdistance/meta.yml b/modules/nf-core/rseqc/innerdistance/meta.yml index d10a4c445..d0a5bf181 100644 --- a/modules/nf-core/rseqc/innerdistance/meta.yml +++ b/modules/nf-core/rseqc/innerdistance/meta.yml @@ -1,6 +1,7 @@ name: rseqc_innerdistance description: Calculate inner distance between read pairs. keywords: + - read_pairs - fragment_size - inner_distance tools: @@ -54,3 +55,6 @@ output: authors: - "@drpatelh" - "@kevinmenden" +maintainers: + - "@drpatelh" + - "@kevinmenden" diff --git a/modules/nf-core/rseqc/innerdistance/rseqc-innerdistance.diff b/modules/nf-core/rseqc/innerdistance/rseqc-innerdistance.diff deleted file mode 100644 index dc760c5da..000000000 --- a/modules/nf-core/rseqc/innerdistance/rseqc-innerdistance.diff +++ /dev/null @@ -1,19 +0,0 @@ -Changes in module 'nf-core/rseqc/innerdistance' ---- modules/nf-core/rseqc/innerdistance/main.nf -+++ modules/nf-core/rseqc/innerdistance/main.nf -@@ -2,10 +2,10 @@ - tag "$meta.id" - label 'process_medium' - -- conda "bioconda::rseqc=3.0.1 'conda-forge::r-base>=3.5'" -+ conda "bioconda::rseqc=5.0.3" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://depot.galaxyproject.org/singularity/rseqc:3.0.1--py37h516909a_1' : -- 'biocontainers/rseqc:3.0.1--py37h516909a_1' }" -+ 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : -+ 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" - - input: - tuple val(meta), path(bam) - -************************************************************ diff --git a/modules/nf-core/rseqc/innerdistance/tests/main.nf.test b/modules/nf-core/rseqc/innerdistance/tests/main.nf.test new file mode 100644 index 000000000..e54036f8a --- /dev/null +++ b/modules/nf-core/rseqc/innerdistance/tests/main.nf.test @@ -0,0 +1,58 @@ +nextflow_process { + + name "Test Process RSEQC_INNERDISTANCE" + script "../main.nf" + process "RSEQC_INNERDISTANCE" + config "./nextflow.config" + + test("sarscov2 - [[meta] - bam] - bed") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/test.bed12", checkIfExists: true)) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.pdf[0][1]).name).match("pdf") }, + { assert snapshot(process.out.distance).match("distance") }, + { assert snapshot(process.out.freq).match("freq") }, + { assert snapshot(process.out.freq).match("rscript") }, + { assert snapshot(process.out.mean).match("mean") }, + { assert snapshot(process.out.versions).match("versions") } + ) + } + } + + test("sarscov2 - [[meta] - bam] - bed - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/test.bed12", checkIfExists: true)) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/rseqc/innerdistance/tests/main.nf.test.snap b/modules/nf-core/rseqc/innerdistance/tests/main.nf.test.snap new file mode 100644 index 000000000..83f33363a --- /dev/null +++ b/modules/nf-core/rseqc/innerdistance/tests/main.nf.test.snap @@ -0,0 +1,189 @@ +{ + "rscript": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.inner_distance_freq.txt:md5,3fc037501f5899b5da009c8ce02fc25e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:33:42.467401" + }, + "pdf": { + "content": [ + "test.inner_distance_plot.pdf" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:33:42.461959" + }, + "distance": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.inner_distance.txt:md5,a1acc9def0f64a5500d4c4cb47cbe32b" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:33:42.463083" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,3ca19644c7f02a53db3ffe50c7706797" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:33:42.474576" + }, + "mean": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.inner_distance_mean.txt:md5,58398b7d5a29a5e564f9e3c50b55996c" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:33:42.470638" + }, + "sarscov2 - [[meta] - bam] - bed - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.inner_distance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.inner_distance_freq.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.inner_distance_mean.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test" + }, + "test.inner_distance_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test" + }, + "test.inner_distance_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + "versions.yml:md5,3ca19644c7f02a53db3ffe50c7706797" + ], + "distance": [ + [ + { + "id": "test" + }, + "test.inner_distance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "freq": [ + [ + { + "id": "test" + }, + "test.inner_distance_freq.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "mean": [ + [ + { + "id": "test" + }, + "test.inner_distance_mean.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "pdf": [ + [ + { + "id": "test" + }, + "test.inner_distance_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "rscript": [ + [ + { + "id": "test" + }, + "test.inner_distance_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,3ca19644c7f02a53db3ffe50c7706797" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:22:20.844642" + }, + "freq": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.inner_distance_freq.txt:md5,3fc037501f5899b5da009c8ce02fc25e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:33:42.464983" + } +} \ No newline at end of file diff --git a/modules/nf-core/rseqc/innerdistance/tests/nextflow.config b/modules/nf-core/rseqc/innerdistance/tests/nextflow.config new file mode 100644 index 000000000..8730f1c4b --- /dev/null +++ b/modules/nf-core/rseqc/innerdistance/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + + publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" } + +} diff --git a/modules/nf-core/rseqc/junctionannotation/environment.yml b/modules/nf-core/rseqc/junctionannotation/environment.yml new file mode 100644 index 000000000..35276b715 --- /dev/null +++ b/modules/nf-core/rseqc/junctionannotation/environment.yml @@ -0,0 +1,8 @@ +name: rseqc_junctionannotation +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::rseqc=5.0.3 + - conda-forge::r-base>=3.5 diff --git a/modules/nf-core/rseqc/junctionannotation/main.nf b/modules/nf-core/rseqc/junctionannotation/main.nf index 9f9c96725..9a8a4653a 100644 --- a/modules/nf-core/rseqc/junctionannotation/main.nf +++ b/modules/nf-core/rseqc/junctionannotation/main.nf @@ -2,7 +2,7 @@ process RSEQC_JUNCTIONANNOTATION { tag "$meta.id" label 'process_medium' - conda "bioconda::rseqc=5.0.3" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" @@ -33,7 +33,24 @@ process RSEQC_JUNCTIONANNOTATION { -r $bed \\ -o $prefix \\ $args \\ - 2> ${prefix}.junction_annotation.log + 2> >(grep -v 'E::idx_find_and_load' | tee ${prefix}.junction_annotation.log >&2) + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + rseqc: \$(junction_annotation.py --version | sed -e "s/junction_annotation.py //g") + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.junction.xls + touch ${prefix}.junction_plot.r + touch ${prefix}.junction_annotation.log + touch ${prefix}.junction.bed + touch ${prefix}.Interact.bed + touch ${prefix}.junction.pdf + touch ${prefix}.events.pdf cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/rseqc/junctionannotation/meta.yml b/modules/nf-core/rseqc/junctionannotation/meta.yml index 48c43260e..a88aa2db3 100644 --- a/modules/nf-core/rseqc/junctionannotation/meta.yml +++ b/modules/nf-core/rseqc/junctionannotation/meta.yml @@ -63,3 +63,6 @@ output: authors: - "@drpatelh" - "@kevinmenden" +maintainers: + - "@drpatelh" + - "@kevinmenden" diff --git a/modules/nf-core/rseqc/junctionannotation/rseqc-junctionannotation.diff b/modules/nf-core/rseqc/junctionannotation/rseqc-junctionannotation.diff deleted file mode 100644 index b210db990..000000000 --- a/modules/nf-core/rseqc/junctionannotation/rseqc-junctionannotation.diff +++ /dev/null @@ -1,19 +0,0 @@ -Changes in module 'nf-core/rseqc/junctionannotation' ---- modules/nf-core/rseqc/junctionannotation/main.nf -+++ modules/nf-core/rseqc/junctionannotation/main.nf -@@ -2,10 +2,10 @@ - tag "$meta.id" - label 'process_medium' - -- conda "bioconda::rseqc=3.0.1 'conda-forge::r-base>=3.5'" -+ conda "bioconda::rseqc=5.0.3" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://depot.galaxyproject.org/singularity/rseqc:3.0.1--py37h516909a_1' : -- 'biocontainers/rseqc:3.0.1--py37h516909a_1' }" -+ 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : -+ 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" - - input: - tuple val(meta), path(bam) - -************************************************************ diff --git a/modules/nf-core/rseqc/junctionannotation/tests/main.nf.test b/modules/nf-core/rseqc/junctionannotation/tests/main.nf.test new file mode 100644 index 000000000..8a05bccab --- /dev/null +++ b/modules/nf-core/rseqc/junctionannotation/tests/main.nf.test @@ -0,0 +1,55 @@ +nextflow_process { + + name "Test Process RSEQC_JUNCTIONANNOTATION" + script "../main.nf" + process "RSEQC_JUNCTIONANNOTATION" + + 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) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/test.bed", checkIfExists: true)) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.rscript.get(0).get(1) ==~ ".*/test.junction_plot.r" }, + { assert process.out.xls.get(0).get(1) ==~ ".*/test.junction.xls" }, + { assert snapshot(process.out.log).match("log") }, + { assert snapshot(process.out.versions).match("versions") } + ) + } + } + + 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) + ]) + input[1] = Channel.of(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/rseqc/junctionannotation/tests/main.nf.test.snap b/modules/nf-core/rseqc/junctionannotation/tests/main.nf.test.snap new file mode 100644 index 000000000..e87594f0b --- /dev/null +++ b/modules/nf-core/rseqc/junctionannotation/tests/main.nf.test.snap @@ -0,0 +1,175 @@ +{ + "log": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.junction_annotation.log:md5,ef37d06d169a1adbeec23fddf82aee2b" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:32:52.732937" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,091865c0ebd6de262c9b0968b5771091" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:32:52.734515" + }, + "sarscov2 - paired end [bam] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junction.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junction_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junction_annotation.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junction.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Interact.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junction.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.events.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + "versions.yml:md5,091865c0ebd6de262c9b0968b5771091" + ], + "bed": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junction.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "events_pdf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.events.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "interact_bed": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Interact.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junction_annotation.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junction.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "rscript": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junction_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,091865c0ebd6de262c9b0968b5771091" + ], + "xls": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junction.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:39:10.213511" + } +} \ No newline at end of file diff --git a/modules/nf-core/rseqc/junctionsaturation/environment.yml b/modules/nf-core/rseqc/junctionsaturation/environment.yml new file mode 100644 index 000000000..7b9cc4fa7 --- /dev/null +++ b/modules/nf-core/rseqc/junctionsaturation/environment.yml @@ -0,0 +1,8 @@ +name: rseqc_junctionsaturation +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::rseqc=5.0.3 + - conda-forge::r-base>=3.5 diff --git a/modules/nf-core/rseqc/junctionsaturation/main.nf b/modules/nf-core/rseqc/junctionsaturation/main.nf index f99049c0d..18f063f38 100644 --- a/modules/nf-core/rseqc/junctionsaturation/main.nf +++ b/modules/nf-core/rseqc/junctionsaturation/main.nf @@ -2,7 +2,7 @@ process RSEQC_JUNCTIONSATURATION { tag "$meta.id" label 'process_medium' - conda "bioconda::rseqc=5.0.3" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" @@ -34,4 +34,16 @@ process RSEQC_JUNCTIONSATURATION { rseqc: \$(junction_saturation.py --version | sed -e "s/junction_saturation.py //g") END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.junctionSaturation_plot.pdf + touch ${prefix}.junctionSaturation_plot.r + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + rseqc: \$(junction_saturation.py --version | sed -e "s/junction_saturation.py //g") + END_VERSIONS + """ } diff --git a/modules/nf-core/rseqc/junctionsaturation/meta.yml b/modules/nf-core/rseqc/junctionsaturation/meta.yml index 340fec0d0..19ae3f52d 100644 --- a/modules/nf-core/rseqc/junctionsaturation/meta.yml +++ b/modules/nf-core/rseqc/junctionsaturation/meta.yml @@ -43,3 +43,6 @@ output: authors: - "@drpatelh" - "@kevinmenden" +maintainers: + - "@drpatelh" + - "@kevinmenden" diff --git a/modules/nf-core/rseqc/junctionsaturation/rseqc-junctionsaturation.diff b/modules/nf-core/rseqc/junctionsaturation/rseqc-junctionsaturation.diff deleted file mode 100644 index 663340cf6..000000000 --- a/modules/nf-core/rseqc/junctionsaturation/rseqc-junctionsaturation.diff +++ /dev/null @@ -1,19 +0,0 @@ -Changes in module 'nf-core/rseqc/junctionsaturation' ---- modules/nf-core/rseqc/junctionsaturation/main.nf -+++ modules/nf-core/rseqc/junctionsaturation/main.nf -@@ -2,10 +2,10 @@ - tag "$meta.id" - label 'process_medium' - -- conda "bioconda::rseqc=3.0.1 'conda-forge::r-base>=3.5'" -+ conda "bioconda::rseqc=5.0.3" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://depot.galaxyproject.org/singularity/rseqc:3.0.1--py37h516909a_1' : -- 'biocontainers/rseqc:3.0.1--py37h516909a_1' }" -+ 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : -+ 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" - - input: - tuple val(meta), path(bam) - -************************************************************ diff --git a/modules/nf-core/rseqc/junctionsaturation/tests/main.nf.test b/modules/nf-core/rseqc/junctionsaturation/tests/main.nf.test new file mode 100644 index 000000000..69d7f0c5d --- /dev/null +++ b/modules/nf-core/rseqc/junctionsaturation/tests/main.nf.test @@ -0,0 +1,54 @@ +nextflow_process { + + name "Test Process RSEQC_JUNCTIONSATURATION" + script "../main.nf" + process "RSEQC_JUNCTIONSATURATION" + + 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) + ]) + 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.pdf[0][1]).name).match("pdf") }, + { assert snapshot(process.out.rscript).match("rscript") }, + { assert snapshot(process.out.versions).match("versions") } + ) + } + } + + 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) + ]) + 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/rseqc/junctionsaturation/tests/main.nf.test.snap b/modules/nf-core/rseqc/junctionsaturation/tests/main.nf.test.snap new file mode 100644 index 000000000..8d702a4ef --- /dev/null +++ b/modules/nf-core/rseqc/junctionsaturation/tests/main.nf.test.snap @@ -0,0 +1,95 @@ +{ + "rscript": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.junctionSaturation_plot.r:md5,caa6e63dcb477aabb169882b2f30dadd" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:32:24.018924" + }, + "pdf": { + "content": [ + "test.junctionSaturation_plot.pdf" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:32:24.011942" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,cd4638541a825dbd44e3cb65d2980aa1" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:32:24.021984" + }, + "sarscov2 paired-end [bam] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junctionSaturation_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junctionSaturation_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,cd4638541a825dbd44e3cb65d2980aa1" + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junctionSaturation_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "rscript": [ + [ + { + "id": "test", + "single_end": false + }, + "test.junctionSaturation_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,cd4638541a825dbd44e3cb65d2980aa1" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:43:55.853893" + } +} \ No newline at end of file diff --git a/modules/nf-core/rseqc/readdistribution/environment.yml b/modules/nf-core/rseqc/readdistribution/environment.yml new file mode 100644 index 000000000..59be9fa88 --- /dev/null +++ b/modules/nf-core/rseqc/readdistribution/environment.yml @@ -0,0 +1,8 @@ +name: rseqc_readdistribution +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::rseqc=5.0.3 + - conda-forge::r-base>=3.5 diff --git a/modules/nf-core/rseqc/readdistribution/main.nf b/modules/nf-core/rseqc/readdistribution/main.nf index 3bf42d1e3..1d9406491 100644 --- a/modules/nf-core/rseqc/readdistribution/main.nf +++ b/modules/nf-core/rseqc/readdistribution/main.nf @@ -2,7 +2,7 @@ process RSEQC_READDISTRIBUTION { tag "$meta.id" label 'process_medium' - conda "bioconda::rseqc=5.0.3" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" @@ -32,4 +32,15 @@ process RSEQC_READDISTRIBUTION { rseqc: \$(read_distribution.py --version | sed -e "s/read_distribution.py //g") END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.read_distribution.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + rseqc: \$(read_distribution.py --version | sed -e "s/read_distribution.py //g") + END_VERSIONS + """ } diff --git a/modules/nf-core/rseqc/readdistribution/meta.yml b/modules/nf-core/rseqc/readdistribution/meta.yml index 94c647120..989792faa 100644 --- a/modules/nf-core/rseqc/readdistribution/meta.yml +++ b/modules/nf-core/rseqc/readdistribution/meta.yml @@ -39,3 +39,6 @@ output: authors: - "@drpatelh" - "@kevinmenden" +maintainers: + - "@drpatelh" + - "@kevinmenden" diff --git a/modules/nf-core/rseqc/readdistribution/rseqc-readdistribution.diff b/modules/nf-core/rseqc/readdistribution/rseqc-readdistribution.diff deleted file mode 100644 index 4219e2ac3..000000000 --- a/modules/nf-core/rseqc/readdistribution/rseqc-readdistribution.diff +++ /dev/null @@ -1,19 +0,0 @@ -Changes in module 'nf-core/rseqc/readdistribution' ---- modules/nf-core/rseqc/readdistribution/main.nf -+++ modules/nf-core/rseqc/readdistribution/main.nf -@@ -2,10 +2,10 @@ - tag "$meta.id" - label 'process_medium' - -- conda "bioconda::rseqc=3.0.1 'conda-forge::r-base>=3.5'" -+ conda "bioconda::rseqc=5.0.3" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://depot.galaxyproject.org/singularity/rseqc:3.0.1--py37h516909a_1' : -- 'biocontainers/rseqc:3.0.1--py37h516909a_1' }" -+ 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : -+ 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" - - input: - tuple val(meta), path(bam) - -************************************************************ diff --git a/modules/nf-core/rseqc/readdistribution/tests/main.nf.test b/modules/nf-core/rseqc/readdistribution/tests/main.nf.test new file mode 100644 index 000000000..c49c558de --- /dev/null +++ b/modules/nf-core/rseqc/readdistribution/tests/main.nf.test @@ -0,0 +1,52 @@ +nextflow_process { + + name "Test Process RSEQC_READDISTRIBUTION" + script "../main.nf" + process "RSEQC_READDISTRIBUTION" + + 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) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/test.bed12", 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) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/test.bed12", checkIfExists: true)) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/rseqc/readdistribution/tests/main.nf.test.snap b/modules/nf-core/rseqc/readdistribution/tests/main.nf.test.snap new file mode 100644 index 000000000..02e5e6117 --- /dev/null +++ b/modules/nf-core/rseqc/readdistribution/tests/main.nf.test.snap @@ -0,0 +1,72 @@ +{ + "sarscov2 paired-end [bam]": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.read_distribution.txt:md5,56893fdc0809d968629a363551a1655f" + ] + ], + "1": [ + "versions.yml:md5,fc68a268ab32a0d72a66f270d6c7925e" + ], + "txt": [ + [ + { + "id": "test", + "single_end": false + }, + "test.read_distribution.txt:md5,56893fdc0809d968629a363551a1655f" + ] + ], + "versions": [ + "versions.yml:md5,fc68a268ab32a0d72a66f270d6c7925e" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T15:38:36.441841" + }, + "sarscov2 paired-end [bam] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.read_distribution.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,fc68a268ab32a0d72a66f270d6c7925e" + ], + "txt": [ + [ + { + "id": "test", + "single_end": false + }, + "test.read_distribution.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,fc68a268ab32a0d72a66f270d6c7925e" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:50:29.345905" + } +} \ No newline at end of file diff --git a/modules/nf-core/rseqc/readduplication/environment.yml b/modules/nf-core/rseqc/readduplication/environment.yml new file mode 100644 index 000000000..c99f107a1 --- /dev/null +++ b/modules/nf-core/rseqc/readduplication/environment.yml @@ -0,0 +1,8 @@ +name: rseqc_readduplication +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::rseqc=5.0.3 + - conda-forge::r-base>=3.5 diff --git a/modules/nf-core/rseqc/readduplication/main.nf b/modules/nf-core/rseqc/readduplication/main.nf index d83547205..354338021 100644 --- a/modules/nf-core/rseqc/readduplication/main.nf +++ b/modules/nf-core/rseqc/readduplication/main.nf @@ -2,7 +2,7 @@ process RSEQC_READDUPLICATION { tag "$meta.id" label 'process_medium' - conda "bioconda::rseqc=5.0.3" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" @@ -34,4 +34,18 @@ process RSEQC_READDUPLICATION { rseqc: \$(read_duplication.py --version | sed -e "s/read_duplication.py //g") END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.seq.DupRate.xls + touch ${prefix}.pos.DupRate.xls + touch ${prefix}.DupRate_plot.pdf + touch ${prefix}.DupRate_plot.r + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + rseqc: \$(read_duplication.py --version | sed -e "s/read_duplication.py //g") + END_VERSIONS + """ } diff --git a/modules/nf-core/rseqc/readduplication/meta.yml b/modules/nf-core/rseqc/readduplication/meta.yml index 5a8666435..4b24d3032 100644 --- a/modules/nf-core/rseqc/readduplication/meta.yml +++ b/modules/nf-core/rseqc/readduplication/meta.yml @@ -3,6 +3,8 @@ description: Calculate read duplication rate keywords: - rnaseq - duplication + - sequence-based + - mapping-based tools: - rseqc: description: | @@ -50,3 +52,6 @@ output: authors: - "@drpatelh" - "@kevinmenden" +maintainers: + - "@drpatelh" + - "@kevinmenden" diff --git a/modules/nf-core/rseqc/readduplication/rseqc-readduplication.diff b/modules/nf-core/rseqc/readduplication/rseqc-readduplication.diff deleted file mode 100644 index 748685c0b..000000000 --- a/modules/nf-core/rseqc/readduplication/rseqc-readduplication.diff +++ /dev/null @@ -1,19 +0,0 @@ -Changes in module 'nf-core/rseqc/readduplication' ---- modules/nf-core/rseqc/readduplication/main.nf -+++ modules/nf-core/rseqc/readduplication/main.nf -@@ -2,10 +2,10 @@ - tag "$meta.id" - label 'process_medium' - -- conda "bioconda::rseqc=3.0.1 'conda-forge::r-base>=3.5'" -+ conda "bioconda::rseqc=5.0.3" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://depot.galaxyproject.org/singularity/rseqc:3.0.1--py37h516909a_1' : -- 'biocontainers/rseqc:3.0.1--py37h516909a_1' }" -+ 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : -+ 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" - - input: - tuple val(meta), path(bam) - -************************************************************ diff --git a/modules/nf-core/rseqc/readduplication/tests/main.nf.test b/modules/nf-core/rseqc/readduplication/tests/main.nf.test new file mode 100644 index 000000000..a6ffced4c --- /dev/null +++ b/modules/nf-core/rseqc/readduplication/tests/main.nf.test @@ -0,0 +1,54 @@ +nextflow_process { + + name "Test Process RSEQC_READDUPLICATION" + script "../main.nf" + process "RSEQC_READDUPLICATION" + + 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 snapshot(file(process.out.pdf[0][1]).name).match("pdf") }, + { assert snapshot(process.out.pos_xls).match("pos_xls") }, + { assert snapshot(process.out.rscript).match("rscript") }, + { assert snapshot(process.out.seq_xls).match("seq_xls") }, + { assert snapshot(process.out.versions).match("versions") } + ) + } + } + + 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() } + ) + } + } +} diff --git a/modules/nf-core/rseqc/readduplication/tests/main.nf.test.snap b/modules/nf-core/rseqc/readduplication/tests/main.nf.test.snap new file mode 100644 index 000000000..143a29dc6 --- /dev/null +++ b/modules/nf-core/rseqc/readduplication/tests/main.nf.test.snap @@ -0,0 +1,167 @@ +{ + "pos_xls": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.pos.DupRate.xls:md5,a859bc2031d46bf1cc4336205847caa3" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T15:43:14.989834" + }, + "rscript": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.DupRate_plot.r:md5,3c0325095cee4835b921e57d61c23dca" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T15:43:15.045525" + }, + "pdf": { + "content": [ + "test.DupRate_plot.pdf" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:33:06.857254" + }, + "seq_xls": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.seq.DupRate.xls:md5,ee8783399eec5a18522a6f08bece338b" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T15:43:15.101953" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,8a0721f3247f97135eadb8eecbe142a1" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:33:06.877127" + }, + "sarscov2 paired-end [bam] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.seq.DupRate.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.pos.DupRate.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.DupRate_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.DupRate_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + "versions.yml:md5,8a0721f3247f97135eadb8eecbe142a1" + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.DupRate_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "pos_xls": [ + [ + { + "id": "test", + "single_end": false + }, + "test.pos.DupRate.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "rscript": [ + [ + { + "id": "test", + "single_end": false + }, + "test.DupRate_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "seq_xls": [ + [ + { + "id": "test", + "single_end": false + }, + "test.seq.DupRate.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,8a0721f3247f97135eadb8eecbe142a1" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:53:03.817194" + } +} \ No newline at end of file diff --git a/modules/nf-core/rseqc/tin/environment.yml b/modules/nf-core/rseqc/tin/environment.yml new file mode 100644 index 000000000..288da4300 --- /dev/null +++ b/modules/nf-core/rseqc/tin/environment.yml @@ -0,0 +1,8 @@ +name: rseqc_tin +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::rseqc=5.0.3 + - conda-forge::r-base>=3.5 diff --git a/modules/nf-core/rseqc/tin/main.nf b/modules/nf-core/rseqc/tin/main.nf index 38f1c1757..397442f03 100644 --- a/modules/nf-core/rseqc/tin/main.nf +++ b/modules/nf-core/rseqc/tin/main.nf @@ -2,7 +2,7 @@ process RSEQC_TIN { tag "$meta.id" label 'process_high' - conda "bioconda::rseqc=5.0.3" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" @@ -33,4 +33,16 @@ process RSEQC_TIN { rseqc: \$(tin.py --version | sed -e "s/tin.py //g") END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${bam.fileName}.summary.txt + touch ${bam.fileName}.tin.xls + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + rseqc: \$(tin.py --version | sed -e "s/tin.py //g") + END_VERSIONS + """ } diff --git a/modules/nf-core/rseqc/tin/meta.yml b/modules/nf-core/rseqc/tin/meta.yml index 381edfde0..f760bb2f4 100644 --- a/modules/nf-core/rseqc/tin/meta.yml +++ b/modules/nf-core/rseqc/tin/meta.yml @@ -46,3 +46,5 @@ output: pattern: "versions.yml" authors: - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/modules/nf-core/rseqc/tin/rseqc-tin.diff b/modules/nf-core/rseqc/tin/rseqc-tin.diff deleted file mode 100644 index aa4727128..000000000 --- a/modules/nf-core/rseqc/tin/rseqc-tin.diff +++ /dev/null @@ -1,19 +0,0 @@ -Changes in module 'nf-core/rseqc/tin' ---- modules/nf-core/rseqc/tin/main.nf -+++ modules/nf-core/rseqc/tin/main.nf -@@ -2,10 +2,10 @@ - tag "$meta.id" - label 'process_high' - -- conda "bioconda::rseqc=3.0.1 'conda-forge::r-base>=3.5'" -+ conda "bioconda::rseqc=5.0.3" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://depot.galaxyproject.org/singularity/rseqc:3.0.1--py37h516909a_1' : -- 'biocontainers/rseqc:3.0.1--py37h516909a_1' }" -+ 'https://depot.galaxyproject.org/singularity/rseqc:5.0.3--py39hf95cd2a_0' : -+ 'biocontainers/rseqc:5.0.3--py39hf95cd2a_0' }" - - input: - tuple val(meta), path(bam), path(bai) - -************************************************************ diff --git a/modules/nf-core/rseqc/tin/tests/main.nf.test b/modules/nf-core/rseqc/tin/tests/main.nf.test new file mode 100644 index 000000000..a4b6f05d4 --- /dev/null +++ b/modules/nf-core/rseqc/tin/tests/main.nf.test @@ -0,0 +1,54 @@ +nextflow_process { + + name "Test Process RSEQC_TIN" + script "../main.nf" + process "RSEQC_TIN" + + 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), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai", checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/test.bed12", 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), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai", checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/bed/test.bed12", checkIfExists: true)) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/rseqc/tin/tests/main.nf.test.snap b/modules/nf-core/rseqc/tin/tests/main.nf.test.snap new file mode 100644 index 000000000..caab3a091 --- /dev/null +++ b/modules/nf-core/rseqc/tin/tests/main.nf.test.snap @@ -0,0 +1,108 @@ +{ + "sarscov2 paired-end [bam]": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.summary.txt:md5,9d98447e178b89a89f6f5aba7a772fe6" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.tin.xls:md5,abdbb6d51a5cd7038cd862ce241ecef1" + ] + ], + "2": [ + "versions.yml:md5,79670dedaa11a978951c16ead7f49c24" + ], + "txt": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.summary.txt:md5,9d98447e178b89a89f6f5aba7a772fe6" + ] + ], + "versions": [ + "versions.yml:md5,79670dedaa11a978951c16ead7f49c24" + ], + "xls": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.tin.xls:md5,abdbb6d51a5cd7038cd862ce241ecef1" + ] + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-26T14:32:42.823857" + }, + "sarscov2 paired-end [bam] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.tin.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,79670dedaa11a978951c16ead7f49c24" + ], + "txt": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,79670dedaa11a978951c16ead7f49c24" + ], + "xls": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.tin.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T09:55:57.905927" + } +} \ No newline at end of file diff --git a/modules/nf-core/salmon/index/environment.yml b/modules/nf-core/salmon/index/environment.yml new file mode 100644 index 000000000..a6607d964 --- /dev/null +++ b/modules/nf-core/salmon/index/environment.yml @@ -0,0 +1,7 @@ +name: salmon_index +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::salmon=1.10.1 diff --git a/modules/nf-core/salmon/index/main.nf b/modules/nf-core/salmon/index/main.nf index 118ee6704..e755d9a34 100644 --- a/modules/nf-core/salmon/index/main.nf +++ b/modules/nf-core/salmon/index/main.nf @@ -2,7 +2,7 @@ process SALMON_INDEX { tag "$transcript_fasta" label "process_medium" - conda "bioconda::salmon=1.10.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/salmon:1.10.1--h7e5ed60_0' : 'biocontainers/salmon:1.10.1--h7e5ed60_0' }" @@ -44,4 +44,29 @@ process SALMON_INDEX { salmon: \$(echo \$(salmon --version) | sed -e "s/salmon //g") END_VERSIONS """ + + stub: + """ + mkdir salmon + touch salmon/complete_ref_lens.bin + touch salmon/ctable.bin + touch salmon/ctg_offsets.bin + touch salmon/duplicate_clusters.tsv + touch salmon/info.json + touch salmon/mphf.bin + touch salmon/pos.bin + touch salmon/pre_indexing.log + touch salmon/rank.bin + touch salmon/refAccumLengths.bin + touch salmon/ref_indexing.log + touch salmon/reflengths.bin + touch salmon/refseq.bin + touch salmon/seq.bin + touch salmon/versionInfo.json + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + salmon: \$(echo \$(salmon --version) | sed -e "s/salmon //g") + END_VERSIONS + """ } diff --git a/modules/nf-core/salmon/index/meta.yml b/modules/nf-core/salmon/index/meta.yml index 53c64152f..fd94dd274 100644 --- a/modules/nf-core/salmon/index/meta.yml +++ b/modules/nf-core/salmon/index/meta.yml @@ -20,7 +20,6 @@ input: - transcriptome_fasta: type: file description: Fasta file of the reference transcriptome - output: - index: type: directory @@ -30,7 +29,9 @@ output: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@kevinmenden" - "@drpatelh" +maintainers: + - "@kevinmenden" + - "@drpatelh" diff --git a/modules/nf-core/salmon/index/tests/main.nf.test b/modules/nf-core/salmon/index/tests/main.nf.test new file mode 100644 index 000000000..0caf30d3e --- /dev/null +++ b/modules/nf-core/salmon/index/tests/main.nf.test @@ -0,0 +1,55 @@ +nextflow_process { + + name "Test Process SALMON_INDEX" + script "../main.nf" + process "SALMON_INDEX" + + test("sarscov2") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/genome.fasta", checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/transcriptome.fasta", checkIfExists: true)]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.index.get(0)).exists() }, + { assert snapshot(process.out.versions).match("versions") } + ) + } + + } + + test("sarscov2 stub") { + options "-stub" + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/genome.fasta", checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/transcriptome.fasta", checkIfExists: true)]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.index.get(0)).exists() }, + { assert snapshot(process.out.versions).match("versions stub") } + ) + } + + } + +} \ No newline at end of file diff --git a/modules/nf-core/salmon/index/tests/main.nf.test.snap b/modules/nf-core/salmon/index/tests/main.nf.test.snap new file mode 100644 index 000000000..703e455c5 --- /dev/null +++ b/modules/nf-core/salmon/index/tests/main.nf.test.snap @@ -0,0 +1,26 @@ +{ + "versions": { + "content": [ + [ + "versions.yml:md5,563eeafb4577be0b13801d7021c0bf42" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2023-11-22T14:26:33.32036" + }, + "versions stub": { + "content": [ + [ + "versions.yml:md5,563eeafb4577be0b13801d7021c0bf42" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-23T09:47:58.828124" + } +} \ No newline at end of file diff --git a/modules/nf-core/salmon/quant/environment.yml b/modules/nf-core/salmon/quant/environment.yml new file mode 100644 index 000000000..862667241 --- /dev/null +++ b/modules/nf-core/salmon/quant/environment.yml @@ -0,0 +1,7 @@ +name: salmon_quant +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::salmon=1.10.1 diff --git a/modules/nf-core/salmon/quant/main.nf b/modules/nf-core/salmon/quant/main.nf index f11b6c2e2..6c528b240 100644 --- a/modules/nf-core/salmon/quant/main.nf +++ b/modules/nf-core/salmon/quant/main.nf @@ -2,7 +2,7 @@ process SALMON_QUANT { tag "$meta.id" label "process_medium" - conda "bioconda::salmon=1.10.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/salmon:1.10.1--h7e5ed60_0' : 'biocontainers/salmon:1.10.1--h7e5ed60_0' }" @@ -16,9 +16,10 @@ process SALMON_QUANT { val lib_type output: - tuple val(meta), path("${prefix}") , emit: results - tuple val(meta), path("*info.json"), emit: json_info, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("${prefix}") , emit: results + tuple val(meta), path("*info.json") , emit: json_info, optional: true + tuple val(meta), path("*lib_format_counts.json"), emit: lib_format_counts, optional: true + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -70,6 +71,22 @@ process SALMON_QUANT { if [ -f $prefix/aux_info/meta_info.json ]; then cp $prefix/aux_info/meta_info.json "${prefix}_meta_info.json" fi + if [ -f $prefix/lib_format_counts.json ]; then + cp $prefix/lib_format_counts.json "${prefix}_lib_format_counts.json" + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + salmon: \$(echo \$(salmon --version) | sed -e "s/salmon //g") + END_VERSIONS + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + mkdir ${prefix} + touch ${prefix}_meta_info.json + touch ${prefix}_lib_format_counts.json cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/salmon/quant/meta.yml b/modules/nf-core/salmon/quant/meta.yml index e809ade2b..a2faf589a 100644 --- a/modules/nf-core/salmon/quant/meta.yml +++ b/modules/nf-core/salmon/quant/meta.yml @@ -31,7 +31,7 @@ input: - gtf: type: file description: GTF of the reference transcriptome - - transcriptome_fasta: + - transcript_fasta: type: file description: Fasta file of the reference transcriptome - alignment_mode: @@ -41,7 +41,6 @@ input: type: string description: | Override library type inferred based on strandedness defined in meta object - output: - results: type: directory @@ -55,7 +54,9 @@ output: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@kevinmenden" - "@drpatelh" +maintainers: + - "@kevinmenden" + - "@drpatelh" diff --git a/modules/nf-core/salmon/quant/tests/main.nf.test b/modules/nf-core/salmon/quant/tests/main.nf.test new file mode 100644 index 000000000..24d8dd700 --- /dev/null +++ b/modules/nf-core/salmon/quant/tests/main.nf.test @@ -0,0 +1,315 @@ +nextflow_process { + + name "Test Process SALMON_QUANT" + script "../main.nf" + process "SALMON_QUANT" + config "./nextflow.config" + + setup { + run("SALMON_INDEX") { + script "../../../salmon/index/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/genome.fasta", checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/transcriptome.fasta", checkIfExists: true)]) + """ + } + } + } + + test("sarscov2 - single_end") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + 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] = SALMON_INDEX.out.index + input[2] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true)]) + input[3] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/transcriptome.fasta", checkIfExists: true)]) + input[4] = false + input[5] = '' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.json_info.get(0).get(1)).exists() }, + { assert path(process.out.results.get(0).get(1)).exists() }, + { assert snapshot( + process.out.versions, + process.out.lib_format_counts + ).match() } + ) + } + + } + + test("sarscov2 - single_end stub") { + options "-stub" + when { + params { + outdir = "$outputDir" + } + process { + """ + 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] = SALMON_INDEX.out.index + input[2] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true)]) + input[3] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/transcriptome.fasta", checkIfExists: true)]) + input[4] = false + input[5] = '' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.json_info.get(0).get(1)).exists() }, + { assert path(process.out.results.get(0).get(1)).exists() }, + { assert snapshot( + process.out.versions, + process.out.lib_format_counts + ).match() } + ) + } + + } + + test("sarscov2 - single_end lib type A") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + 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] = SALMON_INDEX.out.index + input[2] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true)]) + input[3] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/transcriptome.fasta", checkIfExists: true)]) + input[4] = false + input[5] = 'A' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.json_info.get(0).get(1)).exists() }, + { assert path(process.out.results.get(0).get(1)).exists() }, + { assert snapshot( + process.out.versions, + process.out.lib_format_counts + ).match() } + ) + } + + } + + test("sarscov2 - single_end lib type A stub") { + options "-stub" + when { + params { + outdir = "$outputDir" + } + process { + """ + 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] = SALMON_INDEX.out.index + input[2] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true)]) + input[3] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/transcriptome.fasta", checkIfExists: true)]) + input[4] = false + input[5] = 'A' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.json_info.get(0).get(1)).exists() }, + { assert path(process.out.results.get(0).get(1)).exists() }, + { assert snapshot( + process.out.versions, + process.out.lib_format_counts + ).match() } + ) + } + + } + + test("sarscov2 - pair_end") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + 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), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_2.fastq.gz", checkIfExists: true) + ] + ]) + input[1] = SALMON_INDEX.out.index + input[2] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true)]) + input[3] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/transcriptome.fasta", checkIfExists: true)]) + input[4] = false + input[5] = '' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.json_info.get(0).get(1)).exists() }, + { assert path(process.out.results.get(0).get(1)).exists() }, + { assert snapshot( + process.out.versions, + process.out.lib_format_counts + ).match() } + ) + } + + } + + test("sarscov2 - pair_end stub") { + options "-stub" + when { + params { + outdir = "$outputDir" + } + process { + """ + 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), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_2.fastq.gz", checkIfExists: true) + ] + ]) + input[1] = SALMON_INDEX.out.index + input[2] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true)]) + input[3] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/transcriptome.fasta", checkIfExists: true)]) + input[4] = false + input[5] = '' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.json_info.get(0).get(1)).exists() }, + { assert path(process.out.results.get(0).get(1)).exists() }, + { assert snapshot( + process.out.versions, + process.out.lib_format_counts + ).match() } + ) + } + + } + + test("sarscov2 - pair_end multiple") { + + 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/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) + ] + ]) + input[1] = SALMON_INDEX.out.index + input[2] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true)]) + input[3] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/transcriptome.fasta", checkIfExists: true)]) + input[4] = false + input[5] = '' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.json_info.get(0).get(1)).exists() }, + { assert path(process.out.results.get(0).get(1)).exists() }, + { assert snapshot( + process.out.versions, + process.out.lib_format_counts + ).match() } + ) + } + + } + + test("sarscov2 - pair_end multiple stub") { + 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/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) + ] + ]) + input[1] = SALMON_INDEX.out.index + input[2] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true)]) + input[3] = Channel.of([file(params.modules_testdata_base_path + "genomics/sarscov2/genome/transcriptome.fasta", checkIfExists: true)]) + input[4] = false + input[5] = '' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.json_info.get(0).get(1)).exists() }, + { assert path(process.out.results.get(0).get(1)).exists() }, + { assert snapshot( + process.out.versions, + process.out.lib_format_counts + ).match() } + ) + } + + } +} diff --git a/modules/nf-core/salmon/quant/tests/main.nf.test.snap b/modules/nf-core/salmon/quant/tests/main.nf.test.snap new file mode 100644 index 000000000..547ce2de1 --- /dev/null +++ b/modules/nf-core/salmon/quant/tests/main.nf.test.snap @@ -0,0 +1,170 @@ +{ + "sarscov2 - single_end": { + "content": [ + [ + "versions.yml:md5,80eb3d2ad36960c7e9263f81ede9d263" + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test_lib_format_counts.json:md5,c7999dfccd32c090d94e5951522eecd4" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-06-14T09:51:22.424672" + }, + "sarscov2 - single_end stub": { + "content": [ + [ + "versions.yml:md5,80eb3d2ad36960c7e9263f81ede9d263" + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test_lib_format_counts.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-06-14T09:51:32.292277" + }, + "sarscov2 - single_end lib type A": { + "content": [ + [ + "versions.yml:md5,80eb3d2ad36960c7e9263f81ede9d263" + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test_lib_format_counts.json:md5,c7999dfccd32c090d94e5951522eecd4" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-06-14T09:51:42.656382" + }, + "sarscov2 - pair_end multiple": { + "content": [ + [ + "versions.yml:md5,80eb3d2ad36960c7e9263f81ede9d263" + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test_lib_format_counts.json:md5,4a2ee0fac91a4a3471872808d8bd3ff8" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-06-14T09:52:33.03647" + }, + "sarscov2 - pair_end multiple stub": { + "content": [ + [ + "versions.yml:md5,80eb3d2ad36960c7e9263f81ede9d263" + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test_lib_format_counts.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-06-14T09:52:43.388379" + }, + "sarscov2 - single_end lib type A stub": { + "content": [ + [ + "versions.yml:md5,80eb3d2ad36960c7e9263f81ede9d263" + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test_lib_format_counts.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-06-14T09:51:52.612664" + }, + "sarscov2 - pair_end": { + "content": [ + [ + "versions.yml:md5,80eb3d2ad36960c7e9263f81ede9d263" + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test_lib_format_counts.json:md5,e9516e73c9fb39145513b2a41a0af95f" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-06-14T09:52:05.577881" + }, + "sarscov2 - pair_end stub": { + "content": [ + [ + "versions.yml:md5,80eb3d2ad36960c7e9263f81ede9d263" + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test_lib_format_counts.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-06-14T09:52:15.286461" + } +} \ No newline at end of file diff --git a/modules/nf-core/salmon/quant/tests/nextflow.config b/modules/nf-core/salmon/quant/tests/nextflow.config new file mode 100644 index 000000000..37c082129 --- /dev/null +++ b/modules/nf-core/salmon/quant/tests/nextflow.config @@ -0,0 +1,7 @@ +process { + + withName: SALMON_QUANT { + ext.args = '--minAssignedFrags 1' + } + +} diff --git a/modules/nf-core/samtools/flagstat/environment.yml b/modules/nf-core/samtools/flagstat/environment.yml new file mode 100644 index 000000000..68b81558e --- /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.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/samtools/flagstat/main.nf b/modules/nf-core/samtools/flagstat/main.nf index b75707eca..754d84b73 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.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--h50ea8bc_0' }" input: tuple val(meta), path(bam), path(bai) diff --git a/modules/nf-core/samtools/flagstat/meta.yml b/modules/nf-core/samtools/flagstat/meta.yml index 954225dfc..97991358e 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 000000000..b899f1fc7 --- /dev/null +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test @@ -0,0 +1,52 @@ +nextflow_process { + + name "Test Process SAMTOOLS_FLAGSTAT" + script "../main.nf" + process "SAMTOOLS_FLAGSTAT" + + test("BAM") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("BAM - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap new file mode 100644 index 000000000..23989c612 --- /dev/null +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap @@ -0,0 +1,72 @@ +{ + "BAM - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,f606681ef971cbb548a4d9e3fbabdbc2" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,f606681ef971cbb548a4d9e3fbabdbc2" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T14:17:28.002887" + }, + "BAM": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ], + "1": [ + "versions.yml:md5,f606681ef971cbb548a4d9e3fbabdbc2" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ], + "versions": [ + "versions.yml:md5,f606681ef971cbb548a4d9e3fbabdbc2" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T14:17:13.330971" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/idxstats/environment.yml b/modules/nf-core/samtools/idxstats/environment.yml new file mode 100644 index 000000000..eb6c88099 --- /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.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/samtools/idxstats/main.nf b/modules/nf-core/samtools/idxstats/main.nf index 83c7c34b9..2ea2a5ccd 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.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--h50ea8bc_0' }" input: tuple val(meta), path(bam), path(bai) diff --git a/modules/nf-core/samtools/idxstats/meta.yml b/modules/nf-core/samtools/idxstats/meta.yml index dda87e1ee..344e92a3f 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 000000000..bf4c31047 --- /dev/null +++ b/modules/nf-core/samtools/idxstats/tests/main.nf.test @@ -0,0 +1,49 @@ +nextflow_process { + + name "Test Process SAMTOOLS_IDXSTATS" + script "../main.nf" + process "SAMTOOLS_IDXSTATS" + + test("bam") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("bam - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + }} diff --git a/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap b/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap new file mode 100644 index 000000000..a5ac8104e --- /dev/null +++ b/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap @@ -0,0 +1,72 @@ +{ + "bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,7acbcb2a8ec6436ba7b2916d3ff13351" + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,7acbcb2a8ec6436ba7b2916d3ff13351" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T14:17:56.180093" + }, + "bam": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], + "1": [ + "versions.yml:md5,7acbcb2a8ec6436ba7b2916d3ff13351" + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], + "versions": [ + "versions.yml:md5,7acbcb2a8ec6436ba7b2916d3ff13351" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T14:17:41.408704" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/index/environment.yml b/modules/nf-core/samtools/index/environment.yml new file mode 100644 index 000000000..260d516be --- /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.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf index 0b20aa4bb..e002585b9 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.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--h50ea8bc_0' }" input: tuple val(meta), path(input) @@ -35,10 +35,11 @@ process SAMTOOLS_INDEX { """ stub: + def args = task.ext.args ?: '' + def extension = file(input).getExtension() == 'cram' ? + "crai" : args.contains("-c") ? "csi" : "bai" """ - touch ${input}.bai - touch ${input}.crai - touch ${input}.csi + touch ${input}.${extension} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/samtools/index/meta.yml b/modules/nf-core/samtools/index/meta.yml index 8bd2fa6fb..01a4ee03e 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 000000000..0ed260efa --- /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 000000000..b59a25b38 --- /dev/null +++ b/modules/nf-core/samtools/index/tests/main.nf.test @@ -0,0 +1,136 @@ +nextflow_process { + + name "Test Process SAMTOOLS_INDEX" + script "../main.nf" + process "SAMTOOLS_INDEX" + + test("bai") { + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("crai") { + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("csi") { + config "./csi.nextflow.config" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + file(process.out.csi[0][1]).name, + process.out.versions + ).match() } + ) + } + } + + test("bai - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("crai - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("csi - stub") { + options "-stub" + config "./csi.nextflow.config" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/samtools/index/tests/main.nf.test.snap b/modules/nf-core/samtools/index/tests/main.nf.test.snap new file mode 100644 index 000000000..799d199ce --- /dev/null +++ b/modules/nf-core/samtools/index/tests/main.nf.test.snap @@ -0,0 +1,250 @@ +{ + "csi - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" + ], + "bai": [ + + ], + "crai": [ + + ], + "csi": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:51:53.9057" + }, + "crai - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" + ], + "bai": [ + + ], + "crai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:51:45.931558" + }, + "bai - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" + ], + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "crai": [ + + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:51:34.807525" + }, + "csi": { + "content": [ + "test.paired_end.sorted.bam.csi", + [ + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:52:55.688799" + }, + "crai": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,14bc3bd5c89cacc8f4541f9062429029" + ] + ], + "3": [ + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" + ], + "bai": [ + + ], + "crai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,14bc3bd5c89cacc8f4541f9062429029" + ] + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:51:17.609533" + }, + "bai": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,704c10dd1326482448ca3073fdebc2f4" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" + ], + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,704c10dd1326482448ca3073fdebc2f4" + ] + ], + "crai": [ + + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:51:04.16585" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/sort/environment.yml b/modules/nf-core/samtools/sort/environment.yml new file mode 100644 index 000000000..36a12eab0 --- /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.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/samtools/sort/main.nf b/modules/nf-core/samtools/sort/main.nf index 2b7753fd8..8e019099c 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.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--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}": @@ -37,9 +50,20 @@ process SAMTOOLS_SORT { """ stub: + 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" """ - touch ${prefix}.bam + touch ${prefix}.${extension} + if [ "${extension}" == "bam" ]; + then + touch ${prefix}.${extension}.csi + elif [ "${extension}" == "cram" ]; + then + touch ${prefix}.${extension}.crai + fi 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 073284316..341a7d0eb 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 000000000..41c2fca7f --- /dev/null +++ b/modules/nf-core/samtools/sort/tests/main.nf.test @@ -0,0 +1,124 @@ +nextflow_process { + + name "Test Process SAMTOOLS_SORT" + script "../main.nf" + process "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.bam, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match()} + ) + } + } + + test("cram") { + + config "./nextflow_cram.config" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.cram.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.crai.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match()} + ) + } + } + + test("bam - stub") { + + options "-stub" + config "./nextflow.config" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("cram - stub") { + + options "-stub" + config "./nextflow_cram.config" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/samtools/sort/tests/main.nf.test.snap b/modules/nf-core/samtools/sort/tests/main.nf.test.snap new file mode 100644 index 000000000..da38d5d15 --- /dev/null +++ b/modules/nf-core/samtools/sort/tests/main.nf.test.snap @@ -0,0 +1,192 @@ +{ + "cram": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.cram" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.cram.crai" + ] + ], + [ + "versions.yml:md5,7a360de20e1d7a6f15a5e8fbe0a9c062" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:19:37.196205" + }, + "bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + "versions.yml:md5,7a360de20e1d7a6f15a5e8fbe0a9c062" + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "crai": [ + + ], + "cram": [ + + ], + "csi": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,7a360de20e1d7a6f15a5e8fbe0a9c062" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T15:54:46.580756" + }, + "cram - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,7a360de20e1d7a6f15a5e8fbe0a9c062" + ], + "bam": [ + + ], + "crai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,7a360de20e1d7a6f15a5e8fbe0a9c062" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T15:57:30.505698" + }, + "bam": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,21c992d59615936b99f2ad008aa54400" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.csi" + ] + ], + [ + "versions.yml:md5,7a360de20e1d7a6f15a5e8fbe0a9c062" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T15:54:25.872954" + } +} \ 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 000000000..f642771f5 --- /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/nextflow_cram.config b/modules/nf-core/samtools/sort/tests/nextflow_cram.config new file mode 100644 index 000000000..3a8c0188b --- /dev/null +++ b/modules/nf-core/samtools/sort/tests/nextflow_cram.config @@ -0,0 +1,8 @@ +process { + + withName: SAMTOOLS_SORT { + ext.prefix = { "${meta.id}.sorted" } + ext.args = "--write-index --output-fmt cram" + } + +} diff --git a/modules/nf-core/samtools/stats/environment.yml b/modules/nf-core/samtools/stats/environment.yml new file mode 100644 index 000000000..1cc83bd95 --- /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.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf index 4a2607ded..982bc28e7 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.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--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 90e6345f5..735ff8122 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 000000000..6416ae127 --- /dev/null +++ b/modules/nf-core/samtools/stats/tests/main.nf.test @@ -0,0 +1,108 @@ +nextflow_process { + + name "Test Process SAMTOOLS_STATS" + script "../main.nf" + process "SAMTOOLS_STATS" + + test("bam") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + {assert process.success}, + {assert snapshot(process.out).match()} + ) + } + } + + test("cram") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + {assert process.success}, + {assert snapshot(process.out).match()} + ) + } + } + + test("bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + {assert process.success}, + {assert snapshot(process.out).match()} + ) + } + } + + test("cram - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + 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 000000000..3828f3788 --- /dev/null +++ b/modules/nf-core/samtools/stats/tests/main.nf.test.snap @@ -0,0 +1,142 @@ +{ + "cram": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,c9d39b38c22de2057fc2f89949090975" + ] + ], + "1": [ + "versions.yml:md5,b3b70b126f867fdbb7dcea5e36e49d4a" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,c9d39b38c22de2057fc2f89949090975" + ] + ], + "versions": [ + "versions.yml:md5,b3b70b126f867fdbb7dcea5e36e49d4a" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T14:20:24.885816" + }, + "bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,b3b70b126f867fdbb7dcea5e36e49d4a" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,b3b70b126f867fdbb7dcea5e36e49d4a" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T14:20:39.310713" + }, + "cram - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,b3b70b126f867fdbb7dcea5e36e49d4a" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,b3b70b126f867fdbb7dcea5e36e49d4a" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T14:21:04.771199" + }, + "bam": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d522a1fa016b259d6a55620ae53dcd63" + ] + ], + "1": [ + "versions.yml:md5,b3b70b126f867fdbb7dcea5e36e49d4a" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d522a1fa016b259d6a55620ae53dcd63" + ] + ], + "versions": [ + "versions.yml:md5,b3b70b126f867fdbb7dcea5e36e49d4a" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T14:19:06.645466" + } +} \ No newline at end of file diff --git a/modules/nf-core/sortmerna/environment.yml b/modules/nf-core/sortmerna/environment.yml new file mode 100644 index 000000000..f40f9958d --- /dev/null +++ b/modules/nf-core/sortmerna/environment.yml @@ -0,0 +1,7 @@ +name: sortmerna +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::sortmerna=4.3.6 diff --git a/modules/nf-core/sortmerna/main.nf b/modules/nf-core/sortmerna/main.nf index 7afae5a68..7c17e500c 100644 --- a/modules/nf-core/sortmerna/main.nf +++ b/modules/nf-core/sortmerna/main.nf @@ -1,70 +1,110 @@ process SORTMERNA { tag "$meta.id" - label "process_high" + label 'process_high' - conda "bioconda::sortmerna=4.3.4" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/sortmerna:4.3.4--h9ee0642_0' : - 'biocontainers/sortmerna:4.3.4--h9ee0642_0' }" + 'https://depot.galaxyproject.org/singularity/sortmerna:4.3.6--h9ee0642_0' : + 'biocontainers/sortmerna:4.3.6--h9ee0642_0' }" input: tuple val(meta), path(reads) - path fastas + tuple val(meta2), path(fastas) + tuple val(meta3), path(index) output: - tuple val(meta), path("*non_rRNA.fastq.gz"), emit: reads - tuple val(meta), path("*.log") , emit: log - path "versions.yml" , emit: versions + tuple val(meta), path("*non_rRNA.fastq.gz"), emit: reads, optional: true + tuple val(meta), path("*.log") , emit: log, optional: true + tuple val(meta2), path("idx") , emit: index, optional: true + 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}" - if (meta.single_end) { - """ - sortmerna \\ - ${'--ref '+fastas.join(' --ref ')} \\ - --reads $reads \\ - --threads $task.cpus \\ - --workdir . \\ - --aligned rRNA_reads \\ - --fastx \\ - --other non_rRNA_reads \\ - $args + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" - mv non_rRNA_reads.f*q.gz ${prefix}.non_rRNA.fastq.gz - mv rRNA_reads.log ${prefix}.sortmerna.log + def index_only = args.contains('--index 1')? true : false + def skip_index = args.contains('--index 0')? true : false + def paired_end = reads instanceof List + def paired_cmd = '' + def reads_args = '' + def out2_cmd = '' + def mv_cmd = '' + def reads_input = '' + def refs_input = '' - cat <<-END_VERSIONS > versions.yml - "${task.process}": - sortmerna: \$(echo \$(sortmerna --version 2>&1) | sed 's/^.*SortMeRNA version //; s/ Build Date.*\$//') - END_VERSIONS - """ - } else { - """ - sortmerna \\ - ${'--ref '+fastas.join(' --ref ')} \\ - --reads ${reads[0]} \\ - --reads ${reads[1]} \\ - --threads $task.cpus \\ - --workdir . \\ - --aligned rRNA_reads \\ - --fastx \\ - --other non_rRNA_reads \\ - --paired_in \\ - --out2 \\ - $args + if (! index_only){ + reads_args = '--aligned rRNA_reads --fastx --other non_rRNA_reads' + reads_input = paired_end ? reads.collect{"--reads $it"}.join(' ') : "--reads $reads" + def n_fastq = paired_end ? reads.size() : 1 + if ( n_fastq == 1 ) { + mv_cmd = """ + mv non_rRNA_reads.f*q.gz ${prefix}.non_rRNA.fastq.gz + mv rRNA_reads.log ${prefix}.sortmerna.log + """ + } else { + mv_cmd = """ + mv non_rRNA_reads_fwd.f*q.gz ${prefix}_1.non_rRNA.fastq.gz + mv non_rRNA_reads_rev.f*q.gz ${prefix}_2.non_rRNA.fastq.gz + mv rRNA_reads.log ${prefix}.sortmerna.log + """ + paired_cmd = "--paired_in" + out2_cmd = "--out2" + } + } + """ + sortmerna \\ + ${'--ref '+fastas.join(' --ref ')} \\ + $refs_input \\ + $reads_input \\ + --threads $task.cpus \\ + --workdir . \\ + $reads_args \\ + $paired_cmd \\ + $out2_cmd \\ + $args + + $mv_cmd + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sortmerna: \$(echo \$(sortmerna --version 2>&1) | sed 's/^.*SortMeRNA version //; s/ Build Date.*\$//') + END_VERSIONS + """ - mv non_rRNA_reads_fwd.f*q.gz ${prefix}_1.non_rRNA.fastq.gz - mv non_rRNA_reads_rev.f*q.gz ${prefix}_2.non_rRNA.fastq.gz - mv rRNA_reads.log ${prefix}.sortmerna.log + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" - cat <<-END_VERSIONS > versions.yml - "${task.process}": - sortmerna: \$(echo \$(sortmerna --version 2>&1) | sed 's/^.*SortMeRNA version //; s/ Build Date.*\$//') - END_VERSIONS - """ + def index_only = args.contains('--index 1')? true : false + def paired_end = reads instanceof List + def paired_cmd = '' + def out2_cmd = '' + def mv_cmd = '' + def reads_input = '' + + if (! index_only){ + reads_input = paired_end ? reads.collect{"--reads $it"}.join(' ') : "--reads $reads" + def n_fastq = paired_end ? reads.size() : 1 + if ( n_fastq == 1 ) { + mv_cmd = "touch ${prefix}.non_rRNA.fastq.gz" + } else { + mv_cmd = """ + touch ${prefix}_1.non_rRNA.fastq.gz + touch ${prefix}_2.non_rRNA.fastq.gz + """ + } } + """ + $mv_cmd + mkdir -p idx + touch ${prefix}.sortmerna.log + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sortmerna: \$(echo \$(sortmerna --version 2>&1) | sed 's/^.*SortMeRNA version //; s/ Build Date.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/sortmerna/meta.yml b/modules/nf-core/sortmerna/meta.yml index 516d11606..c0a2a581f 100644 --- a/modules/nf-core/sortmerna/meta.yml +++ b/modules/nf-core/sortmerna/meta.yml @@ -23,16 +23,31 @@ input: description: | List of input FastQ files of size 1 and 2 for single-end and paired-end data, respectively. + - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test' ] - fastas: type: file description: | Path to reference file(s) + - meta3: + type: map + description: | + Groovy Map containing index information + e.g. [ id:'test' ] + - index: + type: directory + description: | + Path to index directory of a previous sortmerna run output: - meta: type: map description: | Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + e.g. [ id:'test', single_end:false ], or reference information from an + indexing-only run - reads: type: file description: The filtered fastq reads @@ -41,6 +56,15 @@ output: type: file description: SortMeRNA log file pattern: "*sortmerna.log" + - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test' ] + - index: + type: directory + description: | + Path to index directory generated by sortmern - versions: type: file description: File containing software versions @@ -48,3 +72,6 @@ output: authors: - "@drpatelh" - "@mashehu" +maintainers: + - "@drpatelh" + - "@mashehu" diff --git a/modules/nf-core/sortmerna/nextflow.config b/modules/nf-core/sortmerna/nextflow.config new file mode 100644 index 000000000..953da5a39 --- /dev/null +++ b/modules/nf-core/sortmerna/nextflow.config @@ -0,0 +1,20 @@ +if (params.remove_ribo_rna) { + process { + withName: 'SORTMERNA' { + ext.args = '--num_alignments 1 -v --index 0' + publishDir = [ + [ + path: { "${params.outdir}/sortmerna" }, + mode: params.publish_dir_mode, + pattern: "*.log" + ], + [ + path: { params.save_non_ribo_reads ? "${params.outdir}/sortmerna" : params.outdir }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz", + saveAs: { params.save_non_ribo_reads ? it : null } + ] + ] + } + } +} \ No newline at end of file diff --git a/modules/nf-core/sortmerna/tests/indexing_only.config b/modules/nf-core/sortmerna/tests/indexing_only.config new file mode 100644 index 000000000..3e74a3229 --- /dev/null +++ b/modules/nf-core/sortmerna/tests/indexing_only.config @@ -0,0 +1,5 @@ +process { + withName: 'SORTMERNA' { + ext.args = '--index 1' + } +} diff --git a/modules/nf-core/sortmerna/tests/main.nf.test b/modules/nf-core/sortmerna/tests/main.nf.test new file mode 100644 index 000000000..1954bdfb0 --- /dev/null +++ b/modules/nf-core/sortmerna/tests/main.nf.test @@ -0,0 +1,324 @@ +nextflow_process { + + name "Test Process SORTMERNA" + script "../main.nf" + process "SORTMERNA" + + test("sarscov2 indexing only") { + + config './indexing_only.config' + + when { + process { + """ + input[0] = Channel.of([[],[]]) + input[1] = [ [id:'test2'], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) ] + ] + input[2] = Channel.of([[],[]]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert ! process.out.reads }, + { assert snapshot(process.out.index).match("index_index_only") }, + { assert snapshot(process.out.versions).match("versions_index_only") } + ) + } + + } + + test("sarscov2 indexing only stub") { + + options '-stub' + config './indexing_only.config' + + when { + process { + """ + input[0] = Channel.of([[],[]]) + input[1] = [ [id:'test2'], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) ] + ] + input[2] = Channel.of([[],[]]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert ! process.out.reads }, + { assert snapshot(process.out.index).match("index_only_stub") }, + { assert snapshot(process.out.versions).match("versions_index_only_stub") } + ) + } + + } + + test("sarscov2 single_end") { + + when { + process { + """ + input[0] = [ [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true) ] + ] + input[1] = [ [id:'test2'], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) ] + ] + input[2] = Channel.of([[],[]]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.reads }, + { assert file(process.out.log[0][1]).text.contains("Total reads passing E-value threshold = 100 (100.00)") }, + { + assert snapshot( + ( + [process.out.reads[0][0].toString()] + // meta + process.out.reads.collect { file(it[1]).getName() } + + process.out.log.collect { file(it[1]).getName() } + ).sort() + ).match("sarscov2 single_end_match") + }, + { assert snapshot(process.out.index).match("index_single_end") }, + { assert snapshot(process.out.versions).match("versions_single_end") } + ) + } + + } + + test("sarscov2 single_end stub") { + + options '-stub' + + when { + process { + """ + input[0] = [ [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true) ] + ] + input[1] = [ [id:'test2'], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) ] + ] + input[2] = Channel.of([[],[]]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { + assert snapshot( + ( + [process.out.reads[0][0].toString()] + // meta + process.out.reads.collect { file(it[1]).getName() } + + process.out.log.collect { file(it[1]).getName() } + ).sort() + ).match("sarscov2 single_end-for_stub_match") + }, + { assert snapshot(process.out.index).match("index_single_end_stub") }, + { assert snapshot(process.out.versions).match("versions_single_end_stub") } + ) + } + + } + + test("sarscov2 paired_end") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // 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] = [ [id:'test2'], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) ] + ] + input[2] = Channel.of([[],[]]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.reads }, + { assert file(process.out.log[0][1]).text.contains("Total reads passing E-value threshold = 200 (100.00)") }, + { + assert snapshot( + ( + [process.out.reads[0][0].toString()] + // meta + process.out.reads.collect { it[1].collect { item -> file(item).getName() } } + + process.out.log.collect { file(it[1]).getName() } + ).sort() + ).match("sarscov2 paired_end_match") + }, + { assert snapshot(process.out.index).match("index_paired_end") }, + { assert snapshot(process.out.versions).match("versions_paired_end") } + ) + } + + } + + test("sarscov2 paired_end stub") { + + options '-stub' + + when { + process { + """ + input[0] = [ [ id:'test' ], // 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] = [ [id:'test2'], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) ] + ] + input[2] = Channel.of([[],[]]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { + assert snapshot( + ( + [process.out.reads[0][0].toString()] + // meta + process.out.reads.collect { it[1].collect { item -> file(item).getName() } } + + process.out.log.collect { file(it[1]).getName() } + ).sort() + ).match("sarscov2 paired_end-for_stub_match") + }, + { assert snapshot(process.out.index).match("index_paired_end_stub") }, + { assert snapshot(process.out.versions).match("versions_paired_end_stub") } + ) + } + + } + + test("sarscov2 single_end premade_index") { + + config './premade_index.config' + + setup { + + run("SORTMERNA", alias: "SORTMERNA_INDEX") { + script "../main.nf" + process { + """ + input[0] = Channel.of([[],[]]) + input[1] = [ [id:'test2'], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) ] + ] + input[2] = Channel.of([[],[]]) + """ + } + } + } + + when { + process { + """ + input[0] = [ [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true) ] + ] + input[1] = [ [id:'test2'], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) ] + ] + input[2] = SORTMERNA_INDEX.out.index + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.reads }, + { assert file(process.out.log[0][1]).text.contains("Total reads passing E-value threshold = 100 (100.00)") }, + { + assert snapshot( + ( + [process.out.reads[0][0].toString()] + // meta + process.out.reads.collect { file(it[1]).getName() } + + process.out.log.collect { file(it[1]).getName() } + ).sort() + ).match("sarscov2 single_end_premade_index_match") + }, + { assert snapshot(process.out.index).match("index_single_end_premade_index") }, + { assert snapshot(process.out.versions).match("versions_single_end_premade_index") } + ) + } + } + + test("sarscov2 single_end premade_index stub") { + + config './premade_index.config' + options '-stub' + + setup { + + run("SORTMERNA", alias: "SORTMERNA_INDEX") { + script "../main.nf" + process { + """ + input[0] = Channel.of([[],[]]) + input[1] = [ [id:'test2'], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) ] + ] + input[2] = Channel.of([[],[]]) + """ + } + } + } + + when { + process { + """ + input[0] = [ [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true) ] + ] + input[1] = [ [id:'test2'], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) ] + ] + input[2] = SORTMERNA_INDEX.out.index + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.reads }, + { + assert snapshot( + ( + [process.out.reads[0][0].toString()] + // meta + process.out.reads.collect { file(it[1]).getName() } + + process.out.log.collect { file(it[1]).getName() } + ).sort() + ).match("sarscov2 single_end_premade_index_match_stub") + }, + { assert snapshot(process.out.index).match("index_single_end_premade_index_stub") }, + { assert snapshot(process.out.versions).match("versions_single_end_premade_index_stub") } + ) + } + } +} diff --git a/modules/nf-core/sortmerna/tests/main.nf.test.snap b/modules/nf-core/sortmerna/tests/main.nf.test.snap new file mode 100644 index 000000000..86e84733b --- /dev/null +++ b/modules/nf-core/sortmerna/tests/main.nf.test.snap @@ -0,0 +1,352 @@ +{ + "versions_paired_end_stub": { + "content": [ + [ + "versions.yml:md5,7df9d50209f351e1f75e05a1fad6ba4b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-07T12:27:11.223149" + }, + "index_paired_end_stub": { + "content": [ + [ + [ + { + "id": "test2" + }, + [ + + ] + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T14:24:25.384097178" + }, + "versions_paired_end": { + "content": [ + [ + "versions.yml:md5,7df9d50209f351e1f75e05a1fad6ba4b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-07T12:27:04.517155" + }, + "versions_single_end_stub": { + "content": [ + [ + "versions.yml:md5,7df9d50209f351e1f75e05a1fad6ba4b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-01T12:10:35.228450189" + }, + "sarscov2 single_end_match": { + "content": [ + [ + "test.non_rRNA.fastq.gz", + "test.sortmerna.log", + "{id=test}" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-07T12:28:23.20327" + }, + "index_only_stub": { + "content": [ + [ + [ + { + "id": "test2" + }, + [ + + ] + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T15:00:47.128504164" + }, + "index_single_end_premade_index": { + "content": [ + [ + [ + { + "id": "test2" + }, + [ + "2415186086593376314.bursttrie_0.dat:md5,74f7f020e8d46e24a8a2e9c5fbcd564a", + "2415186086593376314.kmer_0.dat:md5,4a0bcb71b120f6a6949b7969292ef2e7", + "2415186086593376314.pos_0.dat:md5,bc2875e4cc4017707306565e396839ef", + "2415186086593376314.stats:md5,67c9d4c768f28a450fc82a2b5d43db5c" + ] + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T15:01:53.832643452" + }, + "versions_single_end_premade_index": { + "content": [ + [ + "versions.yml:md5,7df9d50209f351e1f75e05a1fad6ba4b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T15:01:53.902154982" + }, + "sarscov2 paired_end-for_stub_match": { + "content": [ + [ + "{id=test}", + [ + "test_1.non_rRNA.fastq.gz", + "test_2.non_rRNA.fastq.gz" + ], + "test.sortmerna.log" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-07T12:28:56.063579" + }, + "index_paired_end": { + "content": [ + [ + [ + { + "id": "test2" + }, + [ + "2415186086593376314.bursttrie_0.dat:md5,74f7f020e8d46e24a8a2e9c5fbcd564a", + "2415186086593376314.kmer_0.dat:md5,4a0bcb71b120f6a6949b7969292ef2e7", + "2415186086593376314.pos_0.dat:md5,bc2875e4cc4017707306565e396839ef", + "2415186086593376314.stats:md5,67c9d4c768f28a450fc82a2b5d43db5c" + ] + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T14:24:14.272659781" + }, + "sarscov2 single_end_premade_index_match_stub": { + "content": [ + [ + "test.non_rRNA.fastq.gz", + "test.sortmerna.log", + "{id=test}" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T15:05:01.913287272" + }, + "sarscov2 single_end-for_stub_match": { + "content": [ + [ + "test.non_rRNA.fastq.gz", + "test.sortmerna.log", + "{id=test}" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-07T12:28:29.197913" + }, + "sarscov2 paired_end_match": { + "content": [ + [ + "{id=test}", + [ + "test_1.non_rRNA.fastq.gz", + "test_2.non_rRNA.fastq.gz" + ], + "test.sortmerna.log" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-07T12:28:49.914992" + }, + "versions_single_end": { + "content": [ + [ + "versions.yml:md5,7df9d50209f351e1f75e05a1fad6ba4b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T14:36:27.14244294" + }, + "versions_index_only": { + "content": [ + [ + "versions.yml:md5,7df9d50209f351e1f75e05a1fad6ba4b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T15:00:35.609161481" + }, + "versions_single_end_premade_index_stub": { + "content": [ + [ + "versions.yml:md5,7df9d50209f351e1f75e05a1fad6ba4b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T15:05:02.059858431" + }, + "index_single_end_stub": { + "content": [ + [ + [ + { + "id": "test2" + }, + [ + + ] + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T14:23:58.068772508" + }, + "versions_index_only_stub": { + "content": [ + [ + "versions.yml:md5,7df9d50209f351e1f75e05a1fad6ba4b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T15:00:47.169402699" + }, + "index_single_end_premade_index_stub": { + "content": [ + [ + [ + { + "id": "test2" + }, + [ + + ] + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T15:05:01.953316205" + }, + "index_single_end": { + "content": [ + [ + [ + { + "id": "test2" + }, + [ + "2415186086593376314.bursttrie_0.dat:md5,74f7f020e8d46e24a8a2e9c5fbcd564a", + "2415186086593376314.kmer_0.dat:md5,4a0bcb71b120f6a6949b7969292ef2e7", + "2415186086593376314.pos_0.dat:md5,bc2875e4cc4017707306565e396839ef", + "2415186086593376314.stats:md5,67c9d4c768f28a450fc82a2b5d43db5c" + ] + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T14:36:26.88061978" + }, + "index_index_only": { + "content": [ + [ + [ + { + "id": "test2" + }, + [ + "2415186086593376314.bursttrie_0.dat:md5,74f7f020e8d46e24a8a2e9c5fbcd564a", + "2415186086593376314.kmer_0.dat:md5,4a0bcb71b120f6a6949b7969292ef2e7", + "2415186086593376314.pos_0.dat:md5,bc2875e4cc4017707306565e396839ef", + "2415186086593376314.stats:md5,67c9d4c768f28a450fc82a2b5d43db5c" + ] + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T15:00:35.34089252" + }, + "sarscov2 single_end_premade_index_match": { + "content": [ + [ + "test.non_rRNA.fastq.gz", + "test.sortmerna.log", + "{id=test}" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-26T15:01:53.797737296" + } +} \ No newline at end of file diff --git a/modules/nf-core/sortmerna/tests/premade_index.config b/modules/nf-core/sortmerna/tests/premade_index.config new file mode 100644 index 000000000..ab86d2e62 --- /dev/null +++ b/modules/nf-core/sortmerna/tests/premade_index.config @@ -0,0 +1,8 @@ +process { + withName: 'SORTMERNA_INDEX' { + ext.args = '--index 1' + } + withName: 'SORTMERNA' { + ext.args = '--index 0' + } +} diff --git a/modules/nf-core/star/align/environment.yml b/modules/nf-core/star/align/environment.yml new file mode 100644 index 000000000..8bd58cff5 --- /dev/null +++ b/modules/nf-core/star/align/environment.yml @@ -0,0 +1,10 @@ +name: star_align +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::star=2.7.10a + - bioconda::samtools=1.18 + - bioconda::htslib=1.18 + - conda-forge::gawk=5.1.0 diff --git a/modules/nf-core/star/align/main.nf b/modules/nf-core/star/align/main.nf index d0e203848..ae67e0040 100644 --- a/modules/nf-core/star/align/main.nf +++ b/modules/nf-core/star/align/main.nf @@ -2,10 +2,10 @@ process STAR_ALIGN { tag "$meta.id" label 'process_high' - conda "bioconda::star=2.7.10a bioconda::samtools=1.16.1 conda-forge::gawk=5.1.0" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:1df389393721fc66f3fd8778ad938ac711951107-0' : - 'biocontainers/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:1df389393721fc66f3fd8778ad938ac711951107-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:ded3841da0194af2701c780e9b3d653a85d27489-0' : + 'biocontainers/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:ded3841da0194af2701c780e9b3d653a85d27489-0' }" input: tuple val(meta), path(reads, stageAs: "input*/*") @@ -81,6 +81,8 @@ process STAR_ALIGN { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ + echo "" | gzip > ${prefix}.unmapped_1.fastq.gz + echo "" | gzip > ${prefix}.unmapped_2.fastq.gz touch ${prefix}Xd.out.bam touch ${prefix}.Log.final.out touch ${prefix}.Log.out @@ -89,8 +91,6 @@ process STAR_ALIGN { touch ${prefix}.toTranscriptome.out.bam touch ${prefix}.Aligned.unsort.out.bam touch ${prefix}.Aligned.sortedByCoord.out.bam - touch ${prefix}.unmapped_1.fastq.gz - touch ${prefix}.unmapped_2.fastq.gz touch ${prefix}.tab touch ${prefix}.SJ.out.tab touch ${prefix}.ReadsPerGene.out.tab diff --git a/modules/nf-core/star/align/meta.yml b/modules/nf-core/star/align/meta.yml index 3d8fed0cc..e80dbb7dd 100644 --- a/modules/nf-core/star/align/meta.yml +++ b/modules/nf-core/star/align/meta.yml @@ -52,7 +52,6 @@ input: - seq_center: type: string description: Sequencing center - output: - bam: type: file @@ -106,8 +105,11 @@ output: type: file description: STAR output bedGraph format file(s) (optional) pattern: "*.bg" - authors: - "@kevinmenden" - "@drpatelh" - "@praveenraj2018" +maintainers: + - "@kevinmenden" + - "@drpatelh" + - "@praveenraj2018" diff --git a/modules/nf-core/star/align/tests/main.nf.test b/modules/nf-core/star/align/tests/main.nf.test new file mode 100644 index 000000000..69f655ef4 --- /dev/null +++ b/modules/nf-core/star/align/tests/main.nf.test @@ -0,0 +1,604 @@ +nextflow_process { + + name "Test Process STAR_ALIGN" + script "../main.nf" + process "STAR_ALIGN" + + test("homo_sapiens - single_end") { + config "./nextflow.config" + + setup { + run("STAR_GENOMEGENERATE") { + script "../../../star/genomegenerate/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true) ] + ]) + input[1] = STAR_GENOMEGENERATE.out.index + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log_final[0][1]).name, + file(process.out.log_out[0][1]).name, + file(process.out.log_progress[0][1]).name, + process.out.bam, + process.out.bam_sorted, + process.out.bam_transcript, + process.out.bam_unsorted, + process.out.bedgraph, + process.out.fastq, + process.out.junction, + process.out.read_per_gene_tab, + process.out.sam, + process.out.spl_junc_tab, + process.out.tab, + process.out.wig, + process.out.versions + ).match() } + ) + } + } + + test("homo_sapiens - paired_end") { + config "./nextflow.config" + + setup { + run("STAR_GENOMEGENERATE") { + script "../../../star/genomegenerate/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE.out.index + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log_final[0][1]).name, + file(process.out.log_out[0][1]).name, + file(process.out.log_progress[0][1]).name, + process.out.bam, + process.out.bam_sorted, + process.out.bam_transcript, + process.out.bam_unsorted, + process.out.bedgraph, + process.out.fastq, + process.out.junction, + process.out.read_per_gene_tab, + process.out.sam, + process.out.spl_junc_tab, + process.out.tab, + process.out.wig, + process.out.versions + ).match() } + ) + } + } + + test("homo_sapiens - paired_end - arriba") { + config "./nextflow.arriba.config" + + setup { + run("STAR_GENOMEGENERATE") { + script "../../../star/genomegenerate/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE.out.index + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log_final[0][1]).name, + file(process.out.log_out[0][1]).name, + file(process.out.log_progress[0][1]).name, + process.out.bam, + process.out.bam_sorted, + process.out.bam_transcript, + process.out.bam_unsorted, + process.out.bedgraph, + process.out.fastq, + process.out.junction, + process.out.read_per_gene_tab, + process.out.sam, + process.out.spl_junc_tab, + process.out.tab, + process.out.wig, + process.out.versions + ).match() } + ) + } + } + + test("homo_sapiens - paired_end - starfusion") { + config "./nextflow.starfusion.config" + + setup { + run("STAR_GENOMEGENERATE") { + script "../../../star/genomegenerate/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE.out.index + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log_final[0][1]).name, + file(process.out.log_out[0][1]).name, + file(process.out.log_progress[0][1]).name, + process.out.bam, + process.out.bam_sorted, + process.out.bam_transcript, + process.out.bam_unsorted, + process.out.bedgraph, + process.out.fastq, + process.out.junction, + process.out.read_per_gene_tab, + process.out.sam, + process.out.spl_junc_tab, + process.out.tab, + process.out.wig, + process.out.versions + ).match() } + ) + } + } + + test("homo_sapiens - paired_end - multiple") { + config "./nextflow.config" + + setup { + run("STAR_GENOMEGENERATE") { + script "../../../star/genomegenerate/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE.out.index + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log_final[0][1]).name, + file(process.out.log_out[0][1]).name, + file(process.out.log_progress[0][1]).name, + process.out.bam, + process.out.bam_sorted, + process.out.bam_transcript, + process.out.bam_unsorted, + process.out.bedgraph, + process.out.fastq, + process.out.junction, + process.out.read_per_gene_tab, + process.out.sam, + process.out.spl_junc_tab, + process.out.tab, + process.out.wig, + process.out.versions + ).match() } + ) + } + } + + test("homo_sapiens - single_end - stub") { + options "-stub" + config "./nextflow.config" + + setup { + run("STAR_GENOMEGENERATE") { + script "../../../star/genomegenerate/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true) ] + ]) + input[1] = STAR_GENOMEGENERATE.out.index + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("homo_sapiens - paired_end - stub") { + options "-stub" + config "./nextflow.config" + + setup { + run("STAR_GENOMEGENERATE") { + script "../../../star/genomegenerate/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE.out.index + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("homo_sapiens - paired_end - arriba - stub") { + options "-stub" + config "./nextflow.arriba.config" + + setup { + run("STAR_GENOMEGENERATE") { + script "../../../star/genomegenerate/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE.out.index + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("homo_sapiens - paired_end - starfusion - stub") { + options "-stub" + config "./nextflow.starfusion.config" + + setup { + run("STAR_GENOMEGENERATE") { + script "../../../star/genomegenerate/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE.out.index + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("homo_sapiens - paired_end - multiple - stub") { + options "-stub" + config "./nextflow.config" + + setup { + run("STAR_GENOMEGENERATE") { + script "../../../star/genomegenerate/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + } + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE.out.index + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = false + input[4] = 'illumina' + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} \ No newline at end of file diff --git a/modules/nf-core/star/align/tests/main.nf.test.snap b/modules/nf-core/star/align/tests/main.nf.test.snap new file mode 100644 index 000000000..c814eb56c --- /dev/null +++ b/modules/nf-core/star/align/tests/main.nf.test.snap @@ -0,0 +1,1973 @@ +{ + "homo_sapiens - single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": true + }, + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": true + }, + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + [ + { + "id": "test", + "single_end": true + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "14": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Signal.UniqueMultiple.str1.out.wig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "15": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Signal.UniqueMultiple.str1.out.bg:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_sorted": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_transcript": [ + [ + { + "id": "test", + "single_end": true + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_unsorted": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Signal.UniqueMultiple.str1.out.bg:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "junction": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_final": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_out": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_progress": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "read_per_gene_tab": [ + [ + { + "id": "test", + "single_end": true + }, + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "spl_junc_tab": [ + [ + { + "id": "test", + "single_end": true + }, + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tab": [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ], + "wig": [ + [ + { + "id": "test", + "single_end": true + }, + "test.Signal.UniqueMultiple.str1.out.wig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T15:16:04.712114" + }, + "homo_sapiens - paired_end - arriba - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "14": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.wig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "15": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.bg:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_sorted": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_transcript": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_unsorted": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.bg:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "junction": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_final": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_out": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_progress": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "read_per_gene_tab": [ + [ + { + "id": "test", + "single_end": false + }, + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "spl_junc_tab": [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tab": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ], + "wig": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.wig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T15:16:28.874293" + }, + "homo_sapiens - single_end": { + "content": [ + "test.Log.final.out", + "test.Log.out", + "test.Log.progress.out", + [ + [ + { + "id": "test", + "single_end": true + }, + "test.Aligned.sortedByCoord.out.bam:md5,c6cfaccaf91bc7fdabed3cfe236d4535" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.Aligned.sortedByCoord.out.bam:md5,c6cfaccaf91bc7fdabed3cfe236d4535" + ] + ], + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": true + }, + [ + "test.Signal.Unique.str1.out.bg:md5,c56fc1472776fb927eaf62d973da5f9a", + "test.Signal.UniqueMultiple.str1.out.bg:md5,e93373cf6f2a2a9506e2efdb260cdd4f" + ] + ] + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.SJ.out.tab:md5,75a516ab950fb958f40b29996474949c" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.SJ.out.tab:md5,75a516ab950fb958f40b29996474949c" + ] + ], + [ + + ], + [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T18:02:34.35338" + }, + "homo_sapiens - paired_end": { + "content": [ + "test.Log.final.out", + "test.Log.out", + "test.Log.progress.out", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.sortedByCoord.out.bam:md5,b9ee1c607e07323bc1652ef3babb543f" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.sortedByCoord.out.bam:md5,b9ee1c607e07323bc1652ef3babb543f" + ] + ], + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Signal.Unique.str1.out.bg:md5,d7bf8b70b436ca048a62513e1d0ece3a", + "test.Signal.UniqueMultiple.str1.out.bg:md5,686d58493b9eb445b56ace4d67f76ef6" + ] + ] + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,844af19ab0fc8cd9a3f75228445aca0d" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,844af19ab0fc8cd9a3f75228445aca0d" + ] + ], + [ + + ], + [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T18:03:16.701923" + }, + "homo_sapiens - paired_end - multiple - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "14": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.wig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "15": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.bg:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_sorted": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_transcript": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_unsorted": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.bg:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "junction": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_final": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_out": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_progress": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "read_per_gene_tab": [ + [ + { + "id": "test", + "single_end": false + }, + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "spl_junc_tab": [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tab": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ], + "wig": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.wig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T15:16:51.360287" + }, + "homo_sapiens - paired_end - multiple": { + "content": [ + "test.Log.final.out", + "test.Log.out", + "test.Log.progress.out", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.sortedByCoord.out.bam:md5,ab07c21d63ab0a6c07d171d213c81d5a" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.sortedByCoord.out.bam:md5,ab07c21d63ab0a6c07d171d213c81d5a" + ] + ], + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Signal.Unique.str1.out.bg:md5,d7bf8b70b436ca048a62513e1d0ece3a", + "test.Signal.UniqueMultiple.str1.out.bg:md5,686d58493b9eb445b56ace4d67f76ef6" + ] + ] + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,069877e053714e23010fe4e1c003b4a2" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,069877e053714e23010fe4e1c003b4a2" + ] + ], + [ + + ], + [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T13:13:28.987438" + }, + "homo_sapiens - paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "14": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.wig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "15": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.bg:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_sorted": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_transcript": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_unsorted": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.bg:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "junction": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_final": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_out": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_progress": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "read_per_gene_tab": [ + [ + { + "id": "test", + "single_end": false + }, + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "spl_junc_tab": [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tab": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ], + "wig": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.wig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T15:16:16.798018" + }, + "homo_sapiens - paired_end - starfusion": { + "content": [ + "test.Log.final.out", + "test.Log.out", + "test.Log.progress.out", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.out.bam:md5,bcad07b838f6762fc01eea52b5cd3f84" + ] + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,c10ef219f4a30e83711b995bc5e40dba" + ] + ], + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,19c3faa1bfa9a0cc5e4c45f17065b53a" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,19c3faa1bfa9a0cc5e4c45f17065b53a" + ] + ], + [ + + ], + [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T13:10:55.371956" + }, + "homo_sapiens - paired_end - arriba": { + "content": [ + "test.Log.final.out", + "test.Log.out", + "test.Log.progress.out", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.out.bam:md5,c1b1747f5873f2d17762725636e891d5" + ] + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,5155c9fd1f787ad6d7d80987fb06219c" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,5155c9fd1f787ad6d7d80987fb06219c" + ] + ], + [ + + ], + [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T13:05:10.7534" + }, + "homo_sapiens - paired_end - starfusion - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "14": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.wig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "15": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.bg:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_sorted": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bam_transcript": [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_unsorted": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.unsort.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.bg:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastq": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.unmapped_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.unmapped_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "junction": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Chimeric.out.junction:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_final": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_out": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log_progress": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "read_per_gene_tab": [ + [ + { + "id": "test", + "single_end": false + }, + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.out.sam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "spl_junc_tab": [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tab": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,2e6b6d8809f5a17f38f4d27c45dcb22f" + ], + "wig": [ + [ + { + "id": "test", + "single_end": false + }, + "test.Signal.UniqueMultiple.str1.out.wig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T15:16:40.64399" + } +} \ No newline at end of file diff --git a/modules/nf-core/star/align/tests/nextflow.arriba.config b/modules/nf-core/star/align/tests/nextflow.arriba.config new file mode 100644 index 000000000..2324b9e58 --- /dev/null +++ b/modules/nf-core/star/align/tests/nextflow.arriba.config @@ -0,0 +1,14 @@ +process { + + withName: STAR_GENOMEGENERATE { + ext.args = '--genomeSAindexNbases 9' + } + + withName: STAR_ALIGN { + ext.args = '--readFilesCommand zcat --outSAMtype BAM Unsorted --outSAMunmapped Within --outBAMcompression 0 --outFilterMultimapNmax 50 --peOverlapNbasesMin 10 --alignSplicedMateMapLminOverLmate 0.5 --alignSJstitchMismatchNmax 5 -1 5 5 --chimSegmentMin 10 --chimOutType WithinBAM HardClip --chimJunctionOverhangMin 10 --chimScoreDropMax 30 --chimScoreJunctionNonGTAG 0 --chimScoreSeparation 1 --chimSegmentReadGapMax 3 --chimMultimapNmax 50' + } + +} + +// Fix chown issue for the output star folder +docker.runOptions = '--platform=linux/amd64 -u $(id -u):$(id -g)' diff --git a/modules/nf-core/star/align/tests/nextflow.config b/modules/nf-core/star/align/tests/nextflow.config new file mode 100644 index 000000000..c4ac58088 --- /dev/null +++ b/modules/nf-core/star/align/tests/nextflow.config @@ -0,0 +1,14 @@ +process { + + withName: STAR_GENOMEGENERATE { + ext.args = '--genomeSAindexNbases 9' + } + + withName: STAR_ALIGN { + ext.args = '--readFilesCommand zcat --outSAMtype BAM SortedByCoordinate --outWigType bedGraph --outWigStrand Unstranded' + } + +} + +// Fix chown issue for the output star folder +docker.runOptions = '--platform=linux/amd64 -u $(id -u):$(id -g)' diff --git a/modules/nf-core/star/align/tests/nextflow.starfusion.config b/modules/nf-core/star/align/tests/nextflow.starfusion.config new file mode 100644 index 000000000..467b64977 --- /dev/null +++ b/modules/nf-core/star/align/tests/nextflow.starfusion.config @@ -0,0 +1,14 @@ +process { + + withName: STAR_GENOMEGENERATE { + ext.args = '--genomeSAindexNbases 9' + } + + withName: STAR_ALIGN { + ext.args = '--readFilesCommand zcat --outSAMtype BAM Unsorted --outReadsUnmapped None --twopassMode Basic --outSAMstrandField intronMotif --outSAMunmapped Within --chimSegmentMin 12 --chimJunctionOverhangMin 8 --chimOutJunctionFormat 1 --alignSJDBoverhangMin 10 --alignMatesGapMax 100000 --alignIntronMax 100000 --alignSJstitchMismatchNmax 5 -1 5 5 --chimMultimapScoreRange 3 --chimScoreJunctionNonGTAG -4 --chimMultimapNmax 20 --chimNonchimScoreDropMin 10 --peOverlapNbasesMin 12 --peOverlapMMp 0.1 --alignInsertionFlush Right --alignSplicedMateMapLminOverLmate 0 --alignSplicedMateMapLmin 30' + } + +} + +// Fix chown issue for the output star folder +docker.runOptions = '--platform=linux/amd64 -u $(id -u):$(id -g)' diff --git a/modules/nf-core/star/genomegenerate/environment.yml b/modules/nf-core/star/genomegenerate/environment.yml new file mode 100644 index 000000000..791f255e5 --- /dev/null +++ b/modules/nf-core/star/genomegenerate/environment.yml @@ -0,0 +1,10 @@ +name: star_genomegenerate +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::samtools=1.18 + - bioconda::htslib=1.18 + - bioconda::star=2.7.10a + - conda-forge::gawk=5.1.0 diff --git a/modules/nf-core/star/genomegenerate/main.nf b/modules/nf-core/star/genomegenerate/main.nf index 434240427..b8855715b 100644 --- a/modules/nf-core/star/genomegenerate/main.nf +++ b/modules/nf-core/star/genomegenerate/main.nf @@ -2,10 +2,10 @@ process STAR_GENOMEGENERATE { tag "$fasta" label 'process_high' - conda "bioconda::star=2.7.10a bioconda::samtools=1.16.1 conda-forge::gawk=5.1.0" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:1df389393721fc66f3fd8778ad938ac711951107-0' : - 'biocontainers/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:1df389393721fc66f3fd8778ad938ac711951107-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:ded3841da0194af2701c780e9b3d653a85d27489-0' : + 'biocontainers/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:ded3841da0194af2701c780e9b3d653a85d27489-0' }" input: tuple val(meta), path(fasta) @@ -19,9 +19,10 @@ process STAR_GENOMEGENERATE { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def args_list = args.tokenize() - def memory = task.memory ? "--limitGenomeGenerateRAM ${task.memory.toBytes() - 100000000}" : '' + def args = task.ext.args ?: '' + def args_list = args.tokenize() + def memory = task.memory ? "--limitGenomeGenerateRAM ${task.memory.toBytes() - 100000000}" : '' + def include_gtf = gtf ? "--sjdbGTFfile $gtf" : '' if (args_list.contains('--genomeSAindexNbases')) { """ mkdir star @@ -29,7 +30,7 @@ process STAR_GENOMEGENERATE { --runMode genomeGenerate \\ --genomeDir star/ \\ --genomeFastaFiles $fasta \\ - --sjdbGTFfile $gtf \\ + $include_gtf \\ --runThreadN $task.cpus \\ $memory \\ $args @@ -51,7 +52,7 @@ process STAR_GENOMEGENERATE { --runMode genomeGenerate \\ --genomeDir star/ \\ --genomeFastaFiles $fasta \\ - --sjdbGTFfile $gtf \\ + $include_gtf \\ --runThreadN $task.cpus \\ --genomeSAindexNbases \$NUM_BASES \\ $memory \\ @@ -67,30 +68,52 @@ process STAR_GENOMEGENERATE { } stub: - """ - mkdir star - touch star/Genome - touch star/Log.out - touch star/SA - touch star/SAindex - touch star/chrLength.txt - touch star/chrName.txt - touch star/chrNameLength.txt - touch star/chrStart.txt - touch star/exonGeTrInfo.tab - touch star/exonInfo.tab - touch star/geneInfo.tab - touch star/genomeParameters.txt - touch star/sjdbInfo.txt - touch star/sjdbList.fromGTF.out.tab - touch star/sjdbList.out.tab - touch star/transcriptInfo.tab + if (gtf) { + """ + mkdir star + touch star/Genome + touch star/Log.out + touch star/SA + touch star/SAindex + touch star/chrLength.txt + touch star/chrName.txt + touch star/chrNameLength.txt + touch star/chrStart.txt + touch star/exonGeTrInfo.tab + touch star/exonInfo.tab + touch star/geneInfo.tab + touch star/genomeParameters.txt + touch star/sjdbInfo.txt + touch star/sjdbList.fromGTF.out.tab + touch star/sjdbList.out.tab + touch star/transcriptInfo.tab - cat <<-END_VERSIONS > versions.yml - "${task.process}": - star: \$(STAR --version | sed -e "s/STAR_//g") - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') - END_VERSIONS - """ + cat <<-END_VERSIONS > versions.yml + "${task.process}": + star: \$(STAR --version | sed -e "s/STAR_//g") + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') + END_VERSIONS + """ + } else { + """ + mkdir star + touch star/Genome + touch star/Log.out + touch star/SA + touch star/SAindex + touch star/chrLength.txt + touch star/chrName.txt + touch star/chrNameLength.txt + touch star/chrStart.txt + touch star/genomeParameters.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + star: \$(STAR --version | sed -e "s/STAR_//g") + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') + END_VERSIONS + """ + } } diff --git a/modules/nf-core/star/genomegenerate/meta.yml b/modules/nf-core/star/genomegenerate/meta.yml index eba2d9cf1..1061e1b8d 100644 --- a/modules/nf-core/star/genomegenerate/meta.yml +++ b/modules/nf-core/star/genomegenerate/meta.yml @@ -31,7 +31,6 @@ input: - gtf: type: file description: GTF file of the reference genome - output: - meta: type: map @@ -46,7 +45,9 @@ output: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@kevinmenden" - "@drpatelh" +maintainers: + - "@kevinmenden" + - "@drpatelh" diff --git a/modules/nf-core/star/genomegenerate/tests/main.nf.test b/modules/nf-core/star/genomegenerate/tests/main.nf.test new file mode 100644 index 000000000..fed98212d --- /dev/null +++ b/modules/nf-core/star/genomegenerate/tests/main.nf.test @@ -0,0 +1,110 @@ +nextflow_process { + + name "Test Process STAR_GENOMEGENERATE" + script "../main.nf" + process "STAR_GENOMEGENERATE" + + test("fasta_gtf") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.index[0][1]).listFiles().collect { it.getName() }.sort().toString(), + process.out.versions) + .match() } + ) + } + } + + test("fasta") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ [], [] ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.index[0][1]).listFiles().collect { it.getName() }.sort().toString(), + process.out.versions + ).match() } + ) + } + } + + test("fasta_gtf_stub") { + + options '-stub' + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("fasta_stub") { + + options '-stub' + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ [], [] ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/star/genomegenerate/tests/main.nf.test.snap b/modules/nf-core/star/genomegenerate/tests/main.nf.test.snap new file mode 100644 index 000000000..207f4b4f5 --- /dev/null +++ b/modules/nf-core/star/genomegenerate/tests/main.nf.test.snap @@ -0,0 +1,148 @@ +{ + "fasta_gtf": { + "content": [ + "[Genome, Log.out, SA, SAindex, chrLength.txt, chrName.txt, chrNameLength.txt, chrStart.txt, exonGeTrInfo.tab, exonInfo.tab, geneInfo.tab, genomeParameters.txt, sjdbInfo.txt, sjdbList.fromGTF.out.tab, sjdbList.out.tab, transcriptInfo.tab]", + [ + "versions.yml:md5,46b8f1f34bb7f23892cd1eb249ed4d7f" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T14:55:35.478401" + }, + "fasta_gtf_stub": { + "content": [ + { + "0": [ + [ + { + "id": "test_fasta" + }, + [ + "Genome:md5,d41d8cd98f00b204e9800998ecf8427e", + "Log.out:md5,d41d8cd98f00b204e9800998ecf8427e", + "SA:md5,d41d8cd98f00b204e9800998ecf8427e", + "SAindex:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrName.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrNameLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrStart.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "exonGeTrInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "exonInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "geneInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "genomeParameters.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sjdbInfo.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sjdbList.fromGTF.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "sjdbList.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "transcriptInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + "versions.yml:md5,46b8f1f34bb7f23892cd1eb249ed4d7f" + ], + "index": [ + [ + { + "id": "test_fasta" + }, + [ + "Genome:md5,d41d8cd98f00b204e9800998ecf8427e", + "Log.out:md5,d41d8cd98f00b204e9800998ecf8427e", + "SA:md5,d41d8cd98f00b204e9800998ecf8427e", + "SAindex:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrName.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrNameLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrStart.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "exonGeTrInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "exonInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "geneInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "genomeParameters.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sjdbInfo.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sjdbList.fromGTF.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "sjdbList.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "transcriptInfo.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,46b8f1f34bb7f23892cd1eb249ed4d7f" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T14:55:57.247585" + }, + "fasta_stub": { + "content": [ + { + "0": [ + [ + { + "id": "test_fasta" + }, + [ + "Genome:md5,d41d8cd98f00b204e9800998ecf8427e", + "Log.out:md5,d41d8cd98f00b204e9800998ecf8427e", + "SA:md5,d41d8cd98f00b204e9800998ecf8427e", + "SAindex:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrName.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrNameLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrStart.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "genomeParameters.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + "versions.yml:md5,46b8f1f34bb7f23892cd1eb249ed4d7f" + ], + "index": [ + [ + { + "id": "test_fasta" + }, + [ + "Genome:md5,d41d8cd98f00b204e9800998ecf8427e", + "Log.out:md5,d41d8cd98f00b204e9800998ecf8427e", + "SA:md5,d41d8cd98f00b204e9800998ecf8427e", + "SAindex:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrName.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrNameLength.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "chrStart.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "genomeParameters.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,46b8f1f34bb7f23892cd1eb249ed4d7f" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T14:56:07.01742" + }, + "fasta": { + "content": [ + "[Genome, Log.out, SA, SAindex, chrLength.txt, chrName.txt, chrNameLength.txt, chrStart.txt, genomeParameters.txt]", + [ + "versions.yml:md5,46b8f1f34bb7f23892cd1eb249ed4d7f" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T14:55:45.48784" + } +} \ No newline at end of file diff --git a/modules/nf-core/stringtie/stringtie/environment.yml b/modules/nf-core/stringtie/stringtie/environment.yml new file mode 100644 index 000000000..7a0eccdb8 --- /dev/null +++ b/modules/nf-core/stringtie/stringtie/environment.yml @@ -0,0 +1,7 @@ +name: stringtie_stringtie +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::stringtie=2.2.1 diff --git a/modules/nf-core/stringtie/stringtie/main.nf b/modules/nf-core/stringtie/stringtie/main.nf index d0f8b563f..6e25ba27d 100644 --- a/modules/nf-core/stringtie/stringtie/main.nf +++ b/modules/nf-core/stringtie/stringtie/main.nf @@ -2,7 +2,7 @@ process STRINGTIE_STRINGTIE { tag "$meta.id" label 'process_medium' - conda "bioconda::stringtie=2.2.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/stringtie:2.2.1--hecb563c_2' : 'biocontainers/stringtie:2.2.1--hecb563c_2' }" diff --git a/modules/nf-core/stringtie/stringtie/meta.yml b/modules/nf-core/stringtie/stringtie/meta.yml index 75518470b..d8ebdd88a 100644 --- a/modules/nf-core/stringtie/stringtie/meta.yml +++ b/modules/nf-core/stringtie/stringtie/meta.yml @@ -5,7 +5,6 @@ keywords: - assembly - quantification - gtf - tools: - stringtie2: description: | @@ -55,3 +54,5 @@ output: pattern: "versions.yml" authors: - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/modules/nf-core/stringtie/stringtie/nextflow.config b/modules/nf-core/stringtie/stringtie/nextflow.config new file mode 100644 index 000000000..dc0651458 --- /dev/null +++ b/modules/nf-core/stringtie/stringtie/nextflow.config @@ -0,0 +1,17 @@ +if (!params.skip_alignment) { + if (!params.skip_stringtie) { + process { + withName: 'STRINGTIE_STRINGTIE' { + ext.args = { [ + '-v', + params.stringtie_ignore_gtf ? '' : '-e' + ].join(' ').trim() } + publishDir = [ + path: { "${params.outdir}/${params.aligner}/stringtie" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } +} \ No newline at end of file diff --git a/modules/nf-core/stringtie/stringtie/tests/main.nf.test b/modules/nf-core/stringtie/stringtie/tests/main.nf.test new file mode 100644 index 000000000..dc315a314 --- /dev/null +++ b/modules/nf-core/stringtie/stringtie/tests/main.nf.test @@ -0,0 +1,209 @@ +nextflow_process { + + name "Test Process STRINGTIE_STRINGTIE" + script "../main.nf" + process "STRINGTIE_STRINGTIE" + config "./nextflow.config" + + test("sarscov2 [bam] - forward strandedness") { + + when { + process { + """ + input[0] = [ + [ id:'test', strandedness:'forward' ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true) ] + ] + input[1] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.abundance, + process.out.transcript_gtf, + process.out.versions + ).match() } + ) + } + } + + test("sarscov2 [bam] - forward strandedness + reference annotation") { + + when { + process { + """ + input[0] = [ + [ id:'test', strandedness:'forward' ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true) ] + ] + input[1] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.abundance, + process.out.ballgown, + process.out.transcript_gtf, + process.out.versions + ).match() } + ) + } + } + + test("sarscov2 [bam] - reverse strandedness") { + + when { + process { + """ + input[0] = [ + [ id:'test', strandedness:'reverse' ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true) ] + ] + input[1] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.abundance, + process.out.transcript_gtf, + process.out.versions + ).match() } + ) + } + } + + test("sarscov2 [bam] - reverse strandedness + reference annotation") { + + when { + process { + """ + input[0] = [ + [ id:'test', strandedness:'reverse' ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true) ] + ] + input[1] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.abundance, + process.out.ballgown, + process.out.transcript_gtf, + process.out.versions + ).match() } + ) + } + } + + test("sarscov2 [bam] - forward strandedness - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', strandedness:'forward' ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true) ] + ] + input[1] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 [bam] - forward strandedness + reference annotation - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', strandedness:'forward' ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true) ] + ] + input[1] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 [bam] - reverse strandedness - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', strandedness:'reverse' ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true) ] + ] + input[1] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 [bam] - reverse strandedness + reference annotation - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', strandedness:'reverse' ], // meta map + [ file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true) ] + ] + input[1] = file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/stringtie/stringtie/tests/main.nf.test.snap b/modules/nf-core/stringtie/stringtie/tests/main.nf.test.snap new file mode 100644 index 000000000..124dd4cbe --- /dev/null +++ b/modules/nf-core/stringtie/stringtie/tests/main.nf.test.snap @@ -0,0 +1,508 @@ +{ + "sarscov2 [bam] - forward strandedness + reference annotation": { + "content": [ + [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.gene.abundance.txt:md5,7d8bce7f2a922e367cedccae7267c22e" + ] + ], + [ + [ + { + "id": "test", + "strandedness": "forward" + }, + [ + "e2t.ctab:md5,e981c0038295ae54b63cedb1083f1540", + "e_data.ctab:md5,6b4cf69bc03f3f69890f972a0e8b7471", + "i2t.ctab:md5,8a117c8aa4334b4c2d4711932b006fb4", + "i_data.ctab:md5,be3abe09740603213f83d50dcf81427f", + "t_data.ctab:md5,3b66c065da73ae0dd41cc332eff6a818" + ] + ] + ], + [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.transcripts.gtf:md5,f56cf8aba2c4a5673bc7963ba5f12d04" + ] + ], + [ + "versions.yml:md5,3410e8ac349d18c85ddee89337851d38" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T12:33:44.299962" + }, + "sarscov2 [bam] - forward strandedness": { + "content": [ + [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.gene.abundance.txt:md5,d6f5c8cadb8458f1df0427cf790246e3" + ] + ], + [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.transcripts.gtf:md5,569137af5be452413086b50653a97203" + ] + ], + [ + "versions.yml:md5,3410e8ac349d18c85ddee89337851d38" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T12:33:35.177738" + }, + "sarscov2 [bam] - forward strandedness - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.transcripts.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.gene.abundance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.coverage.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.ballgown:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + "versions.yml:md5,3410e8ac349d18c85ddee89337851d38" + ], + "abundance": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.gene.abundance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "ballgown": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.ballgown:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "coverage_gtf": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.coverage.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "transcript_gtf": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.transcripts.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,3410e8ac349d18c85ddee89337851d38" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T12:36:32.885078" + }, + "sarscov2 [bam] - forward strandedness + reference annotation - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.transcripts.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.gene.abundance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.coverage.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.ballgown:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + "versions.yml:md5,3410e8ac349d18c85ddee89337851d38" + ], + "abundance": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.gene.abundance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "ballgown": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.ballgown:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "coverage_gtf": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.coverage.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "transcript_gtf": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.transcripts.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,3410e8ac349d18c85ddee89337851d38" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T12:36:43.325777" + }, + "sarscov2 [bam] - reverse strandedness + reference annotation - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.transcripts.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.gene.abundance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.coverage.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.ballgown:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + "versions.yml:md5,3410e8ac349d18c85ddee89337851d38" + ], + "abundance": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.gene.abundance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "ballgown": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.ballgown:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "coverage_gtf": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.coverage.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "transcript_gtf": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.transcripts.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,3410e8ac349d18c85ddee89337851d38" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T12:37:06.085936" + }, + "sarscov2 [bam] - reverse strandedness - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.transcripts.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.gene.abundance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.coverage.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.ballgown:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + "versions.yml:md5,3410e8ac349d18c85ddee89337851d38" + ], + "abundance": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.gene.abundance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "ballgown": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.ballgown:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "coverage_gtf": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.coverage.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "transcript_gtf": [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.transcripts.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,3410e8ac349d18c85ddee89337851d38" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T12:36:53.837578" + }, + "sarscov2 [bam] - reverse strandedness + reference annotation": { + "content": [ + [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.gene.abundance.txt:md5,7385b870b955dae2c2ab78a70cf05cce" + ] + ], + [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + [ + "e2t.ctab:md5,e981c0038295ae54b63cedb1083f1540", + "e_data.ctab:md5,879b6696029d19c4737b562e9d149218", + "i2t.ctab:md5,8a117c8aa4334b4c2d4711932b006fb4", + "i_data.ctab:md5,be3abe09740603213f83d50dcf81427f", + "t_data.ctab:md5,3b66c065da73ae0dd41cc332eff6a818" + ] + ] + ], + [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.transcripts.gtf:md5,bb346053a8c156b803b055133376c7fa" + ] + ], + [ + "versions.yml:md5,3410e8ac349d18c85ddee89337851d38" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T12:34:03.114695" + }, + "sarscov2 [bam] - reverse strandedness": { + "content": [ + [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.gene.abundance.txt:md5,d6f5c8cadb8458f1df0427cf790246e3" + ] + ], + [ + [ + { + "id": "test", + "strandedness": "reverse" + }, + "test.transcripts.gtf:md5,31c34aec2bf36bb0ea3c16c2afeeeb1f" + ] + ], + [ + "versions.yml:md5,3410e8ac349d18c85ddee89337851d38" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T12:33:52.874479" + } +} \ No newline at end of file diff --git a/modules/nf-core/stringtie/stringtie/tests/nextflow.config b/modules/nf-core/stringtie/stringtie/tests/nextflow.config new file mode 100644 index 000000000..e3aaa0999 --- /dev/null +++ b/modules/nf-core/stringtie/stringtie/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'STRINGTIE_STRINGTIE' { + ext.args = '' + } +} diff --git a/modules/nf-core/subread/featurecounts/environment.yml b/modules/nf-core/subread/featurecounts/environment.yml new file mode 100644 index 000000000..ca19439d7 --- /dev/null +++ b/modules/nf-core/subread/featurecounts/environment.yml @@ -0,0 +1,7 @@ +name: subread_featurecounts +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::subread=2.0.1 diff --git a/modules/nf-core/subread/featurecounts/main.nf b/modules/nf-core/subread/featurecounts/main.nf index a524b92f1..471bd16fd 100644 --- a/modules/nf-core/subread/featurecounts/main.nf +++ b/modules/nf-core/subread/featurecounts/main.nf @@ -2,7 +2,7 @@ process SUBREAD_FEATURECOUNTS { tag "$meta.id" label 'process_medium' - conda "bioconda::subread=2.0.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0' : 'biocontainers/subread:2.0.1--hed695b0_0' }" @@ -44,4 +44,16 @@ process SUBREAD_FEATURECOUNTS { subread: \$( echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g") END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.featureCounts.txt + touch ${prefix}.featureCounts.txt.summary + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + subread: \$( echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g") + END_VERSIONS + """ } diff --git a/modules/nf-core/subread/featurecounts/meta.yml b/modules/nf-core/subread/featurecounts/meta.yml index cf02f1ea7..38a379456 100644 --- a/modules/nf-core/subread/featurecounts/meta.yml +++ b/modules/nf-core/subread/featurecounts/meta.yml @@ -5,7 +5,6 @@ keywords: - fasta - genome - reference - tools: - featurecounts: description: featureCounts is a highly efficient general-purpose read summarization program that counts mapped reads for genomic features such as genes, exons, promoter, gene bodies, genomic bins and chromosomal locations. It can be used to count both RNA-seq and genomic DNA-seq reads. @@ -13,7 +12,6 @@ tools: documentation: http://bioinf.wehi.edu.au/subread-package/SubreadUsersGuide.pdf doi: "10.1093/bioinformatics/btt656" licence: ["GPL v3"] - input: - meta: type: map @@ -28,7 +26,6 @@ input: type: file description: Genomic features annotation in GTF or SAF pattern: "*.{gtf,saf}" - output: - meta: type: map @@ -47,6 +44,7 @@ output: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@ntoda03" +maintainers: + - "@ntoda03" diff --git a/modules/nf-core/subread/featurecounts/nextflow.config b/modules/nf-core/subread/featurecounts/nextflow.config new file mode 100644 index 000000000..3a796d101 --- /dev/null +++ b/modules/nf-core/subread/featurecounts/nextflow.config @@ -0,0 +1,26 @@ +if (!params.skip_alignment && !params.skip_qc) { + if (!params.skip_biotype_qc && params.featurecounts_group_type) { + process { + withName: 'SUBREAD_FEATURECOUNTS' { + ext.args = { [ + '-B -C', + params.gencode ? "-g gene_type" : "-g $params.featurecounts_group_type", + "-t $params.featurecounts_feature_type" + ].join(' ').trim() } + publishDir = [ + path: { "${params.outdir}/${params.aligner}/featurecounts" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: 'MULTIQC_CUSTOM_BIOTYPE' { + publishDir = [ + path: { "${params.outdir}/${params.aligner}/featurecounts" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } +} diff --git a/modules/nf-core/subread/featurecounts/tests/main.nf.test b/modules/nf-core/subread/featurecounts/tests/main.nf.test new file mode 100644 index 000000000..3c0c829bf --- /dev/null +++ b/modules/nf-core/subread/featurecounts/tests/main.nf.test @@ -0,0 +1,151 @@ +nextflow_process { + + name "Test Process SUBREAD_FEATURECOUNTS" + script "../main.nf" + process "SUBREAD_FEATURECOUNTS" + config "./nextflow.config" + + test("sarscov2 [bam] - forward") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'forward' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.counts).match("forward_counts") }, + { assert snapshot(process.out.summary).match("forward_summary") }, + { assert snapshot(process.out.versions).match("forward_versions") } + ) + } + } + + test("sarscov2 [bam] - forward - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'forward' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 [bam] - reverse") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'reverse' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.counts).match("reverse_counts") }, + { assert snapshot(process.out.summary).match("reverse_summary") }, + { assert snapshot(process.out.versions).match("reverse_versions") } + ) + } + } + + test("sarscov2 [bam] - reverse - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'reverse' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 [bam] - unstranded") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'unstranded' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.counts).match("unstranded_counts") }, + { assert snapshot(process.out.summary).match("unstranded_summary") }, + { assert snapshot(process.out.versions).match("unstranded_versions") } + ) + } + } + + test("sarscov2 [bam] - unstranded - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true, strandedness:'unstranded' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.single_end.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/subread/featurecounts/tests/main.nf.test.snap b/modules/nf-core/subread/featurecounts/tests/main.nf.test.snap new file mode 100644 index 000000000..72e8dcddf --- /dev/null +++ b/modules/nf-core/subread/featurecounts/tests/main.nf.test.snap @@ -0,0 +1,323 @@ +{ + "forward_counts": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.featureCounts.txt:md5,0012df4c0a0e47eec1440017ab34f75f" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T15:50:10.685863663" + }, + "unstranded_counts": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "unstranded" + }, + "test.featureCounts.txt:md5,3307d31b44a5d6bb3389786bb8f4e91f" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T15:50:38.67903701" + }, + "reverse_summary": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "reverse" + }, + "test.featureCounts.txt.summary:md5,7cfa30ad678b9bc1bc63afbb0281547b" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T15:50:25.168206514" + }, + "sarscov2 [bam] - forward - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.featureCounts.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.featureCounts.txt.summary:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,c2c0903b93c93d9afd2667052b9ee726" + ], + "counts": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.featureCounts.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "summary": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.featureCounts.txt.summary:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,c2c0903b93c93d9afd2667052b9ee726" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T10:04:22.628032" + }, + "sarscov2 [bam] - reverse - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "reverse" + }, + "test.featureCounts.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "reverse" + }, + "test.featureCounts.txt.summary:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,c2c0903b93c93d9afd2667052b9ee726" + ], + "counts": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "reverse" + }, + "test.featureCounts.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "summary": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "reverse" + }, + "test.featureCounts.txt.summary:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,c2c0903b93c93d9afd2667052b9ee726" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T10:04:52.371212" + }, + "reverse_counts": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "reverse" + }, + "test.featureCounts.txt:md5,8175816b8260ed444d59232bd7e7120b" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T15:50:25.160010804" + }, + "sarscov2 [bam] - unstranded - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "unstranded" + }, + "test.featureCounts.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "unstranded" + }, + "test.featureCounts.txt.summary:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,c2c0903b93c93d9afd2667052b9ee726" + ], + "counts": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "unstranded" + }, + "test.featureCounts.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "summary": [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "unstranded" + }, + "test.featureCounts.txt.summary:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,c2c0903b93c93d9afd2667052b9ee726" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T10:05:25.058902" + }, + "forward_summary": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "forward" + }, + "test.featureCounts.txt.summary:md5,8f602ff9a8ef467af43294e80b367cdf" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T15:50:10.699024934" + }, + "forward_versions": { + "content": [ + [ + "versions.yml:md5,c2c0903b93c93d9afd2667052b9ee726" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T15:50:10.704797013" + }, + "unstranded_summary": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true, + "strandedness": "unstranded" + }, + "test.featureCounts.txt.summary:md5,23164b79f9f23f11c82820db61a35560" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T15:50:38.68776235" + }, + "reverse_versions": { + "content": [ + [ + "versions.yml:md5,c2c0903b93c93d9afd2667052b9ee726" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T15:50:25.175265594" + }, + "unstranded_versions": { + "content": [ + [ + "versions.yml:md5,c2c0903b93c93d9afd2667052b9ee726" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-23T15:50:38.69390501" + } +} \ No newline at end of file diff --git a/modules/nf-core/subread/featurecounts/tests/nextflow.config b/modules/nf-core/subread/featurecounts/tests/nextflow.config new file mode 100644 index 000000000..d9fd4fd57 --- /dev/null +++ b/modules/nf-core/subread/featurecounts/tests/nextflow.config @@ -0,0 +1,9 @@ +process { + + publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" } + + withName: SUBREAD_FEATURECOUNTS { + ext.args = '-t CDS' + } + +} diff --git a/modules/nf-core/summarizedexperiment/summarizedexperiment/environment.yml b/modules/nf-core/summarizedexperiment/summarizedexperiment/environment.yml new file mode 100644 index 000000000..252ace791 --- /dev/null +++ b/modules/nf-core/summarizedexperiment/summarizedexperiment/environment.yml @@ -0,0 +1,9 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +name: "summarizedexperiment_summarizedexperiment" +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - "bioconda::bioconductor-summarizedexperiment=1.32.0" diff --git a/modules/nf-core/summarizedexperiment/summarizedexperiment/main.nf b/modules/nf-core/summarizedexperiment/summarizedexperiment/main.nf new file mode 100644 index 000000000..cc37092fd --- /dev/null +++ b/modules/nf-core/summarizedexperiment/summarizedexperiment/main.nf @@ -0,0 +1,36 @@ +process SUMMARIZEDEXPERIMENT_SUMMARIZEDEXPERIMENT { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bioconductor-summarizedexperiment:1.32.0--r43hdfd78af_0' : + 'biocontainers/bioconductor-summarizedexperiment:1.32.0--r43hdfd78af_0' }" + + input: + tuple val(meta), path(matrix_files) + tuple val(meta2), path(rowdata) + tuple val(meta3), path(coldata) + + output: + tuple val(meta), path("*.rds") , emit: rds + tuple val(meta), path("*.R_sessionInfo.log"), emit: log + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'summarizedexperiment.r' + + stub: + """ + touch ${meta.id}.SummarizedExperiment.rds + touch ${meta.id}.R_sessionInfo.log + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bioconductor-summarizedexperiment: \$(Rscript -e "library(SummarizedExperiment); cat(as.character(packageVersion('SummarizedExperiment')))") + END_VERSIONS + """ +} diff --git a/modules/nf-core/summarizedexperiment/summarizedexperiment/meta.yml b/modules/nf-core/summarizedexperiment/summarizedexperiment/meta.yml new file mode 100644 index 000000000..e5118d289 --- /dev/null +++ b/modules/nf-core/summarizedexperiment/summarizedexperiment/meta.yml @@ -0,0 +1,79 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "summarizedexperiment_summarizedexperiment" +description: | + SummarizedExperiment container +keywords: + - gene + - transcript + - sample + - matrix + - assay +tools: + - "summarizedexperiment": + description: "The SummarizedExperiment container contains one or more assays, each represented by a matrix-like object of numeric or other mode. The rows typically represent genomic ranges of interest and the columns represent samples." + homepage: "https://bioconductor.org/packages/release/bioc/html/SummarizedExperiment.html" + documentation: "https://bioconductor.org/packages/release/bioc/vignettes/SummarizedExperiment/inst/doc/SummarizedExperiment.html" + tool_dev_url: "https://github.com/Bioconductor/SummarizedExperiment" + doi: "10.18129/B9.bioc.SummarizedExperiment" + licence: ["Artistic-2.0"] + +input: + - meta: + type: map + description: | + Groovy Map containing information related to the experiment as a whole + e.g. `[ id:'SRP123456' ]` + - matrix_files: + type: directory + description: | + One or more paths to CSV or TSV matrix files. All files must have the + same rows and columns. + pattern: "*.{csv,tsv}" + - meta2: + type: map + description: | + Groovy Map containing reference information related to the species + reference from which matrix rows are derived e.g. `[ id:'yeast' ]` + - rowdata: + type: file + description: | + Metadata on matrix features. One column must contain all matrix row + IDs. + pattern: "*.{csv,tsv}" + - meta3: + type: map + description: | + Groovy Map containing information related to the experiment as a whole, + as represented by the matrix columns and the sample sheet e.g. + `[id:'SRP123456' ]` + - coldata: + type: file + description: | + Metadata on matrix columns. One column must contain all matrix column + IDs. + pattern: "*.{csv,tsv}" + +output: + - meta: + type: map + description: | + Groovy Map containing information related to the experiment as a whole + e.g. `[ id:'SRP123456' ]` + - rds: + type: file + description: Serialised SummarizedExperiment object + pattern: "*.SummarizedExperiment.rds" + - log: + type: file + description: dump of R SessionInfo + pattern: "*.log" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@pinin4fjords" +maintainers: + - "@pinin4fjords" diff --git a/modules/nf-core/summarizedexperiment/summarizedexperiment/templates/summarizedexperiment.r b/modules/nf-core/summarizedexperiment/summarizedexperiment/templates/summarizedexperiment.r new file mode 100644 index 000000000..6c705350a --- /dev/null +++ b/modules/nf-core/summarizedexperiment/summarizedexperiment/templates/summarizedexperiment.r @@ -0,0 +1,237 @@ +#!/usr/bin/env Rscript + +# Written by Lorena Pantano and revised for flexibility in handling assays +# Released under the MIT license. + +library(SummarizedExperiment) + +#' Flexibly read CSV or TSV files +#' +#' @param file Input file +#' @param header Passed to read.delim() +#' @param row.names Passed to read.delim() +#' +#' @return output Data frame + +read_delim_flexible <- function(file, header = TRUE, row.names = NULL, check.names = TRUE, stringsAsFactors = FALSE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) + + if (ext == "tsv" || ext == "txt") { + separator <- "\\t" + } else if (ext == "csv") { + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + read.delim( + file, + sep = separator, + header = header, + row.names = row.names, + check.names = check.names, + stringsAsFactors = stringsAsFactors + ) +} + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse + +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Find First Column Containing All Specified Entries +#' +#' This function searches through each column of a given data frame to find the +#' first column that contains all of the specified entries in a vector. If such +#' a column is found, the name of the column is returned. If no column matches, +#' the function throws an error. +#' +#' @param namesVector A character vector containing the names to be matched. +#' @param df A data frame within which to search for the column containing all +#' names specified in `namesVector`. +#' +#' @return The name of the first column in `df` that contains all entries from +#' `namesVector`. If no such column exists, the function will throw an error. + +findColumnWithAllEntries <- function(namesVector, df) { + for (colName in names(df)) { + if (all(namesVector %in% df[[colName]])) { + return(colName) + } + } + cat(capture.output(print(df)), sep="\n", file=stderr()) + stop(paste("No column contains all vector entries ", paste(namesVector, collapse = ', '))) +} + +#' Check Matrix Name Uniformity in List +#' +#' Verifies if all matrices in a list have identical row and column names. +#' It returns TRUE if uniformity is found, otherwise FALSE. +#' +#' @param matrices List of matrices. +#' @return Logical indicating uniformity of row and column names. +#' @keywords matrix + +checkRowColNames <- function(matrices) { + # Simplify the comparison process + allEqual <- function(namesList) { + all(sapply(namesList[-1], function(x) identical(x, namesList[[1]]))) + } + + rowNamesEqual <- allEqual(lapply(matrices, rownames)) + colNamesEqual <- allEqual(lapply(matrices, colnames)) + + if ((! rowNamesEqual) || (! colNamesEqual)){ + stop("Rows or columns different among input matrices") + } +} + +#' Parse Metadata From File +#' +#' Reads metadata from a specified file and processes it to handle duplicate +#' rows by aggregating them into a single row based on a unique identifier. +#' The function dynamically identifies the appropriate ID column if not specified. +#' It is designed to be flexible for processing either column (sample) or row (feature) metadata. +#' +#' @param metadata_path Character string specifying the path to the metadata file. +#' @param ids Vector of identifiers (column names or row names) used to match against metadata columns. +#' @param metadata_id_col Optional; character string specifying the column name in the metadata +#' to be used as the unique identifier. If NULL, the function attempts to +#' automatically find a suitable column based on `ids`. +#' +#' @return A data frame of processed metadata with duplicate rows aggregated, and row names set to the unique identifier. + +parse_metadata <- function(metadata_path, ids, metadata_id_col = NULL){ + + metadata <- read_delim_flexible(metadata_path, stringsAsFactors = FALSE, header = TRUE) + if (is.null(metadata_id_col)){ + metadata_id_col <- findColumnWithAllEntries(ids, metadata) + } + + # Remove any all-NA columns + metadata <- metadata[, colSums(is.na(metadata)) != nrow(metadata)] + + # Allow for duplicate rows by the id column + metadata <- aggregate( + . ~ metadata[[metadata_id_col]], + data = metadata, + FUN = function(x) paste(unique(x), collapse = ",") + )[,-1] + + rownames(metadata) <- metadata[[metadata_id_col]] + + metadata[ids,, drop=FALSE] +} + +################################################ +################################################ +## Main script starts here ## +################################################ +################################################ + +# Matrices + +args_opt <- parse_args('$task.ext.args') +matrix_files <- as.list(strsplit('$matrix_files', ' ')[[1]]) + +if ('assay_names' %in% names(args_opt)){ + names(matrix_files) <- unlist(strsplit(args_opt[['assay_names']], ',')[[1]]) +}else{ + names(matrix_files) <- unlist(lapply(matrix_files, tools::file_path_sans_ext)) +} + +# Build and verify the main assays list for the summarisedexperiment + +assay_list <- lapply(matrix_files, function(m){ + mat <- read_delim_flexible(m, row.names = 1, stringsAsFactors = FALSE) + mat[,sapply(mat, is.numeric), drop = FALSE] +}) + +checkRowColNames(assay_list) + +# Construct SummarizedExperiment +se <- SummarizedExperiment( + assays = assay_list +) + +# Add column (sample) metadata if provided + +if ('$coldata' != ''){ + coldata <- parse_metadata( + metadata_path = '$coldata', + ids = colnames(assay_list[[1]]), + metadata_id_col = args_opt\$coldata_id_col + ) + + colData(se) <- DataFrame(coldata) +} + +# Add row (feature) metadata if provided + +if ('$rowdata' != ''){ + rowdata <- parse_metadata( + metadata_path = '$rowdata', + ids = rownames(assay_list[[1]]), + metadata_id_col = args_opt\$rowdata_id_col + ) + + rowData(se) <- DataFrame(rowdata) +} + +# Write outputs as RDS files + +prefix <- tools::file_path_sans_ext(matrix_files[1]) +if ('$task.ext.prefix' != 'null'){ + prefix = '$task.ext.prefix' +} else if ('$meta.id' != 'null'){ + prefix = '$meta.id' +} + +# Save the SummarizedExperiment object +output_file <- paste0(prefix, ".SummarizedExperiment.rds") +saveRDS(se, file = output_file) + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste(prefix, "R_sessionInfo.log", sep = '.')) +citation("SummarizedExperiment") +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +r.version <- strsplit(version[['version.string']], ' ')[[1]][3] +summarizedexperiment.version <- as.character(packageVersion('SummarizedExperiment')) + +writeLines( + c( + '"${task.process}":', + paste(' bioconductor-summarizedexperiment:', summarizedexperiment.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/nf-core/summarizedexperiment/summarizedexperiment/tests/main.nf.test b/modules/nf-core/summarizedexperiment/summarizedexperiment/tests/main.nf.test new file mode 100644 index 000000000..8faa18afb --- /dev/null +++ b/modules/nf-core/summarizedexperiment/summarizedexperiment/tests/main.nf.test @@ -0,0 +1,253 @@ +nextflow_process { + + name "Test Process SUMMARIZEDEXPERIMENT_SUMMARIZEDEXPERIMENT" + script "../main.nf" + process "SUMMARIZEDEXPERIMENT_SUMMARIZEDEXPERIMENT" + + setup { + + run("UNTAR") { + script "../../../untar/main.nf" + process { + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + "genomics/eukaryotes/saccharomyces_cerevisiae/kallisto_results.tar.gz", checkIfExists: true) + ] + """ + } + } + run("CUSTOM_TX2GENE") { + script "../../../custom/tx2gene/main.nf" + process { + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + "genomics/eukaryotes/saccharomyces_cerevisiae/genome_gfp.gtf", checkIfExists: true) + ] + input[1] = UNTAR.out.untar.map { meta, dir -> [ meta, dir.listFiles().collect() ] } + input[2] = 'kallisto' + input[3] = 'gene_id' + input[4] = 'gene_name' + """ + } + } + run("TXIMETA_TXIMPORT") { + script "../../../tximeta/tximport/main.nf" + process { + """ + input[0] = UNTAR.out.untar.map { meta, dir -> [ meta, dir.listFiles().collect() ] } + input[1] = CUSTOM_TX2GENE.out.tx2gene + input[2] = 'kallisto' + """ + } + } + } + + test("saccharomyces_cerevisiae - multi_matrix - rowdata - coldata") { + + config "./multi_matrix.config" + + when { + process { + """ + input[0] = TXIMETA_TXIMPORT.out.counts_gene.join(TXIMETA_TXIMPORT.out.tpm_gene).map{tuple(it[0], [it[1], it[2]])} + input[1] = CUSTOM_TX2GENE.out.tx2gene + input[2] = [ + [ id:'gene'], // meta map + file(params.modules_testdata_base_path + "genomics/eukaryotes/saccharomyces_cerevisiae/samplesheet.csv", checkIfExists: true) + ] + """ + } + } + + then { + // Some of the log will vary between conda runs- but top bit should be fine + def loglines = path(process.out.log[0][1]).readLines()[0..14] + + assertAll( + { assert process.success }, + { assert snapshot(loglines).md5().match("gene_log_multi_matrix_rowdata_coldata") }, + { assert snapshot(process.out.versions).match('versions_multi_matrix_rowdata_coldata') } + ) + } + } + + test("saccharomyces_cerevisiae - multi_matrix - rowdata") { + + config "./multi_matrix.config" + + when { + process { + """ + input[0] = TXIMETA_TXIMPORT.out.counts_gene.join(TXIMETA_TXIMPORT.out.tpm_gene).map{tuple(it[0], [it[1], it[2]])} + input[1] = CUSTOM_TX2GENE.out.tx2gene + input[2] = Channel.of([ [], [] ]) + """ + } + } + + then { + // Some of the log will vary between conda runs- but top bit should be fine + def loglines = path(process.out.log[0][1]).readLines()[0..14] + + assertAll( + { assert process.success }, + { assert snapshot(loglines).md5().match("gene_log_multi_matrix_rowdata") }, + { assert snapshot(process.out.versions).match('versions_multi_matrix_rowdata') } + ) + } + } + + test("saccharomyces_cerevisiae - multi_matrix") { + + config "./multi_matrix.config" + + when { + process { + """ + input[0] = TXIMETA_TXIMPORT.out.counts_gene.join(TXIMETA_TXIMPORT.out.tpm_gene).map{tuple(it[0], [it[1], it[2]])} + input[1] = Channel.of([ [], [] ]) + input[2] = Channel.of([ [], [] ]) + """ + } + } + + then { + // Some of the log will vary between conda runs- but top bit should be fine + def loglines = path(process.out.log[0][1]).readLines()[0..14] + + assertAll( + { assert process.success }, + { assert snapshot(loglines).md5().match("gene_log_multi_matrix") }, + { assert snapshot(process.out.versions).match('versions_multi_matrix') } + ) + } + } + + test("saccharomyces_cerevisiae - single_matrix") { + + config "./single_matrix.config" + + when { + process { + """ + input[0] = TXIMETA_TXIMPORT.out.counts_gene + input[1] = Channel.of([ [], [] ]) + input[2] = Channel.of([ [], [] ]) + """ + } + } + + then { + // Some of the log will vary between conda runs- but top bit should be fine + def loglines = path(process.out.log[0][1]).readLines()[0..14] + + assertAll( + { assert process.success }, + { assert snapshot(loglines).md5().match("gene_log_single_matrix") }, + { assert snapshot(process.out.versions).match('versions_single_matrix') } + ) + } + } + + test("saccharomyces_cerevisiae - multi_matrix - rowdata - coldata - stub") { + + config "./multi_matrix.config" + options "-stub" + + when { + process { + """ + input[0] = TXIMETA_TXIMPORT.out.counts_gene.join(TXIMETA_TXIMPORT.out.tpm_gene).map{tuple(it[0], [it[1], it[2]])} + input[1] = CUSTOM_TX2GENE.out.tx2gene + input[2] = [ + [ id:'gene'], // meta map + file(params.modules_testdata_base_path + "genomics/eukaryotes/saccharomyces_cerevisiae/samplesheet.csv", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.log).match("gene_log_multi_matrix_rowdata_coldataa_stub") }, + { assert snapshot(process.out.versions).match('versions_multi_matrix_rowdata_coldata_stub') } + ) + } + } + + test("saccharomyces_cerevisiae - multi_matrix - rowdata - stub") { + + config "./multi_matrix.config" + options "-stub" + + when { + process { + """ + input[0] = TXIMETA_TXIMPORT.out.counts_gene.join(TXIMETA_TXIMPORT.out.tpm_gene).map{tuple(it[0], [it[1], it[2]])} + input[1] = CUSTOM_TX2GENE.out.tx2gene + input[2] = Channel.of([ [], [] ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.log).match("gene_log_multi_matrix_rowdata_stub") }, + { assert snapshot(process.out.versions).match('versions_multi_matrix_rowdata_stub') } + ) + } + } + + test("saccharomyces_cerevisiae - multi_matrix - stub") { + + config "./multi_matrix.config" + options "-stub" + + when { + process { + """ + input[0] = TXIMETA_TXIMPORT.out.counts_gene.join(TXIMETA_TXIMPORT.out.tpm_gene).map{tuple(it[0], [it[1], it[2]])} + input[1] = Channel.of([ [], [] ]) + input[2] = Channel.of([ [], [] ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.log).match("gene_log_multi_matrix_stub") }, + { assert snapshot(process.out.versions).match('versions_multi_matrix_stub') } + ) + } + } + + test("saccharomyces_cerevisiae - single_matrix - stub") { + + config "./single_matrix.config" + options "-stub" + + when { + process { + """ + input[0] = TXIMETA_TXIMPORT.out.counts_gene + input[1] = Channel.of([ [], [] ]) + input[2] = Channel.of([ [], [] ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.log).match("gene_log_single_matrix_stub") }, + { assert snapshot(process.out.versions).match('versions_single_matrix_stub') } + ) + } + } +} + diff --git a/modules/nf-core/summarizedexperiment/summarizedexperiment/tests/main.nf.test.snap b/modules/nf-core/summarizedexperiment/summarizedexperiment/tests/main.nf.test.snap new file mode 100644 index 000000000..1460532c7 --- /dev/null +++ b/modules/nf-core/summarizedexperiment/summarizedexperiment/tests/main.nf.test.snap @@ -0,0 +1,198 @@ +{ + "gene_log_multi_matrix_rowdata_coldataa_stub": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-11T16:41:31.796715" + }, + "gene_log_single_matrix_stub": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-11T16:42:47.12955" + }, + "versions_single_matrix": { + "content": [ + [ + "versions.yml:md5,9fb424df9dedf0dc55c95215ae802bb9" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-08T14:45:26.13363" + }, + "gene_log_multi_matrix_rowdata_stub": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-11T16:41:54.028064" + }, + "gene_log_multi_matrix_rowdata": { + "content": "7c35131fdd46dcdba6c71f7f11d5b2c7", + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-09T14:02:24.430008757" + }, + "versions_multi_matrix_rowdata_stub": { + "content": [ + [ + "versions.yml:md5,9fb424df9dedf0dc55c95215ae802bb9" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-11T16:41:54.080728" + }, + "versions_multi_matrix_stub": { + "content": [ + [ + "versions.yml:md5,9fb424df9dedf0dc55c95215ae802bb9" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-11T16:42:21.425746" + }, + "versions_multi_matrix_rowdata_coldata_stub": { + "content": [ + [ + "versions.yml:md5,9fb424df9dedf0dc55c95215ae802bb9" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-11T16:41:31.837174" + }, + "gene_log_multi_matrix": { + "content": "7c35131fdd46dcdba6c71f7f11d5b2c7", + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-09T14:02:46.367962336" + }, + "gene_log_multi_matrix_stub": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-11T16:42:21.370562" + }, + "gene_log_single_matrix": { + "content": "7c35131fdd46dcdba6c71f7f11d5b2c7", + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-09T14:03:08.330328893" + }, + "versions_single_matrix_stub": { + "content": [ + [ + "versions.yml:md5,9fb424df9dedf0dc55c95215ae802bb9" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-11T16:42:47.173221" + }, + "versions_multi_matrix_rowdata": { + "content": [ + [ + "versions.yml:md5,9fb424df9dedf0dc55c95215ae802bb9" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-08T14:44:42.420728" + }, + "gene_log_multi_matrix_rowdata_coldata": { + "content": "7c35131fdd46dcdba6c71f7f11d5b2c7", + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-09T14:02:01.244907114" + }, + "versions_multi_matrix": { + "content": [ + [ + "versions.yml:md5,9fb424df9dedf0dc55c95215ae802bb9" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-08T14:45:04.188507" + }, + "versions_multi_matrix_rowdata_coldata": { + "content": [ + [ + "versions.yml:md5,9fb424df9dedf0dc55c95215ae802bb9" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-08T14:44:20.698714" + } +} \ No newline at end of file diff --git a/modules/nf-core/summarizedexperiment/summarizedexperiment/tests/multi_matrix.config b/modules/nf-core/summarizedexperiment/summarizedexperiment/tests/multi_matrix.config new file mode 100644 index 000000000..5e6d2fc3c --- /dev/null +++ b/modules/nf-core/summarizedexperiment/summarizedexperiment/tests/multi_matrix.config @@ -0,0 +1,7 @@ +process { + + withName: SUMMARIZEDEXPERIMENT_SUMMARIZEDEXPERIMENT { + ext.args = '--assay_names counts,abundance' + } + +} diff --git a/modules/nf-core/summarizedexperiment/summarizedexperiment/tests/single_matrix.config b/modules/nf-core/summarizedexperiment/summarizedexperiment/tests/single_matrix.config new file mode 100644 index 000000000..4b6440fd9 --- /dev/null +++ b/modules/nf-core/summarizedexperiment/summarizedexperiment/tests/single_matrix.config @@ -0,0 +1,7 @@ +process { + + withName: SUMMARIZEDEXPERIMENT_SUMMARIZEDEXPERIMENT { + ext.args = '--assay_names counts' + } + +} diff --git a/modules/nf-core/trimgalore/environment.yml b/modules/nf-core/trimgalore/environment.yml new file mode 100644 index 000000000..0981320c1 --- /dev/null +++ b/modules/nf-core/trimgalore/environment.yml @@ -0,0 +1,10 @@ +name: trimgalore + +channels: + - conda-forge + - bioconda + - defaults + +dependencies: + - bioconda::cutadapt=3.4 + - bioconda::trim-galore=0.6.7 diff --git a/modules/nf-core/trimgalore/main.nf b/modules/nf-core/trimgalore/main.nf index dcb77ae7b..0e2f32902 100644 --- a/modules/nf-core/trimgalore/main.nf +++ b/modules/nf-core/trimgalore/main.nf @@ -2,7 +2,7 @@ process TRIMGALORE { tag "$meta.id" label 'process_high' - conda "bioconda::trim-galore=0.6.7" + conda "${moduleDir}/environment.yml" 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' }" @@ -72,4 +72,25 @@ process TRIMGALORE { 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} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + trimgalore: \$(echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//') + cutadapt: \$(cutadapt --version) + END_VERSIONS + """ } diff --git a/modules/nf-core/trimgalore/meta.yml b/modules/nf-core/trimgalore/meta.yml index f84c4d771..e649088ce 100644 --- a/modules/nf-core/trimgalore/meta.yml +++ b/modules/nf-core/trimgalore/meta.yml @@ -62,3 +62,7 @@ authors: - "@drpatelh" - "@ewels" - "@FelixKrueger" +maintainers: + - "@drpatelh" + - "@ewels" + - "@FelixKrueger" 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 000000000..4010af8f4 --- /dev/null +++ b/modules/nf-core/trimgalore/tests/main.nf.test @@ -0,0 +1,147 @@ +nextflow_process { + + name "Test Process TRIMGALORE" + script "../main.nf" + process "TRIMGALORE" + + test("test_trimgalore_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 { + def read_lines = ["@ERR5069949.2151832 NS500628:121:HK3MMAFX2:2:21208:10793:15304/1", + "TCATAAACCAAAGCACTCACAGTGTCAACAATTTCAGCAGGACAACGCCGACAAGTTCCGAGGAACATGTCTGGACCTATAGTTTTCATAAGTCTACACACTGAATTGAAATATTCTGGTTCTAGTGTGCCCTTAGTTAGCAATGTGCGT", + "AAAAAAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEAAEEEEAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEAAEEEEE + { assert path(process.out.reads.get(0).get(1)).linesGzip.contains(read_line) } + } + }, + { report1_lines.each { report1_line -> + { assert path(process.out.log.get(0).get(1)).getText().contains(report1_line) } + } + }, + { assert snapshot(process.out.versions).match() } + ) + } + } + + test("test_trimgalore_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("test_trimgalore_paired_end") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_2.fastq.gz", checkIfExists: true) + ] + ] + """ + } + } + + then { + def read1_lines = ["@ERR5069949.2151832 NS500628:121:HK3MMAFX2:2:21208:10793:15304/1", + "TCATAAACCAAAGCACTCACAGTGTCAACAATTTCAGCAGGACAACGCCGACAAGTTCCGAGGAACATGTCTGGACCTATAGTTTTCATAAGTCTACACACTGAATTGAAATATTCTGGTTCTAGTGTGCCCTTAGTTAGCAATGTGCGT", + "AAAAAAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEAAEEEEAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEAAEEEEE + { assert path(process.out.reads.get(0).get(1).get(0)).linesGzip.contains(read1_line) } + } + }, + { read2_lines.each { read2_line -> + { assert path(process.out.reads.get(0).get(1).get(1)).linesGzip.contains(read2_line) } + } + }, + { report1_lines.each { report1_line -> + { assert path(process.out.log.get(0).get(1).get(0)).getText().contains(report1_line) } + } + }, + { report2_lines.each { report2_line -> + { assert path(process.out.log.get(0).get(1).get(1)).getText().contains(report2_line) } + } + }, + { assert snapshot(process.out.versions).match() } + ) + } + } + + test("test_trimgalore_paired_end - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_2.fastq.gz", checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).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 000000000..6cb31c9f9 --- /dev/null +++ b/modules/nf-core/trimgalore/tests/main.nf.test.snap @@ -0,0 +1,180 @@ +{ + "test_trimgalore_single_end": { + "content": [ + [ + "versions.yml:md5,47d966cbb31c80eb8f7fe860d55659b7" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-29T16:33:20.401347" + }, + "test_trimgalore_single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test_trimmed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + + ], + "5": [ + "versions.yml:md5,47d966cbb31c80eb8f7fe860d55659b7" + ], + "html": [ + + ], + "log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test_trimmed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "unpaired": [ + + ], + "versions": [ + "versions.yml:md5,47d966cbb31c80eb8f7fe860d55659b7" + ], + "zip": [ + + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T10:27:44.964166" + }, + "test_trimgalore_paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1_trimmed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2_trimmed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_2.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + + ], + "5": [ + "versions.yml:md5,47d966cbb31c80eb8f7fe860d55659b7" + ], + "html": [ + + ], + "log": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_2.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1_trimmed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2_trimmed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "unpaired": [ + + ], + "versions": [ + "versions.yml:md5,47d966cbb31c80eb8f7fe860d55659b7" + ], + "zip": [ + + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T10:28:07.611496" + }, + "test_trimgalore_paired_end": { + "content": [ + [ + "versions.yml:md5,47d966cbb31c80eb8f7fe860d55659b7" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-29T16:33:28.960497" + } +} \ No newline at end of file diff --git a/modules/nf-core/tximeta/tximport/environment.yml b/modules/nf-core/tximeta/tximport/environment.yml new file mode 100644 index 000000000..24b202222 --- /dev/null +++ b/modules/nf-core/tximeta/tximport/environment.yml @@ -0,0 +1,9 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +name: "tximeta_tximport" +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - "bioconda::bioconductor-tximeta=1.20.1" diff --git a/modules/nf-core/tximeta/tximport/main.nf b/modules/nf-core/tximeta/tximport/main.nf new file mode 100644 index 000000000..b0cce8536 --- /dev/null +++ b/modules/nf-core/tximeta/tximport/main.nf @@ -0,0 +1,47 @@ +process TXIMETA_TXIMPORT { + label "process_medium" + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bioconductor-tximeta%3A1.20.1--r43hdfd78af_0' : + 'biocontainers/bioconductor-tximeta:1.20.1--r43hdfd78af_0' }" + + input: + tuple val(meta), path("quants/*") + tuple val(meta2), path(tx2gene) + val quant_type + + output: + tuple val(meta), path("*gene_tpm.tsv") , emit: tpm_gene + tuple val(meta), path("*gene_counts.tsv") , emit: counts_gene + tuple val(meta), path("*gene_counts_length_scaled.tsv"), emit: counts_gene_length_scaled + tuple val(meta), path("*gene_counts_scaled.tsv") , emit: counts_gene_scaled + tuple val(meta), path("*gene_lengths.tsv") , emit: lengths_gene + tuple val(meta), path("*transcript_tpm.tsv") , emit: tpm_transcript + tuple val(meta), path("*transcript_counts.tsv") , emit: counts_transcript + tuple val(meta), path("*transcript_lengths.tsv") , emit: lengths_transcript + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'tximport.r' + + stub: + """ + touch ${meta.id}.gene_tpm.tsv + touch ${meta.id}.gene_counts.tsv + touch ${meta.id}.gene_counts_length_scaled.tsv + touch ${meta.id}.gene_counts_scaled.tsv + touch ${meta.id}.gene_lengths.tsv + touch ${meta.id}.transcript_tpm.tsv + touch ${meta.id}.transcript_counts.tsv + touch ${meta.id}.transcript_lengths.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bioconductor-tximeta: \$(Rscript -e "library(tximeta); cat(as.character(packageVersion('tximeta')))") + END_VERSIONS + """ +} diff --git a/modules/nf-core/tximeta/tximport/meta.yml b/modules/nf-core/tximeta/tximport/meta.yml new file mode 100644 index 000000000..9ee5fd365 --- /dev/null +++ b/modules/nf-core/tximeta/tximport/meta.yml @@ -0,0 +1,120 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "tximeta_tximport" +description: | + Import transcript-level abundances and estimated counts for gene-level + analysis packages +keywords: + - gene + - kallisto + - pseudoalignment + - salmon + - transcript +tools: + - "tximeta": + description: "Transcript Quantification Import with Automatic Metadata" + homepage: "https://bioconductor.org/packages/release/bioc/html/tximeta.html" + documentation: "https://bioconductor.org/packages/release/bioc/vignettes/tximeta/inst/doc/tximeta.html" + tool_dev_url: "https://github.com/thelovelab/tximeta" + doi: "10.1371/journal.pcbi.1007664" + licence: ["GPL-2"] + +input: + - meta: + type: map + description: | + Groovy Map containing information related to the experiment as a whole + e.g. `[ id:'SRP123456' ]` + - quants: + type: directory + description: Paths to subdirectories corresponding to + sample-wise runs of Salmon or Kallisto + - meta2: + type: map + description: | + Groovy Map containing reference information related to the species + reference e.g. `[ id:'yeast' ]` + - tx2gene: + type: file + description: A transcript to gene mapping table such as those generated + by custom/tx2gene + pattern: "*.{csv,tsv}" + - meta3: + type: map + description: | + Groovy Map containing information related to the experiment as a whole + e.g. `[ id:'SRP123456' ]` + - coldata: + type: file + description: | + Optional 'coldata' file equivalent to a sample sheet where the first + column corresponds to the sample names (directory names in the input + salmon/ kallisto results) + pattern: "*.{csv,tsv}" + - quant_type: + type: string + description: Quantification type, 'kallisto' or 'salmon' + +output: + - meta: + type: map + description: | + Groovy Map containing information related to the experiment as a whole + e.g. `[ id:'SRP123456' ]` + - tpm_gene: + type: file + description: | + Abundance (TPM) values derived from tximport output after + summarizeToGene(), without a 'countsFromAbundance' specification + pattern: "*gene_tpm.tsv" + - counts_gene: + type: file + description: | + Count values derived from tximport output after + summarizeToGene(), without a 'countsFromAbundance' specification + pattern: "*gene_counts.tsv" + - counts_gene_length_scaled: + type: file + description: | + Count values derived from tximport output after summarizeToGene(), with + a 'countsFromAbundance' specification of 'lengthScaledTPM' + pattern: "*gene_counts_length_scaled.tsv" + - counts_gene_scaled: + type: file + description: | + Count values derived from tximport output after summarizeToGene(), with + a 'countsFromAbundance' specification of 'scaledTPM' + pattern: "*gene_counts_scaled.tsv" + - lengths_gene: + type: file + description: | + Length values derived from tximport output after summarizeToGene(), + without a 'countsFromAbundance' specification + pattern: "*gene_lengths.tsv" + - tpm_transcript: + type: file + description: | + Abundance (TPM) values derived from tximport output without + summarizeToGene(), without a 'countsFromAbundance' specification + pattern: "*transcript_tpm.tsv" + - counts_transcript: + type: file + description: | + Count values derived from tximport output without + summarizeToGene(), without a 'countsFromAbundance' specification + pattern: "*transcript_counts.tsv" + - lengths_transcript: + type: file + description: | + Length values derived from tximport output without summarizeToGene(), + without a 'countsFromAbundance' specification + pattern: "*gene_lengths.tsv" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@pinin4fjords" +maintainers: + - "@pinin4fjords" diff --git a/modules/nf-core/tximeta/tximport/templates/tximport.r b/modules/nf-core/tximeta/tximport/templates/tximport.r new file mode 100755 index 000000000..e8235c8b0 --- /dev/null +++ b/modules/nf-core/tximeta/tximport/templates/tximport.r @@ -0,0 +1,217 @@ +#!/usr/bin/env Rscript --vanilla + +# Script for importing and processing transcript-level quantifications. +# Written by Lorena Pantano, later modified by Jonathan Manning, and released +# under the MIT license. + +# Loading required libraries +library(SummarizedExperiment) +library(tximport) + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Build a table from a SummarizedExperiment object +#' +#' This function takes a SummarizedExperiment object and a specific slot name to extract +#' assay data. It then combines the first two columns of the rowData with the specified +#' assay data slot into a new data table. +#' +#' @param se.obj A SummarizedExperiment object from which to build the table. +#' @param slot The name of the slot in the assays list from which to extract data. +#' +#' @return A data frame combining the first two columns of the rowData with the assay data from the specified slot. + +build_table <- function(se.obj, slot) { + cbind(rowData(se.obj)[,1:2], assays(se.obj)[[slot]]) +} + +#' Write a table to a file from a SummarizedExperiment object with given parameters +#' +#' This function generates a table from a SummarizedExperiment object using specified parameters +#' and writes the resulting table to a file. The file name is constructed using a prefix and a +#' suffix from the parameters, and the table is written with tab separation, without quoting text, +#' and without row names. +#' +#' @param params A list containing the parameters needed for file generation and table writing. +#' The list should include: +#' - `obj`: A SummarizedExperiment object from which to build the table. +#' - `slot`: The name of the slot in the assays list from which to extract data. +#' - `suffix`: Suffix to use for generating the file name. +#' +#' @return NULL The function is called for its side effect of writing a file and does not return anything. + +write_se_table <- function(params, prefix) { + file_name <- paste0(prefix, ".", params\$suffix) + write.table(build_table(params\$obj, params\$slot), file_name, + sep="\t", quote=FALSE, row.names = FALSE) +} + +#' Read Transcript Metadata from a Given Path +#' +#' This function reads transcript metadata from a specified file path. The file is expected to +#' be a tab-separated values file without headers, containing transcript information. The function +#' checks if the file is empty and stops execution with an error message if so. It reads the file +#' into a data frame, expecting columns for transcript IDs, gene IDs, and gene names. Additional +#' processing is done to ensure compatibility with a predefined data structure (e.g., `txi[[1]]`), +#' including adding missing entries and reordering based on the transcript IDs found in `txi[[1]]`. +#' +#' @param tinfo_path The file path to the transcript information file. +#' +#' @return A list containing three elements: +#' - `transcript`: A data frame with transcript IDs, gene IDs, and gene names, indexed by transcript IDs. +#' - `gene`: A data frame with unique gene IDs and gene names. +#' - `tx2gene`: A data frame mapping transcript IDs to gene IDs. + +read_transcript_info <- function(tinfo_path){ + info <- file.info(tinfo_path) + if (info\$size == 0) { + stop("tx2gene file is empty") + } + + transcript_info <- read.csv(tinfo_path, sep="\t", header = TRUE, + col.names = c("tx", "gene_id", "gene_name")) + + extra <- setdiff(rownames(txi[[1]]), as.character(transcript_info[["tx"]])) + transcript_info <- rbind(transcript_info, data.frame(tx=extra, gene_id=extra, gene_name=extra)) + transcript_info <- transcript_info[match(rownames(txi[[1]]), transcript_info[["tx"]]), ] + rownames(transcript_info) <- transcript_info[["tx"]] + + list(transcript = transcript_info, + gene = unique(transcript_info[,2:3]), + tx2gene = transcript_info[,1:2]) +} + +#' Create a SummarizedExperiment Object +#' +#' Constructs a SummarizedExperiment object using provided matrices for counts, abundance, and length, +#' along with metadata for columns and rows. This function facilitates the organization of experimental +#' data (e.g., RNA-seq or other high-throughput data) in a structured format that is convenient for +#' further analyses and visualization. +#' +#' @param counts A matrix or DataFrame containing counts data, with rows as features (e.g., genes) and +#' columns as samples. +#' @param abundance A matrix or DataFrame containing abundance data (e.g., TPM or FPKM) with the same +#' dimensions and row/column names as the counts data. +#' @param length A matrix or DataFrame containing feature lengths, matching the dimensions and row/column +#' names of the counts data. +#' @param col_data A DataFrame containing sample-level metadata, with rows corresponding to columns in the +#' counts, abundance, and length matrices. +#' @param row_data A DataFrame containing feature-level metadata, with rows corresponding to features in +#' the counts, abundance, and length matrices. +#' +#' @return A SummarizedExperiment object containing the supplied data and metadata. + +create_summarized_experiment <- function(counts, abundance, length, col_data, row_data) { + SummarizedExperiment(assays = list(counts = counts, abundance = abundance, length = length), + colData = col_data, + rowData = row_data) +} + +################################################ +################################################ +## Main script starts here ## +################################################ +################################################ + +# Define pattern for file names based on quantification type +pattern <- ifelse('$quant_type' == "kallisto", "abundance.tsv", "quant.sf") +fns <- list.files('quants', pattern = pattern, recursive = T, full.names = T) +names <- basename(dirname(fns)) +names(fns) <- names +dropInfReps <- '$quant_type' == "kallisto" + +# Import transcript-level quantifications +txi <- tximport(fns, type = '$quant_type', txOut = TRUE, dropInfReps = dropInfReps) + +# Read transcript and sample data +transcript_info <- read_transcript_info('$tx2gene') + +# Make coldata just to appease the summarizedexperiment +coldata <- data.frame(files = fns, names = names) +rownames(coldata) <- coldata[["names"]] + +# Create initial SummarizedExperiment object +se <- create_summarized_experiment(txi[["counts"]], txi[["abundance"]], txi[["length"]], + DataFrame(coldata), transcript_info\$transcript) + +# Setting parameters for writing tables +params <- list( + list(obj = se, slot = "abundance", suffix = "transcript_tpm.tsv"), + list(obj = se, slot = "counts", suffix = "transcript_counts.tsv"), + list(obj = se, slot = "length", suffix = "transcript_lengths.tsv") +) + +# Process gene-level data if tx2gene mapping is available +if ("tx2gene" %in% names(transcript_info) && !is.null(transcript_info\$tx2gene)) { + tx2gene <- transcript_info\$tx2gene + gi <- summarizeToGene(txi, tx2gene = tx2gene) + gi.ls <- summarizeToGene(txi, tx2gene = tx2gene, countsFromAbundance = "lengthScaledTPM") + gi.s <- summarizeToGene(txi, tx2gene = tx2gene, countsFromAbundance = "scaledTPM") + + gene_info <- transcript_info\$gene[match(rownames(gi[[1]]), transcript_info\$gene[["gene_id"]]),] + rownames(gene_info) <- NULL + col_data_frame <- DataFrame(coldata) + + # Create gene-level SummarizedExperiment objects + gse <- create_summarized_experiment(gi[["counts"]], gi[["abundance"]], gi[["length"]], + col_data_frame, gene_info) + gse.ls <- create_summarized_experiment(gi.ls[["counts"]], gi.ls[["abundance"]], gi.ls[["length"]], + col_data_frame, gene_info) + gse.s <- create_summarized_experiment(gi.s[["counts"]], gi.s[["abundance"]], gi.s[["length"]], + col_data_frame, gene_info) + + params <- c(params, list( + list(obj = gse, slot = "length", suffix = "gene_lengths.tsv"), + list(obj = gse, slot = "abundance", suffix = "gene_tpm.tsv"), + list(obj = gse, slot = "counts", suffix = "gene_counts.tsv"), + list(obj = gse.ls, slot = "counts", suffix = "gene_counts_length_scaled.tsv"), + list(obj = gse.s, slot = "counts", suffix = "gene_counts_scaled.tsv") + )) +} + +# Writing tables for each set of parameters + +prefix <- '' +if ('$task.ext.prefix' != 'null'){ + prefix = '$task.ext.prefix' +} else if ('$meta.id' != 'null'){ + prefix = '$meta.id' +} + +done <- lapply(params, write_se_table, prefix) + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste(prefix, "R_sessionInfo.log", sep = '.')) +citation("tximeta") +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +r.version <- strsplit(version[['version.string']], ' ')[[1]][3] +tximeta.version <- as.character(packageVersion('tximeta')) + +writeLines( + c( + '"${task.process}":', + paste(' bioconductor-tximeta:', tximeta.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/nf-core/tximeta/tximport/tests/main.nf.test b/modules/nf-core/tximeta/tximport/tests/main.nf.test new file mode 100644 index 000000000..782030fb8 --- /dev/null +++ b/modules/nf-core/tximeta/tximport/tests/main.nf.test @@ -0,0 +1,186 @@ +nextflow_process { + + name "Test Process TXIMETA_TXIMPORT" + script "../main.nf" + process "TXIMETA_TXIMPORT" + + test("saccharomyces_cerevisiae - kallisto - gtf") { + + setup { + + run("UNTAR") { + script "../../../untar/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/eukaryotes/saccharomyces_cerevisiae/kallisto_results.tar.gz', checkIfExists: true) + ]) + """ + } + } + run("CUSTOM_TX2GENE") { + script "../../../custom/tx2gene/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/eukaryotes/saccharomyces_cerevisiae/genome_gfp.gtf', checkIfExists: true) + ]) + input[1] = UNTAR.out.untar.map { meta, dir -> [ meta, dir.listFiles().collect() ] } + input[2] = 'kallisto' + input[3] = 'gene_id' + input[4] = 'gene_name' + """ + } + } + } + + when { + process { + """ + input[0] = UNTAR.out.untar.map { meta, dir -> [ meta, dir.listFiles().collect() ] } + input[1] = CUSTOM_TX2GENE.out.tx2gene + input[2] = 'kallisto' + """ + } + } + + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.counts_gene).match('counts_gene_kallisto') }, + { assert snapshot(process.out.counts_gene_length_scaled).match('counts_gene_length_scaled_kallisto') }, + { assert snapshot(process.out.counts_gene_scaled).match('counts_gene_scaled_kallisto') }, + { assert snapshot(process.out.counts_transcript).match('counts_transcript_kallisto') }, + { assert snapshot(process.out.lengths_gene).match('lengths_gene_kallisto') }, + { assert snapshot(process.out.lengths_transcript).match('lengths_transcript_kallisto') }, + { assert snapshot(process.out.tpm_gene).match('tpm_gene_kallisto') }, + { assert snapshot(process.out.tpm_transcript).match('tpm_transcript_kallisto') }, + { assert snapshot(process.out.versions).match('versions_kallisto') } + ) + } + } + + test("saccharomyces_cerevisiae - kallisto - gtf - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ [], [] ]) + input[1] = Channel.of([ [], [] ]) + input[2] = 'kallisto' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.counts_gene).match('counts_gene_kallisto - stub') }, + { assert snapshot(process.out.counts_gene_length_scaled).match('counts_gene_length_scaled_kallisto - stub') }, + { assert snapshot(process.out.counts_gene_scaled).match('counts_gene_scaled_kallisto - stub') }, + { assert snapshot(process.out.counts_transcript).match('counts_transcript_kallisto - stub') }, + { assert snapshot(process.out.lengths_gene).match('lengths_gene_kallisto - stub') }, + { assert snapshot(process.out.lengths_transcript).match('lengths_transcript_kallisto - stub') }, + { assert snapshot(process.out.tpm_gene).match('tpm_gene_kallisto - stub') }, + { assert snapshot(process.out.tpm_transcript).match('tpm_transcript_kallisto - stub') }, + { assert snapshot(process.out.versions).match('versions_kallisto - stub') } + ) + } + + } + test("saccharomyces_cerevisiae - salmon - gtf") { + + setup { + + run("UNTAR") { + script "../../../untar/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/eukaryotes/saccharomyces_cerevisiae/salmon_results.tar.gz', checkIfExists: true) + ]) + """ + } + } + run("CUSTOM_TX2GENE") { + script "../../../custom/tx2gene/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/eukaryotes/saccharomyces_cerevisiae/genome_gfp.gtf', checkIfExists: true) + ]) + input[1] = UNTAR.out.untar.map { meta, dir -> [ meta, dir.listFiles().collect() ] } + input[2] = 'salmon' + input[3] = 'gene_id' + input[4] = 'gene_name' + """ + } + } + } + + when { + process { + """ + input[0] = UNTAR.out.untar.map { meta, dir -> [ meta, dir.listFiles().collect() ] } + input[1] = CUSTOM_TX2GENE.out.tx2gene + input[2] = 'salmon' + """ + } + } + + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.counts_gene).match('counts_gene_salmon') }, + { assert snapshot(process.out.counts_gene_length_scaled).match('counts_gene_length_scaled_salmon') }, + { assert snapshot(process.out.counts_gene_scaled).match('counts_gene_scaled_salmon') }, + { assert snapshot(process.out.counts_transcript).match('counts_transcript_salmon') }, + { assert snapshot(process.out.lengths_gene).match('lengths_gene_salmon') }, + { assert snapshot(process.out.lengths_transcript).match('lengths_transcript_salmon') }, + { assert snapshot(process.out.tpm_gene).match('tpm_gene_salmon') }, + { assert snapshot(process.out.tpm_transcript).match('tpm_transcript_salmon') }, + { assert snapshot(process.out.versions).match('versions_salmon') } + ) + } + + } + + test("saccharomyces_cerevisiae - salmon - gtf - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ [], [] ]) + input[1] = Channel.of([ [], [] ]) + input[2] = 'salmon' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.counts_gene).match('counts_gene_salmon - stub') }, + { assert snapshot(process.out.counts_gene_length_scaled).match('counts_gene_length_scaled_salmon - stub') }, + { assert snapshot(process.out.counts_gene_scaled).match('counts_gene_scaled_salmon - stub') }, + { assert snapshot(process.out.counts_transcript).match('counts_transcript_salmon - stub') }, + { assert snapshot(process.out.lengths_gene).match('lengths_gene_salmon - stub') }, + { assert snapshot(process.out.lengths_transcript).match('lengths_transcript_salmon - stub') }, + { assert snapshot(process.out.tpm_gene).match('tpm_gene_salmon - stub') }, + { assert snapshot(process.out.tpm_transcript).match('tpm_transcript_salmon - stub') }, + { assert snapshot(process.out.versions).match('versions_salmon - stub') } + ) + } + } +} + diff --git a/modules/nf-core/tximeta/tximport/tests/main.nf.test.snap b/modules/nf-core/tximeta/tximport/tests/main.nf.test.snap new file mode 100644 index 000000000..3cd0ee9e4 --- /dev/null +++ b/modules/nf-core/tximeta/tximport/tests/main.nf.test.snap @@ -0,0 +1,594 @@ +{ + "tpm_transcript_salmon - stub": { + "content": [ + [ + [ + [ + + ], + "[].transcript_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:50.683744" + }, + "lengths_gene_kallisto - stub": { + "content": [ + [ + [ + [ + + ], + "[].gene_lengths.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:16.126128" + }, + "counts_gene_scaled_salmon - stub": { + "content": [ + [ + [ + [ + + ], + "[].gene_counts_scaled.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:50.654405" + }, + "counts_gene_kallisto - stub": { + "content": [ + [ + [ + [ + + ], + "[].gene_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:16.112898" + }, + "lengths_transcript_salmon - stub": { + "content": [ + [ + [ + [ + + ], + "[].transcript_lengths.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:50.67148" + }, + "versions_salmon - stub": { + "content": [ + [ + "versions.yml:md5,6ff317cceddc686f84d79cb976e1e28b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:50.690592" + }, + "counts_gene_length_scaled_kallisto": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gene_counts_length_scaled.tsv:md5,4944841ac711124d29673b6b6ed16ef3" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:34:59.621599" + }, + "lengths_transcript_salmon": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.transcript_lengths.tsv:md5,db6d8ab9f8e1123d5984fd534b4347dc" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:32.876208" + }, + "counts_transcript_kallisto": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.transcript_counts.tsv:md5,42e0106e75fa97c1c684c6d9060f1724" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:34:59.62725" + }, + "counts_transcript_kallisto - stub": { + "content": [ + [ + [ + [ + + ], + "[].transcript_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:16.122852" + }, + "counts_transcript_salmon": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.transcript_counts.tsv:md5,ff0f5be09ca7a322672c0074ba35da17" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:32.866731" + }, + "lengths_gene_salmon - stub": { + "content": [ + [ + [ + [ + + ], + "[].gene_lengths.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:50.6654" + }, + "tpm_gene_salmon": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gene_tpm.tsv:md5,6076364cc78741a4f8bc8935a045d13d" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:32.881193" + }, + "tpm_transcript_salmon": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.transcript_tpm.tsv:md5,7a334b565e1e865efb1caf615f194ef7" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:32.886363" + }, + "tpm_gene_salmon - stub": { + "content": [ + [ + [ + [ + + ], + "[].gene_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:50.677538" + }, + "lengths_transcript_kallisto": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.transcript_lengths.tsv:md5,f974b52840431a5dae57bcb615badbf1" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:34:59.632822" + }, + "counts_gene_length_scaled_kallisto - stub": { + "content": [ + [ + [ + [ + + ], + "[].gene_counts_length_scaled.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:16.11652" + }, + "tpm_gene_kallisto - stub": { + "content": [ + [ + [ + [ + + ], + "[].gene_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:16.133742" + }, + "counts_transcript_salmon - stub": { + "content": [ + [ + [ + [ + + ], + "[].transcript_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:50.660144" + }, + "counts_gene_scaled_kallisto": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gene_counts_scaled.tsv:md5,39d14e361434978b3cadae901a26a028" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:34:59.624732" + }, + "counts_gene_salmon": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gene_counts.tsv:md5,c14cab7e15cfac73ec0602dc2c404551" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:32.852188" + }, + "versions_salmon": { + "content": [ + [ + "versions.yml:md5,6ff317cceddc686f84d79cb976e1e28b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:32.892224" + }, + "counts_gene_length_scaled_salmon": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gene_counts_length_scaled.tsv:md5,5f92a6784f6edc5e3b336c71c3ee7daf" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:32.857451" + }, + "tpm_gene_kallisto": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gene_tpm.tsv:md5,85d108269769ae0d841247b9b9ed922d" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:34:59.636454" + }, + "lengths_transcript_kallisto - stub": { + "content": [ + [ + [ + [ + + ], + "[].transcript_lengths.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:16.129712" + }, + "lengths_gene_kallisto": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gene_lengths.tsv:md5,db6becdf807fd164a9c63dd1dd916d9c" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:34:59.630042" + }, + "counts_gene_scaled_kallisto - stub": { + "content": [ + [ + [ + [ + + ], + "[].gene_counts_scaled.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:16.119638" + }, + "tpm_transcript_kallisto": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.transcript_tpm.tsv:md5,65862ed9d4a05abfab952e680dc0e49d" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:34:59.639525" + }, + "lengths_gene_salmon": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gene_lengths.tsv:md5,1691ea2677612805cd699265c83024d7" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:32.871162" + }, + "counts_gene_length_scaled_salmon - stub": { + "content": [ + [ + [ + [ + + ], + "[].gene_counts_length_scaled.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:50.605613" + }, + "counts_gene_kallisto": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gene_counts.tsv:md5,e89c28692ea214396b2d4cb702a804c3" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:34:59.61832" + }, + "versions_kallisto": { + "content": [ + [ + "versions.yml:md5,6ff317cceddc686f84d79cb976e1e28b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:34:59.642751" + }, + "counts_gene_salmon - stub": { + "content": [ + [ + [ + [ + + ], + "[].gene_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:50.598457" + }, + "versions_kallisto - stub": { + "content": [ + [ + "versions.yml:md5,6ff317cceddc686f84d79cb976e1e28b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:16.141689" + }, + "tpm_transcript_kallisto - stub": { + "content": [ + [ + [ + [ + + ], + "[].transcript_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:16.137716" + }, + "counts_gene_scaled_salmon": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gene_counts_scaled.tsv:md5,fdfb3d23aaf5d4316d81247ec4664ca0" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-28T12:35:32.862272" + } +} \ No newline at end of file diff --git a/modules/nf-core/ucsc/bedclip/environment.yml b/modules/nf-core/ucsc/bedclip/environment.yml new file mode 100644 index 000000000..571dc2749 --- /dev/null +++ b/modules/nf-core/ucsc/bedclip/environment.yml @@ -0,0 +1,7 @@ +name: ucsc_bedclip +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::ucsc-bedclip=377 diff --git a/modules/nf-core/ucsc/bedclip/main.nf b/modules/nf-core/ucsc/bedclip/main.nf index 4bad9a399..d3e09dc11 100755 --- a/modules/nf-core/ucsc/bedclip/main.nf +++ b/modules/nf-core/ucsc/bedclip/main.nf @@ -3,7 +3,7 @@ process UCSC_BEDCLIP { label 'process_medium' // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. - conda "bioconda::ucsc-bedclip=377" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ucsc-bedclip:377--h0b8a92a_2' : 'biocontainers/ucsc-bedclip:377--h0b8a92a_2' }" @@ -34,4 +34,16 @@ process UCSC_BEDCLIP { ucsc: $VERSION END_VERSIONS """ + + stub: + 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. + """ + touch ${prefix}.bedGraph + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ucsc: $VERSION + END_VERSIONS + """ } diff --git a/modules/nf-core/ucsc/bedclip/meta.yml b/modules/nf-core/ucsc/bedclip/meta.yml old mode 100755 new mode 100644 index cc5d9d715..2467a28f2 --- a/modules/nf-core/ucsc/bedclip/meta.yml +++ b/modules/nf-core/ucsc/bedclip/meta.yml @@ -9,7 +9,6 @@ tools: description: Remove lines from bed file that refer to off-chromosome locations. homepage: http://hgdownload.cse.ucsc.edu/admin/exe/ licence: ["varies; see http://genome.ucsc.edu/license"] - input: - meta: type: map @@ -20,7 +19,6 @@ input: type: file description: bedGraph file pattern: "*.{bedgraph}" - output: - meta: type: map @@ -35,6 +33,7 @@ output: type: file description: bedGraph file pattern: "*.{bedgraph}" - authors: - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/modules/nf-core/ucsc/bedclip/tests/main.nf.test b/modules/nf-core/ucsc/bedclip/tests/main.nf.test new file mode 100644 index 000000000..5cb8600c3 --- /dev/null +++ b/modules/nf-core/ucsc/bedclip/tests/main.nf.test @@ -0,0 +1,53 @@ +nextflow_process { + + name "Test Process UCSC_BEDCLIP" + script "../main.nf" + process "UCSC_BEDCLIP" + + test("sarscov2") { + 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/bedgraph/test.bedgraph", checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.sizes", checkIfExists: true)) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - stub") { + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bedgraph/test.bedgraph", checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.sizes", checkIfExists: true)) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} \ No newline at end of file diff --git a/modules/nf-core/ucsc/bedclip/tests/main.nf.test.snap b/modules/nf-core/ucsc/bedclip/tests/main.nf.test.snap new file mode 100644 index 000000000..77e893808 --- /dev/null +++ b/modules/nf-core/ucsc/bedclip/tests/main.nf.test.snap @@ -0,0 +1,72 @@ +{ + "sarscov2 - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.clip.bedGraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,b92248ce2a138ad4d146ac0d9e71fb34" + ], + "bedgraph": [ + [ + { + "id": "test", + "single_end": false + }, + "test.clip.bedGraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,b92248ce2a138ad4d146ac0d9e71fb34" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-21T10:31:42.86304" + }, + "sarscov2": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.clip.bedGraph:md5,e02395e1f7c593b3f79563067159ebc2" + ] + ], + "1": [ + "versions.yml:md5,b92248ce2a138ad4d146ac0d9e71fb34" + ], + "bedgraph": [ + [ + { + "id": "test", + "single_end": false + }, + "test.clip.bedGraph:md5,e02395e1f7c593b3f79563067159ebc2" + ] + ], + "versions": [ + "versions.yml:md5,b92248ce2a138ad4d146ac0d9e71fb34" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-07T16:04:04.165478" + } +} \ No newline at end of file diff --git a/modules/nf-core/ucsc/bedclip/tests/nextflow.config b/modules/nf-core/ucsc/bedclip/tests/nextflow.config new file mode 100644 index 000000000..13bce9a82 --- /dev/null +++ b/modules/nf-core/ucsc/bedclip/tests/nextflow.config @@ -0,0 +1,7 @@ +process { + + withName: UCSC_BEDCLIP { + ext.prefix = { "${meta.id}.clip" } + } + +} diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/environment.yml b/modules/nf-core/ucsc/bedgraphtobigwig/environment.yml new file mode 100644 index 000000000..f91e216f5 --- /dev/null +++ b/modules/nf-core/ucsc/bedgraphtobigwig/environment.yml @@ -0,0 +1,7 @@ +name: ucsc_bedgraphtobigwig +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::ucsc-bedgraphtobigwig=445 diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/main.nf b/modules/nf-core/ucsc/bedgraphtobigwig/main.nf index 06bb47099..bff0b00a9 100644 --- a/modules/nf-core/ucsc/bedgraphtobigwig/main.nf +++ b/modules/nf-core/ucsc/bedgraphtobigwig/main.nf @@ -3,7 +3,7 @@ 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=445" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:445--h954228d_0' : 'biocontainers/ucsc-bedgraphtobigwig:445--h954228d_0' }" diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml b/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml index 416c91e07..a60118abe 100755 --- a/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml +++ b/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml @@ -12,7 +12,6 @@ tools: homepage: http://hgdownload.cse.ucsc.edu/admin/exe/ documentation: https://genome.ucsc.edu/goldenPath/help/bigWig.html licence: ["varies; see http://genome.ucsc.edu/license"] - input: - meta: type: map @@ -27,7 +26,6 @@ input: type: file description: chromosome sizes file pattern: "*.{sizes}" - output: - meta: type: map @@ -42,6 +40,7 @@ output: type: file description: bigWig file pattern: "*.{bigWig}" - authors: - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/tests/main.nf.test b/modules/nf-core/ucsc/bedgraphtobigwig/tests/main.nf.test new file mode 100644 index 000000000..d5dbe4a37 --- /dev/null +++ b/modules/nf-core/ucsc/bedgraphtobigwig/tests/main.nf.test @@ -0,0 +1,49 @@ +nextflow_process { + + name "Test Process UCSC_BEDGRAPHTOBIGWIG" + script "../main.nf" + process "UCSC_BEDGRAPHTOBIGWIG" + + test("Should run without failures") { + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bedgraph/test.bedgraph", checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.sizes", checkIfExists: true)) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bedgraph/test.bedgraph", checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.sizes", checkIfExists: true)) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/tests/main.nf.test.snap b/modules/nf-core/ucsc/bedgraphtobigwig/tests/main.nf.test.snap new file mode 100644 index 000000000..7b0181583 --- /dev/null +++ b/modules/nf-core/ucsc/bedgraphtobigwig/tests/main.nf.test.snap @@ -0,0 +1,68 @@ +{ + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bigWig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,93b027527145a243903a3c687c3453b8" + ], + "bigwig": [ + [ + { + "id": "test" + }, + "test.bigWig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,93b027527145a243903a3c687c3453b8" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T12:06:05.176746" + }, + "Should run without failures": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bigWig:md5,910ecc7f57e3bbd5fac5a8edba4f615d" + ] + ], + "1": [ + "versions.yml:md5,93b027527145a243903a3c687c3453b8" + ], + "bigwig": [ + [ + { + "id": "test" + }, + "test.bigWig:md5,910ecc7f57e3bbd5fac5a8edba4f615d" + ] + ], + "versions": [ + "versions.yml:md5,93b027527145a243903a3c687c3453b8" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T12:05:56.658148" + } +} \ No newline at end of file diff --git a/modules/nf-core/umitools/dedup/environment.yml b/modules/nf-core/umitools/dedup/environment.yml new file mode 100644 index 000000000..bc497824f --- /dev/null +++ b/modules/nf-core/umitools/dedup/environment.yml @@ -0,0 +1,7 @@ +name: umitools_dedup +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::umi_tools=1.1.5 diff --git a/modules/nf-core/umitools/dedup/main.nf b/modules/nf-core/umitools/dedup/main.nf index 824ebeeb3..1e2a2aae0 100644 --- a/modules/nf-core/umitools/dedup/main.nf +++ b/modules/nf-core/umitools/dedup/main.nf @@ -2,10 +2,10 @@ process UMITOOLS_DEDUP { tag "$meta.id" label "process_medium" - 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://depot.galaxyproject.org/singularity/umi_tools:1.1.5--py39hf95cd2a_0' : + 'biocontainers/umi_tools:1.1.5--py39hf95cd2a_0' }" input: tuple val(meta), path(bam), path(bai) @@ -47,6 +47,7 @@ process UMITOOLS_DEDUP { """ stub: + prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.bam touch ${prefix}.log diff --git a/modules/nf-core/umitools/dedup/meta.yml b/modules/nf-core/umitools/dedup/meta.yml index 534d4c6b0..38d3fd465 100644 --- a/modules/nf-core/umitools/dedup/meta.yml +++ b/modules/nf-core/umitools/dedup/meta.yml @@ -7,8 +7,8 @@ keywords: 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"] input: @@ -61,8 +61,11 @@ output: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@drpatelh" - "@grst" - "@klkeys" +maintainers: + - "@drpatelh" + - "@grst" + - "@klkeys" diff --git a/modules/nf-core/umitools/dedup/tests/main.nf.test b/modules/nf-core/umitools/dedup/tests/main.nf.test new file mode 100644 index 000000000..883e2d9d7 --- /dev/null +++ b/modules/nf-core/umitools/dedup/tests/main.nf.test @@ -0,0 +1,183 @@ +nextflow_process { + + name "Test Process UMITOOLS_DEDUP" + script "../main.nf" + process "UMITOOLS_DEDUP" + + test("se - no stats") { + config "./nextflow.config" + + when { + process { + """ + get_output_stats = false + + input[0] = [ + [ 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] = get_output_stats + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path("${process.out.log[0][1]}").exists() }, + { assert snapshot( + bam(process.out.bam[0][1]).getSamLinesMD5(), + process.out.versions).match() } + ) + } + } + + test("pe - no stats") { + config "./nextflow.config" + + when { + process { + """ + get_output_stats = false + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai", checkIfExists: true) + ] + input[1] = get_output_stats + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path("${process.out.log[0][1]}").exists() }, + { assert snapshot( + process.out.bam, + process.out.versions).match() } + ) + } + } + + test("pe - with stats") { + config "./nextflow.config" + + when { + process { + """ + get_output_stats = true + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai", checkIfExists: true) + ] + input[1] = get_output_stats + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path("${process.out.log[0][1]}").exists() }, + { assert snapshot( + process.out.bam, + process.out.tsv_edit_distance, + process.out.tsv_per_umi, + process.out.tsv_umi_per_position, + process.out.versions).match() } + ) + } + } + + test("se - no stats - stub") { + + options "-stub" + + config "./nextflow.config" + + when { + process { + """ + get_output_stats = false + + input[0] = [ + [ 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] = get_output_stats + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.bam).match() } + ) + } + } + + test("pe - no stats - stub") { + + options "-stub" + + config "./nextflow.config" + + when { + process { + """ + get_output_stats = false + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai", checkIfExists: true) + ] + input[1] = get_output_stats + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.bam).match() } + ) + } + } + + test("pe - with stats - stub") { + + options "-stub" + + config "./nextflow.config" + + when { + process { + """ + get_output_stats = true + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai", checkIfExists: true) + ] + input[1] = get_output_stats + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.bam).match() } + ) + } + } +} diff --git a/modules/nf-core/umitools/dedup/tests/main.nf.test.snap b/modules/nf-core/umitools/dedup/tests/main.nf.test.snap new file mode 100644 index 000000000..f7f4e94f1 --- /dev/null +++ b/modules/nf-core/umitools/dedup/tests/main.nf.test.snap @@ -0,0 +1,138 @@ +{ + "pe - no stats - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.dedup.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T11:40:46.802233" + }, + "pe - with stats - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.dedup.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T11:40:59.501624" + }, + "pe - with stats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.dedup.bam:md5,350e942a0d45e8356fa24bc8c47dc1ed" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.dedup_edit_distance.tsv:md5,65186b0964e2f8d970cc04d736d8b119" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.dedup_per_umi.tsv:md5,8e6783a4a79437b095f095f2aefe7c01" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.dedup_per_umi_per_position.tsv:md5,9386db4a104b8e4e32f3ca4a84efa4ac" + ] + ], + [ + "versions.yml:md5,e2f5146464c09bf7ae98c85ea5410e50" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T11:27:24.231325" + }, + "se - no stats - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.dedup.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T11:40:34.598176" + }, + "se - no stats": { + "content": [ + "a114abd9fccce6fe2869852b5cd18964", + [ + "versions.yml:md5,e2f5146464c09bf7ae98c85ea5410e50" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T13:45:48.553561" + }, + "pe - no stats": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.dedup.bam:md5,350e942a0d45e8356fa24bc8c47dc1ed" + ] + ], + [ + "versions.yml:md5,e2f5146464c09bf7ae98c85ea5410e50" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T11:27:06.957467" + } +} \ No newline at end of file diff --git a/modules/nf-core/umitools/dedup/tests/nextflow.config b/modules/nf-core/umitools/dedup/tests/nextflow.config new file mode 100644 index 000000000..da6652dc3 --- /dev/null +++ b/modules/nf-core/umitools/dedup/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: UMITOOLS_DEDUP { + ext.prefix = { "${meta.id}.dedup" } + } +} diff --git a/modules/nf-core/umitools/dedup/umitools-dedup.diff b/modules/nf-core/umitools/dedup/umitools-dedup.diff deleted file mode 100644 index 327583445..000000000 --- a/modules/nf-core/umitools/dedup/umitools-dedup.diff +++ /dev/null @@ -1,23 +0,0 @@ -Changes in module 'nf-core/umitools/dedup' ---- modules/nf-core/umitools/dedup/main.nf -+++ modules/nf-core/umitools/dedup/main.nf -@@ -42,7 +42,7 @@ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": -- umitools: \$(umi_tools --version 2>&1 | sed 's/^.*UMI-tools version://; s/ *\$//') -+ umitools: \$( umi_tools --version | sed '/version:/!d; s/.*: //' ) - END_VERSIONS - """ - -@@ -56,7 +56,7 @@ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": -- umitools: \$(umi_tools --version 2>&1 | sed 's/^.*UMI-tools version://; s/ *\$//') -+ umitools: \$( umi_tools --version | sed '/version:/!d; s/.*: //' ) - END_VERSIONS - """ - } - -************************************************************ diff --git a/modules/nf-core/umitools/extract/environment.yml b/modules/nf-core/umitools/extract/environment.yml new file mode 100644 index 000000000..aab452d1e --- /dev/null +++ b/modules/nf-core/umitools/extract/environment.yml @@ -0,0 +1,7 @@ +name: umitools_extract +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::umi_tools=1.1.5 diff --git a/modules/nf-core/umitools/extract/main.nf b/modules/nf-core/umitools/extract/main.nf index 5ffe4eb76..b97900e09 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://depot.galaxyproject.org/singularity/umi_tools:1.1.5--py39hf95cd2a_0' : + 'biocontainers/umi_tools:1.1.5--py39hf95cd2a_0' }" input: tuple val(meta), path(reads) @@ -53,4 +53,22 @@ process UMITOOLS_EXTRACT { 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} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + umitools: \$( umi_tools --version | sed '/version:/!d; s/.*: //' ) + END_VERSIONS + """ } diff --git a/modules/nf-core/umitools/extract/meta.yml b/modules/nf-core/umitools/extract/meta.yml index db64a0f88..7695b2717 100644 --- a/modules/nf-core/umitools/extract/meta.yml +++ b/modules/nf-core/umitools/extract/meta.yml @@ -1,15 +1,16 @@ name: umitools_extract 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" input: - meta: type: map @@ -29,9 +30,7 @@ output: - 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. + 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 @@ -41,7 +40,9 @@ output: type: file description: File containing software versions pattern: "versions.yml" - 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 000000000..3eec566be --- /dev/null +++ b/modules/nf-core/umitools/extract/tests/main.nf.test @@ -0,0 +1,102 @@ +nextflow_process { + + name "Test Process UMITOOLS_EXTRACT" + script "../main.nf" + process "UMITOOLS_EXTRACT" + config "./nextflow.config" + + 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 { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.log.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.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 { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.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() } + ) + } + } +} \ No newline at end of file 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 000000000..b1159054b --- /dev/null +++ b/modules/nf-core/umitools/extract/tests/main.nf.test.snap @@ -0,0 +1,167 @@ +{ + "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": [ + "versions.yml:md5,568d243174c081a0301e74ed42e59b48" + ], + "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": [ + "versions.yml:md5,568d243174c081a0301e74ed42e59b48" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-02T15:05:20.008312" + }, + "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": [ + "versions.yml:md5,568d243174c081a0301e74ed42e59b48" + ], + "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": [ + "versions.yml:md5,568d243174c081a0301e74ed42e59b48" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-02T15:04:12.145999" + }, + "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.yml:md5,568d243174c081a0301e74ed42e59b48" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-02T15:21:09.578031" + }, + "single end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.umi_extract.fastq.gz" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.umi_extract.log" + ] + ], + [ + "versions.yml:md5,568d243174c081a0301e74ed42e59b48" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-02T15:03:52.464606" + } +} \ 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 000000000..c866f5a00 --- /dev/null +++ b/modules/nf-core/umitools/extract/tests/nextflow.config @@ -0,0 +1,9 @@ +process { + + publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" } + + withName: UMITOOLS_EXTRACT { + ext.args = '--bc-pattern="NNNN"' + } + +} diff --git a/modules/nf-core/umitools/extract/umitools-extract.diff b/modules/nf-core/umitools/extract/umitools-extract.diff deleted file mode 100644 index 464a23c00..000000000 --- a/modules/nf-core/umitools/extract/umitools-extract.diff +++ /dev/null @@ -1,23 +0,0 @@ -Changes in module 'nf-core/umitools/extract' ---- modules/nf-core/umitools/extract/main.nf -+++ modules/nf-core/umitools/extract/main.nf -@@ -33,7 +33,7 @@ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": -- umitools: \$(umi_tools --version 2>&1 | sed 's/^.*UMI-tools version://; s/ *\$//') -+ umitools: \$( umi_tools --version | sed '/version:/!d; s/.*: //' ) - END_VERSIONS - """ - } else { -@@ -49,7 +49,7 @@ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": -- umitools: \$(umi_tools --version 2>&1 | sed 's/^.*UMI-tools version://; s/ *\$//') -+ umitools: \$( umi_tools --version | sed '/version:/!d; s/.*: //' ) - END_VERSIONS - """ - } - -************************************************************ diff --git a/modules/nf-core/umitools/prepareforrsem/environment.yml b/modules/nf-core/umitools/prepareforrsem/environment.yml new file mode 100644 index 000000000..dbb1bde77 --- /dev/null +++ b/modules/nf-core/umitools/prepareforrsem/environment.yml @@ -0,0 +1,7 @@ +name: umitools_prepareforrsem +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::umi_tools=1.1.5 diff --git a/modules/local/umitools_prepareforrsem/main.nf b/modules/nf-core/umitools/prepareforrsem/main.nf similarity index 54% rename from modules/local/umitools_prepareforrsem/main.nf rename to modules/nf-core/umitools/prepareforrsem/main.nf index d3c2bd2c2..07c4381ad 100644 --- a/modules/local/umitools_prepareforrsem/main.nf +++ b/modules/nf-core/umitools/prepareforrsem/main.nf @@ -2,13 +2,13 @@ process UMITOOLS_PREPAREFORRSEM { tag "$meta.id" label 'process_medium' - 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://depot.galaxyproject.org/singularity/umi_tools:1.1.5--py39hf95cd2a_0' : + 'biocontainers/umi_tools:1.1.5--py39hf95cd2a_0' }" input: - tuple val(meta), path(bam) + tuple val(meta), path(bam), path(bai) output: tuple val(meta), path('*.bam'), emit: bam @@ -18,11 +18,12 @@ process UMITOOLS_PREPAREFORRSEM { when: task.ext.when == null || task.ext.when - script: // This script is bundled with the pipeline, in nf-core/rnaseq/bin/ + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + if ("$bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" """ - prepare-for-rsem.py \\ + umi_tools prepare-for-rsem \\ --stdin=$bam \\ --stdout=${prefix}.bam \\ --log=${prefix}.prepare_for_rsem.log \\ @@ -30,7 +31,18 @@ process UMITOOLS_PREPAREFORRSEM { cat <<-END_VERSIONS > versions.yml "${task.process}": - umitools: \$(umi_tools --version | sed 's/^.*UMI-tools version://; s/ *\$//') + umitools: \$( umi_tools --version | sed '/version:/!d; s/.*: //' ) + END_VERSIONS + """ + + stub: + """ + touch ${meta.id}.bam + touch ${meta.id}.log + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + umitools: \$( umi_tools --version | sed '/version:/!d; s/.*: //' ) END_VERSIONS """ } diff --git a/modules/nf-core/umitools/prepareforrsem/meta.yml b/modules/nf-core/umitools/prepareforrsem/meta.yml new file mode 100644 index 000000000..8b85366cc --- /dev/null +++ b/modules/nf-core/umitools/prepareforrsem/meta.yml @@ -0,0 +1,53 @@ +name: umitools_prepareforrsem +description: Make the output from umi_tools dedup or group compatible with RSEM +keywords: + - umitools + - rsem + - salmon + - dedup +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 + documentation: https://umi-tools.readthedocs.io/en/latest/ + license: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: | + BAM file containing reads to be deduplicated via UMIs. + pattern: "*.{bam}" + - bai: + type: file + description: | + BAM index files corresponding to the input BAM file. + pattern: "*.{bai}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Prepared BAM file. + pattern: "*.{bam}" + - log: + type: file + description: File with logging information + pattern: "*.{log}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" + - "@pinin4fjords" +maintainers: + - "@drpatelh" + - "@pinin4fjords" diff --git a/modules/nf-core/umitools/prepareforrsem/tests/main.nf.test b/modules/nf-core/umitools/prepareforrsem/tests/main.nf.test new file mode 100644 index 000000000..105093505 --- /dev/null +++ b/modules/nf-core/umitools/prepareforrsem/tests/main.nf.test @@ -0,0 +1,57 @@ +nextflow_process { + + name "Test Process UMITOOLS_PREPAREFORRSEM" + script "../main.nf" + process "UMITOOLS_PREPAREFORRSEM" + + test("sarscov2 - bam") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.bam).match('bam_sarscov2_bam') }, + { assert snapshot(process.out.versions).match('versions_sarscov2_bam') } + ) + } + + } + + 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), + 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.bam).match('bam_sarscov2_bam - stub') }, + { assert snapshot(process.out.versions).match('versions_sarscov2_bam - stub') } + ) + } + + } + +} diff --git a/modules/nf-core/umitools/prepareforrsem/tests/main.nf.test.snap b/modules/nf-core/umitools/prepareforrsem/tests/main.nf.test.snap new file mode 100644 index 000000000..c1e863f6f --- /dev/null +++ b/modules/nf-core/umitools/prepareforrsem/tests/main.nf.test.snap @@ -0,0 +1,62 @@ +{ + "versions_sarscov2_bam": { + "content": [ + [ + "versions.yml:md5,3403849e88fbd33fadd928f8b6ca60bb" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-16T09:46:33.206750132" + }, + "bam_sarscov2_bam": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,fe4b8302182615651e4e7784ec67c819" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-12T17:33:02.066537672" + }, + "bam_sarscov2_bam - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-12T17:33:39.36279218" + }, + "versions_sarscov2_bam - stub": { + "content": [ + [ + "versions.yml:md5,3403849e88fbd33fadd928f8b6ca60bb" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-16T09:46:47.363697981" + } +} \ No newline at end of file diff --git a/modules/nf-core/untar/environment.yml b/modules/nf-core/untar/environment.yml new file mode 100644 index 000000000..4f498244a --- /dev/null +++ b/modules/nf-core/untar/environment.yml @@ -0,0 +1,9 @@ +name: untar +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::grep=3.11 + - conda-forge::sed=4.8 + - conda-forge::tar=1.34 diff --git a/modules/nf-core/untar/main.nf b/modules/nf-core/untar/main.nf index 61461c391..9bd8f5546 100644 --- a/modules/nf-core/untar/main.nf +++ b/modules/nf-core/untar/main.nf @@ -2,10 +2,10 @@ process UNTAR { tag "$archive" label 'process_single' - conda "conda-forge::sed=4.7 conda-forge::grep=3.11 conda-forge::tar=1.34" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'nf-core/ubuntu:20.04' }" + 'https://depot.galaxyproject.org/singularity/ubuntu:22.04' : + 'nf-core/ubuntu:22.04' }" input: tuple val(meta), path(archive) @@ -52,8 +52,29 @@ process UNTAR { stub: prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.toString().replaceFirst(/\.[^\.]+(.gz)?$/, "")) """ - mkdir $prefix - touch ${prefix}/file.txt + mkdir ${prefix} + ## Dry-run untaring the archive to get the files and place all in prefix + if [[ \$(tar -taf ${archive} | grep -o -P "^.*?\\/" | uniq | wc -l) -eq 1 ]]; then + for i in `tar -tf ${archive}`; + do + if [[ \$(echo "\${i}" | grep -E "/\$") == "" ]]; + then + touch \${i} + else + mkdir -p \${i} + fi + done + else + for i in `tar -tf ${archive}`; + do + if [[ \$(echo "\${i}" | grep -E "/\$") == "" ]]; + then + touch ${prefix}/\${i} + else + mkdir -p ${prefix}/\${i} + fi + done + fi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/untar/meta.yml b/modules/nf-core/untar/meta.yml index db241a6e5..a9a2110f5 100644 --- a/modules/nf-core/untar/meta.yml +++ b/modules/nf-core/untar/meta.yml @@ -39,3 +39,8 @@ authors: - "@drpatelh" - "@matthdsm" - "@jfy133" +maintainers: + - "@joseespinosa" + - "@drpatelh" + - "@matthdsm" + - "@jfy133" diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test new file mode 100644 index 000000000..f556118ff --- /dev/null +++ b/modules/nf-core/untar/tests/main.nf.test @@ -0,0 +1,82 @@ +nextflow_process { + + name "Test Process UNTAR" + script "../main.nf" + process "UNTAR" + + test("test_untar") { + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } + + test("test_untar_onlyfiles") { + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } + + test("test_untar - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } + + test("test_untar_onlyfiles - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } +} diff --git a/modules/nf-core/untar/tests/main.nf.test.snap b/modules/nf-core/untar/tests/main.nf.test.snap new file mode 100644 index 000000000..ceb91b792 --- /dev/null +++ b/modules/nf-core/untar/tests/main.nf.test.snap @@ -0,0 +1,158 @@ +{ + "test_untar_onlyfiles": { + "content": [ + { + "0": [ + [ + [ + + ], + [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ] + ] + ], + "1": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ], + "untar": [ + [ + [ + + ], + [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ] + ] + ], + "versions": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-10T12:04:28.231047" + }, + "test_untar_onlyfiles - stub": { + "content": [ + { + "0": [ + [ + [ + + ], + [ + "hello.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ], + "untar": [ + [ + [ + + ], + [ + "hello.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-10T12:04:45.773103" + }, + "test_untar - stub": { + "content": [ + { + "0": [ + [ + [ + + ], + [ + "hash.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "opts.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "taxo.k2d:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ], + "untar": [ + [ + [ + + ], + [ + "hash.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "opts.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "taxo.k2d:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-10T12:04:36.777441" + }, + "test_untar": { + "content": [ + { + "0": [ + [ + [ + + ], + [ + "hash.k2d:md5,8b8598468f54a7087c203ad0190555d9", + "opts.k2d:md5,a033d00cf6759407010b21700938f543", + "taxo.k2d:md5,094d5891cdccf2f1468088855c214b2c" + ] + ] + ], + "1": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ], + "untar": [ + [ + [ + + ], + [ + "hash.k2d:md5,8b8598468f54a7087c203ad0190555d9", + "opts.k2d:md5,a033d00cf6759407010b21700938f543", + "taxo.k2d:md5,094d5891cdccf2f1468088855c214b2c" + ] + ] + ], + "versions": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-10T12:04:19.377674" + } +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index f4d9f87e2..1771272d4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -23,7 +23,7 @@ params { featurecounts_group_type = 'gene_biotype' gencode = false save_reference = false - igenomes_base = 's3://ngi-igenomes/igenomes' + igenomes_base = 's3://ngi-igenomes/igenomes/' igenomes_ignore = false // UMI handling @@ -54,7 +54,7 @@ params { // Ribosomal RNA removal remove_ribo_rna = false save_non_ribo_reads = false - ribo_database_manifest = "${projectDir}/assets/rrna-db-defaults.txt" + ribo_database_manifest = "${projectDir}/workflows/rnaseq/assets/rrna-db-defaults.txt" // Alignment aligner = 'star_salmon' @@ -78,6 +78,8 @@ params { skip_markduplicates = false skip_alignment = false skip_pseudo_alignment = false + stranded_threshold = 0.8 + unstranded_threshold = 0.1 // QC skip_qc = false @@ -102,15 +104,16 @@ params { multiqc_methods_description = null // Boilerplate options - outdir = null - publish_dir_mode = 'copy' - email = null - email_on_fail = null - plaintext_email = false - monochrome_logs = false - hook_url = null - help = false - version = false + outdir = null + publish_dir_mode = 'copy' + email = null + email_on_fail = null + plaintext_email = false + monochrome_logs = false + hook_url = null + help = false + version = false + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/' // Config options config_profile_name = null @@ -119,7 +122,6 @@ params { custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" config_profile_contact = null config_profile_url = null - test_data_base = 'https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq3' // Max resource options // Defaults only, expecting to be overwritten @@ -136,6 +138,15 @@ params { } +// Default publishing logic for pipeline +process { + publishDir = [ + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] +} + // Load base.config by default for all pipelines includeConfig 'conf/base.config' @@ -155,97 +166,104 @@ try { 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', 'defaults'] + 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 - 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)' + 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' + 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 - apptainer.autoMounts = 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 + } + wave { + apptainer.ociAutoPull = true + singularity.ociAutoPull = true + wave.enabled = true + wave.freeze = true + wave.strategy = 'conda,container' } gitpod { - executor.name = 'local' - executor.cpus = 4 - executor.memory = 8.GB + executor.name = 'local' + executor.cpus = 4 + executor.memory = 8.GB } test { includeConfig 'conf/test.config' } - test_cache { includeConfig 'conf/test_cache.config' } test_full { includeConfig 'conf/test_full.config' } test_full_aws { includeConfig 'conf/test_full.config' @@ -322,12 +340,13 @@ manifest { description = """RNA sequencing analysis pipeline for gene/isoform quantification and extensive quality control.""" mainScript = 'main.nf' nextflowVersion = '!>=23.04.0' - version = '3.14.0' + version = '3.15.0' doi = 'https://doi.org/10.5281/zenodo.1400710' } -// Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' +// Workflow specific config +includeConfig "./subworkflows/local/prepare_genome/nextflow.config" +includeConfig './workflows/rnaseq/nextflow.config' // Function to ensure that resource requirements don't go beyond // a maximum limit diff --git a/nextflow_schema.json b/nextflow_schema.json index 42e4e8967..d89b6398e 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -16,9 +16,9 @@ "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 design file 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 4 columns, and a header row. See [usage docs](https://nf-co.re/rnaseq/usage#samplesheet-input).", "fa_icon": "fas fa-file-csv" @@ -200,7 +200,7 @@ "type": "string", "format": "directory-path", "description": "Directory / URL base for iGenomes references.", - "default": "s3://ngi-igenomes/igenomes", + "default": "s3://ngi-igenomes/igenomes/", "fa_icon": "fas fa-cloud-download-alt", "hidden": true }, @@ -267,6 +267,14 @@ "description": "Path to directory or tar.gz archive for pre-built BBSplit index.", "help_text": "The BBSplit index will have to be built at least once with this pipeline (see `--save_reference` to save index). It can then be provided via `--bbsplit_index` for future runs." }, + "sortmerna_index": { + "type": "string", + "format": "path", + "exists": true, + "fa_icon": "fas fa-bezier-curve", + "description": "Path to directory or tar.gz archive for pre-built sortmerna index.", + "help_text": "The sortmerna index will have to be built at least once with this pipeline (see `--save_reference` to save index). It can then be provided via `--sortmerna_index` for future runs." + }, "remove_ribo_rna": { "type": "boolean", "fa_icon": "fas fa-trash-alt", @@ -278,7 +286,7 @@ "format": "file-path", "exists": true, "mimetype": "text/plain", - "default": "${projectDir}/assets/rrna-db-defaults.txt", + "default": "${projectDir}/workflows/rnaseq/assets/rrna-db-defaults.txt", "fa_icon": "fas fa-database", "description": "Text file containing paths to fasta files (one per line) that will be used to create the database for SortMeRNA.", "help_text": "By default, [rRNA databases](https://github.com/biocore/sortmerna/tree/master/data/rRNA_databases) defined in the SortMeRNA GitHub repo are used. You can see an example in the pipeline Github repository in `assets/rrna-default-dbs.txt`.\nPlease note that commercial/non-academic entities require [`licensing for SILVA`](https://www.arb-silva.de/silva-license-information) for these default databases." @@ -444,6 +452,20 @@ "description": "In single-end mode, Kallisto requires an estimated standard error for fragment length. Specify a default value for that here. TODO: use existing RSeQC results to do this dynamically.", "default": 200, "fa_icon": "fas fa-sort-amount-up-alt" + }, + "stranded_threshold": { + "type": "number", + "minimum": 0.5, + "maximum": 1.0, + "default": 0.8, + "description": "The fraction of stranded reads that must be assigned to a strandedness for confident assignment. Must be at least 0.5." + }, + "unstranded_threshold": { + "type": "number", + "minimum": 0.0, + "maximum": 1.0, + "default": 0.1, + "description": "The difference in fraction of stranded reads assigned to 'forward' and 'reverse' below which a sample is classified as 'unstranded'. By default the forward and reverse fractions must differ by less than 0.1 for the sample to be called as unstranded." } } }, @@ -672,13 +694,6 @@ "description": "Institutional config URL link.", "hidden": true, "fa_icon": "fas fa-users-cog" - }, - "test_data_base": { - "type": "string", - "default": "https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq3", - "description": "Base path / URL for data used in the test profiles", - "help_text": "Warning: The `-profile test` samplesheet file itself contains remote paths. Setting this parameter does not alter the contents of that file.", - "hidden": true } } }, @@ -832,6 +847,13 @@ "description": "Validation of parameters in lenient more.", "hidden": true, "help_text": "Allows string values that are parseable as numbers or booleans. For further information see [JSONSchema docs](https://github.com/everit-org/json-schema#lenient-mode)." + }, + "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/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/", + "hidden": true } } } diff --git a/nf-test.config b/nf-test.config new file mode 100644 index 000000000..0f4cac519 --- /dev/null +++ b/nf-test.config @@ -0,0 +1,17 @@ +config { + // Location of nf-tests + testsDir "." + + // nf-test directory used to create temporary files for each test + workDir System.getenv("NFT_WORKDIR") ?: ".nf-test" + + // Location of an optional nextflow.config file specific for executing pipeline tests + configFile "tests/nextflow.config" + + profile "test" + + // load the necessary plugins + plugins { + load "nft-bam@0.3.0" + } +} diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index bc01239b3..000000000 --- a/pyproject.toml +++ /dev/null @@ -1,10 +0,0 @@ -# Config file for Python. Mostly used to configure linting of bin/*.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/subworkflows/local/align_star/main.nf b/subworkflows/local/align_star/main.nf index 1dba0c085..4f516e8e0 100644 --- a/subworkflows/local/align_star/main.nf +++ b/subworkflows/local/align_star/main.nf @@ -11,7 +11,7 @@ workflow ALIGN_STAR { reads // channel: [ val(meta), [ reads ] ] index // channel: [ val(meta), [ index ] ] gtf // channel: [ val(meta), [ gtf ] ] - star_ignore_sjdbgtf // boolean: when using pre-built STAR indices do not re-extract and use splice junctions from the GTF file + star_ignore_sjdbgtf // boolean: when using pre-built STAR indices do not re-extract and use splice junctions from the GTF file seq_platform // string : sequencing platform seq_center // string : sequencing center is_aws_igenome // boolean: whether the genome files are from AWS iGenomes diff --git a/subworkflows/local/align_star/nextflow.config b/subworkflows/local/align_star/nextflow.config new file mode 100644 index 000000000..119eb6e4a --- /dev/null +++ b/subworkflows/local/align_star/nextflow.config @@ -0,0 +1,56 @@ +if (!params.skip_alignment && params.aligner == 'star_salmon') { + process { + withName: '.*:ALIGN_STAR:STAR_ALIGN|.*:ALIGN_STAR:STAR_ALIGN_IGENOMES' { + ext.args = { + // Function to convert argument strings into a map + def argsToMap = { String args -> + args.split("\\s(?=--)").collectEntries { + def parts = it.trim().split(/\s+/, 2) + [(parts.first()): parts.last()] + } + } + + // Initialize the map with preconfigured values + def preset_args_map = argsToMap(""" + --quantMode TranscriptomeSAM + --twopassMode Basic + --outSAMtype BAM Unsorted + --readFilesCommand zcat + --runRNGseed 0 + --outFilterMultimapNmax 20 + --alignSJDBoverhangMin 1 + --outSAMattributes NH HI AS NM MD + --quantTranscriptomeBan Singleend + --outSAMstrandField intronMotif + ${params.save_unaligned ? '--outReadsUnmapped Fastx' : ''} + """.trim()) + + // Consolidate the extra arguments + def final_args_map = preset_args_map + (params.extra_star_align_args ? argsToMap(params.extra_star_align_args) : [:]) + + // Convert the map back to a list and then to a single string + final_args_map.collect { key, value -> "${key} ${value}" }.join(' ').trim() + } + + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}/log" }, + mode: params.publish_dir_mode, + pattern: '*.{out,tab}' + ], + [ + path: { params.save_align_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.bam', + saveAs: { params.save_align_intermeds ? it : null } + ], + [ + path: { params.save_unaligned ? "${params.outdir}/${params.aligner}/unmapped" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.fastq.gz', + saveAs: { params.save_unaligned ? it : null } + ] + ] + } + } +} diff --git a/subworkflows/local/align_star/tests/main.nf.test b/subworkflows/local/align_star/tests/main.nf.test new file mode 100644 index 000000000..35b3236e8 --- /dev/null +++ b/subworkflows/local/align_star/tests/main.nf.test @@ -0,0 +1,297 @@ +nextflow_workflow { + + name "Test Subworkflow ALIGN_STAR" + script "../main.nf" + workflow "ALIGN_STAR" + config "./nextflow.config" + + test("star - no igenomes") { + + setup { + run("STAR_GENOMEGENERATE") { + script "../../../../modules/nf-core/star/genomegenerate/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + } + + when { + workflow { + """ + star_ignore_sjdbgtf = false + seq_platform = 'illumina' + seq_center = false + is_aws_igenome = false + + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE.out.index + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = star_ignore_sjdbgtf + input[4] = seq_platform + input[5] = seq_center + input[6] = is_aws_igenome + input[7] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + file(workflow.out.log_final[0][1]).name, + file(workflow.out.log_out[0][1]).name, + workflow.out.bai, + workflow.out.bam, + workflow.out.bam_sorted, + workflow.out.bam_transcript, + workflow.out.csi, + workflow.out.log_progress, + workflow.out.fastq, + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.orig_bam, + workflow.out.stats, + workflow.out.tab, + workflow.out.versions).match()} + ) + } + } + + test("star - with igenomes") { + + setup { + run("STAR_GENOMEGENERATE_IGENOMES") { + script "../../../../modules/local/star_genomegenerate_igenomes/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + } + + when { + workflow { + """ + star_ignore_sjdbgtf = false + seq_platform = 'illumina' + seq_center = false + is_aws_igenome = true + + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE_IGENOMES.out.index.map{ [ [id:'star'], it ] } + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = star_ignore_sjdbgtf + input[4] = seq_platform + input[5] = seq_center + input[6] = is_aws_igenome + input[7] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + file(workflow.out.log_final[0][1]).name, + file(workflow.out.log_out[0][1]).name, + workflow.out.bai, + workflow.out.bam, + workflow.out.bam_sorted, + workflow.out.bam_transcript, + workflow.out.csi, + workflow.out.log_progress, + workflow.out.fastq, + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.orig_bam, + workflow.out.stats, + workflow.out.tab, + workflow.out.versions).match()} + ) + } + } + + test("star - no igenomes - stub") { + + options "-stub" + + setup { + run("STAR_GENOMEGENERATE") { + script "../../../../modules/nf-core/star/genomegenerate/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + input[1] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + """ + } + } + } + + when { + workflow { + """ + star_ignore_sjdbgtf = false + seq_platform = 'illumina' + seq_center = false + is_aws_igenome = false + + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE.out.index + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = star_ignore_sjdbgtf + input[4] = seq_platform + input[5] = seq_center + input[6] = is_aws_igenome + input[7] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.bai, + workflow.out.bam, + workflow.out.bam_sorted, + workflow.out.bam_transcript, + workflow.out.csi, + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.log_final, + workflow.out.log_out, + workflow.out.log_progress, + workflow.out.orig_bam, + workflow.out.stats, + workflow.out.tab, + workflow.out.versions).match()} + ) + } + } + + test("star - with igenomes - stub") { + + options "-stub" + + setup { + run("STAR_GENOMEGENERATE_IGENOMES") { + script "../../../../modules/local/star_genomegenerate_igenomes/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)]) + """ + } + } + } + + when { + workflow { + """ + star_ignore_sjdbgtf = false + seq_platform = 'illumina' + seq_center = false + is_aws_igenome = true + + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = STAR_GENOMEGENERATE_IGENOMES.out.index.map{ [ [id:'star'], it ] } + input[2] = Channel.of([ + [ id:'test_gtf' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) ] + ]) + input[3] = star_ignore_sjdbgtf + input[4] = seq_platform + input[5] = seq_center + input[6] = is_aws_igenome + input[7] = Channel.of([ + [ id:'test_fasta' ], + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.bai, + workflow.out.bam, + workflow.out.bam_sorted, + workflow.out.bam_transcript, + workflow.out.csi, + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.log_final, + workflow.out.log_out, + workflow.out.log_progress, + workflow.out.orig_bam, + workflow.out.stats, + workflow.out.tab, + workflow.out.versions).match()} + ) + } + } +} diff --git a/subworkflows/local/align_star/tests/main.nf.test.snap b/subworkflows/local/align_star/tests/main.nf.test.snap new file mode 100644 index 000000000..e3a4b2e03 --- /dev/null +++ b/subworkflows/local/align_star/tests/main.nf.test.snap @@ -0,0 +1,498 @@ +{ + "star - with igenomes": { + "content": [ + "test.Log.final.out", + "test.Log.out", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,8bfbd4094a92ac0de8492d98a471d1b0" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,fc154c31eb4d034ebdb6b1d17c6b45eb" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.sortedByCoord.out.bam:md5,b6cec9bba6b04b9b92eddbef128bdfbb" + ] + ], + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,b2bd061d6cbaaf3d6d3b1fed547f69b8" + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,db0e25cd0b37d3030e807846c022199e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,107ca94dd426cc44db316f0d402307c5" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.sortedByCoord.out.bam:md5,b6cec9bba6b04b9b92eddbef128bdfbb" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,202e2f234f93b347b6a72d0163773054" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,844af19ab0fc8cd9a3f75228445aca0d" + ] + ], + [ + "versions.yml:md5,06693106908e6f8f38a2c30accf7067d", + "versions.yml:md5,369619588c8c294b74dca9058a151b11", + "versions.yml:md5,78069d4515b04251f758ac52a49d9971", + "versions.yml:md5,b6a22ef369a375445a8f9313721b8092", + "versions.yml:md5,e3b043ba840d5bddde92f0bf1c91a5fc", + "versions.yml:md5,feaf798d368c662a7a1cea87a24a7434" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:13:41.194686" + }, + "star - no igenomes - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + [ + "versions.yml:md5,06693106908e6f8f38a2c30accf7067d", + "versions.yml:md5,35c1cc21d26d9d8f00e6ec87e97fb634", + "versions.yml:md5,369619588c8c294b74dca9058a151b11", + "versions.yml:md5,78069d4515b04251f758ac52a49d9971", + "versions.yml:md5,b6a22ef369a375445a8f9313721b8092", + "versions.yml:md5,feaf798d368c662a7a1cea87a24a7434" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:43:30.675108" + }, + "star - no igenomes": { + "content": [ + "test.Log.final.out", + "test.Log.out", + [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,8bfbd4094a92ac0de8492d98a471d1b0" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,e6573d093da6ec95f99c1669eb86bbd6" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.sortedByCoord.out.bam:md5,b9ee1c607e07323bc1652ef3babb543f" + ] + ], + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,b2bd061d6cbaaf3d6d3b1fed547f69b8" + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,db0e25cd0b37d3030e807846c022199e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,107ca94dd426cc44db316f0d402307c5" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Aligned.sortedByCoord.out.bam:md5,b9ee1c607e07323bc1652ef3babb543f" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,202e2f234f93b347b6a72d0163773054" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.SJ.out.tab:md5,844af19ab0fc8cd9a3f75228445aca0d" + ] + ], + [ + "versions.yml:md5,06693106908e6f8f38a2c30accf7067d", + "versions.yml:md5,35c1cc21d26d9d8f00e6ec87e97fb634", + "versions.yml:md5,369619588c8c294b74dca9058a151b11", + "versions.yml:md5,78069d4515b04251f758ac52a49d9971", + "versions.yml:md5,b6a22ef369a375445a8f9313721b8092", + "versions.yml:md5,feaf798d368c662a7a1cea87a24a7434" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:12:49.496188" + }, + "star - with igenomes - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.toTranscriptome.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.final.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.Log.progress.out:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.Aligned.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.sortedByCoord.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "testXd.out.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.ReadsPerGene.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.SJ.out.tab:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tab:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + [ + "versions.yml:md5,06693106908e6f8f38a2c30accf7067d", + "versions.yml:md5,369619588c8c294b74dca9058a151b11", + "versions.yml:md5,78069d4515b04251f758ac52a49d9971", + "versions.yml:md5,b6a22ef369a375445a8f9313721b8092", + "versions.yml:md5,e3b043ba840d5bddde92f0bf1c91a5fc", + "versions.yml:md5,feaf798d368c662a7a1cea87a24a7434" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:43:56.680384" + } +} \ No newline at end of file diff --git a/subworkflows/local/align_star/tests/nextflow.config b/subworkflows/local/align_star/tests/nextflow.config new file mode 100644 index 000000000..2c26d74d6 --- /dev/null +++ b/subworkflows/local/align_star/tests/nextflow.config @@ -0,0 +1,12 @@ +process { + withName: 'STAR_GENOMEGENERATE.*' { + ext.args = '--genomeSAindexNbases 9' + } + + withName: 'STAR_ALIGN.*' { + ext.args = '--readFilesCommand zcat --outSAMtype BAM SortedByCoordinate --outWigType bedGraph --outWigStrand Unstranded' + } +} + +// Fix chown issue for the output star folder +docker.runOptions = '--platform=linux/amd64 -u $(id -u):$(id -g)' diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index 0840c7734..92f8cc04a 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -10,15 +10,18 @@ include { GUNZIP as GUNZIP_TRANSCRIPT_FASTA } from '../../../modules/nf-core/gun include { GUNZIP as GUNZIP_ADDITIONAL_FASTA } from '../../../modules/nf-core/gunzip' include { UNTAR as UNTAR_BBSPLIT_INDEX } from '../../../modules/nf-core/untar' +include { UNTAR as UNTAR_SORTMERNA_INDEX } from '../../../modules/nf-core/untar' include { UNTAR as UNTAR_STAR_INDEX } from '../../../modules/nf-core/untar' include { UNTAR as UNTAR_RSEM_INDEX } from '../../../modules/nf-core/untar' include { UNTAR as UNTAR_HISAT2_INDEX } from '../../../modules/nf-core/untar' include { UNTAR as UNTAR_SALMON_INDEX } from '../../../modules/nf-core/untar' include { UNTAR as UNTAR_KALLISTO_INDEX } from '../../../modules/nf-core/untar' +include { CUSTOM_CATADDITIONALFASTA } from '../../../modules/nf-core/custom/catadditionalfasta' include { CUSTOM_GETCHROMSIZES } from '../../../modules/nf-core/custom/getchromsizes' include { GFFREAD } from '../../../modules/nf-core/gffread' include { BBMAP_BBSPLIT } from '../../../modules/nf-core/bbmap/bbsplit' +include { SORTMERNA as SORTMERNA_INDEX } from '../../../modules/nf-core/sortmerna' include { STAR_GENOMEGENERATE } from '../../../modules/nf-core/star/genomegenerate' include { HISAT2_EXTRACTSPLICESITES } from '../../../modules/nf-core/hisat2/extractsplicesites' include { HISAT2_BUILD } from '../../../modules/nf-core/hisat2/build' @@ -29,44 +32,48 @@ include { RSEM_PREPAREREFERENCE as MAKE_TRANSCRIPTS_FASTA } from '../../.. include { PREPROCESS_TRANSCRIPTS_FASTA_GENCODE } from '../../../modules/local/preprocess_transcripts_fasta_gencode' include { GTF2BED } from '../../../modules/local/gtf2bed' -include { CAT_ADDITIONAL_FASTA } from '../../../modules/local/cat_additional_fasta' include { GTF_FILTER } from '../../../modules/local/gtf_filter' include { STAR_GENOMEGENERATE_IGENOMES } from '../../../modules/local/star_genomegenerate_igenomes' workflow PREPARE_GENOME { take: - fasta // file: /path/to/genome.fasta - gtf // file: /path/to/genome.gtf - gff // file: /path/to/genome.gff - additional_fasta // file: /path/to/additional.fasta - transcript_fasta // file: /path/to/transcript.fasta - gene_bed // file: /path/to/gene.bed - splicesites // file: /path/to/splicesites.txt - bbsplit_fasta_list // file: /path/to/bbsplit_fasta_list.txt - star_index // directory: /path/to/star/index/ - rsem_index // directory: /path/to/rsem/index/ - salmon_index // directory: /path/to/salmon/index/ - kallisto_index // directory: /path/to/kallisto/index/ - hisat2_index // directory: /path/to/hisat2/index/ - bbsplit_index // directory: /path/to/rsem/index/ - gencode // boolean: whether the genome is from GENCODE - is_aws_igenome // boolean: whether the genome files are from AWS iGenomes - biotype // string: if additional fasta file is provided biotype value to use when appending entries to GTF file - prepare_tool_indices // list: tools to prepare indices for - filter_gtf // boolean: whether to filter GTF file + fasta // file: /path/to/genome.fasta + gtf // file: /path/to/genome.gtf + gff // file: /path/to/genome.gff + additional_fasta // file: /path/to/additional.fasta + transcript_fasta // file: /path/to/transcript.fasta + gene_bed // file: /path/to/gene.bed + splicesites // file: /path/to/splicesites.txt + bbsplit_fasta_list // file: /path/to/bbsplit_fasta_list.txt + sortmerna_fasta_list // file: /path/to/sortmerna_fasta_list.txt + star_index // directory: /path/to/star/index/ + rsem_index // directory: /path/to/rsem/index/ + salmon_index // directory: /path/to/salmon/index/ + kallisto_index // directory: /path/to/kallisto/index/ + hisat2_index // directory: /path/to/hisat2/index/ + bbsplit_index // directory: /path/to/bbsplit/index/ + sortmerna_index // directory: /path/to/sortmerna/index/ + gencode // boolean: whether the genome is from GENCODE + featurecounts_group_type // string: The attribute type used to group feature types in the GTF file when generating the biotype plot with featureCounts + aligner // string: Specifies the alignment algorithm to use - available options are 'star_salmon', 'star_rsem' and 'hisat2' + pseudo_aligner // string: Specifies the pseudo aligner to use - available options are 'salmon'. Runs in addition to '--aligner' + skip_gtf_filter // boolean: Skip filtering of GTF for valid scaffolds and/ or transcript IDs + skip_bbsplit // boolean: Skip BBSplit for removal of non-reference genome reads + skip_sortmerna // boolean: Skip sortmerna for removal of reads mapping to sequences in sortmerna_fasta_list + skip_alignment // boolean: Skip all of the alignment-based processes within the pipeline + skip_pseudo_alignment // boolean: Skip all of the pseudoalignment-based processes within the pipeline main: - ch_versions = Channel.empty() // // Uncompress genome fasta file if required // if (fasta.endsWith('.gz')) { - ch_fasta = GUNZIP_FASTA ( [ [:], fasta ] ).gunzip.map { it[1] } + ch_fasta = GUNZIP_FASTA ( [ [:], file(fasta, checkIfExists: true) ] ).gunzip.map { it[1] } ch_versions = ch_versions.mix(GUNZIP_FASTA.out.versions) } else { - ch_fasta = Channel.value(file(fasta)) + ch_fasta = Channel.value(file(fasta, checkIfExists: true)) } // @@ -75,23 +82,41 @@ workflow PREPARE_GENOME { if (gtf || gff) { if (gtf) { if (gtf.endsWith('.gz')) { - ch_gtf = GUNZIP_GTF ( [ [:], gtf ] ).gunzip.map { it[1] } + ch_gtf = GUNZIP_GTF ( [ [:], file(gtf, checkIfExists: true) ] ).gunzip.map { it[1] } ch_versions = ch_versions.mix(GUNZIP_GTF.out.versions) } else { - ch_gtf = Channel.value(file(gtf)) + ch_gtf = Channel.value(file(gtf, checkIfExists: true)) } } else if (gff) { if (gff.endsWith('.gz')) { - ch_gff = GUNZIP_GFF ( [ [:], gff ] ).gunzip.map { it[1] } + ch_gff = GUNZIP_GFF ( [ [:], file(gff, checkIfExists: true) ] ).gunzip ch_versions = ch_versions.mix(GUNZIP_GFF.out.versions) } else { - ch_gff = Channel.value(file(gff)) + ch_gff = Channel.value(file(gff, checkIfExists: true)).map { [ [:], it ] } } - ch_gtf = GFFREAD ( ch_gff ).gtf + ch_gtf = GFFREAD ( ch_gff, [] ).gtf.map { it[1] } ch_versions = ch_versions.mix(GFFREAD.out.versions) } - if (filter_gtf) { + // Determine whether to filter the GTF or not + def filter_gtf = + (( + // Condition 1: Alignment is required and aligner is set + !skip_alignment && aligner + ) || + ( + // Condition 2: Pseudoalignment is required and pseudoaligner is set + !skip_pseudo_alignment && pseudo_aligner + ) || + ( + // Condition 3: Transcript FASTA file is not provided + !transcript_fasta + )) && + ( + // Condition 4: --skip_gtf_filter is not provided + !skip_gtf_filter + ) + if (filter_gtf) { GTF_FILTER ( ch_fasta, ch_gtf ) ch_gtf = GTF_FILTER.out.genome_gtf ch_versions = ch_versions.mix(GTF_FILTER.out.versions) @@ -101,17 +126,23 @@ workflow PREPARE_GENOME { // // Uncompress additional fasta file and concatenate with reference fasta and gtf files // + def biotype = gencode ? "gene_type" : featurecounts_group_type if (additional_fasta) { if (additional_fasta.endsWith('.gz')) { - ch_add_fasta = GUNZIP_ADDITIONAL_FASTA ( [ [:], additional_fasta ] ).gunzip.map { it[1] } + ch_add_fasta = GUNZIP_ADDITIONAL_FASTA ( [ [:], file(additional_fasta, checkIfExists: true) ] ).gunzip.map { it[1] } ch_versions = ch_versions.mix(GUNZIP_ADDITIONAL_FASTA.out.versions) } else { - ch_add_fasta = Channel.value(file(additional_fasta)) + ch_add_fasta = Channel.value(file(additional_fasta, checkIfExists: true)) } - CAT_ADDITIONAL_FASTA ( ch_fasta, ch_gtf, ch_add_fasta, biotype ) - ch_fasta = CAT_ADDITIONAL_FASTA.out.fasta - ch_gtf = CAT_ADDITIONAL_FASTA.out.gtf - ch_versions = ch_versions.mix(CAT_ADDITIONAL_FASTA.out.versions) + + CUSTOM_CATADDITIONALFASTA ( + ch_fasta.combine(ch_gtf).map { fasta, gtf -> [ [:], fasta, gtf ] }, + ch_add_fasta.map { [ [:], it ] }, + biotype + ) + ch_fasta = CUSTOM_CATADDITIONALFASTA.out.fasta.map { it[1] }.first() + ch_gtf = CUSTOM_CATADDITIONALFASTA.out.gtf.map { it[1] }.first() + ch_versions = ch_versions.mix(CUSTOM_CATADDITIONALFASTA.out.versions) } // @@ -119,10 +150,10 @@ workflow PREPARE_GENOME { // if (gene_bed) { if (gene_bed.endsWith('.gz')) { - ch_gene_bed = GUNZIP_GENE_BED ( [ [:], gene_bed ] ).gunzip.map { it[1] } + ch_gene_bed = GUNZIP_GENE_BED ( [ [:], file(gene_bed, checkIfExists: true) ] ).gunzip.map { it[1] } ch_versions = ch_versions.mix(GUNZIP_GENE_BED.out.versions) } else { - ch_gene_bed = Channel.value(file(gene_bed)) + ch_gene_bed = Channel.value(file(gene_bed, checkIfExists: true)) } } else { ch_gene_bed = GTF2BED ( ch_gtf ).bed @@ -134,10 +165,10 @@ workflow PREPARE_GENOME { // if (transcript_fasta) { if (transcript_fasta.endsWith('.gz')) { - ch_transcript_fasta = GUNZIP_TRANSCRIPT_FASTA ( [ [:], transcript_fasta ] ).gunzip.map { it[1] } + ch_transcript_fasta = GUNZIP_TRANSCRIPT_FASTA ( [ [:], file(transcript_fasta, checkIfExists: true) ] ).gunzip.map { it[1] } ch_versions = ch_versions.mix(GUNZIP_TRANSCRIPT_FASTA.out.versions) } else { - ch_transcript_fasta = Channel.value(file(transcript_fasta)) + ch_transcript_fasta = Channel.value(file(transcript_fasta, checkIfExists: true)) } if (gencode) { PREPROCESS_TRANSCRIPTS_FASTA_GENCODE ( ch_transcript_fasta ) @@ -157,6 +188,15 @@ workflow PREPARE_GENOME { ch_chrom_sizes = CUSTOM_GETCHROMSIZES.out.sizes.map { it[1] } ch_versions = ch_versions.mix(CUSTOM_GETCHROMSIZES.out.versions) + // + // Get list of indices that need to be created + // + def prepare_tool_indices = [] + if (!skip_bbsplit) { prepare_tool_indices << 'bbsplit' } + if (!skip_sortmerna) { prepare_tool_indices << 'sortmerna' } + if (!skip_alignment) { prepare_tool_indices << aligner } + if (!skip_pseudo_alignment && pseudo_aligner) { prepare_tool_indices << pseudo_aligner } + // // Uncompress BBSplit index or generate from scratch if required // @@ -184,6 +224,36 @@ workflow PREPARE_GENOME { } } + // + // Uncompress sortmerna index or generate from scratch if required + // + ch_sortmerna_index = Channel.empty() + ch_rrna_fastas = Channel.empty() + + if ('sortmerna' in prepare_tool_indices) { + ribo_db = file(sortmerna_fasta_list) + + if (sortmerna_index) { + if (sortmerna_index.endsWith('.tar.gz')) { + ch_sortmerna_index = UNTAR_SORTMERNA_INDEX ( [ [:], sortmerna_index ] ).untar.map { it[1] } + ch_versions = ch_versions.mix(UNTAR_SORTMERNA_INDEX.out.versions) + } else { + ch_sortmerna_index = Channel.value(file(sortmerna_index)) + } + } else { + ch_rrna_fastas = Channel.from(ribo_db.readLines()) + .map { row -> file(row, checkIfExists: true) } + + SORTMERNA_INDEX ( + Channel.of([ [],[] ]), + ch_rrna_fastas.collect().map { [ 'rrna_refs', it ] }, + Channel.of([ [],[] ]) + ) + ch_sortmerna_index = SORTMERNA_INDEX.out.index.first() + ch_versions = ch_versions.mix(SORTMERNA_INDEX.out.versions) + } + } + // // Uncompress STAR index or generate from scratch if required // @@ -197,6 +267,13 @@ workflow PREPARE_GENOME { ch_star_index = Channel.value(file(star_index)) } } else { + // Check if an AWS iGenome has been provided to use the appropriate version of STAR + def is_aws_igenome = false + if (fasta && gtf) { + if ((file(fasta).getName() - '.gz' == 'genome.fa') && (file(gtf).getName() - '.gz' == 'genes.gtf')) { + is_aws_igenome = true + } + } if (is_aws_igenome) { ch_star_index = STAR_GENOMEGENERATE_IGENOMES ( ch_fasta, ch_gtf ).index ch_versions = ch_versions.mix(STAR_GENOMEGENERATE_IGENOMES.out.versions) @@ -281,7 +358,7 @@ workflow PREPARE_GENOME { } } else { if ('kallisto' in prepare_tool_indices) { - ch_kallisto_index = KALLISTO_INDEX ( ch_transcript_fasta.map{[ [:], it]} ).index + ch_kallisto_index = KALLISTO_INDEX ( ch_transcript_fasta.map { [ [:], it] } ).index ch_versions = ch_versions.mix(KALLISTO_INDEX.out.versions) } } @@ -295,6 +372,8 @@ workflow PREPARE_GENOME { chrom_sizes = ch_chrom_sizes // channel: path(genome.sizes) splicesites = ch_splicesites // channel: path(genome.splicesites.txt) bbsplit_index = ch_bbsplit_index // channel: path(bbsplit/index/) + rrna_fastas = ch_rrna_fastas // channel: path(sortmerna_fasta_list) + sortmerna_index = ch_sortmerna_index // channel: path(sortmerna/index/) star_index = ch_star_index // channel: path(star/index/) rsem_index = ch_rsem_index // channel: path(rsem/index/) hisat2_index = ch_hisat2_index // channel: path(hisat2/index/) diff --git a/subworkflows/local/prepare_genome/nextflow.config b/subworkflows/local/prepare_genome/nextflow.config new file mode 100644 index 000000000..cb78cb9e3 --- /dev/null +++ b/subworkflows/local/prepare_genome/nextflow.config @@ -0,0 +1,127 @@ +process { + withName: 'GUNZIP_.*|MAKE_TRANSCRIPTS_FASTA' { + publishDir = [ + path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } + ] + } + + withName: 'UNTAR_.*' { + ext.args2 = '--no-same-owner' + } + + withName: 'UNTAR_.*|STAR_GENOMEGENERATE|STAR_GENOMEGENERATE_IGENOMES|HISAT2_BUILD' { + publishDir = [ + path: { params.save_reference ? "${params.outdir}/genome/index" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } + ] + } + + withName: 'GFFREAD' { + ext.args = '--keep-exon-attrs -F -T' + publishDir = [ + path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } + ] + } + + withName: 'HISAT2_EXTRACTSPLICESITES' { + publishDir = [ + path: { params.save_reference ? "${params.outdir}/genome/index" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } + ] + } + + withName: 'SALMON_INDEX' { + ext.args = { [ + params.gencode ? '--gencode' : '', + params.pseudo_aligner_kmer_size ? "-k ${params.pseudo_aligner_kmer_size}": '' + ].join(' ').trim() } + publishDir = [ + path: { params.save_reference ? "${params.outdir}/genome/index" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } + ] + } + + withName: 'KALLISTO_INDEX' { + ext.args = params.pseudo_aligner_kmer_size ? "-k ${params.pseudo_aligner_kmer_size}" : '' + publishDir = [ + path: { params.save_reference ? "${params.outdir}/genome/index" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } + ] + } + + withName: 'RSEM_PREPAREREFERENCE_GENOME' { + ext.args = '--star' + publishDir = [ + path: { params.save_reference ? "${params.outdir}/genome/index" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } + ] + } + + withName: 'GTF2BED' { + publishDir = [ + path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } + ] + } + + withName: 'CAT_ADDITIONAL_FASTA|PREPROCESS_TRANSCRIPTS_FASTA_GENCODE' { + publishDir = [ + path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } + ] + } + + withName: 'GTF_FILTER' { + ext.args = { params.skip_gtf_transcript_filter ?: '--skip_transcript_id_check' } + publishDir = [ + path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } + ] + } + + withName: 'CUSTOM_GETCHROMSIZES' { + publishDir = [ + path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } + ] + } +} + +if (!params.skip_bbsplit && params.bbsplit_fasta_list) { + process { + withName: '.*:PREPARE_GENOME:BBMAP_BBSPLIT' { + ext.args = 'build=1' + publishDir = [ + path: { params.save_reference ? "${params.outdir}/genome/index" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_reference) ? filename : null } + ] + } + } +} + +if (params.remove_ribo_rna && params.ribo_database_manifest) { + process { + withName: 'SORTMERNA_INDEX' { + ext.args = '--index 1' + publishDir = [ + path: { params.save_reference ? "${params.outdir}/genome/sortmerna" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : params.save_reference ? filename : null } + ] + } + } +} diff --git a/subworkflows/local/prepare_genome/tests/main.nf.test b/subworkflows/local/prepare_genome/tests/main.nf.test new file mode 100644 index 000000000..fd8dc5154 --- /dev/null +++ b/subworkflows/local/prepare_genome/tests/main.nf.test @@ -0,0 +1,2697 @@ +nextflow_workflow { + + name "Test Subworkflow PREPARE_GENOME" + script "../main.nf" + workflow "PREPARE_GENOME" + config "./nextflow.config" + + test("default options") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("gencode = false") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_gtf_filter") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = true + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_bbsplit") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = true + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_alignment") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = true + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_pseudo_alignment") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = true + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("gtf = false") { + + when { + workflow { + """ + gencode = true + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = false + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("gff = false") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = false + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("gfp = false") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = false + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("transcriptome = false") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = false + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("with bed") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = file(params.pipelines_testdata_base_path + 'reference/ngscheckmate.bed', checkIfExists: true) + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("rsem_index = false") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = false + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("salmon_index = false") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = false + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("hisat2_index = false") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = false + input[12] = null + input[13] = false + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("gencode = true") { + + when { + workflow { + """ + gencode = true + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("featurecounts_group_type = 'gene_type'") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_type' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_gtf_filter = true") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = true + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_bbsplit = true") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = true + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_alignment = true") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = true + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_pseudoalignment = true") { + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = true + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.transcript_fasta, + workflow.out.salmon_index, + workflow.out.fasta, + workflow.out.gtf, + workflow.out.fai, + workflow.out.gene_bed, + workflow.out.chrom_sizes, + workflow.out.splicesites, + workflow.out.sortmerna_index, + workflow.out.star_index, + workflow.out.rsem_index, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.versions + ).match() } + ) + } + } + + test("default options - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("gencode = false - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_gtf_filter - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = true + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_bbsplit - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = true + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("skip_alignment - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = true + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_pseudo_alignment - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = true + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("gtf = false - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = true + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = false + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("gff = false - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = false + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("gfp = false - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = false + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("transcriptome = false - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = false + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("with bed - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = file(params.pipelines_testdata_base_path + 'reference/ngscheckmate.bed', checkIfExists: true) + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("rsem_index = false - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = false + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("salmon_index = false - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = false + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("hisat2_index = false - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = false + input[12] = null + input[13] = false + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("gencode = true - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = true + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("featurecounts_group_type = 'gene_type' - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_type' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_gtf_filter = true - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = true + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_bbsplit = true - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = true + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("skip_alignment = true - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = true + skip_pseudo_alignment = false + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } + + test("skip_pseudoalignment = true - stub") { + + options "-stub" + + when { + workflow { + """ + gencode = false + featurecounts_group_type = 'gene_biotype' + aligner = 'star_salmon,star_rsem,hisat2' + pseudo_aligner = 'salmon,kallisto' + skip_gtf_filter = false + skip_bbsplit = false + skip_sortmerna = true + skip_alignment = false + skip_pseudo_alignment = true + + input[0] = file(params.pipelines_testdata_base_path + 'reference/genome.fasta', checkIfExists: true) + input[1] = file(params.pipelines_testdata_base_path + 'reference/genes_with_empty_tid.gtf', checkIfExists: true) + input[2] = file(params.pipelines_testdata_base_path + 'reference/genes.gff', checkIfExists: true) + input[3] = file(params.pipelines_testdata_base_path + 'reference/gfp.fa', checkIfExists: true) + input[4] = file(params.pipelines_testdata_base_path + 'reference/transcriptome.fasta', checkIfExists: true) + input[5] = null + input[6] = null + input[7] = file(params.pipelines_testdata_base_path + 'reference/bbsplit_fasta_list.txt', checkIfExists: true) + input[8] = null + input[9] = null + input[10] = file(params.pipelines_testdata_base_path + 'reference/rsem.tar.gz', checkIfExists: true) + input[11] = file(params.pipelines_testdata_base_path + 'reference/salmon.tar.gz', checkIfExists: true) + input[12] = null + input[13] = file(params.pipelines_testdata_base_path + 'reference/hisat2.tar.gz', checkIfExists: true) + input[14] = null + input[15] = null + input[16] = gencode + input[17] = featurecounts_group_type + input[18] = aligner + input[19] = pseudo_aligner + input[20] = skip_gtf_filter + input[21] = skip_bbsplit + input[22] = skip_sortmerna + input[23] = skip_alignment + input[24] = skip_pseudo_alignment + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.chrom_sizes, + workflow.out.fai, + workflow.out.fasta, + workflow.out.gene_bed, + workflow.out.gtf, + workflow.out.hisat2_index, + workflow.out.kallisto_index, + workflow.out.rsem_index, + workflow.out.salmon_index, + workflow.out.sortmerna_index, + workflow.out.splicesites, + workflow.out.star_index, + workflow.out.transcript_fasta, + workflow.out.versions + ).match() } + ) + } + } +} diff --git a/subworkflows/local/prepare_genome/tests/main.nf.test.snap b/subworkflows/local/prepare_genome/tests/main.nf.test.snap new file mode 100644 index 000000000..88d78c211 --- /dev/null +++ b/subworkflows/local/prepare_genome/tests/main.nf.test.snap @@ -0,0 +1,2316 @@ +{ + "skip_gtf_filter = true - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T17:03:34.032908" + }, + "skip_pseudo_alignment - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T16:59:05.328944" + }, + "skip_gtf_filter": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,5e63cda3dcafc0d6ad0a738133af9d54" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:15:45.003106" + }, + "gencode = false - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T16:57:20.218814" + }, + "gff = false - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T16:59:55.589832" + }, + "skip_pseudoalignment = true - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T17:04:46.509423" + }, + "featurecounts_group_type = 'gene_type' - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T17:03:09.069637" + }, + "gtf = false": { + "content": [ + [ + "transcriptome.fixed.fa:md5,faf3a64453ae73983bbf2743387fbdf2" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,68b68c059ba170af3f9d0a5dc1e0c8b8" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,2a3ed31ad34b8864fb9278dcdef596ec", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,961ab91198c4e6ec9d795b95e3f61fda", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:17:19.742633" + }, + "gfp = false": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/genome.fasta" + ], + [ + "genome.filtered.gtf:md5,ef6fccd153a21c329670462d602ed2d0" + ], + [ + "genome.fasta.fai:md5,2cd76d936cbfa386b14154506c2041b2" + ], + [ + "genome.filtered.bed:md5,e507dc33673e76c32abe344f4dc07952" + ], + [ + "genome.fasta.sizes:md5,29218009212157c49dbc6596621ec780" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:18:06.890333" + }, + "skip_bbsplit = true": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:21:45.41666" + }, + "salmon_index = false - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T17:01:54.475669" + }, + "skip_alignment": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:16:32.139593" + }, + "gfp = false - stub": { + "content": [ + [ + "genome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/genome.fasta" + ], + [ + "genome.filtered.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome.filtered.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T17:00:21.318155" + }, + "gencode = false": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:15:21.650799" + }, + "default options": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:14:58.879047" + }, + "gencode = true - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "transcriptome.fixed.fa:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,961ab91198c4e6ec9d795b95e3f61fda", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T17:02:45.316528" + }, + "skip_alignment - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T16:58:40.569654" + }, + "skip_bbsplit = true - stub": { + "content": [ + { + "0": [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "1": [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + + ], + "13": [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + "14": [ + + ], + "15": [ + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ], + "2": [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "3": [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "4": [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + "5": [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + + ], + "9": [ + + ], + "bbsplit_index": [ + + ], + "chrom_sizes": [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "fai": [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "fasta": [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "gene_bed": [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "gtf": [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "hisat2_index": [ + + ], + "kallisto_index": [ + + ], + "rrna_fastas": [ + + ], + "rsem_index": [ + + ], + "salmon_index": [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + "sortmerna_index": [ + + ], + "splicesites": [ + + ], + "star_index": [ + + ], + "transcript_fasta": [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + "versions": [ + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T12:56:12.856413" + }, + "transcriptome = false": { + "content": [ + [ + "genome.transcripts.fa:md5,b89a3e02ad30ba3fd600f98c8e2f58d4" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,918fe0b59c0986eb602ace85841c5ab3", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:18:30.8944" + }, + "skip_pseudoalignment = true": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:22:33.169752" + }, + "skip_gtf_filter - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T16:57:47.201179" + }, + "gencode = true": { + "content": [ + [ + "transcriptome.fixed.fa:md5,faf3a64453ae73983bbf2743387fbdf2" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,2593a0843dd97f0b7dfb62cdd2c21ab8" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,961ab91198c4e6ec9d795b95e3f61fda", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:20:32.664472" + }, + "hisat2_index = false": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:20:06.853577" + }, + "rsem_index = false - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T17:01:29.423708" + }, + "featurecounts_group_type = 'gene_type'": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,2593a0843dd97f0b7dfb62cdd2c21ab8" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:20:57.049579" + }, + "with bed - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/ngscheckmate.bed" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T17:01:05.223077" + }, + "skip_pseudo_alignment": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:16:56.725751" + }, + "skip_bbsplit": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:16:08.147358" + }, + "with bed": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/ngscheckmate.bed" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:18:54.706918" + }, + "gtf = false - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "transcriptome.fixed.fa:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,2a3ed31ad34b8864fb9278dcdef596ec", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,961ab91198c4e6ec9d795b95e3f61fda", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T16:59:30.478197" + }, + "gff = false": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:17:45.167724" + }, + "default options - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T16:56:58.012938" + }, + "salmon_index = false": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:19:42.999843" + }, + "rsem_index = false": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:19:19.357926" + }, + "skip_alignment = true - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T17:04:20.276533" + }, + "transcriptome = false - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + + ], + [ + + ], + [ + + ], + [ + "genome.transcripts.fa:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,918fe0b59c0986eb602ace85841c5ab3", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T17:00:43.920677" + }, + "skip_alignment = true": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:22:08.9618" + }, + "skip_gtf_filter = true": { + "content": [ + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055" + ], + [ + "genome_gfp.gtf:md5,5e63cda3dcafc0d6ad0a738133af9d54" + ], + [ + "genome_gfp.fasta.fai:md5,8fa54c6bd2ea6a369efbb8ab4f30156a" + ], + [ + "genome_gfp.bed:md5,991993ebef1def1d5823632c21177ec3" + ], + [ + "genome_gfp.fasta.sizes:md5,9b755f8f349b14accefb4d859f84de26" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,1cd265cb86a23a27f683ffb2459f37f5", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,bc99889446f02427c166b3219b793672" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:21:18.583526" + }, + "hisat2_index = false - stub": { + "content": [ + [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + [ + "versions.yml:md5,0bc25597acf1d50abf7070d19d311cd7", + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-04T17:02:19.539518" + }, + "skip_bbsplit - stub": { + "content": [ + { + "0": [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "1": [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + + ], + "13": [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + "14": [ + + ], + "15": [ + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ], + "2": [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "3": [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "4": [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + "5": [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + + ], + "9": [ + + ], + "bbsplit_index": [ + + ], + "chrom_sizes": [ + "genome_transcriptome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "fai": [ + "genome_transcriptome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "fasta": [ + "genome_transcriptome.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "gene_bed": [ + "genome_transcriptome.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "gtf": [ + "genome_transcriptome.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "hisat2_index": [ + + ], + "kallisto_index": [ + + ], + "rrna_fastas": [ + + ], + "rsem_index": [ + + ], + "salmon_index": [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/salmon.tar.gz" + ], + "sortmerna_index": [ + + ], + "splicesites": [ + + ], + "star_index": [ + + ], + "transcript_fasta": [ + "/ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/reference/transcriptome.fasta" + ], + "versions": [ + "versions.yml:md5,71252f1a221be05593361acccb99506b", + "versions.yml:md5,80e9dd350be8cd4c11909d75c914757a", + "versions.yml:md5,bc99889446f02427c166b3219b793672", + "versions.yml:md5,cc8f32b7c37c35a075d38cb773004eaa" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T12:50:45.029123" + } +} \ No newline at end of file diff --git a/subworkflows/local/prepare_genome/tests/nextflow.config b/subworkflows/local/prepare_genome/tests/nextflow.config new file mode 100644 index 000000000..3fdd992f4 --- /dev/null +++ b/subworkflows/local/prepare_genome/tests/nextflow.config @@ -0,0 +1,24 @@ +process { + withName: 'GFFREAD' { + ext.args = '--keep-exon-attrs -F -T' + } + + withName: 'RSEM_PREPAREREFERENCE_GENOME' { + ext.args = '--star' + } + + withName: 'STAR_GENOMEGENERATE.*' { + ext.args = '--genomeSAindexNbases 9' + } + + withName: 'STAR_ALIGN.*' { + ext.args = '--readFilesCommand zcat --outSAMtype BAM SortedByCoordinate --outWigType bedGraph --outWigStrand Unstranded' + } + + withName: 'UNTAR_.*' { + ext.args2 = '--no-same-owner' + } +} + +// Fix chown issue for the output star folder +docker.runOptions = '--platform=linux/amd64 -u $(id -u):$(id -g)' diff --git a/subworkflows/local/quantify_pseudo/main.nf b/subworkflows/local/quantify_pseudo/main.nf deleted file mode 100644 index 7887f086f..000000000 --- a/subworkflows/local/quantify_pseudo/main.nf +++ /dev/null @@ -1,100 +0,0 @@ -// -// Pseudoalignment and quantification with Salmon or Kallisto -// - -include { SALMON_QUANT } from '../../../modules/nf-core/salmon/quant' -include { KALLISTO_QUANT } from '../../../modules/nf-core/kallisto/quant' -include { TX2GENE } from '../../../modules/local/tx2gene' -include { TXIMPORT } from '../../../modules/local/tximport' - -include { SUMMARIZEDEXPERIMENT as SE_GENE } from '../../../modules/local/summarizedexperiment' -include { SUMMARIZEDEXPERIMENT as SE_GENE_LENGTH_SCALED } from '../../../modules/local/summarizedexperiment' -include { SUMMARIZEDEXPERIMENT as SE_GENE_SCALED } from '../../../modules/local/summarizedexperiment' -include { SUMMARIZEDEXPERIMENT as SE_TRANSCRIPT } from '../../../modules/local/summarizedexperiment' - -workflow QUANTIFY_PSEUDO_ALIGNMENT { - take: - reads // channel: [ val(meta), [ reads ] ] - index // channel: /path/to//index/ - transcript_fasta // channel: /path/to/transcript.fasta - gtf // channel: /path/to/genome.gtf - pseudo_aligner // val: kallisto or salmon - alignment_mode // bool: Run Salmon in alignment mode - lib_type // val: String to override Salmon library type - kallisto_quant_fraglen // val: Estimated fragment length required by Kallisto in single-end mode - kallisto_quant_fraglen_sd // val: Estimated standard error for fragment length required by Kallisto in single-end mode - - main: - - ch_versions = Channel.empty() - - // - // Quantify and merge counts across samples - // - // NOTE: MultiQC needs Salmon outputs, but Kallisto logs - if (pseudo_aligner == 'salmon') { - SALMON_QUANT ( reads, index, gtf, transcript_fasta, alignment_mode, lib_type ) - ch_pseudo_results = SALMON_QUANT.out.results - ch_pseudo_multiqc = ch_pseudo_results - ch_versions = ch_versions.mix(SALMON_QUANT.out.versions.first()) - } else { - KALLISTO_QUANT ( reads, index, gtf, [], kallisto_quant_fraglen, kallisto_quant_fraglen_sd) - ch_pseudo_results = KALLISTO_QUANT.out.results - ch_pseudo_multiqc = KALLISTO_QUANT.out.log - ch_versions = ch_versions.mix(KALLISTO_QUANT.out.versions.first()) - } - - TX2GENE ( ch_pseudo_results.collect{it[1]}, pseudo_aligner, gtf ) - ch_versions = ch_versions.mix(TX2GENE.out.versions) - - TXIMPORT ( ch_pseudo_results.collect{it[1]}, TX2GENE.out.tsv.collect(), pseudo_aligner ) - ch_versions = ch_versions.mix(TXIMPORT.out.versions) - - SE_GENE ( - TXIMPORT.out.counts_gene, - TXIMPORT.out.tpm_gene, - TX2GENE.out.tsv.collect() - ) - ch_versions = ch_versions.mix(SE_GENE.out.versions) - - SE_GENE_LENGTH_SCALED ( - TXIMPORT.out.counts_gene_length_scaled, - TXIMPORT.out.tpm_gene, - TX2GENE.out.tsv.collect() - ) - - SE_GENE_SCALED ( - TXIMPORT.out.counts_gene_scaled, - TXIMPORT.out.tpm_gene, - TX2GENE.out.tsv.collect() - ) - - SE_TRANSCRIPT ( - TXIMPORT.out.counts_transcript, - TXIMPORT.out.tpm_transcript, - TX2GENE.out.tsv.collect() - ) - - emit: - results = ch_pseudo_results // channel: [ val(meta), results_dir ] - multiqc = ch_pseudo_multiqc // channel: [ val(meta), files_for_multiqc ] - - tpm_gene = TXIMPORT.out.tpm_gene // path *gene_tpm.tsv - counts_gene = TXIMPORT.out.counts_gene // path *gene_counts.tsv - lengths_gene = TXIMPORT.out.lengths_gene // path *gene_lengths.tsv - counts_gene_length_scaled = TXIMPORT.out.counts_gene_length_scaled // path *gene_counts_length_scaled.tsv - counts_gene_scaled = TXIMPORT.out.counts_gene_scaled // path *gene_counts_scaled.tsv - tpm_transcript = TXIMPORT.out.tpm_transcript // path *gene_tpm.tsv - counts_transcript = TXIMPORT.out.counts_transcript // path *transcript_counts.tsv - lengths_transcript = TXIMPORT.out.lengths_transcript // path *transcript_lengths.tsv - - merged_gene_rds = SE_GENE.out.rds // path: *.rds - merged_gene_rds_length_scaled = SE_GENE_LENGTH_SCALED.out.rds // path: *.rds - merged_gene_rds_scaled = SE_GENE_SCALED.out.rds // path: *.rds - - merged_counts_transcript = TXIMPORT.out.counts_transcript // path: *.transcript_counts.tsv - merged_tpm_transcript = TXIMPORT.out.tpm_transcript // path: *.transcript_tpm.tsv - merged_transcript_rds = SE_TRANSCRIPT.out.rds // path: *.rds - - versions = ch_versions // channel: [ versions.yml ] -} diff --git a/subworkflows/local/quantify_rsem/nextflow.config b/subworkflows/local/quantify_rsem/nextflow.config new file mode 100644 index 000000000..7b50b86c0 --- /dev/null +++ b/subworkflows/local/quantify_rsem/nextflow.config @@ -0,0 +1,39 @@ +if (!params.skip_alignment && params.aligner == 'star_rsem') { + process { + withName: '.*:QUANTIFY_RSEM:RSEM_CALCULATEEXPRESSION' { + ext.args = [ + '--star', + '--star-output-genome-bam', + '--star-gzipped-read-file', + '--estimate-rspd', + '--seed 1' + ].join(' ').trim() + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}" }, + mode: params.publish_dir_mode, + pattern: "*.{stat,results}" + ], + [ + path: { params.save_align_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: "*.bam", + saveAs: { params.save_align_intermeds ? it : null } + ], + [ + path: { "${params.outdir}/${params.aligner}/log" }, + mode: params.publish_dir_mode, + pattern: "*.log" + ] + ] + } + + withName: '.*:QUANTIFY_RSEM:RSEM_MERGE_COUNTS' { + publishDir = [ + path: { "${params.outdir}/${params.aligner}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } +} diff --git a/subworkflows/local/quantify_rsem/tests/main.nf.test b/subworkflows/local/quantify_rsem/tests/main.nf.test new file mode 100644 index 000000000..bba6f4372 --- /dev/null +++ b/subworkflows/local/quantify_rsem/tests/main.nf.test @@ -0,0 +1,105 @@ +nextflow_workflow { + + name "Test Workflow QUANTIFY_RSEM" + script "../main.nf" + workflow "QUANTIFY_RSEM" + config "./nextflow.config" + + test("homo_sapiens") { + + setup { + run("RSEM_PREPAREREFERENCE") { + script "../../../../modules/nf-core/rsem/preparereference/main.nf" + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)) + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)) + """ + } + } + } + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', strandedness: 'forward' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = RSEM_PREPAREREFERENCE.out.index + input[2] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + file(workflow.out.logs[0][1]).name, + workflow.out.counts_gene, + workflow.out.counts_transcript, + workflow.out.stat, + workflow.out.bam_star, + workflow.out.bam_genome, + workflow.out.bam_transcript, + workflow.out.counts_transcript, + workflow.out.bam, + workflow.out.bai, + workflow.out.csi, + workflow.out.stats, + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.merged_counts_gene, + workflow.out.merged_tpm_gene, + workflow.out.merged_counts_transcript, + workflow.out.merged_tpm_transcript, + workflow.out.versions + ).match()} + ) + } + } + + test("homo_sapiens - stub") { + + options "-stub" + + setup { + run("RSEM_PREPAREREFERENCE") { + script "../../../../modules/nf-core/rsem/preparereference/main.nf" + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)) + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)) + """ + } + } + } + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', strandedness: 'forward' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + input[1] = RSEM_PREPAREREFERENCE.out.index + input[2] = Channel.of([[id:'test'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match()} + ) + } + } +} diff --git a/subworkflows/local/quantify_rsem/tests/main.nf.test.snap b/subworkflows/local/quantify_rsem/tests/main.nf.test.snap new file mode 100644 index 000000000..847be5d62 --- /dev/null +++ b/subworkflows/local/quantify_rsem/tests/main.nf.test.snap @@ -0,0 +1,376 @@ +{ + "homo_sapiens - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.genes.results:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.isoforms.results:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + "rsem.merged.gene_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "14": [ + "rsem.merged.gene_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "15": [ + "rsem.merged.transcript_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "16": [ + "rsem.merged.transcript_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "17": [ + "versions.yml:md5,2aa5252eb2ffb409cf556a165d40f8a9", + "versions.yml:md5,3399809728955f4654ab781f37ea42d3", + "versions.yml:md5,4219f710ca21b71a7c7db6b02ac19bb3", + "versions.yml:md5,912c613bca84f899b3e890985ecc6fc2", + "versions.yml:md5,a4755dd9acbfa60dbc38e172ffda193f", + "versions.yml:md5,ae1676b60b6335fff8f1188288103a1c", + "versions.yml:md5,f645ee5b20a4e89c6ed48fdc27c21791" + ], + "2": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.stat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.STAR.genome.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.genome.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.transcript.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + + ], + "bai": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_genome": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.genome.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_star": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.STAR.genome.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam_transcript": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.transcript.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "counts_gene": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.genes.results:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "counts_transcript": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.isoforms.results:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "csi": [ + + ], + "flagstat": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "logs": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "merged_counts_gene": [ + "rsem.merged.gene_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "merged_counts_transcript": [ + "rsem.merged.transcript_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "merged_tpm_gene": [ + "rsem.merged.gene_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "merged_tpm_transcript": [ + "rsem.merged.transcript_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "stat": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.stat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,2aa5252eb2ffb409cf556a165d40f8a9", + "versions.yml:md5,3399809728955f4654ab781f37ea42d3", + "versions.yml:md5,4219f710ca21b71a7c7db6b02ac19bb3", + "versions.yml:md5,912c613bca84f899b3e890985ecc6fc2", + "versions.yml:md5,a4755dd9acbfa60dbc38e172ffda193f", + "versions.yml:md5,ae1676b60b6335fff8f1188288103a1c", + "versions.yml:md5,f645ee5b20a4e89c6ed48fdc27c21791" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:32:06.579549" + }, + "homo_sapiens": { + "content": [ + "test.log", + [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.genes.results:md5,c7ec226f76736ea805771e73553ae359" + ] + ], + [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.isoforms.results:md5,99f7f80aa505b44ca429fdebbd7dd5d8" + ] + ], + [ + [ + { + "id": "test", + "strandedness": "forward" + }, + [ + "test.cnt:md5,76249e6b2f3c104f414aae596ba2c2f4", + "test.model:md5,a7a4bc1734918ef5848604e3362b83e2", + "test.theta:md5,de2e4490c98cc5383a86ae8225fd0a28" + ] + ] + ], + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.transcript.bam:md5,ed681d39f5700ffc74d6321525330d93" + ] + ], + [ + [ + { + "id": "test", + "strandedness": "forward" + }, + "test.isoforms.results:md5,99f7f80aa505b44ca429fdebbd7dd5d8" + ] + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "rsem.merged.gene_counts.tsv:md5,f3b586000c97c89aec45360772e73df1" + ], + [ + "rsem.merged.gene_tpm.tsv:md5,e6ae3dfa9913a7c15b705ec27c376212" + ], + [ + "rsem.merged.transcript_counts.tsv:md5,235c002b811360183494a2aac74d1f5b" + ], + [ + "rsem.merged.transcript_tpm.tsv:md5,d38f22667e3b8012f1d783b8d5159ccc" + ], + [ + "versions.yml:md5,2aa5252eb2ffb409cf556a165d40f8a9", + "versions.yml:md5,ae1676b60b6335fff8f1188288103a1c" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T19:53:14.561568" + } +} \ No newline at end of file diff --git a/subworkflows/local/quantify_rsem/tests/nextflow.config b/subworkflows/local/quantify_rsem/tests/nextflow.config new file mode 100644 index 000000000..51fecdb1f --- /dev/null +++ b/subworkflows/local/quantify_rsem/tests/nextflow.config @@ -0,0 +1,12 @@ +process { + + // Needs the glob to force the config to be applied + withName: "RSEM_PREPAREREFERENCE" { + ext.args = "--star " + } + + withName: "RSEM_CALCULATEEXPRESSION" { + ext.args = '--star --star-gzipped-read-file' + } + +} diff --git a/subworkflows/local/utils_nfcore_rnaseq_pipeline/main.nf b/subworkflows/local/utils_nfcore_rnaseq_pipeline/main.nf new file mode 100644 index 000000000..b2b890479 --- /dev/null +++ b/subworkflows/local/utils_nfcore_rnaseq_pipeline/main.nf @@ -0,0 +1,600 @@ +// +// Subworkflow with functionality specific to the nf-core/rnaseq pipeline +// + +import groovy.json.JsonSlurper + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + IMPORT FUNCTIONS / MODULES / SUBWORKFLOWS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +include { UTILS_NFVALIDATION_PLUGIN } from '../../nf-core/utils_nfvalidation_plugin' +include { paramsSummaryMap } from 'plugin/nf-validation' +include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipeline' +include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' +include { dashedLine } from '../../nf-core/utils_nfcore_pipeline' +include { nfCoreLogo } 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 { workflowCitation } from '../../nf-core/utils_nfcore_pipeline' +include { logColours } from '../../nf-core/utils_nfcore_pipeline' +include { calculateStrandedness } from '../../nf-core/fastq_qc_trim_filter_setstrandedness' + +/* +======================================================================================== + SUBWORKFLOW TO INITIALISE PIPELINE +======================================================================================== +*/ + +workflow PIPELINE_INITIALISATION { + + take: + version // boolean: Display version and exit + help // boolean: Display help text + schema // string: Path to the JSON schema file + 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 + + main: + + // + // Print version and exit if required and dump pipeline parameters to JSON file + // + UTILS_NEXTFLOW_PIPELINE ( + version, + true, + outdir, + workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1 + ) + + // + // Validate parameters and generate parameter summary to stdout + // + pre_help_text = nfCoreLogo(monochrome_logs) + post_help_text = '\n' + workflowCitation() + '\n' + dashedLine(monochrome_logs) + def String workflow_command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --genome GRCh37 --outdir " + UTILS_NFVALIDATION_PLUGIN ( + help, + workflow_command, + pre_help_text, + post_help_text, + validate_params, + schema + ) + + // + // Check config provided to the pipeline + // + UTILS_NFCORE_PIPELINE ( + nextflow_cli_args + ) + + // + // Custom validation for pipeline parameters + // + validateInputParameters() + +} + +/* +======================================================================================== + SUBWORKFLOW FOR PIPELINE COMPLETION +======================================================================================== +*/ + +def pass_mapped_reads = [:] +def pass_trimmed_reads = [:] +def pass_strand_check = [:] + +workflow PIPELINE_COMPLETION { + + take: + schema // string: Path to the JSON schema file + 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 + trim_status // map: pass/fail status per sample for trimming + map_status // map: pass/fail status per sample for mapping + strand_status // map: pass/fail status per sample for strandedness check + + main: + + summary_params = paramsSummaryMap(workflow, parameters_schema: schema) + + trim_status + .map{ + id, status -> pass_trimmed_reads[id] = status + } + + map_status + .map{ + id, status -> pass_mapped_reads[id] = status + } + + strand_status + .map{ + id, status -> pass_strand_check[id] = status + } + + // + // Completion email and summary + // + workflow.onComplete { + if (email || email_on_fail) { + completionEmail(summary_params, email, email_on_fail, plaintext_email, outdir, monochrome_logs, multiqc_report.toList()) + } + + rnaseqSummary(monochrome_logs=monochrome_logs, pass_mapped_reads=pass_mapped_reads, pass_trimmed_reads=pass_trimmed_reads, pass_strand_check=pass_strand_check) + + 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 +======================================================================================== +*/ + +// +// Function to check samples are internally consistent after being grouped +// +def checkSamplesAfterGrouping(input) { + def (metas, fastqs) = input[1..2] + + // Check that multiple runs of the same sample are of the same strandedness + def strandedness_ok = metas.collect{ it.strandedness }.unique().size == 1 + if (!strandedness_ok) { + error("Please check input samplesheet -> Multiple runs of a sample must have the same strandedness!: ${metas[0].id}") + } + + // Check that multiple runs of the same sample are of the same datatype i.e. single-end / paired-end + def endedness_ok = metas.collect{ it.single_end }.unique().size == 1 + if (!endedness_ok) { + error("Please check input samplesheet -> Multiple runs of a sample must be of the same datatype i.e. single-end or paired-end: ${metas[0].id}") + } + + return [ metas[0], fastqs ] +} + +// +// 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) { + if (params.gff) { + gtfGffWarn() + } + if (params.genome == 'GRCh38' && params.gtf.contains('Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf')) { + ncbiGenomeWarn() + } + if (params.gtf.contains('/UCSC/') && params.gtf.contains('Annotation/Genes/genes.gtf')) { + ucscGenomeWarn() + } + } + + if (params.transcript_fasta) { + transcriptsFastaWarn() + } + + if (!params.skip_bbsplit && !params.bbsplit_index && !params.bbsplit_fasta_list) { + error("Please provide either --bbsplit_fasta_list / --bbsplit_index to run BBSplit.") + } + + if (params.remove_ribo_rna && !params.ribo_database_manifest) { + error("Please provide --ribo_database_manifest to remove ribosomal RNA with SortMeRNA.") + } + + if (params.with_umi && !params.skip_umi_extract) { + if (!params.umitools_bc_pattern && !params.umitools_bc_pattern2) { + error("UMI-tools requires a barcode pattern to extract barcodes from the reads.") + } + } + + if (params.skip_alignment) { + skipAlignmentWarn() + } + + if (!params.skip_pseudo_alignment && params.pseudo_aligner) { + if (!(params.salmon_index || params.transcript_fasta || (params.fasta && (params.gtf || params.gff)))) { + error("To use `--pseudo_aligner 'salmon'`, you must provide either --salmon_index or --transcript_fasta or both --fasta and --gtf / --gff.") + } + } + + // Checks when running --aligner star_rsem + if (!params.skip_alignment && params.aligner == 'star_rsem') { + if (params.with_umi) { + rsemUmiError() + } + if (params.rsem_index && params.star_index) { + rsemStarIndexWarn() + } + if (params.aligner == 'star_rsem' && params.extra_star_align_args) { + rsemStarExtraArgumentsWarn() + } + } + + // Warn if --additional_fasta provided with aligner index + if (!params.skip_alignment && params.additional_fasta) { + def index = '' + if (params.aligner == 'star_salmon' && params.star_index) { + index = 'star' + } + if (params.aligner == 'star_rsem' && params.rsem_index) { + index = 'rsem' + } + if (params.aligner == 'hisat2' && params.hisat2_index) { + index = 'hisat2' + } + if (index) { + additionaFastaIndexWarn(index) + } + } + + // Check which RSeQC modules we are running + def valid_rseqc_modules = ['bam_stat', 'inner_distance', 'infer_experiment', 'junction_annotation', 'junction_saturation', 'read_distribution', 'read_duplication', 'tin'] + def rseqc_modules = params.rseqc_modules ? params.rseqc_modules.split(',').collect{ it.trim().toLowerCase() } : [] + if ((valid_rseqc_modules + rseqc_modules).unique().size() != valid_rseqc_modules.size()) { + error("Invalid option: ${params.rseqc_modules}. Valid options for '--rseqc_modules': ${valid_rseqc_modules.join(', ')}") + } + + // Check rRNA databases for sortmerna + if (params.remove_ribo_rna) { + ch_ribo_db = file(params.ribo_database_manifest) + if (ch_ribo_db.isEmpty()) { + error("File provided with --ribo_database_manifest is empty: ${ch_ribo_db.getName()}!") + } + } + + // Check if file with list of fastas is provided when running BBSplit + if (!params.skip_bbsplit && !params.bbsplit_index && params.bbsplit_fasta_list) { + ch_bbsplit_fasta_list = file(params.bbsplit_fasta_list) + if (ch_bbsplit_fasta_list.isEmpty()) { + error("File provided with --bbsplit_fasta_list is empty: ${ch_bbsplit_fasta_list.getName()}!") + } + } +} + +// +// 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 familar 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 = "" + String[] manifest_doi = meta.manifest_map.doi.tokenize(",") + for (String doi_ref: manifest_doi) 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.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " Both '--gtf' and '--gff' parameters have been provided.\n" + + " Using GTF file as priority.\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" +} + +// +// Print a warning if using GRCh38 assembly from igenomes.config +// +def ncbiGenomeWarn() { + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " When using '--genome GRCh38' the assembly is from the NCBI and NOT Ensembl.\n" + + " Biotype QC will be skipped to circumvent the issue below:\n" + + " https://github.com/nf-core/rnaseq/issues/460\n\n" + + " If you would like to use the soft-masked Ensembl assembly instead please see:\n" + + " https://github.com/nf-core/rnaseq/issues/159#issuecomment-501184312\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" +} + +// +// Print a warning if using a UCSC assembly from igenomes.config +// +def ucscGenomeWarn() { + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " When using UCSC assemblies the 'gene_biotype' field is absent from the GTF file.\n" + + " Biotype QC will be skipped to circumvent the issue below:\n" + + " https://github.com/nf-core/rnaseq/issues/460\n\n" + + " If you would like to use the soft-masked Ensembl assembly instead please see:\n" + + " https://github.com/nf-core/rnaseq/issues/159#issuecomment-501184312\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" +} + +// +// Print a warning if using '--transcript_fasta' +// +def transcriptsFastaWarn() { + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " '--transcript_fasta' parameter has been provided.\n" + + " Make sure transcript names in this file match those in the GFF/GTF file.\n\n" + + " Please see:\n" + + " https://github.com/nf-core/rnaseq/issues/753\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" +} + +// +// Print a warning if --skip_alignment has been provided +// +def skipAlignmentWarn() { + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " '--skip_alignment' parameter has been provided.\n" + + " Skipping alignment, genome-based quantification and all downstream QC processes.\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" +} + +// +// Print a warning if using '--aligner star_rsem' and '--with_umi' +// +def rsemUmiError() { + def error_string = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " When using '--aligner star_rsem', STAR is run by RSEM itself and so it is\n" + + " not possible to remove UMIs before the quantification.\n\n" + + " If you would like to remove UMI barcodes using the '--with_umi' option\n" + + " please use either '--aligner star_salmon' or '--aligner hisat2'.\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + error(error_string) +} + +// +// Print a warning if using '--aligner star_rsem' and providing both '--rsem_index' and '--star_index' +// +def rsemStarIndexWarn() { + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " When using '--aligner star_rsem', both the STAR and RSEM indices should\n" + + " be present in the path specified by '--rsem_index'.\n\n" + + " This warning has been generated because you have provided both\n" + + " '--rsem_index' and '--star_index'. The pipeline will ignore the latter.\n\n" + + " Please see:\n" + + " https://github.com/nf-core/rnaseq/issues/568\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" +} + +// +// Print a warning if using '--aligner star_rsem' and providing '--star_extra_alignment_args' +// +def rsemStarExtraArgumentsWarn() { + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " No additional arguments can be passed to STAR when using RSEM.\n" + + " Because RSEM enforces its own parameters for STAR, any extra arguments\n" + + " to STAR will be ignored. Alternatively, choose the STAR+Salmon route.\n\n" + + " This warning has been generated because you have provided both\n" + + " '--aligner star_rsem' and '--extra_star_align_args'.\n\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" +} + +// +// Print a warning if using '--additional_fasta' and '--_index' +// +def additionaFastaIndexWarn(index) { + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " When using '--additional_fasta ' the aligner index will not\n" + + " be re-built with the transgenes incorporated by default since you have \n" + + " already provided an index via '--${index}_index '.\n\n" + + " Set '--additional_fasta --${index}_index false --gene_bed false --save_reference'\n" + + " to re-build the index with transgenes included and the index and gene BED file will be saved in\n" + + " 'results/genome/index/${index}/' for re-use with '--${index}_index'.\n\n" + + " Ignore this warning if you know that the index already contains transgenes.\n\n" + + " Please see:\n" + + " https://github.com/nf-core/rnaseq/issues/556\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" +} + +// +// Function to generate an error if contigs in genome fasta file > 512 Mbp +// +def checkMaxContigSize(fai_file) { + def max_size = 512000000 + fai_file.eachLine { line -> + def lspl = line.split('\t') + def chrom = lspl[0] + def size = lspl[1] + if (size.toInteger() > max_size) { + def error_string = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " Contig longer than ${max_size}bp found in reference genome!\n\n" + + " ${chrom}: ${size}\n\n" + + " Provide the '--bam_csi_index' parameter to use a CSI instead of BAI index.\n\n" + + " Please see:\n" + + " https://github.com/nf-core/rnaseq/issues/744\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + error(error_string) + } + } +} + +// +// Function that parses and returns the alignment rate from the STAR log output +// +def getStarPercentMapped(params, align_log) { + def percent_aligned = 0 + def pattern = /Uniquely mapped reads %\s*\|\s*([\d\.]+)%/ + align_log.eachLine { line -> + def matcher = line =~ pattern + if (matcher) { + percent_aligned = matcher[0][1].toFloat() + } + } + + def pass = false + if (percent_aligned >= params.min_mapped_reads.toFloat()) { + pass = true + } + return [ percent_aligned, pass ] +} + +// +// Function to check whether biotype field exists in GTF file +// +def biotypeInGtf(gtf_file, biotype) { + def hits = 0 + gtf_file.eachLine { line -> + def attributes = line.split('\t')[-1].split() + if (attributes.contains(biotype)) { + hits += 1 + } + } + if (hits) { + return true + } else { + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " Biotype attribute '${biotype}' not found in the last column of the GTF file!\n\n" + + " Biotype QC will be skipped to circumvent the issue below:\n" + + " https://github.com/nf-core/rnaseq/issues/460\n\n" + + " Amend '--featurecounts_group_type' to change this behaviour.\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + return false + } +} + +// +// Function that parses RSeQC infer_experiment output file to get inferred strandedness +// +def getInferexperimentStrandedness(inferexperiment_file, stranded_threshold = 0.8, unstranded_threshold = 0.1) { + def forwardFragments = 0 + def reverseFragments = 0 + def unstrandedFragments = 0 + + inferexperiment_file.eachLine { line -> + def unstranded_matcher = line =~ /Fraction of reads failed to determine:\s([\d\.]+)/ + def se_sense_matcher = line =~ /Fraction of reads explained by "\++,--":\s([\d\.]+)/ + def se_antisense_matcher = line =~ /Fraction of reads explained by "\+-,-\+":\s([\d\.]+)/ + def pe_sense_matcher = line =~ /Fraction of reads explained by "1\++,1--,2\+-,2-\+":\s([\d\.]+)/ + def pe_antisense_matcher = line =~ /Fraction of reads explained by "1\+-,1-\+,2\+\+,2--":\s([\d\.]+)/ + + if (unstranded_matcher) unstrandedFragments = unstranded_matcher[0][1].toFloat() * 100 + if (se_sense_matcher) forwardFragments = se_sense_matcher[0][1].toFloat() * 100 + if (se_antisense_matcher) reverseFragments = se_antisense_matcher[0][1].toFloat() * 100 + if (pe_sense_matcher) forwardFragments = pe_sense_matcher[0][1].toFloat() * 100 + if (pe_antisense_matcher) reverseFragments = pe_antisense_matcher[0][1].toFloat() * 100 + } + + // Use shared calculation function to determine strandedness + return calculateStrandedness(forwardFragments, reverseFragments, unstrandedFragments, stranded_threshold, unstranded_threshold) +} + +// +// Print pipeline summary on completion +// +def rnaseqSummary(monochrome_logs=true, pass_mapped_reads=[:], pass_trimmed_reads=[:], pass_strand_check=[:]) { + def colors = logColours(monochrome_logs) + + def fail_mapped_count = pass_mapped_reads.count { key, value -> value == false } + def fail_trimmed_count = pass_trimmed_reads.count { key, value -> value == false } + def fail_strand_count = pass_strand_check.count { key, value -> value == false } + if (workflow.success) { + def color = colors.green + def status = [] + if (workflow.stats.ignoredCount != 0) { + color = colors.yellow + status += ['with errored process(es)'] + } + if (fail_mapped_count > 0 || fail_trimmed_count > 0) { + color = colors.yellow + status += ['with skipped sampl(es)'] + } + log.info "-${colors.purple}[$workflow.manifest.name]${color} Pipeline completed successfully ${status.join(', ')}${colors.reset}-" + if (fail_trimmed_count > 0) { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Please check MultiQC report: ${fail_trimmed_count}/${pass_trimmed_reads.size()} samples skipped since they failed ${params.min_trimmed_reads} trimmed read threshold.${colors.reset}-" + } + if (fail_mapped_count > 0) { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Please check MultiQC report: ${fail_mapped_count}/${pass_mapped_reads.size()} samples skipped since they failed STAR ${params.min_mapped_reads}% mapped threshold.${colors.reset}-" + } + if (fail_strand_count > 0) { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Please check MultiQC report: ${fail_strand_count}/${pass_strand_check.size()} samples failed strandedness check.${colors.reset}-" + } + } else { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" + } +} + diff --git a/subworkflows/local/utils_nfcore_rnaseq_pipeline/tests/main.function.nf.test b/subworkflows/local/utils_nfcore_rnaseq_pipeline/tests/main.function.nf.test new file mode 100644 index 000000000..b394aadb7 --- /dev/null +++ b/subworkflows/local/utils_nfcore_rnaseq_pipeline/tests/main.function.nf.test @@ -0,0 +1,501 @@ +nextflow_function { + + name "Test Functions" + script "../main.nf" + + test("Test Function checkSamplesAfterGrouping success") { + + function "checkSamplesAfterGrouping" + + when { + function { + """ + input[0] = [ + [], + [ + [ id: 'test', strandedness: 'unstranded', single_end: true ], + [ id: 'test', strandedness: 'unstranded', single_end: true ] + ], + [ + [ 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_1.fastq.gz', checkIfExists: true) ] + ] + ] + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function checkSamplesAfterGrouping invalid strandedness") { + + function "checkSamplesAfterGrouping" + + when { + function { + """ + input[0] = [ + [], + [ + [ id: 'test', strandedness: 'unstranded', single_end: true ], + [ id: 'test', strandedness: 'stranded', single_end: true ] + ], + [ + [ 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_1.fastq.gz', checkIfExists: true) ] + ] + ] + """ + } + } + + then { + assertAll( + { assert function.failed }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function checkSamplesAfterGrouping invalid endedness") { + + function "checkSamplesAfterGrouping" + + when { + function { + """ + input[0] = [ + [], + [ + [ id: 'test', strandedness: 'unstranded', single_end: true ], + [ id: 'test', strandedness: 'unstranded', 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_1.fastq.gz', checkIfExists: true) ] + ] + ] + """ + } + } + + then { + assertAll( + { assert function.failed }, + { assert snapshot(function.result).match() } + ) + } + + } + + + test("Test Function validateInputParameters success") { + // Needs more tests here to check for all options but there are a lot! + + function "validateInputParameters" + + when { + params { + fasta = "genome.fasta" + gtf = "genome.gtf" + gff = "genome.gff" + transcript_fasta = "transcripts.fasta" + skip_bbsplit = true + bbsplit_fasta_list = null + remove_ribo_rna = false + ribo_database_manifest = null + with_umi = false + skip_umi_extract = false + skip_alignment = false + aligner = "star" + skip_pseudo_alignment = false + pseudo_aligner = "salmon" + rsem_index = "rsem_index" + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function genomeExistsError finds genome") { + + function "genomeExistsError" + + when { + params { + genome = "myTest" + genomes { + "myTest" { + myAttribute = "myValue" + } + } + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function genomeExistsError missing genome") { + + function "genomeExistsError" + + when { + params { + genome = "missingTest" + genomes { + "myTest" { + myAttribute = "myValue" + } + } + } + } + + then { + assertAll( + { assert function.failed }, + { assert snapshot(function.result).match() } + ) + } + + } + + + test("Test Function toolCitationText") { + + function "toolCitationText" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function toolBibliographyText") { + + function "toolBibliographyText" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function gtfGffWarn") { + + function "gtfGffWarn" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + + + test("Test Function ncbiGenomeWarn") { + + function "ncbiGenomeWarn" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + + + test("Test Function ucscGenomeWarn") { + + function "ucscGenomeWarn" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + + + test("Test Function transcriptsFastaWarn") { + + function "transcriptsFastaWarn" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + + + test("Test Function skipAlignmentWarn") { + + function "skipAlignmentWarn" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + + + test("Test Function rsemUmiError") { + + function "rsemUmiError" + + then { + assertAll( + { assert function.failed }, + { assert snapshot(function.result).match() } + ) + } + + } + + + + test("Test Function rsemStarIndexWarn") { + + function "rsemStarIndexWarn" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + + test("Test Function rsemStarExtraArgumentsWarn") { + + function "rsemStarExtraArgumentsWarn" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + + test("Test Function additionaFastaIndexWarn") { + + function "additionaFastaIndexWarn" + + when { + function { + """ + input[0] = "mockIndex" + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function checkMaxContigSize") { + + function "checkMaxContigSize" + + when { + function { + """ + input[0] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + + test("Test Function getStarPercentMapped pass") { + + function "getStarPercentMapped" + + when { + function { + """ + def alignLog = file("${workDir}/alignLog.txt") + alignLog.write("Uniquely mapped reads % | 95.6%") + + input[0] = [ + min_mapped_reads: 1.0 + ] + input[1] = alignLog + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert function.result == [ 95.6, true ] } + ) + } + + } + + test("Test Function getStarPercentMapped fail") { + + function "getStarPercentMapped" + + when { + function { + """ + def alignLog = file("${workDir}/alignLog.txt") + alignLog.write("Uniquely mapped reads % | 10.2%") + + input[0] = [ + min_mapped_reads: 50.0 + ] + input[1] = alignLog + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert function.result == [ 10.2, false ] } + ) + } + + } + + + test("Test Function biotypeInGtf success") { + + function "biotypeInGtf" + + when { + function { + """ + input[0] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) + input[1] = "gene_biotype" + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function biotypeInGtf failed") { + + function "biotypeInGtf" + + when { + function { + """ + input[0] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) + input[1] = "NotAppearingInThisFile" + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function getInferexperimentStrandedness reverse") { + + function "getInferexperimentStrandedness" + + when { + function { + """ + def fileContents = [ + 'This is PairEnd Data', + 'Fraction of reads failed to determine: 0.1565', + 'Fraction of reads explained by "1++,1--,2+-,2-+": 0.0075', + 'Fraction of reads explained by "1+-,1-+,2++,2--": 0.8361' + ] + def inferExperimentFile = file("${workDir}/inferExperimentFile.txt") + inferExperimentFile.withWriter{ out -> + fileContents.each {out.println it} + } + + input[0] = inferExperimentFile + input[1] = 0.8 + input[2] = 0.1 + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } +} diff --git a/subworkflows/local/utils_nfcore_rnaseq_pipeline/tests/main.function.nf.test.snap b/subworkflows/local/utils_nfcore_rnaseq_pipeline/tests/main.function.nf.test.snap new file mode 100644 index 000000000..9deb0bca3 --- /dev/null +++ b/subworkflows/local/utils_nfcore_rnaseq_pipeline/tests/main.function.nf.test.snap @@ -0,0 +1,201 @@ +{ + "Test Function gtfGffWarn": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:33:11.163299" + }, + "Test Function biotypeInGtf success": { + "content": [ + true + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:34:03.414382" + }, + "Test Function toolBibliographyText": { + "content": [ + "
  • Andrews S, (2010) FastQC, URL: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/).
  • Ewels, P., Magnusson, M., Lundin, S., & K\u00e4ller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics , 32(19), 3047\u20133048. doi: /10.1093/bioinformatics/btw354
  • " + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:33:07.698845" + }, + "Test Function toolCitationText": { + "content": [ + "Tools used in the workflow included: FastQC (Andrews 2010), MultiQC (Ewels et al. 2016) ." + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:33:04.677913" + }, + "Test Function rsemUmiError": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:33:26.903306" + }, + "Test Function checkSamplesAfterGrouping invalid strandedness": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:32:41.841561" + }, + "Test Function biotypeInGtf failed": { + "content": [ + false + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:34:07.750259" + }, + "Test Function transcriptsFastaWarn": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:33:20.618971" + }, + "Test Function ucscGenomeWarn": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:33:17.405648" + }, + "Test Function skipAlignmentWarn": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:33:23.76368" + }, + "Test Function checkMaxContigSize": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:33:40.548126" + }, + "Test Function checkSamplesAfterGrouping success": { + "content": [ + [ + { + "id": "test", + "strandedness": "unstranded", + "single_end": true + }, + [ + [ + "/ngi-igenomes/testdata/nf-core/modules/genomics/sarscov2/illumina/fastq/test_1.fastq.gz" + ], + [ + "/ngi-igenomes/testdata/nf-core/modules/genomics/sarscov2/illumina/fastq/test_1.fastq.gz" + ] + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:32:37.450298" + }, + "Test Function checkSamplesAfterGrouping invalid endedness": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:32:46.420194" + }, + "Test Function genomeExistsError finds genome": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:32:58.626473" + }, + "Test Function additionaFastaIndexWarn": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:33:36.224496" + }, + "Test Function genomeExistsError missing genome": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:33:01.625542" + }, + "Test Function ncbiGenomeWarn": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:33:14.286665" + }, + "Test Function rsemStarExtraArgumentsWarn": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:33:33.141215" + }, + "Test Function validateInputParameters success": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:32:49.565504" + }, + "Test Function rsemStarIndexWarn": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:33:30.02058" + }, + "Test Function getInferexperimentStrandedness reverse": { + "content": [ + { + "inferred_strandedness": "reverse", + "forwardFragments": 0.749925006577425, + "reverseFragments": 83.60163982823676, + "unstrandedFragments": 15.64843516518582 + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-06-18T14:30:53.743529" + } +} diff --git a/subworkflows/local/utils_nfcore_rnaseq_pipeline/tests/main.pipeline_completion.workflow.nf.test b/subworkflows/local/utils_nfcore_rnaseq_pipeline/tests/main.pipeline_completion.workflow.nf.test new file mode 100644 index 000000000..ea784ea01 --- /dev/null +++ b/subworkflows/local/utils_nfcore_rnaseq_pipeline/tests/main.pipeline_completion.workflow.nf.test @@ -0,0 +1,35 @@ +nextflow_workflow { + + name "Test Workflow PIPELINE_COMPLETION" + script "../main.nf" + workflow "PIPELINE_COMPLETION" + + test("test PIPELINE_COMPLETION successfully completes") { + + when { + workflow { + """ + input[0] = "${projectDir}/nextflow_schema.json" // schema (string) + input[1] = null // email (string) + input[2] = null // email_on_fail (string) + input[3] = true // plaintext_email (boolean) + input[4] = "${outputDir}" // outputDir (string) + input[5] = true // monochrome_logs (boolean) + input[6] = null // hook_url (string) + input[7] = "${outputDir}/multiqc_report.html" // multiqc_report (string) + input[8] = Channel.of(['test_sample', true]) + input[9] = Channel.of(['test_sample', true]) + input[10] = Channel.of(['test_sample', true]) + """ + } + } + + then { + assertAll( + { assert workflow.success} + ) + } + + } + +} diff --git a/subworkflows/local/utils_nfcore_rnaseq_pipeline/tests/main.pipeline_initialistion.workflow.nf.test b/subworkflows/local/utils_nfcore_rnaseq_pipeline/tests/main.pipeline_initialistion.workflow.nf.test new file mode 100644 index 000000000..c1db3fda8 --- /dev/null +++ b/subworkflows/local/utils_nfcore_rnaseq_pipeline/tests/main.pipeline_initialistion.workflow.nf.test @@ -0,0 +1,50 @@ +nextflow_workflow { + + name "Test Workflow PIPELINE_INITIALISATION" + script "../main.nf" + workflow "PIPELINE_INITIALISATION" + + test("test PIPELINE_INITIALISATION successfully completes with valid parameters") { + + when { + params { + // Genome references + fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/genome.fasta" + gtf = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/genes_with_empty_tid.gtf.gz" + gff = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/genes.gff.gz" + transcript_fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/transcriptome.fasta" + additional_fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/gfp.fa.gz" + + bbsplit_fasta_list = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/bbsplit_fasta_list.txt" + hisat2_index = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/hisat2.tar.gz" + salmon_index = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/salmon.tar.gz" + rsem_index = "https://raw.githubusercontent.com/nf-core/test-datasets/7f1614baeb0ddf66e60be78c3d9fa55440465ac8/reference/rsem.tar.gz" + + // Other parameters + skip_bbsplit = false + pseudo_aligner = 'salmon' + umitools_bc_pattern = 'NNNN' + ribo_database_manifest = "${projectDir}/workflows/rnaseq/assets/rrna-db-defaults.txt" + } + workflow { + """ + input[0] = false // version (boolean) + input[1] = false // help (boolean) + input[2] = "${projectDir}/nextflow_schema.json" // schema (string) + input[3] = true // validate_parameters (boolean) + input[4] = true // monochrome_logs (boolean) + input[5] = args // args (array) + input[6] = file("$outputDir") // outdir (string) + """ + } + } + + then { + assertAll( + { assert workflow.success} + ) + } + + } + +} diff --git a/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/main.nf b/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/main.nf index 7c07084ff..fe6ff312f 100644 --- a/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/main.nf +++ b/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/main.nf @@ -44,6 +44,7 @@ workflow BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS { emit: bam = UMITOOLS_DEDUP.out.bam // channel: [ val(meta), path(bam) ] + deduplog = UMITOOLS_DEDUP.out.log // channel: [ val(meta), path(log) ] bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), path(bai) ] csi = SAMTOOLS_INDEX.out.csi // channel: [ val(meta), path(csi) ] diff --git a/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/meta.yml b/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/meta.yml index f11e7ab6f..93e1238b4 100644 --- a/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/meta.yml +++ b/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/meta.yml @@ -37,6 +37,10 @@ output: description: | CSI samtools index Structure: [ val(meta), path(csi) ] + - deduplog: + description: | + UMI-tools deduplication log + Structure: [ val(meta), path(log) ] - stats: description: | File containing samtools stats output @@ -53,7 +57,9 @@ output: description: | Files containing software versions Structure: [ path(versions.yml) ] - authors: - "@drpatelh" - "@KamilMaliszArdigen" +maintainers: + - "@drpatelh" + - "@KamilMaliszArdigen" diff --git a/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/tests/main.nf.test b/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/tests/main.nf.test new file mode 100644 index 000000000..ab541cb88 --- /dev/null +++ b/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/tests/main.nf.test @@ -0,0 +1,66 @@ +nextflow_workflow { + + name "Test Workflow BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS" + script "../main.nf" + workflow "BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS" + + test("sarscov2_bam_bai") { + + when { + workflow { + """ + val_get_dedup_stats = false + + input[0] = Channel.of([ + [ id:'test'], // 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] = val_get_dedup_stats + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert workflow.out.deduplog.get(0).get(1) ==~ ".*.log"}, + { assert workflow.out.bam.get(0).get(1) ==~ ".*.bam"}, + { assert workflow.out.bai.get(0).get(1) ==~ ".*.bai"}, + { assert snapshot( + workflow.out.stats, + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.versions + ).match() } + ) + } + } + + test("sarscov2_bam_bai - stub") { + + options "-stub" + + when { + workflow { + """ + val_get_dedup_stats = false + + input[0] = Channel.of([ + [ id:'test'], // 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] = val_get_dedup_stats + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/tests/main.nf.test.snap new file mode 100644 index 000000000..4fd70b5f3 --- /dev/null +++ b/subworkflows/nf-core/bam_dedup_stats_samtools_umitools/tests/main.nf.test.snap @@ -0,0 +1,169 @@ +{ + "sarscov2_bam_bai": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.stats:md5,09d1bd8f10e000921202f7ea1cd0679e" + ] + ], + [ + [ + { + "id": "test" + }, + "test.flagstat:md5,0bb716e40fae381b97484b58e0b16efe" + ] + ], + [ + [ + { + "id": "test" + }, + "test.idxstats:md5,1adb27b52d4d64b826f48b59d61dcd4d" + ] + ], + [ + "versions.yml:md5,32b4a349a563fb5b01cf0688ae3ca860", + "versions.yml:md5,803d3f4d3992a7a597a09cf330bd46a4", + "versions.yml:md5,9b7824114bf90d4b60110ddaf149f1db", + "versions.yml:md5,f0864f64f8ebb81826a1cf5c14b77e69", + "versions.yml:md5,f4935d4e563646266cc6bb4d75d0fb7d" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T11:53:11.53709" + }, + "sarscov2_bam_bai - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test" + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test" + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test" + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + "versions.yml:md5,32b4a349a563fb5b01cf0688ae3ca860", + "versions.yml:md5,803d3f4d3992a7a597a09cf330bd46a4", + "versions.yml:md5,9b7824114bf90d4b60110ddaf149f1db", + "versions.yml:md5,f0864f64f8ebb81826a1cf5c14b77e69", + "versions.yml:md5,f4935d4e563646266cc6bb4d75d0fb7d" + ], + "bai": [ + [ + { + "id": "test" + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "csi": [ + + ], + "deduplog": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "flagstat": [ + [ + { + "id": "test" + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test" + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test" + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,32b4a349a563fb5b01cf0688ae3ca860", + "versions.yml:md5,803d3f4d3992a7a597a09cf330bd46a4", + "versions.yml:md5,9b7824114bf90d4b60110ddaf149f1db", + "versions.yml:md5,f0864f64f8ebb81826a1cf5c14b77e69", + "versions.yml:md5,f4935d4e563646266cc6bb4d75d0fb7d" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:34:35.959581" + } +} diff --git a/subworkflows/nf-core/bam_markduplicates_picard/main.nf b/subworkflows/nf-core/bam_markduplicates_picard/main.nf index 6e3df3320..2de059b84 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, ch_fai ) + 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 b924596d8..433d35b2b 100644 --- a/subworkflows/nf-core/bam_markduplicates_picard/meta.yml +++ b/subworkflows/nf-core/bam_markduplicates_picard/meta.yml @@ -6,7 +6,6 @@ keywords: - bam - sam - cram - components: - picard/markduplicates - samtools/index @@ -14,15 +13,14 @@ components: - 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: | @@ -31,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 @@ -60,3 +66,6 @@ output: authors: - "@dmarron" - "@drpatelh" +maintainers: + - "@dmarron" + - "@drpatelh" diff --git a/subworkflows/nf-core/bam_markduplicates_picard/nextflow.config b/subworkflows/nf-core/bam_markduplicates_picard/nextflow.config new file mode 100644 index 000000000..2778db78d --- /dev/null +++ b/subworkflows/nf-core/bam_markduplicates_picard/nextflow.config @@ -0,0 +1,41 @@ +if (!params.skip_alignment) { + if (!params.skip_markduplicates && !params.with_umi) { + process { + withName: '.*:BAM_MARKDUPLICATES_PICARD:PICARD_MARKDUPLICATES' { + ext.args = '--ASSUME_SORTED true --REMOVE_DUPLICATES false --VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp' + ext.prefix = { "${meta.id}.markdup.sorted" } + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}/picard_metrics" }, + mode: params.publish_dir_mode, + pattern: '*metrics.txt' + ], + [ + path: { "${params.outdir}/${params.aligner}" }, + mode: params.publish_dir_mode, + pattern: '*.bam' + ] + ] + } + + withName: '.*:BAM_MARKDUPLICATES_PICARD:SAMTOOLS_INDEX' { + ext.args = { params.bam_csi_index ? '-c' : '' } + ext.prefix = { "${meta.id}.markdup.sorted" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}" }, + mode: params.publish_dir_mode, + pattern: '*.{bai,csi}' + ] + } + + withName: '.*:BAM_MARKDUPLICATES_PICARD:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}.markdup.sorted.bam" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}/samtools_stats" }, + mode: params.publish_dir_mode, + pattern: '*.{stats,flagstat,idxstats}' + ] + } + } + } +} 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 000000000..f023a9f7d --- /dev/null +++ b/subworkflows/nf-core/bam_markduplicates_picard/tests/main.nf.test @@ -0,0 +1,142 @@ +nextflow_workflow { + + name "Test Workflow BAM_MARKDUPLICATES_PICARD" + script "../main.nf" + workflow "BAM_MARKDUPLICATES_PICARD" + + 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 path(workflow.out.metrics.get(0).get(1)).getText().contains("97") }, + { 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]), + workflow.out.versions + ).match() } + ) + } + } + + test("homo_sapiens - cram") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + 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 path(workflow.out.metrics.get(0).get(1)).getText().contains("0.999986") }, + { 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]), + workflow.out.versions + ).match() } + ) + } + } + + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end: false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + 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(workflow.out).match() } + ) + } + } + + test("homo_sapiens - cram - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + 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(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/bam_markduplicates_picard/tests/main.nf.test.snap b/subworkflows/nf-core/bam_markduplicates_picard/tests/main.nf.test.snap new file mode 100644 index 000000000..32788a18c --- /dev/null +++ b/subworkflows/nf-core/bam_markduplicates_picard/tests/main.nf.test.snap @@ -0,0 +1,334 @@ +{ + "homo_sapiens - cram": { + "content": [ + "test.cram", + "test.cram.crai:md5,78d47ba01ac4e05f3ae1e353902a989e", + "test.flagstat:md5,93b0ef463df947ede1f42ff60396c34d", + "test.idxstats:md5,e179601fa7b8ebce81ac3765206f6c15", + "test.stats:md5,372a7d9d9081aa009b21343a913beb14", + [ + "versions.yml:md5,0d170c963555870ac9a0d438bf6c2f93", + "versions.yml:md5,3729819c49e6d8eed9ada247e5d77de1", + "versions.yml:md5,966dcea920866a87b55e665563864fc9", + "versions.yml:md5,a62ca6eb27e59dd6f03a93fa8656e656", + "versions.yml:md5,fcf804c605f455127f2449403d70390c" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:28:15.15911" + }, + "sarscov2 - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.MarkDuplicates.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + + ], + "5": [ + + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + "versions.yml:md5,0d170c963555870ac9a0d438bf6c2f93", + "versions.yml:md5,3729819c49e6d8eed9ada247e5d77de1", + "versions.yml:md5,966dcea920866a87b55e665563864fc9", + "versions.yml:md5,a62ca6eb27e59dd6f03a93fa8656e656", + "versions.yml:md5,fcf804c605f455127f2449403d70390c" + ], + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "crai": [ + + ], + "cram": [ + + ], + "csi": [ + + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.MarkDuplicates.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,0d170c963555870ac9a0d438bf6c2f93", + "versions.yml:md5,3729819c49e6d8eed9ada247e5d77de1", + "versions.yml:md5,966dcea920866a87b55e665563864fc9", + "versions.yml:md5,a62ca6eb27e59dd6f03a93fa8656e656", + "versions.yml:md5,fcf804c605f455127f2449403d70390c" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:28:40.128144" + }, + "homo_sapiens - cram - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "test.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.MarkDuplicates.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test" + }, + "test.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + + ], + "6": [ + [ + { + "id": "test" + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test" + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test" + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + "versions.yml:md5,0d170c963555870ac9a0d438bf6c2f93", + "versions.yml:md5,3729819c49e6d8eed9ada247e5d77de1", + "versions.yml:md5,966dcea920866a87b55e665563864fc9", + "versions.yml:md5,a62ca6eb27e59dd6f03a93fa8656e656", + "versions.yml:md5,fcf804c605f455127f2449403d70390c" + ], + "bai": [ + + ], + "bam": [ + + ], + "crai": [ + [ + { + "id": "test" + }, + "test.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + [ + { + "id": "test" + }, + "test.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "csi": [ + + ], + "flagstat": [ + [ + { + "id": "test" + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test" + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "metrics": [ + [ + { + "id": "test" + }, + "test.MarkDuplicates.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test" + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,0d170c963555870ac9a0d438bf6c2f93", + "versions.yml:md5,3729819c49e6d8eed9ada247e5d77de1", + "versions.yml:md5,966dcea920866a87b55e665563864fc9", + "versions.yml:md5,a62ca6eb27e59dd6f03a93fa8656e656", + "versions.yml:md5,fcf804c605f455127f2449403d70390c" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:29:04.075263" + }, + "sarscov2 - bam": { + "content": [ + "test.bam:md5,3091fe6ba1b7530f382fe40b9fd8f45b", + "test.bam.bai:md5,4d3ae8d013444b55e17aa0149a2ab404", + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783", + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2", + "test.stats:md5,cca83e4fc9406fc3875b5e60055d6574", + [ + "versions.yml:md5,0d170c963555870ac9a0d438bf6c2f93", + "versions.yml:md5,3729819c49e6d8eed9ada247e5d77de1", + "versions.yml:md5,966dcea920866a87b55e665563864fc9", + "versions.yml:md5,a62ca6eb27e59dd6f03a93fa8656e656", + "versions.yml:md5,fcf804c605f455127f2449403d70390c" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:27:47.343274" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/bam_rseqc/main.nf b/subworkflows/nf-core/bam_rseqc/main.nf index a698b30ab..043321a13 100644 --- a/subworkflows/nf-core/bam_rseqc/main.nf +++ b/subworkflows/nf-core/bam_rseqc/main.nf @@ -13,44 +13,46 @@ include { RSEQC_TIN } from '../../../modules/nf-core/rseqc/tin/ma workflow BAM_RSEQC { take: - ch_bam_bai // channel: [ val(meta), [ bam, bai ] ] - ch_bed // file: /path/to/genome.bed + bam_bai // channel: [ val(meta), [ bam, bai ] ] + bed // channel: [ genome.bed ] rseqc_modules // list: rseqc modules to run main: - ch_versions = Channel.empty() + bam = bam_bai.map{ [ it[0], it[1] ] } - ch_bam_bai - .map { [ it[0], it[1] ] } - .set { ch_bam } + versions = Channel.empty() // // Run RSeQC bam_stat.py // bamstat_txt = Channel.empty() + if ('bam_stat' in rseqc_modules) { - RSEQC_BAMSTAT ( ch_bam ) + RSEQC_BAMSTAT(bam) bamstat_txt = RSEQC_BAMSTAT.out.txt - ch_versions = ch_versions.mix(RSEQC_BAMSTAT.out.versions.first()) + versions = versions.mix(RSEQC_BAMSTAT.out.versions.first()) } // // Run RSeQC inner_distance.py // + innerdistance_all = Channel.empty() innerdistance_distance = Channel.empty() innerdistance_freq = Channel.empty() innerdistance_mean = Channel.empty() innerdistance_pdf = Channel.empty() innerdistance_rscript = Channel.empty() + if ('inner_distance' in rseqc_modules) { - RSEQC_INNERDISTANCE ( ch_bam, ch_bed ) + RSEQC_INNERDISTANCE(bam, bed) innerdistance_distance = RSEQC_INNERDISTANCE.out.distance innerdistance_freq = RSEQC_INNERDISTANCE.out.freq innerdistance_mean = RSEQC_INNERDISTANCE.out.mean innerdistance_pdf = RSEQC_INNERDISTANCE.out.pdf innerdistance_rscript = RSEQC_INNERDISTANCE.out.rscript - ch_versions = ch_versions.mix(RSEQC_INNERDISTANCE.out.versions.first()) + innerdistance_all = innerdistance_distance.mix(innerdistance_freq, innerdistance_mean, innerdistance_pdf, innerdistance_rscript) + versions = versions.mix(RSEQC_INNERDISTANCE.out.versions.first()) } // @@ -58,14 +60,15 @@ workflow BAM_RSEQC { // inferexperiment_txt = Channel.empty() if ('infer_experiment' in rseqc_modules) { - RSEQC_INFEREXPERIMENT ( ch_bam, ch_bed ) + RSEQC_INFEREXPERIMENT(bam, bed) inferexperiment_txt = RSEQC_INFEREXPERIMENT.out.txt - ch_versions = ch_versions.mix(RSEQC_INFEREXPERIMENT.out.versions.first()) + versions = versions.mix(RSEQC_INFEREXPERIMENT.out.versions.first()) } // // Run RSeQC junction_annotation.py // + junctionannotation_all = Channel.empty() junctionannotation_bed = Channel.empty() junctionannotation_interact_bed = Channel.empty() junctionannotation_xls = Channel.empty() @@ -73,8 +76,9 @@ workflow BAM_RSEQC { junctionannotation_events_pdf = Channel.empty() junctionannotation_rscript = Channel.empty() junctionannotation_log = Channel.empty() + if ('junction_annotation' in rseqc_modules) { - RSEQC_JUNCTIONANNOTATION ( ch_bam, ch_bed ) + RSEQC_JUNCTIONANNOTATION(bam, bed) junctionannotation_bed = RSEQC_JUNCTIONANNOTATION.out.bed junctionannotation_interact_bed = RSEQC_JUNCTIONANNOTATION.out.interact_bed junctionannotation_xls = RSEQC_JUNCTIONANNOTATION.out.xls @@ -82,60 +86,70 @@ workflow BAM_RSEQC { junctionannotation_events_pdf = RSEQC_JUNCTIONANNOTATION.out.events_pdf junctionannotation_rscript = RSEQC_JUNCTIONANNOTATION.out.rscript junctionannotation_log = RSEQC_JUNCTIONANNOTATION.out.log - ch_versions = ch_versions.mix(RSEQC_JUNCTIONANNOTATION.out.versions.first()) + junctionannotation_all = junctionannotation_bed.mix(junctionannotation_interact_bed, junctionannotation_xls, junctionannotation_pdf, junctionannotation_events_pdf, junctionannotation_rscript, junctionannotation_log) + versions = versions.mix(RSEQC_JUNCTIONANNOTATION.out.versions.first()) } // // Run RSeQC junction_saturation.py // + junctionsaturation_all = Channel.empty() junctionsaturation_pdf = Channel.empty() junctionsaturation_rscript = Channel.empty() + if ('junction_saturation' in rseqc_modules) { - RSEQC_JUNCTIONSATURATION ( ch_bam, ch_bed ) + RSEQC_JUNCTIONSATURATION(bam, bed) junctionsaturation_pdf = RSEQC_JUNCTIONSATURATION.out.pdf junctionsaturation_rscript = RSEQC_JUNCTIONSATURATION.out.rscript - ch_versions = ch_versions.mix(RSEQC_JUNCTIONSATURATION.out.versions.first()) + junctionsaturation_all = junctionsaturation_pdf.mix(junctionsaturation_rscript) + versions = versions.mix(RSEQC_JUNCTIONSATURATION.out.versions.first()) } // // Run RSeQC read_distribution.py // readdistribution_txt = Channel.empty() + if ('read_distribution' in rseqc_modules) { - RSEQC_READDISTRIBUTION ( ch_bam, ch_bed ) + RSEQC_READDISTRIBUTION(bam, bed) readdistribution_txt = RSEQC_READDISTRIBUTION.out.txt - ch_versions = ch_versions.mix(RSEQC_READDISTRIBUTION.out.versions.first()) + versions = versions.mix(RSEQC_READDISTRIBUTION.out.versions.first()) } // // Run RSeQC read_duplication.py // + readduplication_all = Channel.empty() readduplication_seq_xls = Channel.empty() readduplication_pos_xls = Channel.empty() readduplication_pdf = Channel.empty() readduplication_rscript = Channel.empty() + if ('read_duplication' in rseqc_modules) { - RSEQC_READDUPLICATION ( ch_bam ) + RSEQC_READDUPLICATION(bam ) readduplication_seq_xls = RSEQC_READDUPLICATION.out.seq_xls readduplication_pos_xls = RSEQC_READDUPLICATION.out.pos_xls readduplication_pdf = RSEQC_READDUPLICATION.out.pdf readduplication_rscript = RSEQC_READDUPLICATION.out.rscript - ch_versions = ch_versions.mix(RSEQC_READDUPLICATION.out.versions.first()) + readduplication_all = readduplication_seq_xls.mix(readduplication_pos_xls, readduplication_pdf, readduplication_rscript) + versions = versions.mix(RSEQC_READDUPLICATION.out.versions.first()) } // // Run RSeQC tin.py // tin_txt = Channel.empty() + if ('tin' in rseqc_modules) { - RSEQC_TIN ( ch_bam_bai, ch_bed ) - tin_txt = RSEQC_TIN.out.txt - ch_versions = ch_versions.mix(RSEQC_TIN.out.versions.first()) + RSEQC_TIN(bam_bai, bed) + tin_txt = RSEQC_TIN.out.txt + versions = versions.mix(RSEQC_TIN.out.versions.first()) } emit: bamstat_txt // channel: [ val(meta), txt ] + innerdistance_all // channel: [ val(meta), {txt, pdf, r} ] innerdistance_distance // channel: [ val(meta), txt ] innerdistance_freq // channel: [ val(meta), txt ] innerdistance_mean // channel: [ val(meta), txt ] @@ -144,6 +158,7 @@ workflow BAM_RSEQC { inferexperiment_txt // channel: [ val(meta), txt ] + junctionannotation_all // channel: [ val(meta), {bed, xls, pdf, r, log} ] junctionannotation_bed // channel: [ val(meta), bed ] junctionannotation_interact_bed // channel: [ val(meta), bed ] junctionannotation_xls // channel: [ val(meta), xls ] @@ -152,11 +167,13 @@ workflow BAM_RSEQC { junctionannotation_rscript // channel: [ val(meta), r ] junctionannotation_log // channel: [ val(meta), log ] + junctionsaturation_all // channel: [ val(meta), {pdf, r} ] junctionsaturation_pdf // channel: [ val(meta), pdf ] junctionsaturation_rscript // channel: [ val(meta), r ] readdistribution_txt // channel: [ val(meta), txt ] + readduplication_all // channel: [ val(meta), {xls, pdf, r} ] readduplication_seq_xls // channel: [ val(meta), xls ] readduplication_pos_xls // channel: [ val(meta), xls ] readduplication_pdf // channel: [ val(meta), pdf ] @@ -164,5 +181,5 @@ workflow BAM_RSEQC { tin_txt // channel: [ val(meta), txt ] - versions = ch_versions // channel: [ versions.yml ] + versions // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/bam_rseqc/meta.yml b/subworkflows/nf-core/bam_rseqc/meta.yml index 428b83e6d..6e76ff560 100644 --- a/subworkflows/nf-core/bam_rseqc/meta.yml +++ b/subworkflows/nf-core/bam_rseqc/meta.yml @@ -12,8 +12,16 @@ keywords: - readdistribution - readduplication - tin -modules: +components: - rseqc + - rseqc/tin + - rseqc/readduplication + - rseqc/readdistribution + - rseqc/junctionsaturation + - rseqc/junctionannotation + - rseqc/innerdistance + - rseqc/inferexperiment + - rseqc/bamstat input: - meta: type: map @@ -42,6 +50,10 @@ output: type: file description: bam statistics report pattern: "*.bam_stat.txt" + - innerdistance_all: + type: file + description: All the output files from RSEQC_INNERDISTANCE + pattern: "*.{txt,pdf,R}" - innerdistance_distance: type: file description: the inner distances @@ -66,6 +78,10 @@ output: type: file description: infer_experiment results report pattern: "*.infer_experiment.txt" + - junctionannotation_all: + type: file + description: All the output files from RSEQC_JUNCTIONANNOTATION + pattern: "*.{bed,xls,pdf,R,log}" - junctionannotation_bed: type: file description: bed file of annotated junctions @@ -94,6 +110,10 @@ output: type: file description: Log file generated by tool pattern: "*.log" + - junctionsaturation_all: + type: file + description: All the output files from RSEQC_JUNCTIONSATURATION + pattern: "*.{pdf,R}" - junctionsaturation_pdf: type: file description: Junction saturation report @@ -106,6 +126,10 @@ output: type: file description: the read distribution report pattern: "*.read_distribution.txt" + - readduplication_all: + type: file + description: All the output files from RSEQC_READDUPLICATION + pattern: "*.{xls,pdf,R}" - readduplication_seq_xls: type: file description: Read duplication rate determined from mapping position of read @@ -133,3 +157,6 @@ output: authors: - "@drpatelh" - "@kevinmenden" +maintainers: + - "@drpatelh" + - "@kevinmenden" diff --git a/subworkflows/nf-core/bam_rseqc/nextflow.config b/subworkflows/nf-core/bam_rseqc/nextflow.config new file mode 100644 index 000000000..4fabc8e99 --- /dev/null +++ b/subworkflows/nf-core/bam_rseqc/nextflow.config @@ -0,0 +1,153 @@ +def rseqc_modules = params.rseqc_modules ? params.rseqc_modules.split(',').collect{ it.trim().toLowerCase() } : [] + +if (!params.skip_alignment && !params.skip_qc && !params.skip_rseqc) { + if ('bam_stat' in rseqc_modules) { + process { + withName: '.*:BAM_RSEQC:RSEQC_BAMSTAT' { + publishDir = [ + path: { "${params.outdir}/${params.aligner}/rseqc/bam_stat" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } + + if ('infer_experiment' in rseqc_modules) { + process { + withName: '.*:BAM_RSEQC:RSEQC_INFEREXPERIMENT' { + publishDir = [ + path: { "${params.outdir}/${params.aligner}/rseqc/infer_experiment" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } + + if ('junction_annotation' in rseqc_modules) { + process { + withName: '.*:BAM_RSEQC:RSEQC_JUNCTIONANNOTATION' { + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}/rseqc/junction_annotation/pdf" }, + mode: params.publish_dir_mode, + pattern: '*.pdf' + ], + [ + path: { "${params.outdir}/${params.aligner}/rseqc/junction_annotation/bed" }, + mode: params.publish_dir_mode, + pattern: '*.bed' + ], + [ + path: { "${params.outdir}/${params.aligner}/rseqc/junction_annotation/xls" }, + mode: params.publish_dir_mode, + pattern: '*.xls' + ], + [ + path: { "${params.outdir}/${params.aligner}/rseqc/junction_annotation/log" }, + mode: params.publish_dir_mode, + pattern: '*.log' + ], + [ + path: { "${params.outdir}/${params.aligner}/rseqc/junction_annotation/rscript" }, + mode: params.publish_dir_mode, + pattern: '*.r' + ] + ] + } + } + } + + if ('junction_saturation' in rseqc_modules) { + process { + withName: '.*:BAM_RSEQC:RSEQC_JUNCTIONSATURATION' { + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}/rseqc/junction_saturation/pdf" }, + mode: params.publish_dir_mode, + pattern: '*.pdf' + ], + [ + path: { "${params.outdir}/${params.aligner}/rseqc/junction_saturation/rscript" }, + mode: params.publish_dir_mode, + pattern: '*.r' + ] + ] + } + } + } + + if ('read_duplication' in rseqc_modules) { + process { + withName: '.*:BAM_RSEQC:RSEQC_READDUPLICATION' { + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}/rseqc/read_duplication/pdf" }, + mode: params.publish_dir_mode, + pattern: '*.pdf' + ], + [ + path: { "${params.outdir}/${params.aligner}/rseqc/read_duplication/xls" }, + mode: params.publish_dir_mode, + pattern: '*.xls' + ], + [ + path: { "${params.outdir}/${params.aligner}/rseqc/read_duplication/rscript" }, + mode: params.publish_dir_mode, + pattern: '*.r' + ] + ] + } + } + } + + if ('read_distribution' in rseqc_modules && !params.bam_csi_index) { + process { + withName: '.*:BAM_RSEQC:RSEQC_READDISTRIBUTION' { + publishDir = [ + path: { "${params.outdir}/${params.aligner}/rseqc/read_distribution" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } + + if ('inner_distance' in rseqc_modules && !params.bam_csi_index) { + process { + withName: '.*:BAM_RSEQC:RSEQC_INNERDISTANCE' { + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}/rseqc/inner_distance/txt" }, + mode: params.publish_dir_mode, + pattern: '*.txt', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ], + [ + path: { "${params.outdir}/${params.aligner}/rseqc/inner_distance/pdf" }, + mode: params.publish_dir_mode, + pattern: '*.pdf' + ], + [ + path: { "${params.outdir}/${params.aligner}/rseqc/inner_distance/rscript" }, + mode: params.publish_dir_mode, + pattern: '*.r' + ] + ] + } + } + } + + if ('tin' in rseqc_modules && !params.bam_csi_index) { + process { + withName: '.*:BAM_RSEQC:RSEQC_TIN' { + publishDir = [ + path: { "${params.outdir}/${params.aligner}/rseqc/tin" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } +} diff --git a/subworkflows/nf-core/bam_rseqc/tests/main.nf.test b/subworkflows/nf-core/bam_rseqc/tests/main.nf.test new file mode 100644 index 000000000..492cfb6fe --- /dev/null +++ b/subworkflows/nf-core/bam_rseqc/tests/main.nf.test @@ -0,0 +1,134 @@ +nextflow_workflow { + + name "Test Workflow BAM_RSEQC" + script "../main.nf" + workflow "BAM_RSEQC" + + test("sarscov2 paired-end [bam]") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test' ], // 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([ + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed12', checkIfExists: true) + ]) + input[2] = ['bam_stat', 'inner_distance', 'infer_experiment', 'junction_annotation', 'junction_saturation', 'read_distribution', 'read_duplication', 'tin'] + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert workflow.out.innerdistance_all.any { it[1].endsWith('.pdf') && file(it[1]).exists() } }, + { assert workflow.out.readduplication_all.any { it[1].endsWith('.pdf') && file(it[1]).exists() } }, + { assert workflow.out.junctionsaturation_all.any { it[1].endsWith('.pdf') && file(it[1]).exists() } }, + { assert snapshot( + workflow.out.bamstat_txt, + workflow.out.innerdistance_all.findAll { it[1].endsWith('.pdf') == false }, + workflow.out.inferexperiment_txt, + workflow.out.junctionannotation_all.findAll { it[1].endsWith('.xls') == false && it[1].endsWith('.r') == false }, + workflow.out.junctionsaturation_all.findAll { it[1].endsWith('.pdf') == false }, + workflow.out.readdistribution_txt, + workflow.out.readduplication_all.findAll { it[1].endsWith('.pdf') == false }, + workflow.out.tin_txt, + workflow.out.versions).match()} + ) + } + } + + test("sarscov2 paired-end [bam] no modules") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test' ], // 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([ + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed12', checkIfExists: true) + ]) + input[2] = [] + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.out.bamstat_txt.size() == 0 }, + { assert workflow.out.innerdistance_all.size() == 0 }, + { assert workflow.out.inferexperiment_txt.size() == 0 }, + { assert workflow.out.junctionannotation_all.size() == 0 }, + { assert workflow.out.junctionsaturation_all.size() == 0 }, + { assert workflow.out.readdistribution_txt.size() == 0 }, + { assert workflow.out.readduplication_all.size() == 0 }, + { assert workflow.out.tin_txt.size() == 0 }, + { assert workflow.out.versions.size() == 0 } + ) + } + } + + test("sarscov2 paired-end [bam] - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test' ], // 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([ + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed12', checkIfExists: true) + ]) + input[2] = ['bam_stat', 'inner_distance', 'infer_experiment', 'junction_annotation', 'junction_saturation', 'read_distribution', 'read_duplication', 'tin'] + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match()} + ) + } + } + + test("sarscov2 paired-end [bam] no modules - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test' ], // 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([ + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed12', checkIfExists: true) + ]) + input[2] = [] + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match()} + ) + } + } +} diff --git a/subworkflows/nf-core/bam_rseqc/tests/main.nf.test.snap b/subworkflows/nf-core/bam_rseqc/tests/main.nf.test.snap new file mode 100644 index 000000000..0040810cc --- /dev/null +++ b/subworkflows/nf-core/bam_rseqc/tests/main.nf.test.snap @@ -0,0 +1,903 @@ +{ + "sarscov2 paired-end [bam]": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.bam_stat.txt:md5,2675857864c1d1139b2a19d25dc36b09" + ] + ], + [ + [ + { + "id": "test" + }, + "test.inner_distance.txt:md5,a1acc9def0f64a5500d4c4cb47cbe32b" + ], + [ + { + "id": "test" + }, + "test.inner_distance_freq.txt:md5,3fc037501f5899b5da009c8ce02fc25e" + ], + [ + { + "id": "test" + }, + "test.inner_distance_mean.txt:md5,58398b7d5a29a5e564f9e3c50b55996c" + ], + [ + { + "id": "test" + }, + "test.inner_distance_plot.r:md5,5859fbd5b42046d47e8b9aa85077f4ea" + ] + ], + [ + [ + { + "id": "test" + }, + "test.infer_experiment.txt:md5,f9d0bfc239df637cd8aeda40ade3c59a" + ] + ], + [ + [ + { + "id": "test" + }, + "test.junction_annotation.log:md5,d75e0f5d62fada8aa9449991b209554c" + ] + ], + [ + [ + { + "id": "test" + }, + "test.junctionSaturation_plot.r:md5,caa6e63dcb477aabb169882b2f30dadd" + ] + ], + [ + [ + { + "id": "test" + }, + "test.read_distribution.txt:md5,56893fdc0809d968629a363551a1655f" + ] + ], + [ + [ + { + "id": "test" + }, + "test.DupRate_plot.r:md5,3c0325095cee4835b921e57d61c23dca" + ], + [ + { + "id": "test" + }, + "test.pos.DupRate.xls:md5,a859bc2031d46bf1cc4336205847caa3" + ], + [ + { + "id": "test" + }, + "test.seq.DupRate.xls:md5,ee8783399eec5a18522a6f08bece338b" + ] + ], + [ + [ + { + "id": "test" + }, + "test.paired_end.sorted.summary.txt:md5,9d98447e178b89a89f6f5aba7a772fe6" + ] + ], + [ + "versions.yml:md5,60dc1afce7fecb7270e998a00ee393e2", + "versions.yml:md5,9bc3caee6aeb54f23f5296b499546515", + "versions.yml:md5,a25161998ca60d5ce4e9a86abbf1bcb8", + "versions.yml:md5,c175b92f50b5be38a8808cbf7ac7452e", + "versions.yml:md5,ca7e95cf7ff7cff5d052b890729f7ead", + "versions.yml:md5,d03beea3c68934c3f3623a005c1424d2", + "versions.yml:md5,f2f3ecd549045f7595245f904f5d9414", + "versions.yml:md5,fd16f1098b9c285f3ea7bd3daf4e8f10" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T12:07:54.452949" + }, + "sarscov2 paired-end [bam] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bam_stat.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.inner_distance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.inner_distance_freq.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.inner_distance_mean.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.inner_distance_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.inner_distance_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test" + }, + "test.Interact.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "test" + }, + "test.junction.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test" + }, + "test.junction.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + [ + { + "id": "test" + }, + "test.events.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "14": [ + [ + { + "id": "test" + }, + "test.junction_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "15": [ + [ + { + "id": "test" + }, + "test.junction_annotation.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "16": [ + [ + { + "id": "test" + }, + "test.junctionSaturation_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.junctionSaturation_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "17": [ + [ + { + "id": "test" + }, + "test.junctionSaturation_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "18": [ + [ + { + "id": "test" + }, + "test.junctionSaturation_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "19": [ + [ + { + "id": "test" + }, + "test.read_distribution.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.inner_distance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "20": [ + [ + { + "id": "test" + }, + "test.DupRate_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.DupRate_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.pos.DupRate.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.seq.DupRate.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "21": [ + [ + { + "id": "test" + }, + "test.seq.DupRate.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "22": [ + [ + { + "id": "test" + }, + "test.pos.DupRate.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "23": [ + [ + { + "id": "test" + }, + "test.DupRate_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "24": [ + [ + { + "id": "test" + }, + "test.DupRate_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "25": [ + [ + { + "id": "test" + }, + "test.paired_end.sorted.bam.summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "26": [ + "versions.yml:md5,60dc1afce7fecb7270e998a00ee393e2", + "versions.yml:md5,9bc3caee6aeb54f23f5296b499546515", + "versions.yml:md5,a25161998ca60d5ce4e9a86abbf1bcb8", + "versions.yml:md5,c175b92f50b5be38a8808cbf7ac7452e", + "versions.yml:md5,ca7e95cf7ff7cff5d052b890729f7ead", + "versions.yml:md5,d03beea3c68934c3f3623a005c1424d2", + "versions.yml:md5,f2f3ecd549045f7595245f904f5d9414", + "versions.yml:md5,fd16f1098b9c285f3ea7bd3daf4e8f10" + ], + "3": [ + [ + { + "id": "test" + }, + "test.inner_distance_freq.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test" + }, + "test.inner_distance_mean.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test" + }, + "test.inner_distance_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test" + }, + "test.inner_distance_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test" + }, + "test.infer_experiment.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test" + }, + "test.Interact.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.events.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.junction.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.junction.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.junction.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.junction_annotation.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.junction_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + [ + { + "id": "test" + }, + "test.junction.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bamstat_txt": [ + [ + { + "id": "test" + }, + "test.bam_stat.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "inferexperiment_txt": [ + [ + { + "id": "test" + }, + "test.infer_experiment.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "innerdistance_all": [ + [ + { + "id": "test" + }, + "test.inner_distance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.inner_distance_freq.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.inner_distance_mean.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.inner_distance_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.inner_distance_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "innerdistance_distance": [ + [ + { + "id": "test" + }, + "test.inner_distance.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "innerdistance_freq": [ + [ + { + "id": "test" + }, + "test.inner_distance_freq.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "innerdistance_mean": [ + [ + { + "id": "test" + }, + "test.inner_distance_mean.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "innerdistance_pdf": [ + [ + { + "id": "test" + }, + "test.inner_distance_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "innerdistance_rscript": [ + [ + { + "id": "test" + }, + "test.inner_distance_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "junctionannotation_all": [ + [ + { + "id": "test" + }, + "test.Interact.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.events.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.junction.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.junction.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.junction.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.junction_annotation.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.junction_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "junctionannotation_bed": [ + [ + { + "id": "test" + }, + "test.junction.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "junctionannotation_events_pdf": [ + [ + { + "id": "test" + }, + "test.events.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "junctionannotation_interact_bed": [ + [ + { + "id": "test" + }, + "test.Interact.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "junctionannotation_log": [ + [ + { + "id": "test" + }, + "test.junction_annotation.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "junctionannotation_pdf": [ + [ + { + "id": "test" + }, + "test.junction.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "junctionannotation_rscript": [ + [ + { + "id": "test" + }, + "test.junction_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "junctionannotation_xls": [ + [ + { + "id": "test" + }, + "test.junction.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "junctionsaturation_all": [ + [ + { + "id": "test" + }, + "test.junctionSaturation_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.junctionSaturation_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "junctionsaturation_pdf": [ + [ + { + "id": "test" + }, + "test.junctionSaturation_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "junctionsaturation_rscript": [ + [ + { + "id": "test" + }, + "test.junctionSaturation_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "readdistribution_txt": [ + [ + { + "id": "test" + }, + "test.read_distribution.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "readduplication_all": [ + [ + { + "id": "test" + }, + "test.DupRate_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.DupRate_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.pos.DupRate.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "test" + }, + "test.seq.DupRate.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "readduplication_pdf": [ + [ + { + "id": "test" + }, + "test.DupRate_plot.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "readduplication_pos_xls": [ + [ + { + "id": "test" + }, + "test.pos.DupRate.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "readduplication_rscript": [ + [ + { + "id": "test" + }, + "test.DupRate_plot.r:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "readduplication_seq_xls": [ + [ + { + "id": "test" + }, + "test.seq.DupRate.xls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tin_txt": [ + [ + { + "id": "test" + }, + "test.paired_end.sorted.bam.summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,60dc1afce7fecb7270e998a00ee393e2", + "versions.yml:md5,9bc3caee6aeb54f23f5296b499546515", + "versions.yml:md5,a25161998ca60d5ce4e9a86abbf1bcb8", + "versions.yml:md5,c175b92f50b5be38a8808cbf7ac7452e", + "versions.yml:md5,ca7e95cf7ff7cff5d052b890729f7ead", + "versions.yml:md5,d03beea3c68934c3f3623a005c1424d2", + "versions.yml:md5,f2f3ecd549045f7595245f904f5d9414", + "versions.yml:md5,fd16f1098b9c285f3ea7bd3daf4e8f10" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T12:08:17.304769" + }, + "sarscov2 paired-end [bam] no modules - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + + ], + "13": [ + + ], + "14": [ + + ], + "15": [ + + ], + "16": [ + + ], + "17": [ + + ], + "18": [ + + ], + "19": [ + + ], + "2": [ + + ], + "20": [ + + ], + "21": [ + + ], + "22": [ + + ], + "23": [ + + ], + "24": [ + + ], + "25": [ + + ], + "26": [ + + ], + "3": [ + + ], + "4": [ + + ], + "5": [ + + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + + ], + "9": [ + + ], + "bamstat_txt": [ + + ], + "inferexperiment_txt": [ + + ], + "innerdistance_all": [ + + ], + "innerdistance_distance": [ + + ], + "innerdistance_freq": [ + + ], + "innerdistance_mean": [ + + ], + "innerdistance_pdf": [ + + ], + "innerdistance_rscript": [ + + ], + "junctionannotation_all": [ + + ], + "junctionannotation_bed": [ + + ], + "junctionannotation_events_pdf": [ + + ], + "junctionannotation_interact_bed": [ + + ], + "junctionannotation_log": [ + + ], + "junctionannotation_pdf": [ + + ], + "junctionannotation_rscript": [ + + ], + "junctionannotation_xls": [ + + ], + "junctionsaturation_all": [ + + ], + "junctionsaturation_pdf": [ + + ], + "junctionsaturation_rscript": [ + + ], + "readdistribution_txt": [ + + ], + "readduplication_all": [ + + ], + "readduplication_pdf": [ + + ], + "readduplication_pos_xls": [ + + ], + "readduplication_rscript": [ + + ], + "readduplication_seq_xls": [ + + ], + "tin_txt": [ + + ], + "versions": [ + + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T12:08:24.443731" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/main.nf b/subworkflows/nf-core/bam_sort_stats_samtools/main.nf index fc1c652b9..b716375b0 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 69c16be41..e01f9ccf6 100644 --- a/subworkflows/nf-core/bam_sort_stats_samtools/meta.yml +++ b/subworkflows/nf-core/bam_sort_stats_samtools/meta.yml @@ -65,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 000000000..a21782114 --- /dev/null +++ b/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test @@ -0,0 +1,122 @@ +nextflow_workflow { + + name "Test Workflow BAM_SORT_STATS_SAMTOOLS" + script "../main.nf" + workflow "BAM_SORT_STATS_SAMTOOLS" + + test("test_bam_sort_stats_samtools_single_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + 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.flagstat, + workflow.out.idxstats, + workflow.out.stats, + workflow.out.versions).match() } + ) + } + } + + test("test_bam_sort_stats_samtools_paired_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + 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.flagstat, + workflow.out.idxstats, + workflow.out.stats, + workflow.out.versions).match() } + ) + } + } + + test("test_bam_sort_stats_samtools_single_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("test_bam_sort_stats_samtools_paired_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap new file mode 100644 index 000000000..b7f4da177 --- /dev/null +++ b/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap @@ -0,0 +1,330 @@ +{ + "test_bam_sort_stats_samtools_single_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,2191911d72575a2358b08b1df64ccb53" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,613e048487662c694aa4a2f73ca96a20" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d32de3b3716a11039cef2367c3c1a56e" + ] + ], + [ + "versions.yml:md5,494b5530a1aa29fd5867cf655bebbfe1", + "versions.yml:md5,9fcb0cd845bfb1f89d83201bb20649b4", + "versions.yml:md5,bacc323ec4055d6f69f07a09089772d1", + "versions.yml:md5,ce946e97097c6a9ccf834a3f91f6da30", + "versions.yml:md5,d6c8dae685f1b7d050165fc15c7a20b5" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:02:44.34964" + }, + "test_bam_sort_stats_samtools_paired_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,cca83e4fc9406fc3875b5e60055d6574" + ] + ], + [ + "versions.yml:md5,494b5530a1aa29fd5867cf655bebbfe1", + "versions.yml:md5,9fcb0cd845bfb1f89d83201bb20649b4", + "versions.yml:md5,bacc323ec4055d6f69f07a09089772d1", + "versions.yml:md5,ce946e97097c6a9ccf834a3f91f6da30", + "versions.yml:md5,d6c8dae685f1b7d050165fc15c7a20b5" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:03:02.583095" + }, + "test_bam_sort_stats_samtools_single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + "versions.yml:md5,494b5530a1aa29fd5867cf655bebbfe1", + "versions.yml:md5,9fcb0cd845bfb1f89d83201bb20649b4", + "versions.yml:md5,bacc323ec4055d6f69f07a09089772d1", + "versions.yml:md5,ce946e97097c6a9ccf834a3f91f6da30", + "versions.yml:md5,d6c8dae685f1b7d050165fc15c7a20b5" + ], + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "csi": [ + + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,494b5530a1aa29fd5867cf655bebbfe1", + "versions.yml:md5,9fcb0cd845bfb1f89d83201bb20649b4", + "versions.yml:md5,bacc323ec4055d6f69f07a09089772d1", + "versions.yml:md5,ce946e97097c6a9ccf834a3f91f6da30", + "versions.yml:md5,d6c8dae685f1b7d050165fc15c7a20b5" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:03:22.328703" + }, + "test_bam_sort_stats_samtools_paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + "versions.yml:md5,494b5530a1aa29fd5867cf655bebbfe1", + "versions.yml:md5,9fcb0cd845bfb1f89d83201bb20649b4", + "versions.yml:md5,bacc323ec4055d6f69f07a09089772d1", + "versions.yml:md5,ce946e97097c6a9ccf834a3f91f6da30", + "versions.yml:md5,d6c8dae685f1b7d050165fc15c7a20b5" + ], + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "csi": [ + + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,494b5530a1aa29fd5867cf655bebbfe1", + "versions.yml:md5,9fcb0cd845bfb1f89d83201bb20649b4", + "versions.yml:md5,bacc323ec4055d6f69f07a09089772d1", + "versions.yml:md5,ce946e97097c6a9ccf834a3f91f6da30", + "versions.yml:md5,d6c8dae685f1b7d050165fc15c7a20b5" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:03:38.833662" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/bam_stats_samtools/meta.yml b/subworkflows/nf-core/bam_stats_samtools/meta.yml index 87863b11b..809bf736b 100644 --- a/subworkflows/nf-core/bam_stats_samtools/meta.yml +++ b/subworkflows/nf-core/bam_stats_samtools/meta.yml @@ -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 000000000..4597aea27 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test @@ -0,0 +1,180 @@ +nextflow_workflow { + + name "Test Workflow BAM_STATS_SAMTOOLS" + script "../main.nf" + workflow "BAM_STATS_SAMTOOLS" + + test("test_bam_stats_samtools_single_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats, + workflow.out.versions).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats, + workflow.out.versions).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end_cram") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats, + workflow.out.versions).match() } + ) + } + } + + test ("test_bam_stats_samtools_single_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end_cram - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap new file mode 100644 index 000000000..a3ddcc5ce --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap @@ -0,0 +1,350 @@ +{ + "test_bam_stats_samtools_paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,3c485730f712b115bcdc235e7294133b", + "versions.yml:md5,90f593a26a2d53e0f0345df7888f448e", + "versions.yml:md5,9ae003814e63a0907d52eec64d5d3ca3" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,3c485730f712b115bcdc235e7294133b", + "versions.yml:md5,90f593a26a2d53e0f0345df7888f448e", + "versions.yml:md5,9ae003814e63a0907d52eec64d5d3ca3" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T12:20:06.699297" + }, + "test_bam_stats_samtools_single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,3c485730f712b115bcdc235e7294133b", + "versions.yml:md5,90f593a26a2d53e0f0345df7888f448e", + "versions.yml:md5,9ae003814e63a0907d52eec64d5d3ca3" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,3c485730f712b115bcdc235e7294133b", + "versions.yml:md5,90f593a26a2d53e0f0345df7888f448e", + "versions.yml:md5,9ae003814e63a0907d52eec64d5d3ca3" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T12:19:57.708621" + }, + "test_bam_stats_samtools_paired_end_cram - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,3c485730f712b115bcdc235e7294133b", + "versions.yml:md5,90f593a26a2d53e0f0345df7888f448e", + "versions.yml:md5,9ae003814e63a0907d52eec64d5d3ca3" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,3c485730f712b115bcdc235e7294133b", + "versions.yml:md5,90f593a26a2d53e0f0345df7888f448e", + "versions.yml:md5,9ae003814e63a0907d52eec64d5d3ca3" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T12:20:17.051493" + }, + "test_bam_stats_samtools_single_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,2191911d72575a2358b08b1df64ccb53" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,613e048487662c694aa4a2f73ca96a20" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,4a0c429c661d6aa0b60acb9309da642d" + ] + ], + [ + "versions.yml:md5,3c485730f712b115bcdc235e7294133b", + "versions.yml:md5,90f593a26a2d53e0f0345df7888f448e", + "versions.yml:md5,9ae003814e63a0907d52eec64d5d3ca3" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T12:19:25.801394" + }, + "test_bam_stats_samtools_paired_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,7afd486ad6abb9a2a3dac90c99e1d87b" + ] + ], + [ + "versions.yml:md5,3c485730f712b115bcdc235e7294133b", + "versions.yml:md5,90f593a26a2d53e0f0345df7888f448e", + "versions.yml:md5,9ae003814e63a0907d52eec64d5d3ca3" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T12:19:36.158768" + }, + "test_bam_stats_samtools_paired_end_cram": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,a53f3d26e2e9851f7d528442bbfe9781" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,e179601fa7b8ebce81ac3765206f6c15" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,16b59a1f2c99d9fe30f711adc3ebe32d" + ] + ], + [ + "versions.yml:md5,3c485730f712b115bcdc235e7294133b", + "versions.yml:md5,90f593a26a2d53e0f0345df7888f448e", + "versions.yml:md5,9ae003814e63a0907d52eec64d5d3ca3" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T12:19:46.625907" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig/meta.yml b/subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig/meta.yml index 5ad4db7db..49b9c27a1 100644 --- a/subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig/meta.yml +++ b/subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig/meta.yml @@ -34,3 +34,6 @@ output: authors: - "@drpatelh" - "@KamilMaliszArdigen" +maintainers: + - "@drpatelh" + - "@KamilMaliszArdigen" diff --git a/subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig/tests/main.nf.test b/subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig/tests/main.nf.test new file mode 100644 index 000000000..17ec676ca --- /dev/null +++ b/subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig/tests/main.nf.test @@ -0,0 +1,53 @@ +nextflow_workflow { + + name "Test Workflow BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG" + script "../main.nf" + workflow "BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG" + config "./nextflow.config" + + test("sarscov2 [bedgraph] [genome_sizes]") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bedgraph/test.bedgraph', checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.sizes', checkIfExists: true)) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("sarscov2 [bedgraph] [genome_sizes] - 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/bedgraph/test.bedgraph', checkIfExists: true) + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.sizes', checkIfExists: true)) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig/tests/main.nf.test.snap b/subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig/tests/main.nf.test.snap new file mode 100644 index 000000000..26ed39c00 --- /dev/null +++ b/subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig/tests/main.nf.test.snap @@ -0,0 +1,112 @@ +{ + "sarscov2 [bedgraph] [genome_sizes]": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bigWig:md5,910ecc7f57e3bbd5fac5a8edba4f615d" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.clip.bedGraph:md5,e02395e1f7c593b3f79563067159ebc2" + ] + ], + "2": [ + "versions.yml:md5,21c57fc724b374139b11f88017251733", + "versions.yml:md5,72a7b07bc0e796ff6805c57f7340337f" + ], + "bedgraph": [ + [ + { + "id": "test", + "single_end": false + }, + "test.clip.bedGraph:md5,e02395e1f7c593b3f79563067159ebc2" + ] + ], + "bigwig": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bigWig:md5,910ecc7f57e3bbd5fac5a8edba4f615d" + ] + ], + "versions": [ + "versions.yml:md5,21c57fc724b374139b11f88017251733", + "versions.yml:md5,72a7b07bc0e796ff6805c57f7340337f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2023-11-26T01:55:31.016058335" + }, + "sarscov2 [bedgraph] [genome_sizes] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bigWig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.clip.bedGraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,21c57fc724b374139b11f88017251733", + "versions.yml:md5,72a7b07bc0e796ff6805c57f7340337f" + ], + "bedgraph": [ + [ + { + "id": "test", + "single_end": false + }, + "test.clip.bedGraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bigwig": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bigWig:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,21c57fc724b374139b11f88017251733", + "versions.yml:md5,72a7b07bc0e796ff6805c57f7340337f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T12:22:51.388076" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig/tests/nextflow.config b/subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig/tests/nextflow.config new file mode 100644 index 000000000..46af4b0a9 --- /dev/null +++ b/subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig/tests/nextflow.config @@ -0,0 +1,9 @@ +process { + + publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" } + + withName: UCSC_BEDCLIP { + ext.prefix = { "${meta.id}.clip" } + } + +} diff --git a/subworkflows/nf-core/fastq_align_hisat2/main.nf b/subworkflows/nf-core/fastq_align_hisat2/main.nf index a2ec1cf5e..511fe035c 100644 --- a/subworkflows/nf-core/fastq_align_hisat2/main.nf +++ b/subworkflows/nf-core/fastq_align_hisat2/main.nf @@ -41,4 +41,3 @@ workflow FASTQ_ALIGN_HISAT2 { versions = ch_versions // channel: [ versions.yml ] } - diff --git a/subworkflows/nf-core/fastq_align_hisat2/meta.yml b/subworkflows/nf-core/fastq_align_hisat2/meta.yml index 2b05beb68..6f00d4daa 100644 --- a/subworkflows/nf-core/fastq_align_hisat2/meta.yml +++ b/subworkflows/nf-core/fastq_align_hisat2/meta.yml @@ -87,3 +87,5 @@ output: pattern: "versions.yml" authors: - "@priyanka-surana" +maintainers: + - "@priyanka-surana" diff --git a/subworkflows/nf-core/fastq_align_hisat2/nextflow.config b/subworkflows/nf-core/fastq_align_hisat2/nextflow.config new file mode 100644 index 000000000..0f6d1abdc --- /dev/null +++ b/subworkflows/nf-core/fastq_align_hisat2/nextflow.config @@ -0,0 +1,26 @@ +if (!params.skip_alignment && params.aligner == 'hisat2') { + process { + withName: '.*:FASTQ_ALIGN_HISAT2:HISAT2_ALIGN' { + ext.args = '--met-stderr --new-summary --dta' + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}/log" }, + mode: params.publish_dir_mode, + pattern: '*.log' + ], + [ + path: { params.save_align_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.bam', + saveAs: { params.save_align_intermeds ? it : null } + ], + [ + path: { params.save_unaligned ? "${params.outdir}/${params.aligner}/unmapped" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.fastq.gz', + saveAs: { params.save_unaligned ? it : null } + ] + ] + } + } +} diff --git a/subworkflows/nf-core/fastq_align_hisat2/tests/main.nf.test b/subworkflows/nf-core/fastq_align_hisat2/tests/main.nf.test new file mode 100644 index 000000000..0048b3b33 --- /dev/null +++ b/subworkflows/nf-core/fastq_align_hisat2/tests/main.nf.test @@ -0,0 +1,207 @@ +nextflow_workflow { + + name "Test Subworkflow FASTQ_ALIGN_HISAT2" + script "../main.nf" + workflow "FASTQ_ALIGN_HISAT2" + config "./nextflow.config" + + setup { + run("HISAT2_EXTRACTSPLICESITES") { + script "../../../../modules/nf-core/hisat2/extractsplicesites/main.nf" + process { + """ + input[0] = Channel.of([ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ]) + """ + } + } + + run("HISAT2_EXTRACTSPLICESITES", alias: "HISAT2_EXTRACTSPLICESITES_STUB") { + script "../../../../modules/nf-core/hisat2/extractsplicesites/main.nf" + process { + """ + input[0] = Channel.of([ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ]) + """ + } + } + + run("HISAT2_BUILD") { + script "../../../../modules/nf-core/hisat2/build/main.nf" + process { + """ + input[0] = Channel.of([ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) + ]) + input[1] = Channel.of([ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ]) + input[2] = HISAT2_EXTRACTSPLICESITES.out.txt + """ + } + } + + run("HISAT2_BUILD", alias: "HISAT2_BUILD_STUB") { + script "../../../../modules/nf-core/hisat2/build/main.nf" + process { + """ + input[0] = Channel.of([ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) + ]) + input[1] = Channel.of([ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.gtf", checkIfExists: true) + ]) + input[2] = HISAT2_EXTRACTSPLICESITES_STUB.out.txt + """ + } + } + } + + test("sarscov2 - bam - single_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], + [ + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true) + ] + ]) + input[1] = HISAT2_BUILD.out.index + input[2] = HISAT2_EXTRACTSPLICESITES.out.txt + input[3] = Channel.of([ + [ id:'test' ], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + file(workflow.out.bai[0][1]).name, + file(workflow.out.bam[0][1]).name, + file(workflow.out.orig_bam[0][1]).name, + workflow.out.csi, + workflow.out.fastq, + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats, + workflow.out.summary, + workflow.out.versions).match()} + ) + } + } + test("sarscov2 - bam - paired_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], + [ + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_2.fastq.gz", checkIfExists: true) + ] + ]) + input[1] = HISAT2_BUILD.out.index + input[2] = HISAT2_EXTRACTSPLICESITES.out.txt + input[3] = Channel.of([ + [ id:'test' ], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + file(workflow.out.bai[0][1]).name, + file(workflow.out.bam[0][1]).name, + file(workflow.out.orig_bam[0][1]).name, + workflow.out.csi, + workflow.out.fastq, + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats, + workflow.out.summary, + workflow.out.versions).match()} + ) + } + } + + test("sarscov2 - bam - single_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], + [ + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true) + ] + ]) + input[1] = HISAT2_BUILD_STUB.out.index + input[2] = HISAT2_EXTRACTSPLICESITES_STUB.out.txt + input[3] = Channel.of([ + [ id:'test' ], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match()} + ) + } + } + test("sarscov2 - bam - paired_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], + [ + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_1.fastq.gz", checkIfExists: true), + file(params.modules_testdata_base_path + "genomics/sarscov2/illumina/fastq/test_2.fastq.gz", checkIfExists: true) + ] + ]) + input[1] = HISAT2_BUILD_STUB.out.index + input[2] = HISAT2_EXTRACTSPLICESITES_STUB.out.txt + input[3] = Channel.of([ + [ id:'test' ], + file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match()} + ) + } + } +} diff --git a/subworkflows/nf-core/fastq_align_hisat2/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_align_hisat2/tests/main.nf.test.snap new file mode 100644 index 000000000..408dabff0 --- /dev/null +++ b/subworkflows/nf-core/fastq_align_hisat2/tests/main.nf.test.snap @@ -0,0 +1,456 @@ +{ + "sarscov2 - bam - single_end": { + "content": [ + "test.sorted.bam.bai", + "test.sorted.bam", + "test.bam", + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,6de3bfde9582ad2532033832091f5c46" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,2a5df85e0d90e55bb2b359f6e05d5fbb" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,845655ccfd1fd701b9f692f8db9508af" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.hisat2.summary.log:md5,7b8a9e61b7646da1089b041333c41a87" + ] + ], + [ + "versions.yml:md5,2d9432e15956fe71fe0ba811547acea6", + "versions.yml:md5,5fcbed7fee2404be4ecee6efab5914b8", + "versions.yml:md5,6b9d9eed13bf074965d1623a7e8a1741", + "versions.yml:md5,7767a57d88fff540ce475902df2e9e0a", + "versions.yml:md5,b4ccce0351e5718d36600858452dd4b1", + "versions.yml:md5,bb6710ee58b84a1ed212f9c599d84066" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T12:36:06.813423" + }, + "sarscov2 - bam - single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.hisat2.summary.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + "versions.yml:md5,2d9432e15956fe71fe0ba811547acea6", + "versions.yml:md5,5fcbed7fee2404be4ecee6efab5914b8", + "versions.yml:md5,6b9d9eed13bf074965d1623a7e8a1741", + "versions.yml:md5,7767a57d88fff540ce475902df2e9e0a", + "versions.yml:md5,b4ccce0351e5718d36600858452dd4b1", + "versions.yml:md5,bb6710ee58b84a1ed212f9c599d84066" + ], + "bai": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "csi": [ + + ], + "fastq": [ + + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "orig_bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "summary": [ + [ + { + "id": "test", + "single_end": true + }, + "test.hisat2.summary.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,2d9432e15956fe71fe0ba811547acea6", + "versions.yml:md5,5fcbed7fee2404be4ecee6efab5914b8", + "versions.yml:md5,6b9d9eed13bf074965d1623a7e8a1741", + "versions.yml:md5,7767a57d88fff540ce475902df2e9e0a", + "versions.yml:md5,b4ccce0351e5718d36600858452dd4b1", + "versions.yml:md5,bb6710ee58b84a1ed212f9c599d84066" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:36:23.861012" + }, + "sarscov2 - bam - paired_end": { + "content": [ + "test.sorted.bam.bai", + "test.sorted.bam", + "test.bam", + [ + + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,2fa0d90162a1b655863796c2a6bd8f45" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,1adb27b52d4d64b826f48b59d61dcd4d" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,603fa8c9e0e9eb3769498fc989a29250" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.hisat2.summary.log:md5,9839b31db795958cc4b70711a3414e9c" + ] + ], + [ + "versions.yml:md5,2d9432e15956fe71fe0ba811547acea6", + "versions.yml:md5,5fcbed7fee2404be4ecee6efab5914b8", + "versions.yml:md5,6b9d9eed13bf074965d1623a7e8a1741", + "versions.yml:md5,7767a57d88fff540ce475902df2e9e0a", + "versions.yml:md5,b4ccce0351e5718d36600858452dd4b1", + "versions.yml:md5,bb6710ee58b84a1ed212f9c599d84066" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T12:36:25.071168" + }, + "sarscov2 - bam - paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hisat2.summary.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + "versions.yml:md5,2d9432e15956fe71fe0ba811547acea6", + "versions.yml:md5,5fcbed7fee2404be4ecee6efab5914b8", + "versions.yml:md5,6b9d9eed13bf074965d1623a7e8a1741", + "versions.yml:md5,7767a57d88fff540ce475902df2e9e0a", + "versions.yml:md5,b4ccce0351e5718d36600858452dd4b1", + "versions.yml:md5,bb6710ee58b84a1ed212f9c599d84066" + ], + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "csi": [ + + ], + "fastq": [ + + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "orig_bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "summary": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hisat2.summary.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,2d9432e15956fe71fe0ba811547acea6", + "versions.yml:md5,5fcbed7fee2404be4ecee6efab5914b8", + "versions.yml:md5,6b9d9eed13bf074965d1623a7e8a1741", + "versions.yml:md5,7767a57d88fff540ce475902df2e9e0a", + "versions.yml:md5,b4ccce0351e5718d36600858452dd4b1", + "versions.yml:md5,bb6710ee58b84a1ed212f9c599d84066" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T19:36:44.894976" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_align_hisat2/tests/nextflow.config b/subworkflows/nf-core/fastq_align_hisat2/tests/nextflow.config new file mode 100644 index 000000000..d2a119b55 --- /dev/null +++ b/subworkflows/nf-core/fastq_align_hisat2/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: SAMTOOLS_SORT { + ext.prefix = { "${meta.id}.sorted" } + } +} diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/main.nf b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/main.nf index 3dbb27eae..ab6cbb320 100644 --- a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/main.nf +++ b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/main.nf @@ -12,11 +12,27 @@ include { FASTP } from '../../../modules/nf-core/fastp/main' // import groovy.json.JsonSlurper -def getFastpReadsAfterFiltering(json_file) { +def getFastpReadsAfterFiltering(json_file, min_num_reads) { + + if ( workflow.stubRun ) { return min_num_reads } + def Map json = (Map) new JsonSlurper().parseText(json_file.text).get('summary') return json['after_filtering']['total_reads'].toLong() } +def getFastpAdapterSequence(json_file){ + + if ( workflow.stubRun ) { return "" } + + def Map json = (Map) new JsonSlurper().parseText(json_file.text) + try{ + adapter = json['adapter_cutting']['read1_adapter_sequence'] + } catch(Exception ex){ + adapter = "" + } + return adapter +} + workflow FASTQ_FASTQC_UMITOOLS_FASTP { take: reads // channel: [ val(meta), [ reads ] ] @@ -25,7 +41,7 @@ workflow FASTQ_FASTQC_UMITOOLS_FASTP { skip_umi_extract // boolean: true/false umi_discard_read // integer: 0, 1 or 2 skip_trimming // boolean: true/false - adapter_fasta // file: adapter.fasta + adapter_fasta // file: adapter.fasta save_trimmed_fail // boolean: true/false save_merged // boolean: true/false min_trimmed_reads // integer: > 0 @@ -75,10 +91,13 @@ workflow FASTQ_FASTQC_UMITOOLS_FASTP { fastqc_trim_html = Channel.empty() fastqc_trim_zip = Channel.empty() trim_read_count = Channel.empty() + adapter_seq = Channel.empty() + if (!skip_trimming) { FASTP ( umi_reads, adapter_fasta, + false, // don't want to set discard_trimmed_pass, else there will be no reads output save_trimmed_fail, save_merged ) @@ -96,7 +115,7 @@ workflow FASTQ_FASTQC_UMITOOLS_FASTP { .out .reads .join(trim_json) - .map { meta, reads, json -> [ meta, reads, getFastpReadsAfterFiltering(json) ] } + .map { meta, reads, json -> [ meta, reads, getFastpReadsAfterFiltering(json, min_trimmed_reads.toLong()) ] } .set { ch_num_trimmed_reads } ch_num_trimmed_reads @@ -108,6 +127,10 @@ workflow FASTQ_FASTQC_UMITOOLS_FASTP { .map { meta, reads, num_reads -> [ meta, num_reads ] } .set { trim_read_count } + trim_json + .map { meta, json -> [meta, getFastpAdapterSequence(json)] } + .set { adapter_seq } + if (!skip_fastqc) { FASTQC_TRIM ( trim_reads @@ -125,6 +148,7 @@ workflow FASTQ_FASTQC_UMITOOLS_FASTP { fastqc_raw_zip // channel: [ val(meta), [ zip ] ] umi_log // channel: [ val(meta), [ log ] ] + adapter_seq // channel: [ val(meta), [ adapter_seq] ] trim_json // channel: [ val(meta), [ json ] ] trim_html // channel: [ val(meta), [ html ] ] diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/meta.yml b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/meta.yml index f76b40261..9308fe9ba 100644 --- a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/meta.yml +++ b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/meta.yml @@ -43,7 +43,7 @@ input: - skip_trimming: type: boolean description: | - Allows to skip trimgalore execution + Allows to skip FastP execution - adapter_fasta: type: file description: | @@ -69,9 +69,8 @@ output: - 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. + 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: type: file @@ -116,9 +115,15 @@ output: type: file description: FastQC report archive pattern: "*_{fastqc.zip}" + - adapter_seq: + type: string + description: | + Adapter Sequence found in read1 - versions: type: file description: File containing software versions pattern: "versions.yml" authors: - "@robsyme" +maintainers: + - "@robsyme" diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/nextflow.config b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/nextflow.config new file mode 100644 index 000000000..38685f1d0 --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/nextflow.config @@ -0,0 +1,79 @@ +if (!(params.skip_fastqc || params.skip_qc)) { + if (params.trimmer == 'fastp') { + process { + withName: '.*:FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW' { + ext.args = '--quiet' + ext.prefix = { "${meta.id}_raw" } + publishDir = [ + path: { "${params.outdir}/fastqc/raw" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM' { + ext.args = '--quiet' + ext.prefix = { "${meta.id}_trimmed" } + publishDir = [ + path: { "${params.outdir}/fastqc/trim" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } +} + +if (!params.skip_trimming) { + if (params.trimmer == 'fastp') { + process { + withName: '.*:FASTQ_FASTQC_UMITOOLS_FASTP:FASTP' { + ext.args = { params.extra_fastp_args ?: '' } + publishDir = [ + [ + path: { "${params.outdir}/${params.trimmer}" }, + mode: params.publish_dir_mode, + pattern: "*.{json,html}" + ], + [ + path: { "${params.outdir}/${params.trimmer}/log" }, + mode: params.publish_dir_mode, + pattern: "*.log" + ], + [ + path: { params.save_trimmed ? "${params.outdir}/${params.trimmer}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz", + saveAs: { params.save_trimmed ? it : null } + ] + ] + } + } + } +} + +if (params.with_umi && !params.skip_umi_extract) { + process { + withName: '.*:FASTQ_FASTQC_UMITOOLS_FASTP:UMITOOLS_EXTRACT' { + ext.args = { [ + params.umitools_extract_method ? "--extract-method=${params.umitools_extract_method}" : '', + params.umitools_bc_pattern ? "--bc-pattern='${params.umitools_bc_pattern}'" : '', + params.umitools_bc_pattern2 ? "--bc-pattern2='${params.umitools_bc_pattern2}'" : '', + params.umitools_umi_separator ? "--umi-separator='${params.umitools_umi_separator}'" : '' + ].join(' ').trim() } + publishDir = [ + [ + path: { "${params.outdir}/umitools" }, + mode: params.publish_dir_mode, + pattern: "*.log" + ], + [ + path: { params.save_umi_intermeds ? "${params.outdir}/umitools" : params.outdir }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz", + saveAs: { params.save_umi_intermeds ? it : null } + ] + ] + } + } +} diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test new file mode 100644 index 000000000..eb944b7d5 --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test @@ -0,0 +1,964 @@ +nextflow_workflow { + + name "Test Workflow FASTQ_FASTQC_UMITOOLS_FASTP" + script "../main.nf" + workflow "FASTQ_FASTQC_UMITOOLS_FASTP" + config './nextflow.config' + + test("sarscov2 paired-end [fastq]") { + + when { + workflow { + """ + skip_fastqc = false + with_umi = false + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.out.fastqc_raw_html }, + { assert workflow.out.fastqc_raw_zip }, + { assert workflow.out.fastqc_trim_html }, + { assert workflow.out.fastqc_trim_zip }, + { assert workflow.out.trim_html }, + { assert workflow.out.trim_log }, + { assert snapshot( + workflow.out.adapter_seq, + workflow.out.reads, + workflow.out.trim_json, + workflow.out.trim_read_count, + workflow.out.trim_reads_fail, + workflow.out.trim_reads_merged, + workflow.out.umi_log, + workflow.out.versions + ).match() + } + ) + } + } + + test("skip_fastqc") { + + when { + workflow { + """ + skip_fastqc = true + with_umi = false + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.out.trim_html }, + { assert workflow.out.trim_log }, + { assert !workflow.out.fastqc_raw_html }, + { assert !workflow.out.fastqc_raw_zip }, + { assert !workflow.out.fastqc_trim_html }, + { assert !workflow.out.fastqc_trim_zip }, + { assert snapshot( + workflow.out.adapter_seq, + workflow.out.reads, + workflow.out.trim_json, + workflow.out.trim_read_count, + workflow.out.trim_reads_fail, + workflow.out.trim_reads_merged, + workflow.out.umi_log, + workflow.out.versions + ).match() + } + ) + } + } + + test("with_umi") { + + when { + workflow { + """ + skip_fastqc = false + with_umi = true + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.out.fastqc_raw_html }, + { assert workflow.out.fastqc_raw_zip }, + { assert workflow.out.fastqc_trim_html }, + { assert workflow.out.fastqc_trim_zip }, + { assert workflow.out.trim_html }, + { assert workflow.out.trim_log }, + { assert snapshot( + workflow.out.adapter_seq, + workflow.out.reads, + workflow.out.trim_json, + workflow.out.trim_read_count, + workflow.out.trim_reads_fail, + workflow.out.trim_reads_merged, + workflow.out.versions + ).match() + } + ) + } + } + + + test("skip_umi_extract") { + + when { + workflow { + """ + skip_fastqc = false + with_umi = true + skip_umi_extract = true + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.out.fastqc_raw_html }, + { assert workflow.out.fastqc_raw_zip }, + { assert workflow.out.fastqc_trim_html }, + { assert workflow.out.fastqc_trim_zip }, + { assert workflow.out.trim_html }, + { assert workflow.out.trim_log }, + { assert snapshot( + workflow.out.adapter_seq, + workflow.out.reads, + workflow.out.trim_json, + workflow.out.trim_read_count, + workflow.out.trim_reads_fail, + workflow.out.trim_reads_merged, + workflow.out.umi_log, + workflow.out.versions + ).match() + } + ) + } + } + + test("umi_discard_read = 2") { + + when { + workflow { + """ + skip_fastqc = false + with_umi = true + skip_umi_extract = true + umi_discard_read = 2 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.out.fastqc_raw_html }, + { assert workflow.out.fastqc_raw_zip }, + { assert workflow.out.fastqc_trim_html }, + { assert workflow.out.fastqc_trim_zip }, + { assert workflow.out.trim_html }, + { assert workflow.out.trim_log }, + { assert snapshot( + workflow.out.adapter_seq, + workflow.out.reads, + workflow.out.trim_json, + workflow.out.trim_read_count, + workflow.out.trim_reads_fail, + workflow.out.trim_reads_merged, + workflow.out.umi_log, + workflow.out.versions + ).match() + } + ) + } + } + + test("skip_trimming") { + + when { + workflow { + """ + skip_fastqc = false + with_umi = false + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = true + adapter_fasta = [] + save_trimmed_fail = false + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.out.fastqc_raw_html }, + { assert workflow.out.fastqc_raw_zip }, + { assert !workflow.out.fastqc_trim_html }, + { assert !workflow.out.fastqc_trim_zip }, + { assert !workflow.out.trim_html }, + { assert !workflow.out.trim_log }, + { assert snapshot( + // If we skip trimming then input is output, so not snapshotting + workflow.out.adapter_seq, + workflow.out.reads.get(0).get(0), // Reads meta map + workflow.out.trim_json, + workflow.out.trim_read_count, + workflow.out.trim_reads_fail, + workflow.out.trim_reads_merged, + workflow.out.umi_log, + workflow.out.versions + ).match() + } + ) + } + } + + test("save_trimmed_fail") { + + config './nextflow.save_trimmed.config' + + when { + workflow { + """ + skip_fastqc = false + with_umi = false + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = true + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.out.fastqc_raw_html }, + { assert workflow.out.fastqc_raw_zip }, + { assert workflow.out.fastqc_trim_html }, + { assert workflow.out.fastqc_trim_zip }, + { assert workflow.out.trim_html }, + { assert workflow.out.trim_log }, + { assert snapshot( + workflow.out.adapter_seq, + workflow.out.reads, + workflow.out.trim_json, + workflow.out.trim_read_count, + workflow.out.trim_reads_fail, + workflow.out.trim_reads_merged, + workflow.out.umi_log, + workflow.out.versions + ).match() + } + ) + } + } + + test("save_merged") { + + when { + workflow { + """ + skip_fastqc = false + with_umi = false + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = true + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.out.fastqc_raw_html }, + { assert workflow.out.fastqc_raw_zip }, + { assert workflow.out.fastqc_trim_html }, + { assert workflow.out.fastqc_trim_zip }, + { assert workflow.out.trim_html }, + { assert workflow.out.trim_log }, + { assert snapshot( + workflow.out.adapter_seq, + workflow.out.reads, + workflow.out.trim_json, + workflow.out.trim_read_count, + workflow.out.trim_reads_fail, + workflow.out.trim_reads_merged, + workflow.out.umi_log, + workflow.out.versions + ).match() + } + ) + } + } + + test("min_trimmed_reads = 26") { + // Subworkflow should stop after FASTP which trims down to 25 reads + + when { + workflow { + """ + skip_fastqc = false + with_umi = false + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = true + min_trimmed_reads = 26 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.out.fastqc_raw_html }, + { assert workflow.out.fastqc_raw_zip }, + { assert workflow.out.fastqc_trim_html }, + { assert workflow.out.fastqc_trim_zip }, + { assert workflow.out.trim_html }, + { assert workflow.out.trim_log }, + { assert snapshot( + workflow.out.adapter_seq, + workflow.out.reads, + workflow.out.trim_json, + workflow.out.trim_read_count, + workflow.out.trim_reads_fail, + workflow.out.trim_reads_merged, + workflow.out.umi_log, + workflow.out.versions + ).match() + } + ) + } + } + + test("sarscov2 paired-end [fastq] - stub") { + + options '-stub' + + when { + workflow { + """ + skip_fastqc = false + with_umi = false + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("skip_fastqc - stub") { + + options "-stub" + + when { + workflow { + """ + skip_fastqc = true + with_umi = false + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("with_umi - stub") { + + options "-stub" + + when { + workflow { + """ + skip_fastqc = false + with_umi = true + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + + test("skip_umi_extract - stub") { + + options "-stub" + + when { + workflow { + """ + skip_fastqc = false + with_umi = true + skip_umi_extract = true + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("umi_discard_read = 2 - stub") { + + options "-stub" + + when { + workflow { + """ + skip_fastqc = false + with_umi = true + skip_umi_extract = true + umi_discard_read = 2 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("skip_trimming - stub") { + + options "-stub" + + when { + workflow { + """ + skip_fastqc = false + with_umi = false + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = true + adapter_fasta = [] + save_trimmed_fail = false + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.adapter_seq, + workflow.out.fastqc_raw_html, + workflow.out.fastqc_raw_zip, + workflow.out.fastqc_trim_html, + workflow.out.fastqc_trim_zip, + workflow.out.trim_html, + workflow.out.trim_json, + workflow.out.trim_log, + workflow.out.trim_read_count, + workflow.out.trim_reads_fail, + workflow.out.trim_reads_merged, + workflow.out.umi_log, + workflow.out.versions).match() } + ) + } + } + + test("save_trimmed_fail - stub") { + + options "-stub" + + config './nextflow.save_trimmed.config' + + when { + workflow { + """ + skip_fastqc = false + with_umi = false + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = true + save_merged = false + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("save_merged - stub") { + + options "-stub" + + when { + workflow { + """ + skip_fastqc = false + with_umi = false + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = true + min_trimmed_reads = 1 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("min_trimmed_reads = 26 - stub") { + // Subworkflow should stop after FASTP which trims down to 25 reads + + options "-stub" + + when { + workflow { + """ + skip_fastqc = false + with_umi = false + skip_umi_extract = false + umi_discard_read = 1 + skip_trimming = false + adapter_fasta = [] + save_trimmed_fail = false + save_merged = true + min_trimmed_reads = 26 + + 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] = skip_fastqc + input[2] = with_umi + input[3] = skip_umi_extract + input[4] = umi_discard_read + input[5] = skip_trimming + input[6] = adapter_fasta + input[7] = save_trimmed_fail + input[8] = save_merged + input[9] = min_trimmed_reads + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test.snap new file mode 100644 index 000000000..e7d1f51ed --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test.snap @@ -0,0 +1,2407 @@ +{ + "skip_fastqc": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "unspecified" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,67b2bbae47f073e05a97a9c2edce23c7", + "test_2.fastp.fastq.gz:md5,25cbdca08e2083dbd4f0502de6b62f39" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,1e0f8e27e71728e2b63fc64086be95cd" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + 198 + ] + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:56:01.933832" + }, + "save_trimmed_fail": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "unspecified" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,6ff32a64c5188b9a9192be1398c262c7", + "test_2.fastp.fastq.gz:md5,db0cb7c9977e94ac2b4b446ebd017a8a" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,4c3268ddb50ea5b33125984776aa3519" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + 162 + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.paired.fail.fastq.gz:md5,409b687c734cedd7a1fec14d316e1366", + "test_1.fail.fastq.gz:md5,4f273cf3159c13f79e8ffae12f5661f6", + "test_2.fail.fastq.gz:md5,f97b9edefb5649aab661fbc9e71fc995" + ] + ] + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:57:38.736" + }, + "skip_umi_extract": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "unspecified" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,67b2bbae47f073e05a97a9c2edce23c7", + "test_2.fastp.fastq.gz:md5,25cbdca08e2083dbd4f0502de6b62f39" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,1e0f8e27e71728e2b63fc64086be95cd" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + 198 + ] + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:56:47.905105" + }, + "umi_discard_read = 2": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "unspecified" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,67b2bbae47f073e05a97a9c2edce23c7", + "test_2.fastp.fastq.gz:md5,25cbdca08e2083dbd4f0502de6b62f39" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,1e0f8e27e71728e2b63fc64086be95cd" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + 198 + ] + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:57:05.436744" + }, + "umi_discard_read = 2 - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + 1 + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + + ], + "9": [ + + ], + "adapter_seq": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "fastqc_raw_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_raw_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "trim_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_read_count": [ + [ + { + "id": "test", + "single_end": false + }, + 1 + ] + ], + "trim_reads_fail": [ + + ], + "trim_reads_merged": [ + + ], + "umi_log": [ + + ], + "versions": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:59:27.273892" + }, + "skip_trimming - stub": { + "content": [ + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:59:39.247758" + }, + "save_merged": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "unspecified" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,54b726a55e992a869fd3fa778afe1672", + "test_2.fastp.fastq.gz:md5,29d3b33b869f7b63417b8ff07bb128ba" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,b712fd68ed0322f4bec49ff2a5237fcc" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + 75 + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.merged.fastq.gz:md5,c873bb1ab3fa859dcc47306465e749d5" + ] + ], + [ + + ], + [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:57:57.472342" + }, + "skip_trimming": { + "content": [ + [ + + ], + { + "id": "test", + "single_end": false + }, + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:57:19.875543" + }, + "with_umi": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.fastq.gz:md5,ba8c6c3a7ce718d9a2c5857e2edf53bc" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,d39c5c6d9a2e35fb60d26ced46569af6" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + 99 + ] + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,01f264f78de3c6d893c449cc6d3cd721", + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:56:26.778625" + }, + "min_trimmed_reads = 26": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "unspecified" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,54b726a55e992a869fd3fa778afe1672", + "test_2.fastp.fastq.gz:md5,29d3b33b869f7b63417b8ff07bb128ba" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,b712fd68ed0322f4bec49ff2a5237fcc" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + 75 + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.merged.fastq.gz:md5,c873bb1ab3fa859dcc47306465e749d5" + ] + ], + [ + + ], + [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:58:16.36697" + }, + "min_trimmed_reads = 26 - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + 26 + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + + ], + "9": [ + [ + { + "id": "test", + "single_end": false + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "adapter_seq": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "fastqc_raw_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_raw_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "trim_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_read_count": [ + [ + { + "id": "test", + "single_end": false + }, + 26 + ] + ], + "trim_reads_fail": [ + + ], + "trim_reads_merged": [ + [ + { + "id": "test", + "single_end": false + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "umi_log": [ + + ], + "versions": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:00:16.524361" + }, + "with_umi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": true + }, + 1 + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": true + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "single_end": true + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + "versions.yml:md5,01f264f78de3c6d893c449cc6d3cd721", + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ], + "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": true + }, + "" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + + ], + "9": [ + + ], + "adapter_seq": [ + [ + { + "id": "test", + "single_end": true + }, + "" + ] + ], + "fastqc_raw_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_raw_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_html": [ + [ + { + "id": "test", + "single_end": true + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_zip": [ + [ + { + "id": "test", + "single_end": true + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "trim_html": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_json": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_log": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_read_count": [ + [ + { + "id": "test", + "single_end": true + }, + 1 + ] + ], + "trim_reads_fail": [ + + ], + "trim_reads_merged": [ + + ], + "umi_log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.umi_extract.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,01f264f78de3c6d893c449cc6d3cd721", + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:58:56.42517" + }, + "skip_fastqc - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + 1 + ] + ], + "11": [ + + ], + "12": [ + + ], + "13": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad" + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + + ], + "9": [ + + ], + "adapter_seq": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "fastqc_raw_html": [ + + ], + "fastqc_raw_zip": [ + + ], + "fastqc_trim_html": [ + + ], + "fastqc_trim_zip": [ + + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "trim_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_read_count": [ + [ + { + "id": "test", + "single_end": false + }, + 1 + ] + ], + "trim_reads_fail": [ + + ], + "trim_reads_merged": [ + + ], + "umi_log": [ + + ], + "versions": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:58:41.207281" + }, + "save_merged - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + 1 + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + + ], + "9": [ + [ + { + "id": "test", + "single_end": false + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "adapter_seq": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "fastqc_raw_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_raw_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "trim_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_read_count": [ + [ + { + "id": "test", + "single_end": false + }, + 1 + ] + ], + "trim_reads_fail": [ + + ], + "trim_reads_merged": [ + [ + { + "id": "test", + "single_end": false + }, + "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "umi_log": [ + + ], + "versions": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:00:03.695409" + }, + "sarscov2 paired-end [fastq]": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "unspecified" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,67b2bbae47f073e05a97a9c2edce23c7", + "test_2.fastp.fastq.gz:md5,25cbdca08e2083dbd4f0502de6b62f39" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,1e0f8e27e71728e2b63fc64086be95cd" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + 198 + ] + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:55:50.614571" + }, + "sarscov2 paired-end [fastq] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + 1 + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + + ], + "9": [ + + ], + "adapter_seq": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "fastqc_raw_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_raw_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "trim_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_read_count": [ + [ + { + "id": "test", + "single_end": false + }, + 1 + ] + ], + "trim_reads_fail": [ + + ], + "trim_reads_merged": [ + + ], + "umi_log": [ + + ], + "versions": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:58:29.296468" + }, + "save_trimmed_fail - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + 1 + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.paired.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_1.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "9": [ + + ], + "adapter_seq": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "fastqc_raw_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_raw_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "trim_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_read_count": [ + [ + { + "id": "test", + "single_end": false + }, + 1 + ] + ], + "trim_reads_fail": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.paired.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_1.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "trim_reads_merged": [ + + ], + "umi_log": [ + + ], + "versions": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:59:51.615894" + }, + "skip_umi_extract - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + 1 + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + + ], + "9": [ + + ], + "adapter_seq": [ + [ + { + "id": "test", + "single_end": false + }, + "" + ] + ], + "fastqc_raw_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_raw_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "fastqc_trim_zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "trim_html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_json": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_log": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "trim_read_count": [ + [ + { + "id": "test", + "single_end": false + }, + 1 + ] + ], + "trim_reads_fail": [ + + ], + "trim_reads_merged": [ + + ], + "umi_log": [ + + ], + "versions": [ + "versions.yml:md5,85bd0117e5778fff18e3920972a296ad", + "versions.yml:md5,c50aa59475ab901bc6f9a2cf7b1a14e0", + "versions.yml:md5,f3dcaae948e8eed92b4a5557b4c6668e" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T16:59:12.592278" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/nextflow.config b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/nextflow.config new file mode 100644 index 000000000..0174cae50 --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/nextflow.config @@ -0,0 +1,11 @@ +process { + + withName: UMITOOLS_EXTRACT { + ext.args = '--bc-pattern="NNNN" --bc-pattern2="NNNN"' + } + + withName: UMICOLLAPSE { + ext.prefix = { "${meta.id}.dedup" } + } + +} diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/nextflow.save_trimmed.config b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/nextflow.save_trimmed.config new file mode 100644 index 000000000..21207addd --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/nextflow.save_trimmed.config @@ -0,0 +1,6 @@ +process { + // Make filtering more aggressive to make more reads fail + withName: FASTP { + ext.args = "-e 30" + } +} diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/meta.yml b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/meta.yml index e32e90f43..a7df97f77 100644 --- a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/meta.yml +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/meta.yml @@ -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/nextflow.config b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/nextflow.config new file mode 100644 index 000000000..46c7a72b6 --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/nextflow.config @@ -0,0 +1,89 @@ +if (!(params.skip_fastqc || params.skip_qc)) { + if (params.trimmer == 'trimgalore') { + process { + withName: '.*:FASTQ_FASTQC_UMITOOLS_TRIMGALORE:FASTQC' { + ext.args = '--quiet' + ext.prefix = { "${meta.id}_raw" } + publishDir = [ + path: { "${params.outdir}/fastqc/raw" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } +} + +if (!params.skip_trimming) { + if (params.trimmer == 'trimgalore') { + process { + withName: '.*:FASTQ_FASTQC_UMITOOLS_TRIMGALORE:TRIMGALORE' { + ext.args = { + // Function to convert argument strings into a map + def argsToMap = { String args -> + args.split("\\s(?=--)").collectEntries { + def parts = it.trim().split(/\s+/, 2) + [(parts.first()): parts.last()] + } + } + + // Initialize the map with preconfigured values + def preset_args_map = argsToMap(""" + --fastqc_args '-t ${task.cpus}' + """.trim()) + + // Consolidate the extra arguments + def final_args_map = preset_args_map + (params.extra_trimgalore_args ? argsToMap(params.extra_trimgalore_args) : [:]) + + // Convert the map back to a list and then to a single string + final_args_map.collect { key, value -> "${key} ${value}" }.join(' ').trim() + } + ext.prefix = { "${meta.id}_trimmed" } + publishDir = [ + [ + path: { "${params.outdir}/fastqc/trim" }, + mode: params.publish_dir_mode, + pattern: "*.{html,zip}" + ], + [ + path: { params.save_trimmed ? "${params.outdir}/${params.trimmer}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: "*.fq.gz", + saveAs: { params.save_trimmed ? it : null } + ], + [ + path: { "${params.outdir}/${params.trimmer}" }, + mode: params.publish_dir_mode, + pattern: "*.txt" + ] + ] + } + } + } +} + +if (params.with_umi && !params.skip_umi_extract) { + process { + withName: '.*:FASTQ_FASTQC_UMITOOLS_TRIMGALORE:UMITOOLS_EXTRACT' { + ext.args = { [ + params.umitools_extract_method ? "--extract-method=${params.umitools_extract_method}" : '', + params.umitools_bc_pattern ? "--bc-pattern='${params.umitools_bc_pattern}'" : '', + params.umitools_bc_pattern2 ? "--bc-pattern2='${params.umitools_bc_pattern2}'" : '', + params.umitools_umi_separator ? "--umi-separator='${params.umitools_umi_separator}'" : '' + ].join(' ').trim() } + publishDir = [ + [ + path: { "${params.outdir}/umitools" }, + mode: params.publish_dir_mode, + pattern: "*.log" + ], + [ + path: { params.save_umi_intermeds ? "${params.outdir}/umitools" : params.outdir }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz", + saveAs: { params.save_umi_intermeds ? it : null } + ] + ] + } + } +} 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 000000000..3fffd234b --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test @@ -0,0 +1,263 @@ +nextflow_workflow { + + name "Test Subworkflow FASTQ_FASTQC_UMITOOLS_TRIMGALORE" + script "../main.nf" + workflow "FASTQ_FASTQC_UMITOOLS_TRIMGALORE" + config './nextflow.config' + + 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, + workflow.out.versions).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, + workflow.out.versions).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, + workflow.out.versions).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, + workflow.out.versions).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 000000000..b37a75c9b --- /dev/null +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test.snap @@ -0,0 +1,524 @@ +{ + "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": [ + + ], + "5": [ + + ], + "6": [ + + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": true + }, + 0 + ] + ], + "9": [ + "versions.yml:md5,0a5b8fa83ba29cf645bf9e9471cca150", + "versions.yml:md5,3e4b7f058c0aa96ba41c3e4d6df6e839", + "versions.yml:md5,7e740129a23c5ac21c27476e30f8a6d2" + ], + "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" + ] + ], + "versions": [ + "versions.yml:md5,0a5b8fa83ba29cf645bf9e9471cca150", + "versions.yml:md5,3e4b7f058c0aa96ba41c3e4d6df6e839", + "versions.yml:md5,7e740129a23c5ac21c27476e30f8a6d2" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:06:34.919444" + }, + "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": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_2.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + 0 + ] + ], + "9": [ + "versions.yml:md5,0a5b8fa83ba29cf645bf9e9471cca150", + "versions.yml:md5,7e740129a23c5ac21c27476e30f8a6d2" + ], + "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": [ + + ], + "versions": [ + "versions.yml:md5,0a5b8fa83ba29cf645bf9e9471cca150", + "versions.yml:md5,7e740129a23c5ac21c27476e30f8a6d2" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:06:51.765414" + }, + "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 + ] + ], + [ + + ], + [ + "versions.yml:md5,0a5b8fa83ba29cf645bf9e9471cca150", + "versions.yml:md5,7e740129a23c5ac21c27476e30f8a6d2" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:05:37.366404" + }, + "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 + ] + ], + [ + + ], + [ + "versions.yml:md5,0a5b8fa83ba29cf645bf9e9471cca150", + "versions.yml:md5,3e4b7f058c0aa96ba41c3e4d6df6e839", + "versions.yml:md5,7e740129a23c5ac21c27476e30f8a6d2" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:04:53.072227" + }, + "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 + ] + ], + [ + + ], + [ + "versions.yml:md5,0a5b8fa83ba29cf645bf9e9471cca150", + "versions.yml:md5,3e4b7f058c0aa96ba41c3e4d6df6e839", + "versions.yml:md5,7e740129a23c5ac21c27476e30f8a6d2" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:05:16.709704" + }, + "test skip all steps": { + "content": [ + [ + + ], + [ + + ], + [ + + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:05:49.455992" + }, + "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": [ + + ], + "5": [ + + ], + "6": [ + + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": true + }, + 0 + ] + ], + "9": [ + "versions.yml:md5,0a5b8fa83ba29cf645bf9e9471cca150", + "versions.yml:md5,3e4b7f058c0aa96ba41c3e4d6df6e839", + "versions.yml:md5,7e740129a23c5ac21c27476e30f8a6d2" + ], + "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" + ] + ], + "versions": [ + "versions.yml:md5,0a5b8fa83ba29cf645bf9e9471cca150", + "versions.yml:md5,3e4b7f058c0aa96ba41c3e4d6df6e839", + "versions.yml:md5,7e740129a23c5ac21c27476e30f8a6d2" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T17:06:09.844235" + } +} \ 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 000000000..06a7d07a7 --- /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/fastq_qc_trim_filter_setstrandedness/main.nf b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/main.nf new file mode 100644 index 000000000..4c7b25f8e --- /dev/null +++ b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/main.nf @@ -0,0 +1,319 @@ +import groovy.json.JsonSlurper + +include { BBMAP_BBSPLIT } from '../../../modules/nf-core/bbmap/bbsplit' +include { CAT_FASTQ } from '../../../modules/nf-core/cat/fastq/main' +include { SORTMERNA } from '../../../modules/nf-core/sortmerna/main' +include { SORTMERNA as SORTMERNA_INDEX } from '../../../modules/nf-core/sortmerna/main' + +include { FASTQ_SUBSAMPLE_FQ_SALMON } from '../fastq_subsample_fq_salmon' +include { FASTQ_FASTQC_UMITOOLS_TRIMGALORE } from '../fastq_fastqc_umitools_trimgalore' +include { FASTQ_FASTQC_UMITOOLS_FASTP } from '../fastq_fastqc_umitools_fastp' + +def pass_trimmed_reads = [:] + +// +// Function to determine library type by comparing type counts. +// + +// +def calculateStrandedness(forwardFragments, reverseFragments, unstrandedFragments, stranded_threshold=0.8, unstranded_threshold=0.1) { + def totalFragments = forwardFragments + reverseFragments + unstrandedFragments + def totalStrandedFragments = forwardFragments + reverseFragments + + def library_strandedness = 'undetermined' + if (totalStrandedFragments > 0) { + def forwardProportion = forwardFragments / (totalStrandedFragments as double) + def reverseProportion = reverseFragments / (totalStrandedFragments as double) + def proportionDifference = Math.abs(forwardProportion - reverseProportion) + + if (forwardProportion >= stranded_threshold) { + strandedness = 'forward' + } else if (reverseProportion >= stranded_threshold) { + strandedness = 'reverse' + } else if (proportionDifference <= unstranded_threshold) { + strandedness = 'unstranded' + } + } + + return [ + inferred_strandedness: strandedness, + forwardFragments: (forwardFragments / (totalFragments as double)) * 100, + reverseFragments: (reverseFragments / (totalFragments as double)) * 100, + unstrandedFragments: (unstrandedFragments / (totalFragments as double)) * 100 + ] +} + +// +// Function that parses Salmon quant 'lib_format_counts.json' output file to get inferred strandedness +// +def getSalmonInferredStrandedness(json_file, stranded_threshold = 0.8, unstranded_threshold = 0.1) { + // Parse the JSON content of the file + def libCounts = new JsonSlurper().parseText(json_file.text) + + // Calculate the counts for forward and reverse strand fragments + def forwardKeys = ['SF', 'ISF', 'MSF', 'OSF'] + def reverseKeys = ['SR', 'ISR', 'MSR', 'OSR'] + + // Calculate unstranded fragments (IU and U) + // NOTE: this is here for completeness, but actually all fragments have a + // strandedness (even if the overall library does not), so all these values + // will be '0'. See + // https://groups.google.com/g/sailfish-users/c/yxzBDv6NB6I + def unstrandedKeys = ['IU', 'U', 'MU'] + + def forwardFragments = forwardKeys.collect { libCounts[it] ?: 0 }.sum() + def reverseFragments = reverseKeys.collect { libCounts[it] ?: 0 }.sum() + def unstrandedFragments = unstrandedKeys.collect { libCounts[it] ?: 0 }.sum() + + // Use shared calculation function to determine strandedness + return calculateStrandedness(forwardFragments, reverseFragments, unstrandedFragments, stranded_threshold, unstranded_threshold) +} + +// +// Create MultiQC tsv custom content from a list of values +// +def multiqcTsvFromList(tsv_data, header) { + def tsv_string = "" + if (tsv_data.size() > 0) { + tsv_string += "${header.join('\t')}\n" + tsv_string += tsv_data.join('\n') + } + return tsv_string +} + +workflow FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS { + + take: + ch_reads // channel: [ val(meta), [ reads ] ] + ch_fasta // channel: /path/to/genome.fasta + ch_transcript_fasta // channel: /path/to/transcript.fasta + ch_gtf // channel: /path/to/genome.gtf + ch_salmon_index // channel: /path/to/salmon/index/ (optional) + ch_sortmerna_index // channel: /path/to/sortmerna/index/ (optional) + ch_bbsplit_index // channel: /path/to/bbsplit/index/ (optional) + ch_rrna_fastas // channel: one or more fasta files containing rrna sequences to be passed to SortMeRNA (optional) + skip_bbsplit // boolean: Skip BBSplit for removal of non-reference genome reads. + skip_fastqc // boolean: true/false + skip_trimming // boolean: true/false + skip_umi_extract // boolean: true/false + make_salmon_index // boolean: Whether to create salmon index before running salmon quant + make_sortmerna_index // boolean: Whether to create a sortmerna index before running sortmerna + trimmer // string (enum): 'fastp' or 'trimgalore' + min_trimmed_reads // integer: > 0 + save_trimmed // boolean: true/false + remove_ribo_rna // boolean: true/false: whether to run sortmerna to remove rrnas + with_umi // boolean: true/false: Enable UMI-based read deduplication. + umi_discard_read // integer: 0, 1 or 2 + stranded_threshold // float: The fraction of stranded reads that must be assigned to a strandedness for confident assignment. Must be at least 0.5 + unstranded_threshold // float: The difference in fraction of stranded reads assigned to 'forward' and 'reverse' below which a sample is classified as 'unstranded' + + main: + + ch_versions = Channel.empty() + ch_filtered_reads = Channel.empty() + ch_trim_read_count = Channel.empty() + ch_multiqc_files = Channel.empty() + + ch_reads + .branch { + meta, fastqs -> + single : fastqs.size() == 1 + return [ meta, fastqs.flatten() ] + multiple: fastqs.size() > 1 + return [ meta, fastqs.flatten() ] + } + .set { ch_fastq } + + // + // MODULE: Concatenate FastQ files from same sample if required + // + CAT_FASTQ ( + ch_fastq.multiple + ) + .reads + .mix(ch_fastq.single) + .set { ch_filtered_reads } + + ch_versions = ch_versions.mix(CAT_FASTQ.out.versions.first()) + + // + // SUBWORKFLOW: Read QC, extract UMI and trim adapters with TrimGalore! + // + if (trimmer == 'trimgalore') { + FASTQ_FASTQC_UMITOOLS_TRIMGALORE ( + ch_filtered_reads, + skip_fastqc, + with_umi, + skip_umi_extract, + skip_trimming, + umi_discard_read, + min_trimmed_reads + ) + ch_filtered_reads = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.reads + ch_trim_read_count = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_read_count + + ch_versions = ch_versions.mix(FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.versions) + ch_multiqc_files = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.fastqc_zip + .mix(FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_zip) + .mix(FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_log) + .mix(ch_multiqc_files) + } + + // + // SUBWORKFLOW: Read QC, extract UMI and trim adapters with fastp + // + if (trimmer == 'fastp') { + FASTQ_FASTQC_UMITOOLS_FASTP ( + ch_filtered_reads, + skip_fastqc, + with_umi, + skip_umi_extract, + umi_discard_read, + skip_trimming, + [], + save_trimmed, + save_trimmed, + min_trimmed_reads + ) + ch_filtered_reads = FASTQ_FASTQC_UMITOOLS_FASTP.out.reads + ch_trim_read_count = FASTQ_FASTQC_UMITOOLS_FASTP.out.trim_read_count + + ch_versions = ch_versions.mix(FASTQ_FASTQC_UMITOOLS_FASTP.out.versions) + ch_multiqc_files = FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_raw_zip + .mix(FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_trim_zip) + .mix(FASTQ_FASTQC_UMITOOLS_FASTP.out.trim_json.map{tuple(it[0], [it[1]])}) + .mix(ch_multiqc_files) + } + + // + // Get list of samples that failed trimming threshold for MultiQC report + // + + ch_trim_read_count + .map { + meta, num_reads -> + pass_trimmed_reads[meta.id] = true + if (num_reads <= min_trimmed_reads.toFloat()) { + pass_trimmed_reads[meta.id] = false + return [ "$meta.id\t$num_reads" ] + } + } + .collect() + .map { + tsv_data -> + def header = ["Sample", "Reads after trimming"] + multiqcTsvFromList(tsv_data, header) + } + .set { ch_fail_trimming_multiqc } + + ch_multiqc_files = ch_multiqc_files + .mix( + ch_fail_trimming_multiqc.collectFile(name: 'fail_trimmed_samples_mqc.tsv') + ) + + // + // MODULE: Remove genome contaminant reads + // + if (!skip_bbsplit) { + BBMAP_BBSPLIT ( + ch_filtered_reads, + ch_bbsplit_index, + [], + [ [], [] ], + false + ) + + BBMAP_BBSPLIT.out.primary_fastq + .set { ch_filtered_reads } + + ch_versions = ch_versions.mix(BBMAP_BBSPLIT.out.versions.first()) + } + + // + // MODULE: Remove ribosomal RNA reads + // + if (remove_ribo_rna) { + ch_sortmerna_fastas = ch_rrna_fastas + .collect() + .map{ ['rrna_refs', it] } + + if (make_sortmerna_index) { + SORTMERNA_INDEX ( + [[],[]], + ch_sortmerna_fastas, + [[],[]] + ) + ch_sortmerna_index = SORTMERNA_INDEX.out.index.first() + } + + SORTMERNA ( + ch_filtered_reads, + ch_sortmerna_fastas, + ch_sortmerna_index + ) + + SORTMERNA.out.reads + .set { ch_filtered_reads } + + ch_multiqc_files = ch_multiqc_files + .mix(SORTMERNA.out.log) + + ch_versions = ch_versions.mix(SORTMERNA.out.versions.first()) + } + + // Branch FastQ channels if 'auto' specified to infer strandedness + ch_filtered_reads + .branch { + meta, fastq -> + auto_strand : meta.strandedness == 'auto' + return [ meta, fastq ] + known_strand: meta.strandedness != 'auto' + return [ meta, fastq ] + } + .set { ch_strand_fastq } + + // + // SUBWORKFLOW: Sub-sample FastQ files and pseudoalign with Salmon to auto-infer strandedness + // + // Return empty channel if ch_strand_fastq.auto_strand is empty so salmon index isn't created + + ch_fasta + .combine(ch_strand_fastq.auto_strand) + .map { it.first() } + .first() + .set { ch_genome_fasta } + + FASTQ_SUBSAMPLE_FQ_SALMON ( + ch_strand_fastq.auto_strand, + ch_genome_fasta, + ch_transcript_fasta, + ch_gtf, + ch_salmon_index, + make_salmon_index + ) + ch_versions = ch_versions.mix(FASTQ_SUBSAMPLE_FQ_SALMON.out.versions) + + FASTQ_SUBSAMPLE_FQ_SALMON + .out + .lib_format_counts + .join(ch_strand_fastq.auto_strand) + .map { + meta, json, reads -> + def salmon_strand_analysis = getSalmonInferredStrandedness(json, stranded_threshold=stranded_threshold, unstranded_threshold=unstranded_threshold) + strandedness = salmon_strand_analysis.inferred_strandedness + if (strandedness == 'undetermined') { + strandedness = 'unstranded' + } + return [ meta + [ strandedness: strandedness, salmon_strand_analysis: salmon_strand_analysis ], reads ] + } + .mix(ch_strand_fastq.known_strand) + .set { ch_strand_inferred_fastq } + + emit: + + reads = ch_strand_inferred_fastq + trim_read_count = ch_trim_read_count + + multiqc_files = ch_multiqc_files.transpose().map{it[1]} + versions = ch_versions // channel: [ versions.yml ] +} diff --git a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/meta.yml b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/meta.yml new file mode 100644 index 000000000..6f92f56a0 --- /dev/null +++ b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/meta.yml @@ -0,0 +1,132 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "fastq_qc_trim_filter_setstrandedness" +description: Basic FASTQ preprocessing for RNA-seq +keywords: + - fastq + - rnaseq + - rrna + - trimming + - subsample + - strandedness +components: + - bbmap/bbsplit + - samtools/sort + - samtools/index + - cat + - cat/fastq + - sortmerna + - fastq_subsample_fq_salmon + - fastq_fastqc_umitools_trimgalore + - fastq_fastqc_umitools_fastp +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test' ] + - ch_reads: + type: file + description: | + Channel with input FastQ files of size 1 and 2 for single-end and + paired-end data, respectively. + - ch_fasta: + type: file + description: Channel with genome sequence in fasta format + - ch_transcript_fasta: + type: file + description: Channel with transcriptome sequence in fasta format + - ch_gtf: + type: file + description: Channel with features in GTF format + - ch_salmon_index: + type: file + description: Directory containing Salmon index + - ch_sortmerna_index: + type: file + description: Directory containing sortmerna index + - ch_bbsplit_index: + type: file + description: Path to directory or tar.gz archive for pre-built BBSplit index + - ch_rrna_fastas: + type: file + description: | + Channel containing one or more FASTA files containing rRNA sequences + for use with SortMeRNA + - skip_bbsplit: + type: boolean + description: Whether to skip BBSplit for removal of non-reference genome reads + - skip_fastqc: + type: boolean + description: Whether to skip FastQC + - skip_trimming: + type: boolean + description: Whether to skip trimming + - skip_umi_extract: + type: boolean + description: | + Skip the UMI extraction from the read in case the UMIs have been moved + to the headers in advance of the pipeline run + - make_salmon_index: + type: boolean + description: Whether to create salmon index before running salmon quant + - make_sortmerna_index: + type: boolean + description: Whether to create sortmerna index before running sortmerna + - trimmer: + type: string + description: | + Specifies the trimming tool to use - available options are 'trimgalore' + and 'fastp' + - min_trimmed_reads: + type: integer + description: | + Minimum number of trimmed reads below which samples are removed from + further processing + - save_trimmed: + type: boolean + description: Save the trimmed FastQ files in the results directory? + - remove_ribo_rna: + type: boolean + description: Enable the removal of reads derived from ribosomal RNA using SortMeRNA? + - with_umi: + type: boolean + description: Enable UMI-based read deduplication + - umi_discard_read: + type: integer + description: | + After UMI barcode extraction discard either R1 or R2 by setting this + parameter to 1 or 2, respectively + - stranded_threshold: + type: float + min: 0.5 + description: | + The fraction of stranded reads that must be assigned to a strandedness + for confident assignment. Must be at least 0.5. + - unstranded_threshold: + type: float + description: | + The difference in fraction of stranded reads assigned to 'forward' and + 'reverse' below which a sample is classified as 'unstranded'. + +output: + - reads: + type: file + description: Preprocessed fastq reads + pattern: "*.{fq,fastq}{,.gz}" + - multiqc_files: + type: file + description: MultiQC-compatible output files from tools used in prepreocessing + pattern: "*" + - trim_read_count: + type: integer + description: Number of reads remaining after trimming for all input samples + - versions: + type: file + description: | + File containing software versions + Structure: [ path(versions.yml) ] + pattern: "versions.yml" +authors: + - "@pinin4fjords" +maintainers: + - "@pinin4fjords" diff --git a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.function.nf.test b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.function.nf.test new file mode 100644 index 000000000..57fcd302b --- /dev/null +++ b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.function.nf.test @@ -0,0 +1,118 @@ +nextflow_function { + + name "Test Functions" + script "../main.nf" + + // + // Test function for deriving strandedness from Salmon numbers + // + + test("Test Function getSalmonInferredStrandedness unstranded") { + + function "getSalmonInferredStrandedness" + + when { + function { + """ + import groovy.json.JsonOutput + + // Define the JSON contents for the test + def json_contents = JsonOutput.toJson([ + "SF": 0, + "SR": 0, + "ISF": 100, + "ISR": 100, + "IU": 0, + "U": 0 + ]) + def jsonFile = file("${workDir}/salmonUnstranded.json") + jsonFile.write(json_contents) + + input[0] = jsonFile + input[1] = 0.8 + input[2] = 0.1 + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function getSalmonInferredStrandedness forward") { + + function "getSalmonInferredStrandedness" + + when { + function { + """ + import groovy.json.JsonOutput + + def json_contents = JsonOutput.toJson([ + "SF": 0, + "SR": 0, + "ISF": 100, + "ISR": 0, + "IU": 0, + "U": 0 + ]) + def jsonFile = file("${workDir}/salmonForward.json") + jsonFile.write(json_contents) + + input[0] = jsonFile + input[1] = 0.8 + input[2] = 0.1 + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function getSalmonInferredStrandedness reverse") { + + function "getSalmonInferredStrandedness" + + when { + function { + """ + import groovy.json.JsonOutput + + def json_contents = JsonOutput.toJson([ + "SF": 0, + "SR": 0, + "ISF": 0, + "ISR": 100, + "IU": 0, + "U": 0 + ]) + def jsonFile = file("${workDir}/salmonReverse.json") + jsonFile.write(json_contents) + + input[0] = jsonFile + input[1] = 0.8 + input[2] = 0.1 + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } +} diff --git a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.function.nf.test.snap b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.function.nf.test.snap new file mode 100644 index 000000000..4b4e2e874 --- /dev/null +++ b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.function.nf.test.snap @@ -0,0 +1,47 @@ +{ + "Test Function getSalmonInferredStrandedness forward": { + "content": [ + { + "inferred_strandedness": "forward", + "forwardFragments": 100.0, + "reverseFragments": 0.0, + "unstrandedFragments": 0.0 + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-17T10:28:59.284820592" + }, + "Test Function getSalmonInferredStrandedness unstranded": { + "content": [ + { + "inferred_strandedness": "unstranded", + "forwardFragments": 50.0, + "reverseFragments": 50.0, + "unstrandedFragments": 0.0 + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-17T10:28:47.514036696" + }, + "Test Function getSalmonInferredStrandedness reverse": { + "content": [ + { + "inferred_strandedness": "reverse", + "forwardFragments": 0.0, + "reverseFragments": 100.0, + "unstrandedFragments": 0.0 + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-17T10:29:11.43961965" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test new file mode 100644 index 000000000..c752e176c --- /dev/null +++ b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test @@ -0,0 +1,120 @@ +nextflow_workflow { + + name "Test Subworkflow FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS" + script "../main.nf" + workflow "FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS" + config "./nextflow.config" + + test("homo_sapiens paired-end [fastq] fastp") { + + when { + workflow { + """ + ch_reads = Channel.of([ + [ id:'test', single_end:false, strandedness:'auto' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + + input[0] = ch_reads + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)) // ch_fasta + input[2] = Channel.of(file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/transcriptome.fasta", checkIfExists: true)) // ch_transcript_fasta + input[3] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)) // ch_gtf + input[4] = [] // ch_salmon_index + input[5] = [] // ch_sortmerna_index + input[6] = [] // ch_bbsplit_index + input[7] = Channel.of(file('https://raw.githubusercontent.com/biocore/sortmerna/v4.3.4/data/rRNA_databases/rfam-5.8s-database-id98.fasta', checkIfExists: true)) // ch_rrna_fastas + input[8] = true // skip_bbsplit + input[9] = false // skip_fastqc + input[10] = false // skip_trimming + input[11] = true // skip_umi_extract + input[12] = true // make_salmon_index + input[13] = true // make_sortmerna_index + input[14] = 'fastp' // trimmer + input[15] = 10 // min_trimmed_reads + input[16] = true // save_trimmed + input[17] = true // remove_ribo_rna + input[18] = false // with_umi + input[19] = 0 // umi_discard_read + input[20] = 0.8 // stranded_threshold + input[21] = 0.1 // unstranded_threshold + """ + } + } + + then { + def pelines1 = path(workflow.out.reads[0][1][0]).linesGzip + def pelines2 = path(workflow.out.reads[0][1][1]).linesGzip + assertAll( + { assert workflow.success}, + { assert snapshot(pelines1).md5().match("fastp_test_pe_reads_1_lines") }, + { assert snapshot(pelines1.size()).match("fastp_test_pe_reads_1_size") }, + { assert snapshot(pelines2).md5().match("fastp_test_pe_reads_2_lines") }, + { assert snapshot(pelines2.size()).match("fastp_test_pe_reads_2_size") }, + { assert snapshot(workflow.out.trim_read_count).match("fastp_read_count") } + // This doesn't work- 'cat' changes between Conda and Docker - + // leaving it here until we find a way to address that + // { assert snapshot(workflow.out.versions).match("fastp_versions") } + ) + } + } + test("homo_sapiens paired-end [fastq] trimgalore") { + + when { + workflow { + """ + ch_reads = Channel.of([ + [ id:'test', single_end:false, strandedness:'auto' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz', checkIfExists: true) + ] + ]) + + input[0] = ch_reads + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)) // ch_fasta + input[2] = Channel.of(file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/transcriptome.fasta", checkIfExists: true)) // ch_transcript_fasta + input[3] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)) // ch_gtf + input[4] = [] // ch_salmon_index + input[5] = [] // ch_sortmerna_index + input[6] = [] // ch_bbsplit_index + input[7] = Channel.of(file('https://raw.githubusercontent.com/biocore/sortmerna/v4.3.4/data/rRNA_databases/rfam-5.8s-database-id98.fasta', checkIfExists: true)) // ch_rrna_fastas + input[8] = true // skip_bbsplit + input[9] = false // skip_fastqc + input[10] = false // skip_trimming + input[11] = true // skip_umi_extract + input[12] = true // make_salmon_index + input[13] = true // make_sortmerna_index + input[14] = 'fastp' // trimmer + input[15] = 10 // min_trimmed_reads + input[16] = true // save_trimmed + input[17] = true // remove_ribo_rna + input[18] = false // with_umi + input[19] = 0 // umi_discard_read + input[20] = 0.8 // stranded_threshold + input[21] = 0.1 // unstranded_threshold + """ + } + } + + then { + def pelines1 = path(workflow.out.reads[0][1][0]).linesGzip + def pelines2 = path(workflow.out.reads[0][1][1]).linesGzip + assertAll( + { assert workflow.success}, + { assert snapshot(pelines1).md5().match("trimgalore_test_pe_reads_1_lines") }, + { assert snapshot(pelines1.size()).match("trimgalore_test_pe_reads_1_size") }, + { assert snapshot(pelines2).md5().match("trimgalore_test_pe_reads_2_lines") }, + { assert snapshot(pelines2.size()).match("trimgalore_test_pe_reads_2_size") }, + { assert snapshot(workflow.out.trim_read_count).match("trimgalore_read_count") } + // This doesn't work- 'cat' changes between Conda and Docker - + // leaving it here until we find a way to address that + //{ assert snapshot(workflow.out.versions).match("trimgalore_versions") } + ) + } + } + + +} diff --git a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test.snap new file mode 100644 index 000000000..985349317 --- /dev/null +++ b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test.snap @@ -0,0 +1,112 @@ +{ + "fastp_read_count": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "auto" + }, + 3022 + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-17T10:24:00.044553245" + }, + "trimgalore_test_pe_reads_2_lines": { + "content": "eccf3e9e74589ff01c77fce7f4548e41", + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-17T10:24:26.838793051" + }, + "fastp_test_pe_reads_1_size": { + "content": [ + 4508 + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-17T10:23:59.889337984" + }, + "trimgalore_test_pe_reads_1_size": { + "content": [ + 4508 + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-17T10:24:26.778599725" + }, + "trimgalore_test_pe_reads_1_lines": { + "content": "3868fc1caf09367141d2bbf47e158823", + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-17T10:24:26.774975135" + }, + "fastp_test_pe_reads_2_lines": { + "content": "eccf3e9e74589ff01c77fce7f4548e41", + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-17T10:23:59.997625278" + }, + "fastp_test_pe_reads_2_size": { + "content": [ + 4508 + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-17T10:24:00.042449965" + }, + "trimgalore_test_pe_reads_2_size": { + "content": [ + 4508 + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-17T10:24:26.841434261" + }, + "fastp_test_pe_reads_1_lines": { + "content": "3868fc1caf09367141d2bbf47e158823", + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-17T10:23:59.882844295" + }, + "trimgalore_read_count": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false, + "strandedness": "auto" + }, + 3022 + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-17T10:24:26.84402498" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/nextflow.config b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/nextflow.config new file mode 100644 index 000000000..9e33e4b33 --- /dev/null +++ b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/nextflow.config @@ -0,0 +1,27 @@ +// +// Read subsampling and strand inferring options +// + +process { + withName: 'FQ_SUBSAMPLE' { + ext.args = '--record-count 1000000 --seed 1' + ext.prefix = { "${meta.id}.subsampled" } + publishDir = [ + enabled: false + ] + } + + withName: '.*:FASTQ_SUBSAMPLE_FQ_SALMON:SALMON_QUANT' { + ext.args = '--skipQuant --minAssignedFrags 1' + publishDir = [ + enabled: false + ] + } + withName: 'SORTMERNA' { + ext.args = '--index 0' + } + withName: 'SORTMERNA_INDEX' { + ext.args = '--index 1' + } +} + diff --git a/subworkflows/nf-core/fastq_subsample_fq_salmon/main.nf b/subworkflows/nf-core/fastq_subsample_fq_salmon/main.nf index 0ac3e53a3..bac581cfa 100644 --- a/subworkflows/nf-core/fastq_subsample_fq_salmon/main.nf +++ b/subworkflows/nf-core/fastq_subsample_fq_salmon/main.nf @@ -43,12 +43,13 @@ workflow FASTQ_SUBSAMPLE_FQ_SALMON { ch_versions = ch_versions.mix(SALMON_QUANT.out.versions.first()) emit: - index = ch_index // channel: [ index ] + index = ch_index // channel: [ index ] - reads = FQ_SUBSAMPLE.out.fastq // channel: [ val(meta), fastq ] + reads = FQ_SUBSAMPLE.out.fastq // channel: [ val(meta), fastq ] - results = SALMON_QUANT.out.results // channel: [ val(meta), results_dir ] - json_info = SALMON_QUANT.out.json_info // channel: [ val(meta), json_info + results = SALMON_QUANT.out.results // channel: [ val(meta), results_dir ] + json_info = SALMON_QUANT.out.json_info // channel: [ val(meta), json_info + lib_format_counts = SALMON_QUANT.out.lib_format_counts // channel: [ val(meta), json_info - versions = ch_versions // channel: [ versions.yml ] + versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/fastq_subsample_fq_salmon/meta.yml b/subworkflows/nf-core/fastq_subsample_fq_salmon/meta.yml index d144269ba..7e2f10966 100644 --- a/subworkflows/nf-core/fastq_subsample_fq_salmon/meta.yml +++ b/subworkflows/nf-core/fastq_subsample_fq_salmon/meta.yml @@ -39,7 +39,6 @@ input: - make_index: type: boolean description: Whether to create salmon index before running salmon quant - output: - index: type: directory @@ -66,3 +65,6 @@ output: authors: - "@robsyme" - "@drpatelh" +maintainers: + - "@robsyme" + - "@drpatelh" diff --git a/subworkflows/nf-core/fastq_subsample_fq_salmon/nextflow.config b/subworkflows/nf-core/fastq_subsample_fq_salmon/nextflow.config new file mode 100644 index 000000000..36a8c5d7a --- /dev/null +++ b/subworkflows/nf-core/fastq_subsample_fq_salmon/nextflow.config @@ -0,0 +1,16 @@ +process { + withName: '.*:FASTQ_SUBSAMPLE_FQ_SALMON:FQ_SUBSAMPLE' { + ext.args = '--record-count 1000000 --seed 1' + ext.prefix = { "${meta.id}.subsampled" } + publishDir = [ + enabled: false + ] + } + + withName: '.*:FASTQ_SUBSAMPLE_FQ_SALMON:SALMON_QUANT' { + ext.args = '--skipQuant' + publishDir = [ + enabled: false + ] + } +} diff --git a/subworkflows/nf-core/fastq_subsample_fq_salmon/tests/main.nf.test b/subworkflows/nf-core/fastq_subsample_fq_salmon/tests/main.nf.test new file mode 100644 index 000000000..077d9c758 --- /dev/null +++ b/subworkflows/nf-core/fastq_subsample_fq_salmon/tests/main.nf.test @@ -0,0 +1,104 @@ +nextflow_workflow { + + name "Test Workflow FASTQ_SUBSAMPLE_FQ_SALMON" + script "../main.nf" + workflow "FASTQ_SUBSAMPLE_FQ_SALMON" + config "./nextflow.config" + + test("homo_sapiens paired-end [fastq]") { + + setup { + run("SALMON_INDEX") { + script "../../../../modules/nf-core/salmon/index/main.nf" + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)) // genome_fasta + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/transcriptome.fasta', checkIfExists: true)) // transcriptome_fasta + """ + } + } + } + + when { + workflow { + """ + make_index = false + + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)) // genome_fasta + input[2] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/transcriptome.fasta', checkIfExists: true)) // transcriptome_fasta + input[3] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)) // genome_gtf + input[4] = SALMON_INDEX.out.index + input[5] = make_index + """ + } + } + + then { + def readlines1 = path(workflow.out.reads[0][1][0]).linesGzip + def readlines2 = path(workflow.out.reads[0][1][1]).linesGzip + assertAll( + { assert workflow.success }, + { assert workflow.out.index }, + { assert workflow.out.json_info }, + { assert workflow.out.results }, + { assert snapshot( + readlines1[0..5], + readlines1.size(), + readlines2[0..5], + readlines2.size(), + workflow.out.lib_format_counts, + workflow.out.versions).match() } + ) + } + } + + test("homo_sapiens paired-end [fastq] - stub") { + + options "-stub" + + setup { + run("SALMON_INDEX") { + script "../../../../modules/nf-core/salmon/index/main.nf" + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)) // genome_fasta + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/transcriptome.fasta', checkIfExists: true)) // transcriptome_fasta + """ + } + } + } + + when { + workflow { + """ + make_index = false + + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + ]) + input[1] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)) // genome_fasta + input[2] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/transcriptome.fasta', checkIfExists: true)) // transcriptome_fasta + input[3] = Channel.of(file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true)) // genome_gtf + input[4] = SALMON_INDEX.out.index + input[5] = make_index + """ + } + } + + then { + def readlines1 = path(workflow.out.reads[0][1][0]).linesGzip + def readlines2 = path(workflow.out.reads[0][1][1]).linesGzip + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/fastq_subsample_fq_salmon/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_subsample_fq_salmon/tests/main.nf.test.snap new file mode 100644 index 000000000..e0c944f31 --- /dev/null +++ b/subworkflows/nf-core/fastq_subsample_fq_salmon/tests/main.nf.test.snap @@ -0,0 +1,181 @@ +{ + "homo_sapiens paired-end [fastq]": { + "content": [ + [ + "@normal#21#998579#1/1", + "CCTTCTCCCTGCTGGGGTTGCTTGTCAGTAGCGGGCAAGGTAGGAGTGTGGCGCTTTATTGCATTTACTTTCCCTCCCCCTTCCCCCCGGCCAAGAGAGG", + "+", + "102302000331;3333;23133320233330*33/233333333333333/313232333/3;3;3/333000;11/00;;01//103*1032323233", + "@normal#21#998572#2/1", + "CTCCTCTCCTTCTACCTGCTGGGGTTGCTTGTCAGTAGCGGGCAAGGTCGGAGTGTTGCGCTTTATTGCATTTACTTTCCCTCCCCCTTCCACCCGGCCA" + ], + 1066944, + [ + "@normal#21#998579#1/2", + "AAAAAAAAAGAAGAAGCAGAAGCTGTTTCCCTGGATATCCTGCTCACCGATTCCCCTCTCCAATTCTGTATTTTCCCTTCTCTTATTTAAGGGTCTCCAC", + "+", + "023333233332333310333302333211/3333;0300;*/;000/32;201003031/22;21333032;;11/23030322;2332333313/030", + "@normal#21#998572#2/2", + "TTCCCCTCTCCAATTGAGTATTTTCCCTTCTCTTATTTAAGGGTCTCCACACAAACAGATACAATTTTAGGGACAGCTAGGAGAAAGAACGAAAATAATAA" + ], + 1066944, + [ + [ + { + "id": "test", + "single_end": false + }, + "test_lib_format_counts.json:md5,0b0e2dc090e5ad88f9a9d6dbe9c3e4a0" + ] + ], + [ + "versions.yml:md5,12c0d1f67c2afb97470ae0974e5e01bb", + "versions.yml:md5,885fde9e7beac002b3a17b66b92db4bd" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T15:08:35.832206" + }, + "homo_sapiens paired-end [fastq] - stub": { + "content": [ + { + "0": [ + [ + "complete_ref_lens.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "ctable.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "ctg_offsets.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "duplicate_clusters.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "info.json:md5,d41d8cd98f00b204e9800998ecf8427e", + "mphf.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "pos.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "pre_indexing.log:md5,d41d8cd98f00b204e9800998ecf8427e", + "rank.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "refAccumLengths.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "ref_indexing.log:md5,d41d8cd98f00b204e9800998ecf8427e", + "reflengths.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "refseq.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "seq.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "versionInfo.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + [ + + ] + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test_meta_info.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test_lib_format_counts.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + "versions.yml:md5,12c0d1f67c2afb97470ae0974e5e01bb", + "versions.yml:md5,885fde9e7beac002b3a17b66b92db4bd" + ], + "index": [ + [ + "complete_ref_lens.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "ctable.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "ctg_offsets.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "duplicate_clusters.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "info.json:md5,d41d8cd98f00b204e9800998ecf8427e", + "mphf.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "pos.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "pre_indexing.log:md5,d41d8cd98f00b204e9800998ecf8427e", + "rank.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "refAccumLengths.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "ref_indexing.log:md5,d41d8cd98f00b204e9800998ecf8427e", + "reflengths.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "refseq.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "seq.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "versionInfo.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "json_info": [ + [ + { + "id": "test", + "single_end": false + }, + "test_meta_info.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "lib_format_counts": [ + [ + { + "id": "test", + "single_end": false + }, + "test_lib_format_counts.json:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_R1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + "results": [ + [ + { + "id": "test", + "single_end": false + }, + [ + + ] + ] + ], + "versions": [ + "versions.yml:md5,12c0d1f67c2afb97470ae0974e5e01bb", + "versions.yml:md5,885fde9e7beac002b3a17b66b92db4bd" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T15:08:56.819" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_subsample_fq_salmon/tests/nextflow.config b/subworkflows/nf-core/fastq_subsample_fq_salmon/tests/nextflow.config new file mode 100644 index 000000000..7fc4d632b --- /dev/null +++ b/subworkflows/nf-core/fastq_subsample_fq_salmon/tests/nextflow.config @@ -0,0 +1,9 @@ +process { + + publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" } + + withName: FQ_SUBSAMPLE { + ext.args = '--record-count 1000000 --seed 1' + } + +} diff --git a/subworkflows/nf-core/quantify_pseudo_alignment/main.nf b/subworkflows/nf-core/quantify_pseudo_alignment/main.nf new file mode 100644 index 000000000..b245b9bad --- /dev/null +++ b/subworkflows/nf-core/quantify_pseudo_alignment/main.nf @@ -0,0 +1,123 @@ +// +// Pseudoalignment and quantification with Salmon or Kallisto +// + +include { SALMON_QUANT } from '../../../modules/nf-core/salmon/quant' +include { KALLISTO_QUANT } from '../../../modules/nf-core/kallisto/quant' +include { CUSTOM_TX2GENE } from '../../../modules/nf-core/custom/tx2gene' +include { TXIMETA_TXIMPORT } from '../../../modules/nf-core/tximeta/tximport' + +include { SUMMARIZEDEXPERIMENT_SUMMARIZEDEXPERIMENT as SE_GENE } from '../../../modules/nf-core/summarizedexperiment/summarizedexperiment' +include { SUMMARIZEDEXPERIMENT_SUMMARIZEDEXPERIMENT as SE_GENE_LENGTH_SCALED } from '../../../modules/nf-core/summarizedexperiment/summarizedexperiment' +include { SUMMARIZEDEXPERIMENT_SUMMARIZEDEXPERIMENT as SE_GENE_SCALED } from '../../../modules/nf-core/summarizedexperiment/summarizedexperiment' +include { SUMMARIZEDEXPERIMENT_SUMMARIZEDEXPERIMENT as SE_TRANSCRIPT } from '../../../modules/nf-core/summarizedexperiment/summarizedexperiment' + +workflow QUANTIFY_PSEUDO_ALIGNMENT { + take: + samplesheet // channel: [ val(meta), /path/to/samplsheet ] + reads // channel: [ val(meta), [ reads ] ] + index // channel: /path/to//index/ + transcript_fasta // channel: /path/to/transcript.fasta + gtf // channel: /path/to/genome.gtf + gtf_id_attribute // val: GTF gene ID attribute + gtf_extra_attribute // val: GTF alternative gene attribute (e.g. gene_name) + pseudo_aligner // val: kallisto or salmon + alignment_mode // bool: Run Salmon in alignment mode + lib_type // val: String to override Salmon library type + kallisto_quant_fraglen // val: Estimated fragment length required by Kallisto in single-end mode + kallisto_quant_fraglen_sd // val: Estimated standard error for fragment length required by Kallisto in single-end mode + + main: + ch_versions = Channel.empty() + + // + // Quantify and merge counts across samples + // + // NOTE: MultiQC needs Salmon outputs, but Kallisto logs + if (pseudo_aligner == 'salmon') { + SALMON_QUANT ( + reads, + index, + gtf, + transcript_fasta, + alignment_mode, + lib_type + ) + ch_pseudo_results = SALMON_QUANT.out.results + ch_pseudo_multiqc = ch_pseudo_results + ch_versions = ch_versions.mix(SALMON_QUANT.out.versions.first()) + } else { + KALLISTO_QUANT ( + reads, + index, + gtf, + [], + kallisto_quant_fraglen, + kallisto_quant_fraglen_sd + ) + ch_pseudo_results = KALLISTO_QUANT.out.results + ch_pseudo_multiqc = KALLISTO_QUANT.out.log + ch_versions = ch_versions.mix(KALLISTO_QUANT.out.versions.first()) + } + + CUSTOM_TX2GENE ( + gtf.map { [ [:], it ] }, + ch_pseudo_results.collect{ it[1] }.map { [ [:], it ] }, + pseudo_aligner, + gtf_id_attribute, + gtf_extra_attribute + ) + ch_versions = ch_versions.mix(CUSTOM_TX2GENE.out.versions) + + TXIMETA_TXIMPORT ( + ch_pseudo_results.collect{ it[1] }.map { [ ['id': 'all_samples'], it ] }, + CUSTOM_TX2GENE.out.tx2gene, + pseudo_aligner + ) + ch_versions = ch_versions.mix(TXIMETA_TXIMPORT.out.versions) + + SE_GENE ( + TXIMETA_TXIMPORT.out.counts_gene.concat(TXIMETA_TXIMPORT.out.tpm_gene).groupTuple(), + CUSTOM_TX2GENE.out.tx2gene, + samplesheet + ) + ch_versions = ch_versions.mix(SE_GENE.out.versions) + + SE_GENE_LENGTH_SCALED ( + TXIMETA_TXIMPORT.out.counts_gene_length_scaled.concat(TXIMETA_TXIMPORT.out.tpm_gene).groupTuple(), + CUSTOM_TX2GENE.out.tx2gene, + samplesheet + ) + + SE_GENE_SCALED ( + TXIMETA_TXIMPORT.out.counts_gene_scaled.concat(TXIMETA_TXIMPORT.out.tpm_gene).groupTuple(), + CUSTOM_TX2GENE.out.tx2gene, + samplesheet + ) + + SE_TRANSCRIPT ( + TXIMETA_TXIMPORT.out.counts_transcript.concat(TXIMETA_TXIMPORT.out.tpm_transcript).groupTuple(), + CUSTOM_TX2GENE.out.tx2gene, + samplesheet + ) + + emit: + results = ch_pseudo_results // channel: [ val(meta), results_dir ] + multiqc = ch_pseudo_multiqc // channel: [ val(meta), files_for_multiqc ] + + tpm_gene = TXIMETA_TXIMPORT.out.tpm_gene // path: *gene_tpm.tsv + counts_gene = TXIMETA_TXIMPORT.out.counts_gene // path: *gene_counts.tsv + lengths_gene = TXIMETA_TXIMPORT.out.lengths_gene // path: *gene_lengths.tsv + counts_gene_length_scaled = TXIMETA_TXIMPORT.out.counts_gene_length_scaled // path: *gene_counts_length_scaled.tsv + counts_gene_scaled = TXIMETA_TXIMPORT.out.counts_gene_scaled // path: *gene_counts_scaled.tsv + tpm_transcript = TXIMETA_TXIMPORT.out.tpm_transcript // path: *gene_tpm.tsv + counts_transcript = TXIMETA_TXIMPORT.out.counts_transcript // path: *transcript_counts.tsv + lengths_transcript = TXIMETA_TXIMPORT.out.lengths_transcript // path: *transcript_lengths.tsv + + merged_gene_rds = SE_GENE.out.rds // path: *.rds + merged_gene_rds_length_scaled = SE_GENE_LENGTH_SCALED.out.rds // path: *.rds + merged_gene_rds_scaled = SE_GENE_SCALED.out.rds // path: *.rds + merged_transcript_rds = SE_TRANSCRIPT.out.rds // path: *.rds + + versions = ch_versions // channel: [ versions.yml ] +} diff --git a/subworkflows/nf-core/quantify_pseudo_alignment/meta.yml b/subworkflows/nf-core/quantify_pseudo_alignment/meta.yml new file mode 100644 index 000000000..419bd3cc3 --- /dev/null +++ b/subworkflows/nf-core/quantify_pseudo_alignment/meta.yml @@ -0,0 +1,174 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "quantify_pseudo_alignment" +description: Perform quantification with Salmon or Kallisto to produce count tables and SummarizedExperiment objects +keywords: + - rnaseq + - quantification + - kallisto + - salmon +components: + - custom/tx2gene + - kallisto/quant + - salmon/quant + - summarizedexperiment/summarizedexperiment + - tximeta/tximport +input: + - meta: + type: map + description: | + Groovy Map containing study-level sample sheet information. e.g. [ + id:'SRP1234' ]. + - samplesheet: + type: file + description: | + Sample sheet, to be baked into the `colData` of summarizedexperiment + objects. + pattern: "*.{csv,tsv}" + - reads: + type: file + description: | + Channel with input FastQ files of size 1 and 2 for single-end and + paired-end data, respectively. OR a transcriptome-level BAM file if + running Salmon in alignment mode. + - index: + type: path + description: | + Path to Salmon or Kallisto index in the tool-appropriate form. + - gtf: + type: file + description: | + Channel with features in GTF format. Passed to pseudoaligners and used + to generate transcript/ gene mappings. + - gtf_id_attribute: + type: string + description: | + Attribute in GTF file corresponding to the gene identifier. + - gtf_extra_attribute: + type: string + description: GTF alternative gene attribute (e.g. gene_name) + - pseudo_aligner: + type: string + description: Pseudoaligner, `kallisto` or `salmon`. + - alignment_mode: + type: boolean + description: | + If running Salmon, run in alignment mode (`true` or `false`). + - lib_type: + type: string + description: String to override Salmon library type. + - kallisto_quant_fraglen: + type: integer + description: | + Estimated fragment length. Required if running Kallisto with + single-ended reads. + - kallisto_quant_fraglen_sd: + type: integer + description: | + Estimated standard error for fragment length required by Kallisto in + single-end mode. + +output: + - meta: + type: map + description: | + Groovy Map containing study-level sample sheet information. e.g. [ + id:'SRP1234' ]. + - results: + type: file + description: | + Channel containing sample-wise results directories from the + pseudoaligner. + - multiqc: + type: file + description: | + Channel containing those pseudoaligner outputs readable by MultiQC for + passing to workflow-level reporting. + - tpm_gene: + type: file + description: | + Gene-level matrix of abundance values in TPM. + pattern: "*.gene_tpm.tsv" + - counts_gene: + type: file + description: | + Gene-level matrix of unadjusted estimated counts from tximport + (`countsFromAbundance = 'no'`). + pattern: "*.gene_counts.tsv" + - lengths_gene: + type: file + description: | + Gene-level matrix of length values for modelling in downstream + analysis. + pattern: "gene_lengths.tsv" + - counts_gene_length_scaled: + type: file + description: | + Gene-level matrix of estimated counts, generated from abundance (TPM) + values by scaling to library size, additionally scaled using the + average transcript length, averaged over samples and to library size, + using tximport `countsFromAbundance = 'lengthScaledTPM'`. + pattern: "*.gene_counts_length_scaled.tsv" + - counts_gene_scaled: + type: file + description: | + Gene-level matrix of estimated counts, generated from abundance (TPM) + values by scaling to library size with tximport `countsFromAbundance = + 'scaledTPM'`. + pattern: "*.gene_counts_length_scaled.tsv" + - tpm_transcript: + type: file + description: | + Transcript-level matrix of abundance values in TPM. + pattern: "*.transcript_tpm.tsv" + - counts_transcript: + type: file + description: | + Transcript-level matrix of unadjusted estimated counts from tximport + (`countsFromAbundance = 'no'`). + pattern: "*.transcript_counts.tsv" + - lengths_transcript: + type: file + description: | + Transcript-level matrix of length values for modelling in downstream + analysis. + pattern: "transcript_lengths.tsv" + - merged_gene_rds: + type: file + description: | + Serialised SummarizedExperiment object containing gene level TPM + abundance values and counts generated from tximport with + `countsFromAbundance = 'no'`. + pattern: "*.rds" + - merged_gene_rds_length_scaled: + type: file + description: | + Serialised SummarizedExperiment object containing gene level TPM + abundance values and counts generated from tximport with + `countsFromAbundance='lengthScaledTPM'`. + pattern: "*.rds" + - merged_gene_rds_scaled: + type: file + description: | + Serialised SummarizedExperiment object containing gene level TPM + abundance values and counts generated from tximport with + `countsFromAbundance='scaledTPM'`. + pattern: "*.rds" + - merged_transcript_rds: + type: file + description: | + Serialised SummarizedExperiment object containing transcript level TPM + abundance values and counts generated from tximport with + `countsFromAbundance = 'no'`. + pattern: "*.rds" + - versions: + type: file + description: | + File containing software versions + Structure: [ path(versions.yml) ] + pattern: "versions.yml" +authors: + - "@pinin4fjords" + - "@adamrtalbot" +maintainers: + - "@pinin4fjords" + - "@adamrtalbot" diff --git a/subworkflows/nf-core/quantify_pseudo_alignment/nextflow.config b/subworkflows/nf-core/quantify_pseudo_alignment/nextflow.config new file mode 100644 index 000000000..adf881967 --- /dev/null +++ b/subworkflows/nf-core/quantify_pseudo_alignment/nextflow.config @@ -0,0 +1,67 @@ +if (!params.skip_pseudo_alignment && params.pseudo_aligner == 'salmon') { + process { + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:SALMON_QUANT' { + ext.args = { params.extra_salmon_quant_args ?: '' } + publishDir = [ + path: { "${params.outdir}/${params.pseudo_aligner}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') || filename.endsWith('_meta_info.json') || filename.endsWith('_format_counts.json') ? null : filename } + ] + } + } +} + +if (!params.skip_pseudo_alignment && params.pseudo_aligner == 'kallisto') { + process { + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:KALLISTO_QUANT' { + ext.args = params.extra_kallisto_quant_args ?: '' + publishDir = [ + path: { "${params.outdir}/${params.pseudo_aligner}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') || filename.endsWith('.run_info.json') || filename.endsWith('.log') ? null : filename } + ] + } + } +} + +if (!params.skip_pseudo_alignment && params.pseudo_aligner) { + process { + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:CUSTOM_TX2GENE' { + publishDir = [ + path: { "${params.outdir}/${params.pseudo_aligner}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:TXIMETA_TXIMPORT' { + ext.prefix = { "${quant_type}.merged" } + publishDir = [ + path: { "${params.outdir}/${params.pseudo_aligner}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:SE_.*' { + ext.args = '--assay_names counts,abundance' + publishDir = [ + path: { "${params.outdir}/${params.pseudo_aligner}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') || filename.endsWith('.log') ? null : filename } + ] + } + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:SE_GENE' { + ext.prefix = { "${params.pseudo_aligner}.merged.gene_counts" } + } + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:SE_GENE_SCALED' { + ext.prefix = { "${params.pseudo_aligner}.merged.gene_counts_scaled" } + } + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:SE_GENE_LENGTH_SCALED' { + ext.prefix = { "${params.pseudo_aligner}.merged.gene_counts_length_scaled" } + } + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:SE_TRANSCRIPT' { + ext.prefix = { "${params.pseudo_aligner}.merged.transcript_counts" } + } + } +} diff --git a/subworkflows/nf-core/quantify_pseudo_alignment/tests/main.nf.test b/subworkflows/nf-core/quantify_pseudo_alignment/tests/main.nf.test new file mode 100644 index 000000000..d0a59629e --- /dev/null +++ b/subworkflows/nf-core/quantify_pseudo_alignment/tests/main.nf.test @@ -0,0 +1,242 @@ +nextflow_workflow { + + name "Test Workflow QUANTIFY_PSEUDO_ALIGNMENT" + script "../main.nf" + workflow "QUANTIFY_PSEUDO_ALIGNMENT" + + test("salmon") { + + setup { + run("SALMON_INDEX") { + script "../../../../modules/nf-core/salmon/index/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/genome.fasta", checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/transcriptome.fasta", checkIfExists: true)]) + """ + } + } + } + + when { + workflow { + """ + input[0] = [ + [ id: 'samplesheet' ], + file(params.modules_testdata_base_path + '/genomics/sarscov2/illumina/csv/samplesheet_micro.csv', checkIfExists: true) + ] + input[1] = [ + [ id: 'test' ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[2] = SALMON_INDEX.out.index + input[3] = Channel.of(file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/transcriptome.fasta", checkIfExists: true)) + input[4] = Channel.of(file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/genome.gtf", checkIfExists: true)) + input[5] = 'gene_id' + input[6] = 'gene_name' + input[7] = 'salmon' + input[8] = false + input[9] = 'A' + input[10] = null + input[11] = null + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + file(workflow.out.merged_gene_rds[0][1]).name, + file(workflow.out.merged_gene_rds_length_scaled[0][1]).name, + file(workflow.out.merged_gene_rds_scaled[0][1]).name, + file(workflow.out.merged_transcript_rds[0][1]).name, + workflow.out.counts_gene, + workflow.out.counts_gene_length_scaled, + workflow.out.lengths_gene, + workflow.out.lengths_transcript, + workflow.out.merged_counts_transcript, + workflow.out.merged_tpm_transcript, + workflow.out.tpm_gene, + workflow.out.tpm_transcript, + workflow.out.versions + ).match() + } + ) + } + } + + test("kallisto") { + + setup { + run("KALLISTO_INDEX") { + script "../../../../modules/nf-core/kallisto/index/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'transcriptome' ], // meta map + file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/transcriptome.fasta", checkIfExists: true) + ]) + """ + } + } + } + + when { + workflow { + """ + input[0] = [ + [ id: 'samplesheet' ], + file(params.modules_testdata_base_path + '/genomics/sarscov2/illumina/csv/samplesheet_micro.csv', checkIfExists: true) + ] + input[1] = [ + [ id: 'test' ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[2] = KALLISTO_INDEX.out.index + input[3] = Channel.of(file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/transcriptome.fasta", checkIfExists: true)) + input[4] = Channel.of(file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/genome.gtf", checkIfExists: true)) + input[5] = 'gene_id' + input[6] = 'gene_name' + input[7] = 'kallisto' + input[8] = null + input[9] = null + input[10] = [] + input[11] = [] + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + file(workflow.out.merged_gene_rds[0][1]).name, + file(workflow.out.merged_gene_rds_length_scaled[0][1]).name, + file(workflow.out.merged_gene_rds_scaled[0][1]).name, + file(workflow.out.merged_transcript_rds[0][1]).name, + workflow.out.counts_gene, + workflow.out.counts_gene_length_scaled, + workflow.out.lengths_gene, + workflow.out.lengths_transcript, + workflow.out.tpm_gene, + workflow.out.tpm_transcript, + workflow.out.versions + ).match() + } + ) + } + } + + test("salmon - stub") { + + options "-stub" + + setup { + run("SALMON_INDEX") { + script "../../../../modules/nf-core/salmon/index/main.nf" + process { + """ + input[0] = Channel.of([file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/genome.fasta", checkIfExists: true)]) + input[1] = Channel.of([file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/transcriptome.fasta", checkIfExists: true)]) + """ + } + } + } + + when { + workflow { + """ + input[0] = [ + [ id: 'samplesheet' ], + file(params.modules_testdata_base_path + '/genomics/sarscov2/illumina/csv/samplesheet_micro.csv', checkIfExists: true) + ] + input[1] = [ + [ id: 'test' ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[2] = SALMON_INDEX.out.index + input[3] = Channel.of(file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/transcriptome.fasta", checkIfExists: true)) + input[4] = Channel.of(file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/genome.gtf", checkIfExists: true)) + input[5] = 'gene_id' + input[6] = 'gene_name' + input[7] = 'salmon' + input[8] = false + input[9] = 'A' + input[10] = null + input[11] = null + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match()} + ) + } + } + + test("kallisto - stub") { + + options "-stub" + + setup { + run("KALLISTO_INDEX") { + script "../../../../modules/nf-core/kallisto/index/main.nf" + process { + """ + input[0] = Channel.of([ + [ id:'transcriptome' ], // meta map + file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/transcriptome.fasta", checkIfExists: true) + ]) + """ + } + } + } + + when { + workflow { + """ + input[0] = [ + [ id: 'samplesheet' ], + file(params.modules_testdata_base_path + '/genomics/sarscov2/illumina/csv/samplesheet_micro.csv', checkIfExists: true) + ] + input[1] = [ + [ id: 'test' ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[2] = KALLISTO_INDEX.out.index + input[3] = Channel.of(file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/transcriptome.fasta", checkIfExists: true)) + input[4] = Channel.of(file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/genome.gtf", checkIfExists: true)) + input[5] = 'gene_id' + input[6] = 'gene_name' + input[7] = 'kallisto' + input[8] = null + input[9] = null + input[10] = [] + input[11] = [] + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match()} + ) + } + } +} diff --git a/subworkflows/nf-core/quantify_pseudo_alignment/tests/main.nf.test.snap b/subworkflows/nf-core/quantify_pseudo_alignment/tests/main.nf.test.snap new file mode 100644 index 000000000..4db35cced --- /dev/null +++ b/subworkflows/nf-core/quantify_pseudo_alignment/tests/main.nf.test.snap @@ -0,0 +1,644 @@ +{ + "kallisto": { + "content": [ + "all_samples.SummarizedExperiment.rds", + "all_samples.SummarizedExperiment.rds", + "all_samples.SummarizedExperiment.rds", + "all_samples.SummarizedExperiment.rds", + [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts.tsv:md5,4ba44e5ebc9ed0ca2ca008d10a1dddc3" + ] + ], + [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts_length_scaled.tsv:md5,078746568e3fd0c995559352b661b2d9" + ] + ], + [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_lengths.tsv:md5,b031192af7a8f64dcc887978a69fdbb7" + ] + ], + [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_lengths.tsv:md5,131952a97905469ab012f0f46e52405c" + ] + ], + [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_tpm.tsv:md5,23fa0c64cfbd198806b53897de791b8b" + ] + ], + [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_tpm.tsv:md5,de458e1c2a579e53bd7671c5176f5d0c" + ] + ], + [ + "versions.yml:md5,b44caeec65491d47e098c7ddaf024b96", + "versions.yml:md5,d5243289a32cde9e90e20f1a202bb566", + "versions.yml:md5,e9e7d18c3de83f1113fb1ff0c55d35ed", + "versions.yml:md5,ea39658f8685118d81d42acd451e66ea" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T15:36:19.861809" + }, + "salmon - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + [ + + ] + ] + ], + "1": [ + [ + { + "id": "test" + }, + [ + + ] + ] + ], + "10": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "14": [ + "versions.yml:md5,4c3564e1ba17d8ce2b0ee784251ddd87", + "versions.yml:md5,7afb76ee798ceb1e5dff5879d28ef85a", + "versions.yml:md5,d5243289a32cde9e90e20f1a202bb566", + "versions.yml:md5,e9e7d18c3de83f1113fb1ff0c55d35ed" + ], + "2": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_lengths.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts_length_scaled.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts_scaled.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_lengths.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "counts_gene": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "counts_gene_length_scaled": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts_length_scaled.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "counts_gene_scaled": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts_scaled.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "counts_transcript": [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "lengths_gene": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_lengths.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "lengths_transcript": [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_lengths.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "merged_gene_rds": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "merged_gene_rds_length_scaled": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "merged_gene_rds_scaled": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "merged_transcript_rds": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "multiqc": [ + [ + { + "id": "test" + }, + [ + + ] + ] + ], + "results": [ + [ + { + "id": "test" + }, + [ + + ] + ] + ], + "tpm_gene": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tpm_transcript": [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,4c3564e1ba17d8ce2b0ee784251ddd87", + "versions.yml:md5,7afb76ee798ceb1e5dff5879d28ef85a", + "versions.yml:md5,d5243289a32cde9e90e20f1a202bb566", + "versions.yml:md5,e9e7d18c3de83f1113fb1ff0c55d35ed" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T15:36:55.281379" + }, + "kallisto - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + [ + + ] + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "14": [ + "versions.yml:md5,7afb76ee798ceb1e5dff5879d28ef85a", + "versions.yml:md5,d5243289a32cde9e90e20f1a202bb566", + "versions.yml:md5,e9e7d18c3de83f1113fb1ff0c55d35ed", + "versions.yml:md5,ea39658f8685118d81d42acd451e66ea" + ], + "2": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_lengths.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts_length_scaled.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts_scaled.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_lengths.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "counts_gene": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "counts_gene_length_scaled": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts_length_scaled.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "counts_gene_scaled": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts_scaled.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "counts_transcript": [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "lengths_gene": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_lengths.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "lengths_transcript": [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_lengths.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "merged_gene_rds": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "merged_gene_rds_length_scaled": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "merged_gene_rds_scaled": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "merged_transcript_rds": [ + [ + { + "id": "all_samples" + }, + "all_samples.SummarizedExperiment.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "multiqc": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "results": [ + [ + { + "id": "test" + }, + [ + + ] + ] + ], + "tpm_gene": [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tpm_transcript": [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_tpm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,7afb76ee798ceb1e5dff5879d28ef85a", + "versions.yml:md5,d5243289a32cde9e90e20f1a202bb566", + "versions.yml:md5,e9e7d18c3de83f1113fb1ff0c55d35ed", + "versions.yml:md5,ea39658f8685118d81d42acd451e66ea" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T15:37:29.239014" + }, + "salmon": { + "content": [ + "all_samples.SummarizedExperiment.rds", + "all_samples.SummarizedExperiment.rds", + "all_samples.SummarizedExperiment.rds", + "all_samples.SummarizedExperiment.rds", + [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts.tsv:md5,865a4706b8bf47f476d8298fdd344902" + ] + ], + [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_counts_length_scaled.tsv:md5,46194b28815747fe3c3d5a619fa994a7" + ] + ], + [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_lengths.tsv:md5,158e17a7bda7827b3d528f379e81d2bd" + ] + ], + [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_lengths.tsv:md5,f39a15fea56a5a8e5776dcdda0c8f102" + ] + ], + null, + null, + [ + [ + { + "id": "all_samples" + }, + "all_samples.gene_tpm.tsv:md5,9711ed8364c3a1ea4fc87bd5e0780835" + ] + ], + [ + [ + { + "id": "all_samples" + }, + "all_samples.transcript_tpm.tsv:md5,e0c16bf083ebb88bcfaf27cfba12d3e9" + ] + ], + [ + "versions.yml:md5,4c3564e1ba17d8ce2b0ee784251ddd87", + "versions.yml:md5,b44caeec65491d47e098c7ddaf024b96", + "versions.yml:md5,d5243289a32cde9e90e20f1a202bb566", + "versions.yml:md5,e9e7d18c3de83f1113fb1ff0c55d35ed" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-03T15:35:48.954002" + } +} \ No newline at end of file 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 000000000..28e32b200 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf @@ -0,0 +1,124 @@ +// +// 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 | 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'] + 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 + + required_channels_in_order.eachWithIndex { channel, index -> + if (index < required_channels_in_order.size() - 1) { + channel_priority_violation |= !(channels.indexOf(channel) < channels.indexOf(required_channels_in_order[index+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/subworkflows/nf-core/utils_nextflow_pipeline/meta.yml b/subworkflows/nf-core/utils_nextflow_pipeline/meta.yml new file mode 100644 index 000000000..e5c3a0a82 --- /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 000000000..742d4a00a --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test @@ -0,0 +1,51 @@ + +nextflow_function { + + name "Test Functions" + script "subworkflows/nf-core/utils_nextflow_pipeline/main.nf" + config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" + + 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 000000000..e3f0baf47 --- /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 000000000..13782037c --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test @@ -0,0 +1,108 @@ +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" + + 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 { + assertAll( + { assert workflow.success }, + { assert workflow.stdout.contains("nextflow_workflow v9.9.9") } + ) + } + } + + 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 000000000..a09572e5b --- /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 000000000..cbd8495bb --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -0,0 +1,445 @@ +// +// 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" + } +} + +// +// Citation string for pipeline +// +def workflowCitation() { + def temp_doi_ref = "" + def manifest_doi = workflow.manifest.doi.tokenize(",") + // 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 + manifest_doi.each { doi_ref -> + temp_doi_ref += " https://doi.org/${doi_ref.replace('https://doi.org/', '').replace(' ', '')}\n" + } + return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + + "* The pipeline\n" + + temp_doi_ref + "\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 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 +} + +// +// nf-core logo +// +def nfCoreLogo(monochrome_logs=true) { + def colors = logColours(monochrome_logs) as Map + 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} ${getWorkflowVersion()}${colors.reset} + ${dashedLine(monochrome_logs)} + """.stripIndent() + ) +} + +// +// Return dashed line +// +def dashedLine(monochrome_logs=true) { + def colors = logColours(monochrome_logs) as Map + return "-${colors.dim}----------------------------------------------------${colors.reset}-" +} + +// +// 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 +} + +// +// Attach the multiqc report to email +// +def attachMultiqcReport(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" + } + } + return mqc_report +} + +// +// 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 = attachMultiqcReport(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 nextflow.util.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) { throw 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 (all) { + // 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 000000000..d08d24342 --- /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 000000000..3de07f37a --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test @@ -0,0 +1,130 @@ + +nextflow_function { + + name "Test Functions" + script "../main.nf" + config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" + + 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 workflowCitation") { + + function "workflowCitation" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Test Function nfCoreLogo") { + + function "nfCoreLogo" + + when { + function { + """ + input[0] = false + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Test Function dashedLine") { + + function "dashedLine" + + when { + function { + """ + input[0] = false + """ + } + } + + 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() } + ) + } + } +} 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 000000000..1037232c9 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap @@ -0,0 +1,166 @@ +{ + "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 nfCoreLogo": { + "content": [ + "\n\n-\u001b[2m----------------------------------------------------\u001b[0m-\n \u001b[0;32m,--.\u001b[0;30m/\u001b[0;32m,-.\u001b[0m\n\u001b[0;34m ___ __ __ __ ___ \u001b[0;32m/,-._.--~'\u001b[0m\n\u001b[0;34m |\\ | |__ __ / ` / \\ |__) |__ \u001b[0;33m} {\u001b[0m\n\u001b[0;34m | \\| | \\__, \\__/ | \\ |___ \u001b[0;32m\\`-._,-`-,\u001b[0m\n \u001b[0;32m`._,._,'\u001b[0m\n\u001b[0;35m nextflow_workflow v9.9.9\u001b[0m\n-\u001b[2m----------------------------------------------------\u001b[0m-\n" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:10.562934" + }, + "Test Function workflowCitation": { + "content": [ + "If you use nextflow_workflow for your analysis please cite:\n\n* The pipeline\n https://doi.org/10.5281/zenodo.5070524\n\n* The nf-core framework\n https://doi.org/10.1038/s41587-020-0439-x\n\n* Software dependencies\n https://github.com/nextflow_workflow/blob/master/CITATIONS.md" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:07.019761" + }, + "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 dashedLine": { + "content": [ + "-\u001b[2m----------------------------------------------------\u001b[0m-" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:14.366181" + }, + "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 000000000..ff1ae72a9 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test @@ -0,0 +1,25 @@ +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" + + 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 000000000..859d1030f --- /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 000000000..d0a926bf6 --- /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_nfvalidation_plugin/main.nf b/subworkflows/nf-core/utils_nfvalidation_plugin/main.nf new file mode 100644 index 000000000..2585b65d1 --- /dev/null +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/main.nf @@ -0,0 +1,62 @@ +// +// Subworkflow that uses the nf-validation plugin to render help text and parameter summary +// + +/* +======================================================================================== + IMPORT NF-VALIDATION PLUGIN +======================================================================================== +*/ + +include { paramsHelp } from 'plugin/nf-validation' +include { paramsSummaryLog } from 'plugin/nf-validation' +include { validateParameters } from 'plugin/nf-validation' + +/* +======================================================================================== + SUBWORKFLOW DEFINITION +======================================================================================== +*/ + +workflow UTILS_NFVALIDATION_PLUGIN { + + take: + print_help // boolean: print help + workflow_command // string: default commmand used to run pipeline + pre_help_text // string: string to be printed before help text and summary log + post_help_text // string: string to be printed after help text and summary log + validate_params // boolean: validate parameters + schema_filename // path: JSON schema file, null to use default value + + main: + + log.debug "Using schema file: ${schema_filename}" + + // Default values for strings + pre_help_text = pre_help_text ?: '' + post_help_text = post_help_text ?: '' + workflow_command = workflow_command ?: '' + + // + // Print help message if needed + // + if (print_help) { + log.info pre_help_text + paramsHelp(workflow_command, parameters_schema: schema_filename) + post_help_text + System.exit(0) + } + + // + // Print parameter summary to stdout + // + log.info pre_help_text + paramsSummaryLog(workflow, parameters_schema: schema_filename) + post_help_text + + // + // Validate parameters relative to the parameter JSON schema + // + if (validate_params){ + validateParameters(parameters_schema: schema_filename) + } + + emit: + dummy_emit = true +} diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml b/subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml new file mode 100644 index 000000000..3d4a6b04f --- /dev/null +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml @@ -0,0 +1,44 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "UTILS_NFVALIDATION_PLUGIN" +description: Use nf-validation to initiate and validate a pipeline +keywords: + - utility + - pipeline + - initialise + - validation +components: [] +input: + - print_help: + type: boolean + description: | + Print help message and exit + - workflow_command: + type: string + description: | + The command to run the workflow e.g. "nextflow run main.nf" + - pre_help_text: + type: string + description: | + Text to print before the help message + - post_help_text: + type: string + description: | + Text to print after the help message + - validate_params: + type: boolean + description: | + Validate the parameters and error if invalid. + - schema_filename: + type: string + description: | + The filename of the schema to validate against. +output: + - dummy_emit: + type: boolean + description: | + Dummy emit to make nf-core subworkflows lint happy +authors: + - "@adamrtalbot" +maintainers: + - "@adamrtalbot" + - "@maxulysse" diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test new file mode 100644 index 000000000..5649654e6 --- /dev/null +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test @@ -0,0 +1,194 @@ +nextflow_workflow { + + name "Test Workflow UTILS_NFVALIDATION_PLUGIN" + script "../main.nf" + workflow "UTILS_NFVALIDATION_PLUGIN" + + test("Should run nothing") { + + when { + + params { + monochrome_logs = true + test_data = '' + } + + workflow { + """ + help = false + workflow_command = null + pre_help_text = null + post_help_text = null + validate_params = false + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } + + test("Should run help") { + + + when { + + params { + monochrome_logs = true + test_data = '' + } + workflow { + """ + help = true + workflow_command = null + pre_help_text = null + post_help_text = null + validate_params = false + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.exitStatus == 0 }, + { assert workflow.stdout.any { it.contains('Input/output options') } }, + { assert workflow.stdout.any { it.contains('--outdir') } } + ) + } + } + + test("Should run help with command") { + + when { + + params { + monochrome_logs = true + test_data = '' + } + workflow { + """ + help = true + workflow_command = "nextflow run noorg/doesntexist" + pre_help_text = null + post_help_text = null + validate_params = false + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.exitStatus == 0 }, + { assert workflow.stdout.any { it.contains('nextflow run noorg/doesntexist') } }, + { assert workflow.stdout.any { it.contains('Input/output options') } }, + { assert workflow.stdout.any { it.contains('--outdir') } } + ) + } + } + + test("Should run help with extra text") { + + + when { + + params { + monochrome_logs = true + test_data = '' + } + workflow { + """ + help = true + workflow_command = "nextflow run noorg/doesntexist" + pre_help_text = "pre-help-text" + post_help_text = "post-help-text" + validate_params = false + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert workflow.exitStatus == 0 }, + { assert workflow.stdout.any { it.contains('pre-help-text') } }, + { assert workflow.stdout.any { it.contains('nextflow run noorg/doesntexist') } }, + { assert workflow.stdout.any { it.contains('Input/output options') } }, + { assert workflow.stdout.any { it.contains('--outdir') } }, + { assert workflow.stdout.any { it.contains('post-help-text') } } + ) + } + } + + test("Should validate params") { + + when { + + params { + monochrome_logs = true + test_data = '' + outdir = 1 + } + workflow { + """ + help = false + workflow_command = null + pre_help_text = null + post_help_text = null + validate_params = true + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assertAll( + { assert workflow.failed }, + { assert workflow.stdout.any { it.contains('ERROR ~ ERROR: Validation of pipeline parameters failed!') } } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/nextflow_schema.json b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/nextflow_schema.json new file mode 100644 index 000000000..7626c1c93 --- /dev/null +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/nextflow_schema.json @@ -0,0 +1,96 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://raw.githubusercontent.com/./master/nextflow_schema.json", + "title": ". pipeline parameters", + "description": "", + "type": "object", + "definitions": { + "input_output_options": { + "title": "Input/output options", + "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Define where the pipeline should find input data and save output data.", + "required": ["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": "#/definitions/input_output_options" + }, + { + "$ref": "#/definitions/generic_options" + } + ] +} diff --git a/tests/default.nf.test b/tests/default.nf.test new file mode 100644 index 000000000..069bb846f --- /dev/null +++ b/tests/default.nf.test @@ -0,0 +1,961 @@ +nextflow_pipeline { + + name "Test pipeline with default settings" + script "../main.nf" + + test("Params: default") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/bbsplit/RAP1_IAA_30M_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP2.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP2.stats.txt").name + ).match("bbsplit") }, + { assert snapshot( + path("${params.outdir}/custom/out/genome_gfp.fasta"), + path("${params.outdir}/custom/out/genome_gfp.gtf") + ).match("references") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.zip").name + ).match("fastqc/raw") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.zip").name + ).match("fastqc/trim") }, + { assert snapshot( + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_filtered_reads_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc-status-check-heatmap-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc-status-check-heatmap.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_adapter_content_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_overrepresented_sequences_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_overrepresented_sequences_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_n_content_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_n_content_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_sequence_quality_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_sequence_quality_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot-1_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot-1_Percentages.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Percentages.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_quality_scores_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_quality_scores_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_counts_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_counts_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_duplication_levels_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_duplication_levels_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_length_distribution_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_citations.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_cutadapt.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fastqc_fastqc_raw.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fastqc_fastqc_trimmed.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_featurecounts_biotype_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_idxstats.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram_1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram_2.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_gene_coverage_profile_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_gene_coverage_profile_Normalised.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_rnaseq_cov_hist.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_infer_experiment_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt"), + // These files are not stable + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_top_overrepresented_sequences_table-1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_top_overrepresented_sequences_table.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/junction_saturation_known.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/junction_saturation_novel.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_data.json").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_dupradar-section-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fail_strand_check_table.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_general_stats.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_picard_dups.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_infer_experiment.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_junction_annotation.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_read_distribution.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_flagstat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_stats.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_software_versions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_sources.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_deduplication.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_genomic_origin.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_rnaseq_genome_results.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance_plot_Counts.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance_plot_Percentages.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Events.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_all.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_All_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_Known_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_Novel_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_distribution_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_dups.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_dups_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/salmon_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-flagstat-dp_Percentage_of_total.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-flagstat-dp_Read_counts.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-stats-dp.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/star_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/star_summary_table.txt").name + ).match("multiqc_data") }, + { assert snapshot( + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_filtered_reads_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_filtered_reads_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Obs_Exp.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/dupradar-section-plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc-status-check-heatmap-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc-status-check-heatmap.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot-1_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot-1_Percentages.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-1-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-1-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/featurecounts_biotype_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/featurecounts_biotype_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_gene_coverage_profile_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_gene_coverage_profile_Normalised.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_infer_experiment_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_dups_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png"), + // PDFs, SVGs, some PNGs and HTML reports are not stable + file("${params.outdir}/multiqc/star_salmon/multiqc_report.html").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/dupradar-section-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fail_strand_check_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc-status-check-heatmap-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc-status-check-heatmap.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_adapter_content_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot-1_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot-1_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-1-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-1-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_length_distribution_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/featurecounts_biotype_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/featurecounts_biotype_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/general_stats_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/picard_deduplication-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/picard_deduplication-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Normalised.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_genomic_origin-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_genomic_origin-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_bam_stat.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_infer_experiment_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_All_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Known_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Novel_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_distribution_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_distribution_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_dups_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-flagstat-dp_Percentage_of_total.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-flagstat-dp_Read_counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-stats-dp.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_salmon_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_salmon_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_summary_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fail_strand_check_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_adapter_content_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_n_content_plot-1.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_n_content_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot-1.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_length_distribution_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table-1.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/general_stats_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/picard_deduplication-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/picard_deduplication-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_genomic_origin-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_genomic_origin-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_bam_stat.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_inner_distance_plot_Counts.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_inner_distance_plot_Percentages.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_All_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_Known_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_Novel_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_distribution_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_distribution_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-flagstat-dp_Percentage_of_total.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-flagstat-dp_Read_counts.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-stats-dp.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_salmon_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_salmon_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_summary_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/dupradar-section-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fail_strand_check_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc-status-check-heatmap-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc-status-check-heatmap.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_adapter_content_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_n_content_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_n_content_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot-1_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot-1_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-1-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-1-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_length_distribution_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/featurecounts_biotype_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/featurecounts_biotype_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/general_stats_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/picard_deduplication-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/picard_deduplication-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Normalised.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_genomic_origin-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_genomic_origin-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_bam_stat.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_infer_experiment_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_inner_distance_plot_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_inner_distance_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_All_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Known_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Novel_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_distribution_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_distribution_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_dups_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-flagstat-dp_Percentage_of_total.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-flagstat-dp_Read_counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-stats-dp.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_salmon_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_salmon_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_summary_table.svg").name + ).match("multiqc_plots") }, + { assert snapshot( + path("${params.outdir}/salmon/deseq2_qc/R_sessionInfo.log"), + // These files are not stable + file("${params.outdir}/salmon/deseq2_qc/deseq2.dds.RData").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.pca.vals.txt").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.plots.pdf").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.sample.dists.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_IAA_30M_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/deseq2.size_factors.RData").name + ).match("salmon/deseq2_qc") }, + { assert snapshot( + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP2/lib_format_counts.json"), + // These files are not stable + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP2/quant.sf").name + ).match("salmon_quant") }, + { assert snapshot( + path("${params.outdir}/salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_tpm.tsv").name + ).match("salmon") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/bigwig/RAP1_IAA_30M_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_IAA_30M_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP2.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP2.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP2.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP2.reverse.bigWig").name + ).match("star_salmon/bigwig") }, + { assert snapshot( + path("${params.outdir}/star_salmon/deseq2_qc/R_sessionInfo.log"), + // These files are not stable + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_IAA_30M_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP2.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/WT_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/WT_REP2.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/deseq2.size_factors.RData").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.dds.RData").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.pca.vals.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.plots.pdf").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.sample.dists.txt").name + ).match("star_salmon/deseq2_qc") }, + { assert snapshot( + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_IAA_30M_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_UNINDUCED_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_UNINDUCED_REP2_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/WT_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/WT_REP2_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_IAA_30M_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_UNINDUCED_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_UNINDUCED_REP2_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/WT_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/WT_REP2_intercept_slope.txt"), + // PDFs are not stable + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/WT_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/WT_REP2_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_IAA_30M_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_UNINDUCED_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_UNINDUCED_REP2_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/WT_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/WT_REP2_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_IAA_30M_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_UNINDUCED_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_UNINDUCED_REP2_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/WT_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/WT_REP2_duprateExpDens.pdf").name + ).match("star_salmon/dupradar") }, + { assert snapshot( + path("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP1.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP2.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP2.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP2.featureCounts.txt"), + // These files are unstable + file("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/WT_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/WT_REP2.featureCounts.txt.summary").name + ).match("star_salmon/featurecounts") }, + { assert snapshot( + path("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/WT_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/WT_REP2.SJ.out.tab"), + // Logs are not stable + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.final.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.progress.out").name + ).match("star_salmon/log") }, + { assert snapshot( + // Metrics are not stable + file("${params.outdir}/star_salmon/picard_metrics/RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name + ).match("star_salmon/picard_metrics") }, + { assert snapshot( + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + // HTML reports and these files are not stable + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/rnaseq_qc_results.txt").name + ).match("star_salmon/qualimap") }, + { assert snapshot( + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_IAA_30M_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_UNINDUCED_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_UNINDUCED_REP2.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/WT_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/WT_REP2.infer_experiment.txt"), + // PDFs, R scripts and all these files are not stable + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_IAA_30M_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_UNINDUCED_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_UNINDUCED_REP2.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/WT_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/WT_REP2.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/pdf/RAP1_IAA_30M_REP1.inner_distance_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/pdf/WT_REP1.inner_distance_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/pdf/WT_REP2.inner_distance_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/rscript/RAP1_IAA_30M_REP1.inner_distance_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/rscript/WT_REP1.inner_distance_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/rscript/WT_REP2.inner_distance_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_freq.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_mean.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP1.inner_distance.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP1.inner_distance_freq.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP1.inner_distance_mean.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP2.inner_distance.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP2.inner_distance_freq.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP2.inner_distance_mean.txt").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP2.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP2.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_IAA_30M_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP2.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/WT_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/WT_REP2.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP2.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP2.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_IAA_30M_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP2.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/WT_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/WT_REP2.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_IAA_30M_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP2.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/WT_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/WT_REP2.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/WT_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/WT_REP2.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_IAA_30M_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP2.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/WT_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/WT_REP2.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_IAA_30M_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_UNINDUCED_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_UNINDUCED_REP2.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/WT_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/WT_REP2.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_IAA_30M_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP2.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/WT_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/WT_REP2.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_IAA_30M_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP2.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/WT_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/WT_REP2.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP2.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP2.seq.DupRate.xls").name + ).match("star_salmon/rseqc") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_tpm.tsv").name + ).match("star_salmon/salmon") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.stats").name + ).match("star_salmon/samtools_stats") }, + { assert snapshot( + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/i_data.ctab"), + // These files are not stable + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.transcripts.gtf").name + ).match("star_salmon/stringtie") }, + { assert snapshot( + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/WT_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/WT_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/WT_REP2.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/WT_REP2.markdup.sorted.bam.bai").name + ).match("star_salmon/markdup") }, + { assert snapshot( + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/star_salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/star_salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/star_salmon/WT_REP2/quant.sf").name + ).match("star_salmon/salmon_quant") }, + { assert snapshot( + // These reports are not stable + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match("trimgalore") }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml") + ).match("versions") } + ) + } + } + + test("Params: default - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml"), + file("${params.outdir}/custom/out/genome_transcriptome.fasta").name, + file("${params.outdir}/custom/out/genome_transcriptome.gtf").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.zip").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report.html").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match() } + ) + } + } +} diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap new file mode 100644 index 000000000..9be7dfb04 --- /dev/null +++ b/tests/default.nf.test.snap @@ -0,0 +1,1080 @@ +{ + "star_salmon/log": { + "content": [ + "RAP1_IAA_30M_REP1.SJ.out.tab:md5,ea95e243278af55534f2c52eb5fff7ee", + "RAP1_UNINDUCED_REP1.SJ.out.tab:md5,e548d13942535dc0821f3ec6d9743ec8", + "RAP1_UNINDUCED_REP2.SJ.out.tab:md5,1f294365343a1a5e95682792fdb77033", + "WT_REP1.SJ.out.tab:md5,1350c2fa6a675bf107386c6cd3fc5204", + "WT_REP2.SJ.out.tab:md5,f6cc03643a5e3c1025a5b4754eb1be23", + "RAP1_IAA_30M_REP1.Log.final.out", + "RAP1_IAA_30M_REP1.Log.out", + "RAP1_IAA_30M_REP1.Log.progress.out", + "RAP1_UNINDUCED_REP1.Log.final.out", + "RAP1_UNINDUCED_REP1.Log.out", + "RAP1_UNINDUCED_REP1.Log.progress.out", + "RAP1_UNINDUCED_REP2.Log.final.out", + "RAP1_UNINDUCED_REP2.Log.out", + "RAP1_UNINDUCED_REP2.Log.progress.out", + "WT_REP1.Log.final.out", + "WT_REP1.Log.out", + "WT_REP1.Log.progress.out", + "WT_REP2.Log.final.out", + "WT_REP2.Log.out", + "WT_REP2.Log.progress.out" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T14:57:58.85709" + }, + "star_salmon/salmon_quant": { + "content": [ + "ambig_info.tsv:md5,f9a605d54a0a103566f7a9b8e0867a73", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,4cc2492f557e5e0a2911a0bd83a51020", + "ambig_info.tsv:md5,8f97be8af4e47cc48650c62227a40203", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,dc750c3564c63da54979c852794d58a5", + "ambig_info.tsv:md5,a044fe7a3ad445c9a91a0d54ab5015d1", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,db43ed650e6e7b42cd2c5b8101bb6748", + "ambig_info.tsv:md5,7a8ea02d74058efb801e8c62bca96fd4", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,e418b4e899623449c6babdf53e5aabde", + "ambig_info.tsv:md5,543a047a549437026a1363ea8ddf5b03", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,f234c8d322df3b59d990594c63b24eae", + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T13:24:55.413942" + }, + "trimgalore": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T13:59:56.824816" + }, + "star_salmon/rseqc": { + "content": [ + "RAP1_IAA_30M_REP1.infer_experiment.txt:md5,169d25b95c008bebe9ce886fea6a4e33", + "RAP1_UNINDUCED_REP1.infer_experiment.txt:md5,2ca0ce0fd3204bd2cc4812c4655b1f1f", + "RAP1_UNINDUCED_REP2.infer_experiment.txt:md5,7d5705880188f9beab1939e08d6b8f40", + "WT_REP1.infer_experiment.txt:md5,bf0c137f5fca06e7c40e1984a1acb06d", + "WT_REP2.infer_experiment.txt:md5,82e23b329ee60709f343bc2d17d43b14", + "RAP1_IAA_30M_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP2.bam_stat.txt", + "WT_REP1.bam_stat.txt", + "WT_REP2.bam_stat.txt", + "RAP1_IAA_30M_REP1.inner_distance_plot.pdf", + "WT_REP1.inner_distance_plot.pdf", + "WT_REP2.inner_distance_plot.pdf", + "RAP1_IAA_30M_REP1.inner_distance_plot.r", + "WT_REP1.inner_distance_plot.r", + "WT_REP2.inner_distance_plot.r", + "RAP1_IAA_30M_REP1.inner_distance.txt", + "RAP1_IAA_30M_REP1.inner_distance_freq.txt", + "RAP1_IAA_30M_REP1.inner_distance_mean.txt", + "WT_REP1.inner_distance.txt", + "WT_REP1.inner_distance_freq.txt", + "WT_REP1.inner_distance_mean.txt", + "WT_REP2.inner_distance.txt", + "WT_REP2.inner_distance_freq.txt", + "WT_REP2.inner_distance_mean.txt", + "RAP1_IAA_30M_REP1.junction.Interact.bed", + "RAP1_IAA_30M_REP1.junction.bed", + "RAP1_UNINDUCED_REP1.junction.Interact.bed", + "RAP1_UNINDUCED_REP1.junction.bed", + "RAP1_UNINDUCED_REP2.junction.Interact.bed", + "RAP1_UNINDUCED_REP2.junction.bed", + "WT_REP1.junction.Interact.bed", + "WT_REP1.junction.bed", + "WT_REP2.junction.Interact.bed", + "WT_REP2.junction.bed", + "RAP1_IAA_30M_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP2.junction_annotation.log", + "WT_REP1.junction_annotation.log", + "WT_REP2.junction_annotation.log", + "RAP1_IAA_30M_REP1.splice_events.pdf", + "RAP1_IAA_30M_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP1.splice_events.pdf", + "RAP1_UNINDUCED_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP2.splice_events.pdf", + "RAP1_UNINDUCED_REP2.splice_junction.pdf", + "WT_REP1.splice_events.pdf", + "WT_REP1.splice_junction.pdf", + "WT_REP2.splice_events.pdf", + "WT_REP2.splice_junction.pdf", + "RAP1_IAA_30M_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP2.junction_plot.r", + "WT_REP1.junction_plot.r", + "WT_REP2.junction_plot.r", + "RAP1_IAA_30M_REP1.junction.xls", + "RAP1_UNINDUCED_REP1.junction.xls", + "RAP1_UNINDUCED_REP2.junction.xls", + "WT_REP1.junction.xls", + "WT_REP2.junction.xls", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf", + "WT_REP1.junctionSaturation_plot.pdf", + "WT_REP2.junctionSaturation_plot.pdf", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.r", + "WT_REP1.junctionSaturation_plot.r", + "WT_REP2.junctionSaturation_plot.r", + "RAP1_IAA_30M_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP2.read_distribution.txt", + "WT_REP1.read_distribution.txt", + "WT_REP2.read_distribution.txt", + "RAP1_IAA_30M_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP2.DupRate_plot.pdf", + "WT_REP1.DupRate_plot.pdf", + "WT_REP2.DupRate_plot.pdf", + "RAP1_IAA_30M_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP2.DupRate_plot.r", + "WT_REP1.DupRate_plot.r", + "WT_REP2.DupRate_plot.r", + "RAP1_IAA_30M_REP1.pos.DupRate.xls", + "RAP1_IAA_30M_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP1.pos.DupRate.xls", + "RAP1_UNINDUCED_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP2.pos.DupRate.xls", + "RAP1_UNINDUCED_REP2.seq.DupRate.xls", + "WT_REP1.pos.DupRate.xls", + "WT_REP1.seq.DupRate.xls", + "WT_REP2.pos.DupRate.xls", + "WT_REP2.seq.DupRate.xls" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:44:57.857714" + }, + "references": { + "content": [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055", + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T13:59:53.18077" + }, + "star_salmon/samtools_stats": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.stats", + "RAP1_IAA_30M_REP1.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.sorted.bam.stats", + "WT_REP1.markdup.sorted.bam.flagstat", + "WT_REP1.markdup.sorted.bam.idxstats", + "WT_REP1.markdup.sorted.bam.stats", + "WT_REP1.sorted.bam.flagstat", + "WT_REP1.sorted.bam.idxstats", + "WT_REP1.sorted.bam.stats", + "WT_REP2.markdup.sorted.bam.flagstat", + "WT_REP2.markdup.sorted.bam.idxstats", + "WT_REP2.markdup.sorted.bam.stats", + "WT_REP2.sorted.bam.flagstat", + "WT_REP2.sorted.bam.idxstats", + "WT_REP2.sorted.bam.stats" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T18:42:17.143005" + }, + "Params: default - stub": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=null}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, FASTQC={fastqc=0.12.1}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, STAR_GENOMEGENERATE={star=2.7.10a, samtools=1.18, gawk=5.1.0}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}", + "genome_transcriptome.fasta", + "genome_transcriptome.gtf", + "RAP1_IAA_30M_REP1_raw.html", + "RAP1_IAA_30M_REP1_raw.zip", + "RAP1_UNINDUCED_REP1_raw.html", + "RAP1_UNINDUCED_REP1_raw.zip", + "RAP1_UNINDUCED_REP2_raw.html", + "RAP1_UNINDUCED_REP2_raw.zip", + "WT_REP1_raw.html", + "WT_REP1_raw.zip", + "WT_REP2_raw.html", + "WT_REP2_raw.zip", + "multiqc_report.html", + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T14:00:48.949429" + }, + "multiqc_plots": { + "content": [ + "cutadapt_filtered_reads_plot-cnt.png:md5,704cf0d91bfa3dd658dd8c9590f669a2", + "cutadapt_filtered_reads_plot-pct.png:md5,2684d8b2afca3300e5786486b80237f0", + "cutadapt_trimmed_sequences_plot_3_Counts.png:md5,bef41d894629b0c4dab4478bbf197f50", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.png:md5,1e0d01537d3797623d0b3fd8fbe42787", + "dupradar-section-plot.png:md5,3ae5e5cb161b7abd878d718bc71b41f6", + "fastqc-status-check-heatmap-1.png:md5,2402522f8c02e12aea9af088c6595890", + "fastqc-status-check-heatmap.png:md5,fe8b5b4ab4480d46a12a9005932a9b84", + "fastqc_overrepresented_sequences_plot-1.png:md5,40e450251b80ec0efc9364434234ec7f", + "fastqc_overrepresented_sequences_plot.png:md5,6f5ffbdf1bf61fabe5e028c8bc85de14", + "fastqc_per_sequence_gc_content_plot-1_Counts.png:md5,8a806cec2142f9911502e0a253d83d13", + "fastqc_per_sequence_gc_content_plot-1_Percentages.png:md5,953929d50c8490029880e205e4db7959", + "fastqc_per_sequence_gc_content_plot_Counts.png:md5,01f124545af788fd5cc7bbf41b005e16", + "fastqc_per_sequence_gc_content_plot_Percentages.png:md5,eba3abf8bedb2cb20bad90c54e9c8881", + "fastqc_per_sequence_quality_scores_plot-1.png:md5,d2c29cae169f35744500c751b4a7366e", + "fastqc_per_sequence_quality_scores_plot.png:md5,42fd7369a8aca78f620164a9e887c3cb", + "fastqc_sequence_counts_plot-1-cnt.png:md5,2874fea747c7ff46828bf4f17668caf8", + "fastqc_sequence_counts_plot-1-pct.png:md5,0022d7f5ac78b6eff157de24e37c5ab0", + "fastqc_sequence_counts_plot-cnt.png:md5,3890d5555f2a39b46b9f6efb14cb91f2", + "fastqc_sequence_counts_plot-pct.png:md5,55fa5838c8b2db978fcfa5cb83f6b054", + "fastqc_sequence_duplication_levels_plot-1.png:md5,fcd3b1ec2b95fe4bcd607dc28179a754", + "fastqc_sequence_duplication_levels_plot.png:md5,747431f0f38f8e4c41a11a072fa18780", + "featurecounts_biotype_plot-cnt.png:md5,4c66fce934b018143e7b8f6a1383d3f6", + "featurecounts_biotype_plot-pct.png:md5,9191dc2dd130f22ad404d27e045d2304", + "qualimap_gene_coverage_profile_Counts.png:md5,ac424dc7e5444a32e482bd5048ac4432", + "qualimap_gene_coverage_profile_Normalised.png:md5,62e5a2146daec985b8c2de02e3b57c1e", + "rseqc_infer_experiment_plot.png:md5,60c3cafb671fad2cf5f695615230eb8f", + "rseqc_read_dups_plot.png:md5,958513925fa5494bf499c989842d6928", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png:md5,ce6abb232fd5b5f2e66c0fe9a571d75f", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png:md5,6b44818f886ef020fb3646f152ad4af6", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png:md5,d5d8a85b7ad72a0cb93d9283ea12b23f", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png:md5,19317ad8f1448cd7eb1d319f85cc5c4d", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png:md5,a6849cd92ae738441212b681a411614d", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png:md5,4c06988372df63a1fb5f8be93f73ae8f", + "multiqc_report.html", + "cutadapt_filtered_reads_plot-cnt.pdf", + "cutadapt_filtered_reads_plot-pct.pdf", + "cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "dupradar-section-plot.pdf", + "fail_strand_check_table.pdf", + "fastqc-status-check-heatmap-1.pdf", + "fastqc-status-check-heatmap.pdf", + "fastqc_adapter_content_plot.pdf", + "fastqc_overrepresented_sequences_plot-1.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot-1.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot-1.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot-1_Counts.pdf", + "fastqc_per_sequence_gc_content_plot-1_Percentages.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot-1.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-1-cnt.pdf", + "fastqc_sequence_counts_plot-1-pct.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot-1.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table-1.pdf", + "fastqc_top_overrepresented_sequences_table.pdf", + "featurecounts_biotype_plot-cnt.pdf", + "featurecounts_biotype_plot-pct.pdf", + "general_stats_table.pdf", + "picard_deduplication-cnt.pdf", + "picard_deduplication-pct.pdf", + "qualimap_gene_coverage_profile_Counts.pdf", + "qualimap_gene_coverage_profile_Normalised.pdf", + "qualimap_genomic_origin-cnt.pdf", + "qualimap_genomic_origin-pct.pdf", + "rseqc_bam_stat.pdf", + "rseqc_infer_experiment_plot.pdf", + "rseqc_inner_distance_plot_Counts.pdf", + "rseqc_inner_distance_plot_Percentages.pdf", + "rseqc_junction_annotation_junctions_plot_Events-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Events-pct.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf", + "rseqc_junction_saturation_plot_All_Junctions.pdf", + "rseqc_junction_saturation_plot_Known_Junctions.pdf", + "rseqc_junction_saturation_plot_Novel_Junctions.pdf", + "rseqc_read_distribution_plot-cnt.pdf", + "rseqc_read_distribution_plot-pct.pdf", + "rseqc_read_dups_plot.pdf", + "salmon_deseq2_clustering-plot.pdf", + "salmon_deseq2_pca-plot.pdf", + "salmon_plot.pdf", + "samtools-flagstat-dp_Percentage_of_total.pdf", + "samtools-flagstat-dp_Read_counts.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", + "samtools-stats-dp.pdf", + "samtools_alignment_plot-cnt.pdf", + "samtools_alignment_plot-pct.pdf", + "star_alignment_plot-cnt.pdf", + "star_alignment_plot-pct.pdf", + "star_salmon_deseq2_clustering-plot.pdf", + "star_salmon_deseq2_pca-plot.pdf", + "star_summary_table.pdf", + "fail_strand_check_table.png", + "fastqc_adapter_content_plot.png", + "fastqc_per_base_n_content_plot-1.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot-1.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table-1.png", + "fastqc_top_overrepresented_sequences_table.png", + "general_stats_table.png", + "picard_deduplication-cnt.png", + "picard_deduplication-pct.png", + "qualimap_genomic_origin-cnt.png", + "qualimap_genomic_origin-pct.png", + "rseqc_bam_stat.png", + "rseqc_inner_distance_plot_Counts.png", + "rseqc_inner_distance_plot_Percentages.png", + "rseqc_junction_annotation_junctions_plot_Events-cnt.png", + "rseqc_junction_annotation_junctions_plot_Events-pct.png", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.png", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.png", + "rseqc_junction_saturation_plot_All_Junctions.png", + "rseqc_junction_saturation_plot_Known_Junctions.png", + "rseqc_junction_saturation_plot_Novel_Junctions.png", + "rseqc_read_distribution_plot-cnt.png", + "rseqc_read_distribution_plot-pct.png", + "salmon_deseq2_clustering-plot.png", + "salmon_deseq2_pca-plot.png", + "salmon_plot.png", + "samtools-flagstat-dp_Percentage_of_total.png", + "samtools-flagstat-dp_Read_counts.png", + "samtools-stats-dp.png", + "samtools_alignment_plot-cnt.png", + "samtools_alignment_plot-pct.png", + "star_alignment_plot-cnt.png", + "star_alignment_plot-pct.png", + "star_salmon_deseq2_clustering-plot.png", + "star_salmon_deseq2_pca-plot.png", + "star_summary_table.png", + "cutadapt_filtered_reads_plot-cnt.svg", + "cutadapt_filtered_reads_plot-pct.svg", + "cutadapt_trimmed_sequences_plot_3_Counts.svg", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "dupradar-section-plot.svg", + "fail_strand_check_table.svg", + "fastqc-status-check-heatmap-1.svg", + "fastqc-status-check-heatmap.svg", + "fastqc_adapter_content_plot.svg", + "fastqc_overrepresented_sequences_plot-1.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot-1.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot-1.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot-1_Counts.svg", + "fastqc_per_sequence_gc_content_plot-1_Percentages.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot-1.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-1-cnt.svg", + "fastqc_sequence_counts_plot-1-pct.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot-1.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table-1.svg", + "fastqc_top_overrepresented_sequences_table.svg", + "featurecounts_biotype_plot-cnt.svg", + "featurecounts_biotype_plot-pct.svg", + "general_stats_table.svg", + "picard_deduplication-cnt.svg", + "picard_deduplication-pct.svg", + "qualimap_gene_coverage_profile_Counts.svg", + "qualimap_gene_coverage_profile_Normalised.svg", + "qualimap_genomic_origin-cnt.svg", + "qualimap_genomic_origin-pct.svg", + "rseqc_bam_stat.svg", + "rseqc_infer_experiment_plot.svg", + "rseqc_inner_distance_plot_Counts.svg", + "rseqc_inner_distance_plot_Percentages.svg", + "rseqc_junction_annotation_junctions_plot_Events-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Events-pct.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.svg", + "rseqc_junction_saturation_plot_All_Junctions.svg", + "rseqc_junction_saturation_plot_Known_Junctions.svg", + "rseqc_junction_saturation_plot_Novel_Junctions.svg", + "rseqc_read_distribution_plot-cnt.svg", + "rseqc_read_distribution_plot-pct.svg", + "rseqc_read_dups_plot.svg", + "salmon_deseq2_clustering-plot.svg", + "salmon_deseq2_pca-plot.svg", + "salmon_plot.svg", + "samtools-flagstat-dp_Percentage_of_total.svg", + "samtools-flagstat-dp_Read_counts.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", + "samtools-stats-dp.svg", + "samtools_alignment_plot-cnt.svg", + "samtools_alignment_plot-pct.svg", + "star_alignment_plot-cnt.svg", + "star_alignment_plot-pct.svg", + "star_salmon_deseq2_clustering-plot.svg", + "star_salmon_deseq2_pca-plot.svg", + "star_summary_table.svg" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T18:42:16.932219" + }, + "fastqc/raw": { + "content": [ + "RAP1_IAA_30M_REP1_raw_1_fastqc.html", + "RAP1_IAA_30M_REP1_raw_1_fastqc.zip", + "RAP1_IAA_30M_REP1_raw_2_fastqc.html", + "RAP1_IAA_30M_REP1_raw_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_raw_fastqc.html", + "RAP1_UNINDUCED_REP1_raw_fastqc.zip", + "RAP1_UNINDUCED_REP2_raw_fastqc.html", + "RAP1_UNINDUCED_REP2_raw_fastqc.zip", + "WT_REP1_raw_1_fastqc.html", + "WT_REP1_raw_1_fastqc.zip", + "WT_REP1_raw_2_fastqc.html", + "WT_REP1_raw_2_fastqc.zip", + "WT_REP2_raw_1_fastqc.html", + "WT_REP2_raw_1_fastqc.zip", + "WT_REP2_raw_2_fastqc.html", + "WT_REP2_raw_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T13:59:53.196519" + }, + "star_salmon/stringtie": { + "content": [ + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,3f149502efe2a9d4bac98b1dd18c15e7", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,a052ab04070e72cc318fb7680b0764e3", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,e82329a443b9ff50a86e42aff91bd704", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,d279003d92f7feef9adb31203f84474a", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,10e2d00f93f9e74f224bd3c1bfbeb29b", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,525413b70bcf62c24c8f96182e09883e", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,9aa371befc36478d7720d3ea275e6f4d", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,907ab2e06346df131cbdb929afc005a8", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,b03f3118d1aa58fceadcb3311028e856", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,041edee3193df311f621c09f4991892b", + "t_data.ctab", + "RAP1_IAA_30M_REP1.coverage.gtf", + "RAP1_IAA_30M_REP1.gene.abundance.txt", + "RAP1_IAA_30M_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP1.coverage.gtf", + "RAP1_UNINDUCED_REP1.gene.abundance.txt", + "RAP1_UNINDUCED_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP2.coverage.gtf", + "RAP1_UNINDUCED_REP2.gene.abundance.txt", + "RAP1_UNINDUCED_REP2.transcripts.gtf", + "t_data.ctab", + "WT_REP1.coverage.gtf", + "WT_REP1.gene.abundance.txt", + "WT_REP1.transcripts.gtf", + "t_data.ctab", + "WT_REP2.coverage.gtf", + "WT_REP2.gene.abundance.txt", + "WT_REP2.transcripts.gtf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T15:35:08.116582" + }, + "salmon_quant": { + "content": [ + "ambig_info.tsv:md5,de973a4b22a4457217ae3dc04caf9401", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,1215f0c20f87d3aef8553ef119e1e74c", + "lib_format_counts.json:md5,c24ffe28d70476b5ccdd8bc2d22c0ac1", + "ambig_info.tsv:md5,45f252b4f0e11e6730cf0c29f800fdbb", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,621c6601aade5b1f2e3d6ca2fc71f636", + "lib_format_counts.json:md5,f6d44c0221f7fd559f11a9afe04c9935", + "ambig_info.tsv:md5,6dcc2891ea572e9b8d1ba52cd434ab84", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,9bed6e4dc5428d6f6297adcea29a6326", + "lib_format_counts.json:md5,7c562bf2f70e42f3a7292687dfd328c3", + "ambig_info.tsv:md5,194f574e0586416155e3f33d42e2b167", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,c7ed0aaa5d6c7934ddbebfd29e4eb86d", + "lib_format_counts.json:md5,d46250bb3677d72feeefc435fe6395a6", + "ambig_info.tsv:md5,a26e3f936e65d7da66392603c2f91f6f", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,69ebfc2c7ca6b221a0a22fa1dc8c20ac", + "lib_format_counts.json:md5,088fd51db07022ffde47033bbd029400", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T13:59:53.950437" + }, + "multiqc_data": { + "content": [ + "cutadapt_filtered_reads_plot.txt:md5,bf033e64e9d23bee85b6277f11c663f1", + "cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,13dfa866fd91dbb072689efe9aa83b1f", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,07145dd8dd3db654859b18eb0389046c", + "fastqc-status-check-heatmap-1.txt:md5,22a03548736b88b23be6bc0c9ef1b4a6", + "fastqc-status-check-heatmap.txt:md5,5a89b0d8d162f6b1dbdaf39457bbc03b", + "fastqc_adapter_content_plot.txt:md5,da0389be84cfdd189b1d045212eb2974", + "fastqc_overrepresented_sequences_plot-1.txt:md5,4adfeacd3a3a6c7c808f121b24e6b247", + "fastqc_overrepresented_sequences_plot.txt:md5,25d88ea8a72f55e8a374ae802bc7f0b1", + "fastqc_per_base_n_content_plot-1.txt:md5,418610c1ce119cb786ad434db75d366e", + "fastqc_per_base_n_content_plot.txt:md5,d368d7e36ca2f73dcde61f2b486d8213", + "fastqc_per_base_sequence_quality_plot-1.txt:md5,bd22e06e41c096ad4f745d40fe96a1e5", + "fastqc_per_base_sequence_quality_plot.txt:md5,5c3065b549129702b185ea1b817da420", + "fastqc_per_sequence_gc_content_plot-1_Counts.txt:md5,004c60768ceb6197765154e3eaa37b7a", + "fastqc_per_sequence_gc_content_plot-1_Percentages.txt:md5,95d29060b687f745288ad1ec47750037", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,9ddaa50167117d3c9188ccf015427704", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,f10ee2881b61308af35f304aa3d810a3", + "fastqc_per_sequence_quality_scores_plot-1.txt:md5,0f9834cc19f76dd5c87cf8cba7435a7c", + "fastqc_per_sequence_quality_scores_plot.txt:md5,b5f9a02933e3065952237afd2ec9ce82", + "fastqc_sequence_counts_plot-1.txt:md5,3861354bbedfbde7ca36a72994f9425c", + "fastqc_sequence_counts_plot.txt:md5,d385a3e2c2573a0902c66e8c93876d3c", + "fastqc_sequence_duplication_levels_plot-1.txt:md5,c73407d55fc532e864fa1dc8dbc12874", + "fastqc_sequence_duplication_levels_plot.txt:md5,8812cee16f6ca65e2c33635754de1772", + "fastqc_sequence_length_distribution_plot.txt:md5,6fe2c985606abad947bcca99b015ae33", + "multiqc_citations.txt:md5,2d2ab6df367e36e98e081c33dec187a0", + "multiqc_cutadapt.txt:md5,aac9581a5670cb55edf564f3d6c1f9a7", + "multiqc_fastqc_fastqc_raw.txt:md5,81c3c1a2575a1891a7f2a9637a0f2cc0", + "multiqc_fastqc_fastqc_trimmed.txt:md5,a3238f515e01d158d875d69968753804", + "multiqc_featurecounts_biotype_plot.txt:md5,56be7f0813c3cbea0f68f61d9b355b71", + "multiqc_samtools_idxstats.txt:md5,fd7d03a91f0b9e01a6939941f7f2243f", + "picard_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_2.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "qualimap_gene_coverage_profile_Counts.txt:md5,02044ed1bf1eca19a8a87c9971cdc049", + "qualimap_gene_coverage_profile_Normalised.txt:md5,eeeea7f50278b3b335bef545784abbfa", + "qualimap_rnaseq_cov_hist.txt:md5,51407e597076f3a7f98622213bea6bce", + "rseqc_infer_experiment_plot.txt:md5,de5a0bad9cca763928e7c33375eb5218", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,75acd04232d1804b5f960ee4c5db4722", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,ae45731d8d4595f77e6b271004f3a070", + "samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,01637c600d3840500851eb4118564cc6", + "fastqc_top_overrepresented_sequences_table-1.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "junction_saturation_known.txt", + "junction_saturation_novel.txt", + "multiqc_data.json", + "multiqc_dupradar-section-plot.txt", + "multiqc_fail_strand_check_table.txt", + "multiqc_general_stats.txt", + "multiqc_picard_dups.txt", + "multiqc_rseqc_bam_stat.txt", + "multiqc_rseqc_infer_experiment.txt", + "multiqc_rseqc_junction_annotation.txt", + "multiqc_rseqc_read_distribution.txt", + "multiqc_salmon.txt", + "multiqc_salmon_deseq2_clustering-plot.txt", + "multiqc_salmon_deseq2_clustering-plot_1.txt", + "multiqc_salmon_deseq2_clustering-plot_2.txt", + "multiqc_salmon_deseq2_clustering-plot_3.txt", + "multiqc_salmon_deseq2_clustering-plot_4.txt", + "multiqc_salmon_deseq2_pca-plot.txt", + "multiqc_samtools_flagstat.txt", + "multiqc_samtools_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt", + "multiqc_star.txt", + "multiqc_star_salmon_deseq2_clustering-plot.txt", + "multiqc_star_salmon_deseq2_clustering-plot_1.txt", + "multiqc_star_salmon_deseq2_clustering-plot_2.txt", + "multiqc_star_salmon_deseq2_clustering-plot_3.txt", + "multiqc_star_salmon_deseq2_clustering-plot_4.txt", + "multiqc_star_salmon_deseq2_pca-plot.txt", + "picard_deduplication.txt", + "qualimap_genomic_origin.txt", + "qualimap_rnaseq_genome_results.txt", + "rseqc_bam_stat.txt", + "rseqc_inner_distance.txt", + "rseqc_inner_distance_plot_Counts.txt", + "rseqc_inner_distance_plot_Percentages.txt", + "rseqc_junction_annotation_junctions_plot_Events.txt", + "rseqc_junction_annotation_junctions_plot_Junctions.txt", + "rseqc_junction_saturation_all.txt", + "rseqc_junction_saturation_plot_All_Junctions.txt", + "rseqc_junction_saturation_plot_Known_Junctions.txt", + "rseqc_junction_saturation_plot_Novel_Junctions.txt", + "rseqc_read_distribution_plot.txt", + "rseqc_read_dups.txt", + "rseqc_read_dups_plot.txt", + "salmon_plot.txt", + "samtools-flagstat-dp_Percentage_of_total.txt", + "samtools-flagstat-dp_Read_counts.txt", + "samtools-stats-dp.txt", + "samtools_alignment_plot.txt", + "star_alignment_plot.txt", + "star_summary_table.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T18:42:16.785525" + }, + "star_salmon/deseq2_qc": { + "content": [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "RAP1_IAA_30M_REP1.txt", + "RAP1_UNINDUCED_REP1.txt", + "RAP1_UNINDUCED_REP2.txt", + "WT_REP1.txt", + "WT_REP2.txt", + "deseq2.size_factors.RData", + "deseq2.dds.RData", + "deseq2.pca.vals.txt", + "deseq2.plots.pdf", + "deseq2.sample.dists.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T12:20:39.105655" + }, + "star_salmon/markdup": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai", + "WT_REP1.markdup.sorted.bam", + "WT_REP1.markdup.sorted.bam.bai", + "WT_REP2.markdup.sorted.bam", + "WT_REP2.markdup.sorted.bam.bai" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T13:24:55.331523" + }, + "star_salmon/featurecounts": { + "content": [ + "RAP1_IAA_30M_REP1.biotype_counts_mqc.tsv:md5,f3688a214d33a43ad79abe4b31df0c4b", + "RAP1_IAA_30M_REP1.biotype_counts_rrna_mqc.tsv:md5,dde2de0cb90e10d0195c726f768e9941", + "RAP1_IAA_30M_REP1.featureCounts.txt:md5,b38da3230d4d29ebc8d4af36852d7212", + "RAP1_UNINDUCED_REP1.biotype_counts_mqc.tsv:md5,d241d50e582ceb97e6f16b3556f5f5a9", + "RAP1_UNINDUCED_REP1.biotype_counts_rrna_mqc.tsv:md5,845ff9059c72bc6722a8de69776e22bb", + "RAP1_UNINDUCED_REP1.featureCounts.txt:md5,2ab175746532de1c54020c1eabc27bb5", + "RAP1_UNINDUCED_REP2.biotype_counts_mqc.tsv:md5,b621ce1e803d8670ece6c66391c33ba4", + "RAP1_UNINDUCED_REP2.biotype_counts_rrna_mqc.tsv:md5,6d3fa4c88c7fe61f638e4624ad5e22f0", + "RAP1_UNINDUCED_REP2.featureCounts.txt:md5,480b2586a878bc22f5b73f94051b41d8", + "WT_REP1.biotype_counts_mqc.tsv:md5,cac41767a8cc2e5fee58637971ec89d1", + "WT_REP1.biotype_counts_rrna_mqc.tsv:md5,8ef76d717492ca23764938aee8ea33a9", + "WT_REP1.featureCounts.txt:md5,112001ddbe917d935ee276d1685840bd", + "WT_REP2.biotype_counts_mqc.tsv:md5,e61b72317ac3c4d4ac64b663145e6262", + "WT_REP2.biotype_counts_rrna_mqc.tsv:md5,12294618fe44df1e7f39348372dcb481", + "WT_REP2.featureCounts.txt:md5,59e23ae18cfe6aa2e5a884bc03cbff15", + "RAP1_IAA_30M_REP1.featureCounts.txt.summary", + "RAP1_UNINDUCED_REP1.featureCounts.txt.summary", + "RAP1_UNINDUCED_REP2.featureCounts.txt.summary", + "WT_REP1.featureCounts.txt.summary", + "WT_REP2.featureCounts.txt.summary" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:44:57.630756" + }, + "salmon/deseq2_qc": { + "content": [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "deseq2.dds.RData", + "deseq2.pca.vals.txt", + "deseq2.plots.pdf", + "deseq2.sample.dists.txt", + "RAP1_IAA_30M_REP1.txt", + "RAP1_UNINDUCED_REP1.txt", + "RAP1_UNINDUCED_REP2.txt", + "WT_REP1.txt", + "WT_REP2.txt", + "deseq2.size_factors.RData" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T15:35:07.630987" + }, + "salmon": { + "content": [ + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T13:59:54.169289" + }, + "star_salmon/picard_metrics": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T13:59:55.48375" + }, + "star_salmon/salmon": { + "content": [ + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T14:57:59.602274" + }, + "star_salmon/bigwig": { + "content": [ + "RAP1_IAA_30M_REP1.forward.bigWig", + "RAP1_IAA_30M_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP1.forward.bigWig", + "RAP1_UNINDUCED_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP2.forward.bigWig", + "RAP1_UNINDUCED_REP2.reverse.bigWig", + "WT_REP1.forward.bigWig", + "WT_REP1.reverse.bigWig", + "WT_REP2.forward.bigWig", + "WT_REP2.reverse.bigWig" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T13:59:54.39954" + }, + "versions": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, BEDTOOLS_GENOMECOV_FW={bedtools=2.31.1}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=3.9.5}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, CUSTOM_TX2GENE={python=3.9.5}, DESEQ2_QC_PSEUDO={r-base=4.0.3, bioconductor-deseq2=1.28.0}, DESEQ2_QC_STAR_SALMON={r-base=4.0.3, bioconductor-deseq2=1.28.0}, DUPRADAR={bioconductor-dupradar=1.32.0}, FASTQC={fastqc=0.12.1}, FQ_SUBSAMPLE={fq=0.9.1 (2022-02-22)}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, MULTIQC_CUSTOM_BIOTYPE={python=3.9.5}, PICARD_MARKDUPLICATES={picard=3.1.1}, QUALIMAP_RNASEQ={qualimap=2.3}, RSEQC_BAMSTAT={rseqc=5.0.2}, RSEQC_INFEREXPERIMENT={rseqc=5.0.2}, RSEQC_INNERDISTANCE={rseqc=5.0.2}, RSEQC_JUNCTIONANNOTATION={rseqc=5.0.2}, RSEQC_JUNCTIONSATURATION={rseqc=5.0.2}, RSEQC_READDISTRIBUTION={rseqc=5.0.2}, RSEQC_READDUPLICATION={rseqc=5.0.2}, SALMON_QUANT={salmon=1.10.1}, SAMTOOLS_FLAGSTAT={samtools=1.2}, SAMTOOLS_IDXSTATS={samtools=1.2}, SAMTOOLS_INDEX={samtools=1.2}, SAMTOOLS_SORT={samtools=1.2}, SAMTOOLS_STATS={samtools=1.2}, SE_GENE={bioconductor-summarizedexperiment=1.32.0}, STAR_ALIGN={star=2.7.10a, samtools=1.18, gawk=5.1.0}, STAR_GENOMEGENERATE={star=2.7.10a, samtools=1.18, gawk=5.1.0}, STRINGTIE_STRINGTIE={stringtie=2.2.1}, SUBREAD_FEATURECOUNTS={subread=2.0.1}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, TXIMETA_TXIMPORT={bioconductor-tximeta=1.20.1}, UCSC_BEDCLIP={ucsc=377}, UCSC_BEDGRAPHTOBIGWIG={ucsc=445}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T13:59:57.208071" + }, + "fastqc/trim": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip", + "WT_REP1_trimmed_1_val_1_fastqc.html", + "WT_REP1_trimmed_1_val_1_fastqc.zip", + "WT_REP1_trimmed_2_val_2_fastqc.html", + "WT_REP1_trimmed_2_val_2_fastqc.zip", + "WT_REP2_trimmed_1_val_1_fastqc.html", + "WT_REP2_trimmed_1_val_1_fastqc.zip", + "WT_REP2_trimmed_2_val_2_fastqc.html", + "WT_REP2_trimmed_2_val_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T13:59:53.266348" + }, + "star_salmon/dupradar": { + "content": [ + "RAP1_IAA_30M_REP1_dupMatrix.txt:md5,2e0d518a450bb57801cdd075d4e9c217", + "RAP1_UNINDUCED_REP1_dupMatrix.txt:md5,96e2f9e1fc5a22a7d468e6fb4a613370", + "RAP1_UNINDUCED_REP2_dupMatrix.txt:md5,28c30ce734d78d53b1c47c3f87414e4b", + "WT_REP1_dupMatrix.txt:md5,b6aa1b99d91f5fa7a94efeed1c496c00", + "WT_REP2_dupMatrix.txt:md5,02236769150436cf31b7339f612119a5", + "RAP1_IAA_30M_REP1_intercept_slope.txt:md5,c677048855caf5190f29fa5f7137cd79", + "RAP1_UNINDUCED_REP1_intercept_slope.txt:md5,ea1b4323d3bc83759e8a026416bca32b", + "RAP1_UNINDUCED_REP2_intercept_slope.txt:md5,b062f49a5223a3452075062cdd308043", + "WT_REP1_intercept_slope.txt:md5,e7fcac6d125a7ba746a5cba4a1e66aef", + "WT_REP2_intercept_slope.txt:md5,5af16b07a734b73a2c1103b535f9e26e", + "RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf", + "WT_REP1_duprateExpBoxplot.pdf", + "WT_REP2_duprateExpBoxplot.pdf", + "RAP1_IAA_30M_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP2_expressionHist.pdf", + "WT_REP1_expressionHist.pdf", + "WT_REP2_expressionHist.pdf", + "RAP1_IAA_30M_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP2_duprateExpDens.pdf", + "WT_REP1_duprateExpDens.pdf", + "WT_REP2_duprateExpDens.pdf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T13:59:54.879476" + }, + "bbsplit": { + "content": [ + "RAP1_IAA_30M_REP1.stats.txt", + "RAP1_UNINDUCED_REP1.stats.txt", + "RAP1_UNINDUCED_REP2.stats.txt", + "WT_REP1.stats.txt", + "WT_REP2.stats.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T16:18:49.803978" + }, + "star_salmon/qualimap": { + "content": [ + "Coverage Profile Along Genes (High).png:md5,876c1b88f33bd3e5fe1a41679729573d", + "Coverage Profile Along Genes (Low).png:md5,ee1f2c9cc4dd4867811eda1e68864ab4", + "Coverage Profile Along Genes (Total).png:md5,53747a8f9813744902756ad60638380a", + "Transcript coverage histogram.png:md5,4f9072d4b11216373b59396293803a37", + "coverage_profile_along_genes_(high).txt:md5,fcb06d460810c0555de5396b9dae05e8", + "coverage_profile_along_genes_(low).txt:md5,e3c9a1ddfdb89f8534ff7548b70fce32", + "coverage_profile_along_genes_(total).txt:md5,e3c9a1ddfdb89f8534ff7548b70fce32", + "Coverage Profile Along Genes (High).png:md5,bbf0531018e7fccfc1dfdd1c05715518", + "Coverage Profile Along Genes (Low).png:md5,3c147d9c831d4be98615a22a72fad05d", + "Coverage Profile Along Genes (Total).png:md5,5a8a6db3a8d19a2dcb8f715b11e67c50", + "Transcript coverage histogram.png:md5,488440d7b6d73bcd4567316712e281fe", + "coverage_profile_along_genes_(high).txt:md5,9f1e29a4d6eec52e8796b080daaedca3", + "coverage_profile_along_genes_(low).txt:md5,353f42a84ff34167646fc83909eac2ff", + "coverage_profile_along_genes_(total).txt:md5,353f42a84ff34167646fc83909eac2ff", + "Coverage Profile Along Genes (High).png:md5,5a5d99cc7a1dba3762d67f4aa4adad58", + "Coverage Profile Along Genes (Low).png:md5,b6adc296e9a732aa0495a6da8fa4ed90", + "Coverage Profile Along Genes (Total).png:md5,fcb94fb9c1a51c1db32f884d05929cc8", + "Transcript coverage histogram.png:md5,3aeb52ff3e3752727a370b0d7ceb0518", + "coverage_profile_along_genes_(high).txt:md5,3b20a736708df02ea8c86dc5829ae67e", + "coverage_profile_along_genes_(low).txt:md5,02b314b76ef1317f20e129412340755d", + "coverage_profile_along_genes_(total).txt:md5,02b314b76ef1317f20e129412340755d", + "Coverage Profile Along Genes (High).png:md5,c974d47996bcc57b99dfaf6903f61f41", + "Coverage Profile Along Genes (Low).png:md5,c8fe631f0580c93adb5be107c6a7a1a3", + "Coverage Profile Along Genes (Total).png:md5,424d245e9f3e626d9e79f51d1b93e946", + "Transcript coverage histogram.png:md5,17404146ad5e0a9bce97ce622e00975e", + "coverage_profile_along_genes_(high).txt:md5,8bf366c7dbc6170035ee64a057c581f1", + "coverage_profile_along_genes_(low).txt:md5,a9102de3ff9679d1f7a86afa85997211", + "coverage_profile_along_genes_(total).txt:md5,a9102de3ff9679d1f7a86afa85997211", + "Coverage Profile Along Genes (High).png:md5,40edd79c21f3e8d8bbac384156c472d6", + "Coverage Profile Along Genes (Low).png:md5,935c0372259a953a4c99569e9b236ae5", + "Coverage Profile Along Genes (Total).png:md5,34f7a4307be1ea674b7b98eee564d96b", + "Transcript coverage histogram.png:md5,e2abf8a9c62fef57f0be1ca0e01e502d", + "coverage_profile_along_genes_(high).txt:md5,3f13eb908d6e97e6831306e9527cc2e3", + "coverage_profile_along_genes_(low).txt:md5,24df553662d0cedaa74cf06a8fead40b", + "coverage_profile_along_genes_(total).txt:md5,24df553662d0cedaa74cf06a8fead40b", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:44:57.740534" + } +} \ No newline at end of file diff --git a/tests/featurecounts_group_type.nf.test b/tests/featurecounts_group_type.nf.test new file mode 100644 index 000000000..16794293b --- /dev/null +++ b/tests/featurecounts_group_type.nf.test @@ -0,0 +1,933 @@ +nextflow_pipeline { + + name "Test pipeline without a group type for featureCounts" + script "../main.nf" + + test("Params: --featurecounts_group_type false") { + + when { + params { + outdir = "$outputDir" + featurecounts_group_type = false + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/bbsplit/RAP1_IAA_30M_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP2.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP2.stats.txt").name + ).match("bbsplit") }, + { assert snapshot( + path("${params.outdir}/custom/out/genome_gfp.fasta"), + path("${params.outdir}/custom/out/genome_gfp.gtf") + ).match("references") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.zip").name + ).match("fastqc/raw") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.zip").name + ).match("fastqc/trim") }, + { assert snapshot( + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_filtered_reads_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc-status-check-heatmap-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc-status-check-heatmap.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_adapter_content_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_overrepresented_sequences_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_overrepresented_sequences_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_n_content_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_n_content_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_sequence_quality_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_sequence_quality_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot-1_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot-1_Percentages.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Percentages.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_quality_scores_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_quality_scores_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_counts_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_counts_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_duplication_levels_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_duplication_levels_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_length_distribution_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_citations.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_cutadapt.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fastqc_fastqc_raw.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fastqc_fastqc_trimmed.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_idxstats.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram_1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram_2.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_gene_coverage_profile_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_gene_coverage_profile_Normalised.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_rnaseq_cov_hist.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_infer_experiment_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt"), + // These files are not stable + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_top_overrepresented_sequences_table-1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_top_overrepresented_sequences_table.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/junction_saturation_known.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/junction_saturation_novel.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_data.json").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_dupradar-section-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fail_strand_check_table.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_general_stats.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_picard_dups.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_infer_experiment.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_junction_annotation.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_read_distribution.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_flagstat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_stats.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_software_versions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_sources.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_deduplication.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_genomic_origin.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_rnaseq_genome_results.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance_plot_Counts.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance_plot_Percentages.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Events.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_all.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_All_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_Known_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_Novel_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_distribution_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_dups.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_dups_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/salmon_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-flagstat-dp_Percentage_of_total.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-flagstat-dp_Read_counts.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-stats-dp.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/star_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/star_summary_table.txt").name + ).match("multiqc_data") }, + { assert snapshot( + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_filtered_reads_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_filtered_reads_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Obs_Exp.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/dupradar-section-plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc-status-check-heatmap-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc-status-check-heatmap.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot-1_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot-1_Percentages.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-1-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-1-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_gene_coverage_profile_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_gene_coverage_profile_Normalised.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_infer_experiment_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_dups_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png"), + // PDFs, SVGs, some PNGs and HTML reports are not stable + file("${params.outdir}/multiqc/star_salmon/multiqc_report.html").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/dupradar-section-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fail_strand_check_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc-status-check-heatmap-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc-status-check-heatmap.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_adapter_content_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot-1_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot-1_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-1-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-1-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_length_distribution_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/general_stats_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/picard_deduplication-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/picard_deduplication-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Normalised.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_genomic_origin-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_genomic_origin-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_bam_stat.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_infer_experiment_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_All_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Known_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Novel_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_distribution_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_distribution_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_dups_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-flagstat-dp_Percentage_of_total.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-flagstat-dp_Read_counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-stats-dp.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_salmon_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_salmon_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_summary_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fail_strand_check_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_adapter_content_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_n_content_plot-1.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_n_content_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot-1.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_length_distribution_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table-1.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/general_stats_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/picard_deduplication-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/picard_deduplication-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_genomic_origin-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_genomic_origin-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_bam_stat.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_inner_distance_plot_Counts.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_inner_distance_plot_Percentages.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_All_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_Known_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_Novel_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_distribution_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_distribution_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-flagstat-dp_Percentage_of_total.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-flagstat-dp_Read_counts.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-stats-dp.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_salmon_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_salmon_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_summary_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/dupradar-section-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fail_strand_check_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc-status-check-heatmap-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc-status-check-heatmap.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_adapter_content_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_n_content_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_n_content_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot-1_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot-1_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-1-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-1-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_length_distribution_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/general_stats_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/picard_deduplication-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/picard_deduplication-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Normalised.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_genomic_origin-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_genomic_origin-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_bam_stat.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_infer_experiment_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_inner_distance_plot_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_inner_distance_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_All_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Known_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Novel_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_distribution_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_distribution_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_dups_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-flagstat-dp_Percentage_of_total.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-flagstat-dp_Read_counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-stats-dp.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_salmon_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_salmon_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_summary_table.svg").name + ).match("multiqc_plots") }, + { assert snapshot( + path("${params.outdir}/salmon/deseq2_qc/R_sessionInfo.log"), + // These files are not stable + file("${params.outdir}/salmon/deseq2_qc/deseq2.dds.RData").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.pca.vals.txt").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.plots.pdf").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.sample.dists.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_IAA_30M_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/deseq2.size_factors.RData").name + ).match("salmon/deseq2_qc") }, + { assert snapshot( + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP2/lib_format_counts.json"), + // These files are not stable + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP2/quant.sf").name + ).match("salmon_quant") }, + { assert snapshot( + path("${params.outdir}/salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_tpm.tsv").name + ).match("salmon") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/bigwig/RAP1_IAA_30M_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_IAA_30M_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP2.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP2.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP2.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP2.reverse.bigWig").name + ).match("star_salmon/bigwig") }, + { assert snapshot( + path("${params.outdir}/star_salmon/deseq2_qc/R_sessionInfo.log"), + // These files are not stable + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_IAA_30M_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP2.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/WT_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/WT_REP2.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/deseq2.size_factors.RData").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.dds.RData").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.pca.vals.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.plots.pdf").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.sample.dists.txt").name + ).match("star_salmon/deseq2_qc") }, + { assert snapshot( + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_IAA_30M_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_UNINDUCED_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_UNINDUCED_REP2_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/WT_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/WT_REP2_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_IAA_30M_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_UNINDUCED_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_UNINDUCED_REP2_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/WT_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/WT_REP2_intercept_slope.txt"), + // PDFs are not stable + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/WT_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/WT_REP2_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_IAA_30M_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_UNINDUCED_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_UNINDUCED_REP2_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/WT_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/WT_REP2_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_IAA_30M_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_UNINDUCED_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_UNINDUCED_REP2_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/WT_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/WT_REP2_duprateExpDens.pdf").name + ).match("star_salmon/dupradar") }, + { assert snapshot( + path("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/WT_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/WT_REP2.SJ.out.tab"), + // Logs are not stable + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.final.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.progress.out").name + ).match("star_salmon/log") }, + { assert snapshot( + // Metrics are not stable + file("${params.outdir}/star_salmon/picard_metrics/RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name + ).match("star_salmon/picard_metrics") }, + { assert snapshot( + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + // HTML reports and these files are not stable + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/rnaseq_qc_results.txt").name + ).match("star_salmon/qualimap") }, + { assert snapshot( + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_IAA_30M_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_UNINDUCED_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_UNINDUCED_REP2.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/WT_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/WT_REP2.infer_experiment.txt"), + // PDFs, R scripts and all these files are not stable + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_IAA_30M_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_UNINDUCED_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_UNINDUCED_REP2.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/WT_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/WT_REP2.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/pdf/RAP1_IAA_30M_REP1.inner_distance_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/pdf/WT_REP1.inner_distance_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/pdf/WT_REP2.inner_distance_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/rscript/RAP1_IAA_30M_REP1.inner_distance_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/rscript/WT_REP1.inner_distance_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/rscript/WT_REP2.inner_distance_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_freq.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_mean.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP1.inner_distance.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP1.inner_distance_freq.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP1.inner_distance_mean.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP2.inner_distance.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP2.inner_distance_freq.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP2.inner_distance_mean.txt").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP2.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP2.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_IAA_30M_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP2.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/WT_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/WT_REP2.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP2.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP2.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_IAA_30M_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP2.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/WT_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/WT_REP2.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_IAA_30M_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP2.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/WT_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/WT_REP2.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/WT_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/WT_REP2.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_IAA_30M_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP2.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/WT_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/WT_REP2.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_IAA_30M_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_UNINDUCED_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_UNINDUCED_REP2.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/WT_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/WT_REP2.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_IAA_30M_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP2.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/WT_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/WT_REP2.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_IAA_30M_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP2.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/WT_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/WT_REP2.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP2.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP2.seq.DupRate.xls").name + ).match("star_salmon/rseqc") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_tpm.tsv").name + ).match("star_salmon/salmon") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.stats").name + ).match("star_salmon/samtools_stats") }, + { assert snapshot( + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/i_data.ctab"), + // These files are not stable + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.transcripts.gtf").name + ).match("star_salmon/stringtie") }, + { assert snapshot( + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/WT_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/WT_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/WT_REP2.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/WT_REP2.markdup.sorted.bam.bai").name + ).match("star_salmon/markdup") }, + { assert snapshot( + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/star_salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/star_salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/star_salmon/WT_REP2/quant.sf").name + ).match("star_salmon/salmon_quant") }, + { assert snapshot( + // These reports are not stable + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match("trimgalore") }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml") + ).match("versions") } + ) + } + } + + test("Params: --featurecounts_group_type false - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + featurecounts_group_type = false + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml"), + file("${params.outdir}/custom/out/genome_transcriptome.fasta").name, + file("${params.outdir}/custom/out/genome_transcriptome.gtf").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.zip").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report.html").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match() } + ) + } + } +} diff --git a/tests/featurecounts_group_type.nf.test.snap b/tests/featurecounts_group_type.nf.test.snap new file mode 100644 index 000000000..a7e6910dd --- /dev/null +++ b/tests/featurecounts_group_type.nf.test.snap @@ -0,0 +1,1044 @@ +{ + "star_salmon/log": { + "content": [ + "RAP1_IAA_30M_REP1.SJ.out.tab:md5,ea95e243278af55534f2c52eb5fff7ee", + "RAP1_UNINDUCED_REP1.SJ.out.tab:md5,e548d13942535dc0821f3ec6d9743ec8", + "RAP1_UNINDUCED_REP2.SJ.out.tab:md5,1f294365343a1a5e95682792fdb77033", + "WT_REP1.SJ.out.tab:md5,1350c2fa6a675bf107386c6cd3fc5204", + "WT_REP2.SJ.out.tab:md5,f6cc03643a5e3c1025a5b4754eb1be23", + "RAP1_IAA_30M_REP1.Log.final.out", + "RAP1_IAA_30M_REP1.Log.out", + "RAP1_IAA_30M_REP1.Log.progress.out", + "RAP1_UNINDUCED_REP1.Log.final.out", + "RAP1_UNINDUCED_REP1.Log.out", + "RAP1_UNINDUCED_REP1.Log.progress.out", + "RAP1_UNINDUCED_REP2.Log.final.out", + "RAP1_UNINDUCED_REP2.Log.out", + "RAP1_UNINDUCED_REP2.Log.progress.out", + "WT_REP1.Log.final.out", + "WT_REP1.Log.out", + "WT_REP1.Log.progress.out", + "WT_REP2.Log.final.out", + "WT_REP2.Log.out", + "WT_REP2.Log.progress.out" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T17:43:26.652121" + }, + "star_salmon/salmon_quant": { + "content": [ + "ambig_info.tsv:md5,f9a605d54a0a103566f7a9b8e0867a73", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,4cc2492f557e5e0a2911a0bd83a51020", + "ambig_info.tsv:md5,8f97be8af4e47cc48650c62227a40203", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,dc750c3564c63da54979c852794d58a5", + "ambig_info.tsv:md5,a044fe7a3ad445c9a91a0d54ab5015d1", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,db43ed650e6e7b42cd2c5b8101bb6748", + "ambig_info.tsv:md5,7a8ea02d74058efb801e8c62bca96fd4", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,e418b4e899623449c6babdf53e5aabde", + "ambig_info.tsv:md5,543a047a549437026a1363ea8ddf5b03", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,f234c8d322df3b59d990594c63b24eae", + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T13:34:18.439694" + }, + "multiqc_data": { + "content": [ + "cutadapt_filtered_reads_plot.txt:md5,bf033e64e9d23bee85b6277f11c663f1", + "cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,13dfa866fd91dbb072689efe9aa83b1f", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,07145dd8dd3db654859b18eb0389046c", + "fastqc-status-check-heatmap-1.txt:md5,22a03548736b88b23be6bc0c9ef1b4a6", + "fastqc-status-check-heatmap.txt:md5,5a89b0d8d162f6b1dbdaf39457bbc03b", + "fastqc_adapter_content_plot.txt:md5,da0389be84cfdd189b1d045212eb2974", + "fastqc_overrepresented_sequences_plot-1.txt:md5,4adfeacd3a3a6c7c808f121b24e6b247", + "fastqc_overrepresented_sequences_plot.txt:md5,25d88ea8a72f55e8a374ae802bc7f0b1", + "fastqc_per_base_n_content_plot-1.txt:md5,418610c1ce119cb786ad434db75d366e", + "fastqc_per_base_n_content_plot.txt:md5,d368d7e36ca2f73dcde61f2b486d8213", + "fastqc_per_base_sequence_quality_plot-1.txt:md5,bd22e06e41c096ad4f745d40fe96a1e5", + "fastqc_per_base_sequence_quality_plot.txt:md5,5c3065b549129702b185ea1b817da420", + "fastqc_per_sequence_gc_content_plot-1_Counts.txt:md5,004c60768ceb6197765154e3eaa37b7a", + "fastqc_per_sequence_gc_content_plot-1_Percentages.txt:md5,95d29060b687f745288ad1ec47750037", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,9ddaa50167117d3c9188ccf015427704", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,f10ee2881b61308af35f304aa3d810a3", + "fastqc_per_sequence_quality_scores_plot-1.txt:md5,0f9834cc19f76dd5c87cf8cba7435a7c", + "fastqc_per_sequence_quality_scores_plot.txt:md5,b5f9a02933e3065952237afd2ec9ce82", + "fastqc_sequence_counts_plot-1.txt:md5,3861354bbedfbde7ca36a72994f9425c", + "fastqc_sequence_counts_plot.txt:md5,d385a3e2c2573a0902c66e8c93876d3c", + "fastqc_sequence_duplication_levels_plot-1.txt:md5,c73407d55fc532e864fa1dc8dbc12874", + "fastqc_sequence_duplication_levels_plot.txt:md5,8812cee16f6ca65e2c33635754de1772", + "fastqc_sequence_length_distribution_plot.txt:md5,6fe2c985606abad947bcca99b015ae33", + "multiqc_citations.txt:md5,2d2ab6df367e36e98e081c33dec187a0", + "multiqc_cutadapt.txt:md5,aac9581a5670cb55edf564f3d6c1f9a7", + "multiqc_fastqc_fastqc_raw.txt:md5,81c3c1a2575a1891a7f2a9637a0f2cc0", + "multiqc_fastqc_fastqc_trimmed.txt:md5,a3238f515e01d158d875d69968753804", + "multiqc_samtools_idxstats.txt:md5,fd7d03a91f0b9e01a6939941f7f2243f", + "picard_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_2.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "qualimap_gene_coverage_profile_Counts.txt:md5,02044ed1bf1eca19a8a87c9971cdc049", + "qualimap_gene_coverage_profile_Normalised.txt:md5,eeeea7f50278b3b335bef545784abbfa", + "qualimap_rnaseq_cov_hist.txt:md5,51407e597076f3a7f98622213bea6bce", + "rseqc_infer_experiment_plot.txt:md5,de5a0bad9cca763928e7c33375eb5218", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,75acd04232d1804b5f960ee4c5db4722", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,ae45731d8d4595f77e6b271004f3a070", + "samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,01637c600d3840500851eb4118564cc6", + "fastqc_top_overrepresented_sequences_table-1.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "junction_saturation_known.txt", + "junction_saturation_novel.txt", + "multiqc_data.json", + "multiqc_dupradar-section-plot.txt", + "multiqc_fail_strand_check_table.txt", + "multiqc_general_stats.txt", + "multiqc_picard_dups.txt", + "multiqc_rseqc_bam_stat.txt", + "multiqc_rseqc_infer_experiment.txt", + "multiqc_rseqc_junction_annotation.txt", + "multiqc_rseqc_read_distribution.txt", + "multiqc_salmon.txt", + "multiqc_salmon_deseq2_clustering-plot.txt", + "multiqc_salmon_deseq2_clustering-plot_1.txt", + "multiqc_salmon_deseq2_clustering-plot_2.txt", + "multiqc_salmon_deseq2_clustering-plot_3.txt", + "multiqc_salmon_deseq2_clustering-plot_4.txt", + "multiqc_salmon_deseq2_pca-plot.txt", + "multiqc_samtools_flagstat.txt", + "multiqc_samtools_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt", + "multiqc_star.txt", + "multiqc_star_salmon_deseq2_clustering-plot.txt", + "multiqc_star_salmon_deseq2_clustering-plot_1.txt", + "multiqc_star_salmon_deseq2_clustering-plot_2.txt", + "multiqc_star_salmon_deseq2_clustering-plot_3.txt", + "multiqc_star_salmon_deseq2_clustering-plot_4.txt", + "multiqc_star_salmon_deseq2_pca-plot.txt", + "picard_deduplication.txt", + "qualimap_genomic_origin.txt", + "qualimap_rnaseq_genome_results.txt", + "rseqc_bam_stat.txt", + "rseqc_inner_distance.txt", + "rseqc_inner_distance_plot_Counts.txt", + "rseqc_inner_distance_plot_Percentages.txt", + "rseqc_junction_annotation_junctions_plot_Events.txt", + "rseqc_junction_annotation_junctions_plot_Junctions.txt", + "rseqc_junction_saturation_all.txt", + "rseqc_junction_saturation_plot_All_Junctions.txt", + "rseqc_junction_saturation_plot_Known_Junctions.txt", + "rseqc_junction_saturation_plot_Novel_Junctions.txt", + "rseqc_read_distribution_plot.txt", + "rseqc_read_dups.txt", + "rseqc_read_dups_plot.txt", + "salmon_plot.txt", + "samtools-flagstat-dp_Percentage_of_total.txt", + "samtools-flagstat-dp_Read_counts.txt", + "samtools-stats-dp.txt", + "samtools_alignment_plot.txt", + "star_alignment_plot.txt", + "star_summary_table.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T18:50:10.937365" + }, + "trimgalore": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T17:43:26.995324" + }, + "star_salmon/rseqc": { + "content": [ + "RAP1_IAA_30M_REP1.infer_experiment.txt:md5,169d25b95c008bebe9ce886fea6a4e33", + "RAP1_UNINDUCED_REP1.infer_experiment.txt:md5,2ca0ce0fd3204bd2cc4812c4655b1f1f", + "RAP1_UNINDUCED_REP2.infer_experiment.txt:md5,7d5705880188f9beab1939e08d6b8f40", + "WT_REP1.infer_experiment.txt:md5,bf0c137f5fca06e7c40e1984a1acb06d", + "WT_REP2.infer_experiment.txt:md5,82e23b329ee60709f343bc2d17d43b14", + "RAP1_IAA_30M_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP2.bam_stat.txt", + "WT_REP1.bam_stat.txt", + "WT_REP2.bam_stat.txt", + "RAP1_IAA_30M_REP1.inner_distance_plot.pdf", + "WT_REP1.inner_distance_plot.pdf", + "WT_REP2.inner_distance_plot.pdf", + "RAP1_IAA_30M_REP1.inner_distance_plot.r", + "WT_REP1.inner_distance_plot.r", + "WT_REP2.inner_distance_plot.r", + "RAP1_IAA_30M_REP1.inner_distance.txt", + "RAP1_IAA_30M_REP1.inner_distance_freq.txt", + "RAP1_IAA_30M_REP1.inner_distance_mean.txt", + "WT_REP1.inner_distance.txt", + "WT_REP1.inner_distance_freq.txt", + "WT_REP1.inner_distance_mean.txt", + "WT_REP2.inner_distance.txt", + "WT_REP2.inner_distance_freq.txt", + "WT_REP2.inner_distance_mean.txt", + "RAP1_IAA_30M_REP1.junction.Interact.bed", + "RAP1_IAA_30M_REP1.junction.bed", + "RAP1_UNINDUCED_REP1.junction.Interact.bed", + "RAP1_UNINDUCED_REP1.junction.bed", + "RAP1_UNINDUCED_REP2.junction.Interact.bed", + "RAP1_UNINDUCED_REP2.junction.bed", + "WT_REP1.junction.Interact.bed", + "WT_REP1.junction.bed", + "WT_REP2.junction.Interact.bed", + "WT_REP2.junction.bed", + "RAP1_IAA_30M_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP2.junction_annotation.log", + "WT_REP1.junction_annotation.log", + "WT_REP2.junction_annotation.log", + "RAP1_IAA_30M_REP1.splice_events.pdf", + "RAP1_IAA_30M_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP1.splice_events.pdf", + "RAP1_UNINDUCED_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP2.splice_events.pdf", + "RAP1_UNINDUCED_REP2.splice_junction.pdf", + "WT_REP1.splice_events.pdf", + "WT_REP1.splice_junction.pdf", + "WT_REP2.splice_events.pdf", + "WT_REP2.splice_junction.pdf", + "RAP1_IAA_30M_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP2.junction_plot.r", + "WT_REP1.junction_plot.r", + "WT_REP2.junction_plot.r", + "RAP1_IAA_30M_REP1.junction.xls", + "RAP1_UNINDUCED_REP1.junction.xls", + "RAP1_UNINDUCED_REP2.junction.xls", + "WT_REP1.junction.xls", + "WT_REP2.junction.xls", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf", + "WT_REP1.junctionSaturation_plot.pdf", + "WT_REP2.junctionSaturation_plot.pdf", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.r", + "WT_REP1.junctionSaturation_plot.r", + "WT_REP2.junctionSaturation_plot.r", + "RAP1_IAA_30M_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP2.read_distribution.txt", + "WT_REP1.read_distribution.txt", + "WT_REP2.read_distribution.txt", + "RAP1_IAA_30M_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP2.DupRate_plot.pdf", + "WT_REP1.DupRate_plot.pdf", + "WT_REP2.DupRate_plot.pdf", + "RAP1_IAA_30M_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP2.DupRate_plot.r", + "WT_REP1.DupRate_plot.r", + "WT_REP2.DupRate_plot.r", + "RAP1_IAA_30M_REP1.pos.DupRate.xls", + "RAP1_IAA_30M_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP1.pos.DupRate.xls", + "RAP1_UNINDUCED_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP2.pos.DupRate.xls", + "RAP1_UNINDUCED_REP2.seq.DupRate.xls", + "WT_REP1.pos.DupRate.xls", + "WT_REP1.seq.DupRate.xls", + "WT_REP2.pos.DupRate.xls", + "WT_REP2.seq.DupRate.xls" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T14:18:39.109008" + }, + "references": { + "content": [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055", + "genome_gfp.gtf:md5,b4776accd1bf7206c7ab0f1d84e4721e" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T15:44:10.068551" + }, + "star_salmon/deseq2_qc": { + "content": [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "RAP1_IAA_30M_REP1.txt", + "RAP1_UNINDUCED_REP1.txt", + "RAP1_UNINDUCED_REP2.txt", + "WT_REP1.txt", + "WT_REP2.txt", + "deseq2.size_factors.RData", + "deseq2.dds.RData", + "deseq2.pca.vals.txt", + "deseq2.plots.pdf", + "deseq2.sample.dists.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T12:28:48.071152" + }, + "star_salmon/markdup": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai", + "WT_REP1.markdup.sorted.bam", + "WT_REP1.markdup.sorted.bam.bai", + "WT_REP2.markdup.sorted.bam", + "WT_REP2.markdup.sorted.bam.bai" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T13:34:18.361387" + }, + "star_salmon/samtools_stats": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.stats", + "RAP1_IAA_30M_REP1.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.sorted.bam.stats", + "WT_REP1.markdup.sorted.bam.flagstat", + "WT_REP1.markdup.sorted.bam.idxstats", + "WT_REP1.markdup.sorted.bam.stats", + "WT_REP1.sorted.bam.flagstat", + "WT_REP1.sorted.bam.idxstats", + "WT_REP1.sorted.bam.stats", + "WT_REP2.markdup.sorted.bam.flagstat", + "WT_REP2.markdup.sorted.bam.idxstats", + "WT_REP2.markdup.sorted.bam.stats", + "WT_REP2.sorted.bam.flagstat", + "WT_REP2.sorted.bam.idxstats", + "WT_REP2.sorted.bam.stats" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T18:50:11.105038" + }, + "salmon/deseq2_qc": { + "content": [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "deseq2.dds.RData", + "deseq2.pca.vals.txt", + "deseq2.plots.pdf", + "deseq2.sample.dists.txt", + "RAP1_IAA_30M_REP1.txt", + "RAP1_UNINDUCED_REP1.txt", + "RAP1_UNINDUCED_REP2.txt", + "WT_REP1.txt", + "WT_REP2.txt", + "deseq2.size_factors.RData" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T17:34:58.241817" + }, + "salmon": { + "content": [ + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T17:34:58.361409" + }, + "multiqc_plots": { + "content": [ + "cutadapt_filtered_reads_plot-cnt.png:md5,704cf0d91bfa3dd658dd8c9590f669a2", + "cutadapt_filtered_reads_plot-pct.png:md5,2684d8b2afca3300e5786486b80237f0", + "cutadapt_trimmed_sequences_plot_3_Counts.png:md5,bef41d894629b0c4dab4478bbf197f50", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.png:md5,1e0d01537d3797623d0b3fd8fbe42787", + "dupradar-section-plot.png:md5,3ae5e5cb161b7abd878d718bc71b41f6", + "fastqc-status-check-heatmap-1.png:md5,2402522f8c02e12aea9af088c6595890", + "fastqc-status-check-heatmap.png:md5,fe8b5b4ab4480d46a12a9005932a9b84", + "fastqc_overrepresented_sequences_plot-1.png:md5,40e450251b80ec0efc9364434234ec7f", + "fastqc_overrepresented_sequences_plot.png:md5,6f5ffbdf1bf61fabe5e028c8bc85de14", + "fastqc_per_sequence_gc_content_plot-1_Counts.png:md5,8a806cec2142f9911502e0a253d83d13", + "fastqc_per_sequence_gc_content_plot-1_Percentages.png:md5,953929d50c8490029880e205e4db7959", + "fastqc_per_sequence_gc_content_plot_Counts.png:md5,01f124545af788fd5cc7bbf41b005e16", + "fastqc_per_sequence_gc_content_plot_Percentages.png:md5,eba3abf8bedb2cb20bad90c54e9c8881", + "fastqc_per_sequence_quality_scores_plot-1.png:md5,d2c29cae169f35744500c751b4a7366e", + "fastqc_per_sequence_quality_scores_plot.png:md5,42fd7369a8aca78f620164a9e887c3cb", + "fastqc_sequence_counts_plot-1-cnt.png:md5,2874fea747c7ff46828bf4f17668caf8", + "fastqc_sequence_counts_plot-1-pct.png:md5,0022d7f5ac78b6eff157de24e37c5ab0", + "fastqc_sequence_counts_plot-cnt.png:md5,3890d5555f2a39b46b9f6efb14cb91f2", + "fastqc_sequence_counts_plot-pct.png:md5,55fa5838c8b2db978fcfa5cb83f6b054", + "fastqc_sequence_duplication_levels_plot-1.png:md5,fcd3b1ec2b95fe4bcd607dc28179a754", + "fastqc_sequence_duplication_levels_plot.png:md5,747431f0f38f8e4c41a11a072fa18780", + "qualimap_gene_coverage_profile_Counts.png:md5,ac424dc7e5444a32e482bd5048ac4432", + "qualimap_gene_coverage_profile_Normalised.png:md5,62e5a2146daec985b8c2de02e3b57c1e", + "rseqc_infer_experiment_plot.png:md5,60c3cafb671fad2cf5f695615230eb8f", + "rseqc_read_dups_plot.png:md5,958513925fa5494bf499c989842d6928", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png:md5,ce6abb232fd5b5f2e66c0fe9a571d75f", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png:md5,6b44818f886ef020fb3646f152ad4af6", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png:md5,d5d8a85b7ad72a0cb93d9283ea12b23f", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png:md5,19317ad8f1448cd7eb1d319f85cc5c4d", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png:md5,a6849cd92ae738441212b681a411614d", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png:md5,4c06988372df63a1fb5f8be93f73ae8f", + "multiqc_report.html", + "cutadapt_filtered_reads_plot-cnt.pdf", + "cutadapt_filtered_reads_plot-pct.pdf", + "cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "dupradar-section-plot.pdf", + "fail_strand_check_table.pdf", + "fastqc-status-check-heatmap-1.pdf", + "fastqc-status-check-heatmap.pdf", + "fastqc_adapter_content_plot.pdf", + "fastqc_overrepresented_sequences_plot-1.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot-1.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot-1.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot-1_Counts.pdf", + "fastqc_per_sequence_gc_content_plot-1_Percentages.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot-1.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-1-cnt.pdf", + "fastqc_sequence_counts_plot-1-pct.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot-1.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table-1.pdf", + "fastqc_top_overrepresented_sequences_table.pdf", + "general_stats_table.pdf", + "picard_deduplication-cnt.pdf", + "picard_deduplication-pct.pdf", + "qualimap_gene_coverage_profile_Counts.pdf", + "qualimap_gene_coverage_profile_Normalised.pdf", + "qualimap_genomic_origin-cnt.pdf", + "qualimap_genomic_origin-pct.pdf", + "rseqc_bam_stat.pdf", + "rseqc_infer_experiment_plot.pdf", + "rseqc_inner_distance_plot_Counts.pdf", + "rseqc_inner_distance_plot_Percentages.pdf", + "rseqc_junction_annotation_junctions_plot_Events-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Events-pct.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf", + "rseqc_junction_saturation_plot_All_Junctions.pdf", + "rseqc_junction_saturation_plot_Known_Junctions.pdf", + "rseqc_junction_saturation_plot_Novel_Junctions.pdf", + "rseqc_read_distribution_plot-cnt.pdf", + "rseqc_read_distribution_plot-pct.pdf", + "rseqc_read_dups_plot.pdf", + "salmon_deseq2_clustering-plot.pdf", + "salmon_deseq2_pca-plot.pdf", + "salmon_plot.pdf", + "samtools-flagstat-dp_Percentage_of_total.pdf", + "samtools-flagstat-dp_Read_counts.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", + "samtools-stats-dp.pdf", + "samtools_alignment_plot-cnt.pdf", + "samtools_alignment_plot-pct.pdf", + "star_alignment_plot-cnt.pdf", + "star_alignment_plot-pct.pdf", + "star_salmon_deseq2_clustering-plot.pdf", + "star_salmon_deseq2_pca-plot.pdf", + "star_summary_table.pdf", + "fail_strand_check_table.png", + "fastqc_adapter_content_plot.png", + "fastqc_per_base_n_content_plot-1.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot-1.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table-1.png", + "fastqc_top_overrepresented_sequences_table.png", + "general_stats_table.png", + "picard_deduplication-cnt.png", + "picard_deduplication-pct.png", + "qualimap_genomic_origin-cnt.png", + "qualimap_genomic_origin-pct.png", + "rseqc_bam_stat.png", + "rseqc_inner_distance_plot_Counts.png", + "rseqc_inner_distance_plot_Percentages.png", + "rseqc_junction_annotation_junctions_plot_Events-cnt.png", + "rseqc_junction_annotation_junctions_plot_Events-pct.png", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.png", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.png", + "rseqc_junction_saturation_plot_All_Junctions.png", + "rseqc_junction_saturation_plot_Known_Junctions.png", + "rseqc_junction_saturation_plot_Novel_Junctions.png", + "rseqc_read_distribution_plot-cnt.png", + "rseqc_read_distribution_plot-pct.png", + "salmon_deseq2_clustering-plot.png", + "salmon_deseq2_pca-plot.png", + "salmon_plot.png", + "samtools-flagstat-dp_Percentage_of_total.png", + "samtools-flagstat-dp_Read_counts.png", + "samtools-stats-dp.png", + "samtools_alignment_plot-cnt.png", + "samtools_alignment_plot-pct.png", + "star_alignment_plot-cnt.png", + "star_alignment_plot-pct.png", + "star_salmon_deseq2_clustering-plot.png", + "star_salmon_deseq2_pca-plot.png", + "star_summary_table.png", + "cutadapt_filtered_reads_plot-cnt.svg", + "cutadapt_filtered_reads_plot-pct.svg", + "cutadapt_trimmed_sequences_plot_3_Counts.svg", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "dupradar-section-plot.svg", + "fail_strand_check_table.svg", + "fastqc-status-check-heatmap-1.svg", + "fastqc-status-check-heatmap.svg", + "fastqc_adapter_content_plot.svg", + "fastqc_overrepresented_sequences_plot-1.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot-1.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot-1.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot-1_Counts.svg", + "fastqc_per_sequence_gc_content_plot-1_Percentages.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot-1.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-1-cnt.svg", + "fastqc_sequence_counts_plot-1-pct.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot-1.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table-1.svg", + "fastqc_top_overrepresented_sequences_table.svg", + "general_stats_table.svg", + "picard_deduplication-cnt.svg", + "picard_deduplication-pct.svg", + "qualimap_gene_coverage_profile_Counts.svg", + "qualimap_gene_coverage_profile_Normalised.svg", + "qualimap_genomic_origin-cnt.svg", + "qualimap_genomic_origin-pct.svg", + "rseqc_bam_stat.svg", + "rseqc_infer_experiment_plot.svg", + "rseqc_inner_distance_plot_Counts.svg", + "rseqc_inner_distance_plot_Percentages.svg", + "rseqc_junction_annotation_junctions_plot_Events-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Events-pct.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.svg", + "rseqc_junction_saturation_plot_All_Junctions.svg", + "rseqc_junction_saturation_plot_Known_Junctions.svg", + "rseqc_junction_saturation_plot_Novel_Junctions.svg", + "rseqc_read_distribution_plot-cnt.svg", + "rseqc_read_distribution_plot-pct.svg", + "rseqc_read_dups_plot.svg", + "salmon_deseq2_clustering-plot.svg", + "salmon_deseq2_pca-plot.svg", + "salmon_plot.svg", + "samtools-flagstat-dp_Percentage_of_total.svg", + "samtools-flagstat-dp_Read_counts.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", + "samtools-stats-dp.svg", + "samtools_alignment_plot-cnt.svg", + "samtools_alignment_plot-pct.svg", + "star_alignment_plot-cnt.svg", + "star_alignment_plot-pct.svg", + "star_salmon_deseq2_clustering-plot.svg", + "star_salmon_deseq2_pca-plot.svg", + "star_summary_table.svg" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T18:50:11.011282" + }, + "star_salmon/picard_metrics": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T17:43:26.670351" + }, + "star_salmon/salmon": { + "content": [ + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T17:43:26.774813" + }, + "fastqc/raw": { + "content": [ + "RAP1_IAA_30M_REP1_raw_1_fastqc.html", + "RAP1_IAA_30M_REP1_raw_1_fastqc.zip", + "RAP1_IAA_30M_REP1_raw_2_fastqc.html", + "RAP1_IAA_30M_REP1_raw_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_raw_fastqc.html", + "RAP1_UNINDUCED_REP1_raw_fastqc.zip", + "RAP1_UNINDUCED_REP2_raw_fastqc.html", + "RAP1_UNINDUCED_REP2_raw_fastqc.zip", + "WT_REP1_raw_1_fastqc.html", + "WT_REP1_raw_1_fastqc.zip", + "WT_REP1_raw_2_fastqc.html", + "WT_REP1_raw_2_fastqc.zip", + "WT_REP2_raw_1_fastqc.html", + "WT_REP2_raw_1_fastqc.zip", + "WT_REP2_raw_2_fastqc.html", + "WT_REP2_raw_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T15:44:10.08366" + }, + "star_salmon/bigwig": { + "content": [ + "RAP1_IAA_30M_REP1.forward.bigWig", + "RAP1_IAA_30M_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP1.forward.bigWig", + "RAP1_UNINDUCED_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP2.forward.bigWig", + "RAP1_UNINDUCED_REP2.reverse.bigWig", + "WT_REP1.forward.bigWig", + "WT_REP1.reverse.bigWig", + "WT_REP2.forward.bigWig", + "WT_REP2.reverse.bigWig" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T17:34:58.428703" + }, + "versions": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, BEDTOOLS_GENOMECOV_FW={bedtools=2.31.1}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=3.9.5}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, CUSTOM_TX2GENE={python=3.9.5}, DESEQ2_QC_PSEUDO={r-base=4.0.3, bioconductor-deseq2=1.28.0}, DESEQ2_QC_STAR_SALMON={r-base=4.0.3, bioconductor-deseq2=1.28.0}, DUPRADAR={bioconductor-dupradar=1.32.0}, FASTQC={fastqc=0.12.1}, FQ_SUBSAMPLE={fq=0.9.1 (2022-02-22)}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, PICARD_MARKDUPLICATES={picard=3.1.1}, QUALIMAP_RNASEQ={qualimap=2.3}, RSEQC_BAMSTAT={rseqc=5.0.2}, RSEQC_INFEREXPERIMENT={rseqc=5.0.2}, RSEQC_INNERDISTANCE={rseqc=5.0.2}, RSEQC_JUNCTIONANNOTATION={rseqc=5.0.2}, RSEQC_JUNCTIONSATURATION={rseqc=5.0.2}, RSEQC_READDISTRIBUTION={rseqc=5.0.2}, RSEQC_READDUPLICATION={rseqc=5.0.2}, SALMON_QUANT={salmon=1.10.1}, SAMTOOLS_FLAGSTAT={samtools=1.2}, SAMTOOLS_IDXSTATS={samtools=1.2}, SAMTOOLS_INDEX={samtools=1.2}, SAMTOOLS_SORT={samtools=1.2}, SAMTOOLS_STATS={samtools=1.2}, SE_GENE={bioconductor-summarizedexperiment=1.32.0}, STAR_ALIGN={star=2.7.10a, samtools=1.18, gawk=5.1.0}, STAR_GENOMEGENERATE={star=2.7.10a, samtools=1.18, gawk=5.1.0}, STRINGTIE_STRINGTIE={stringtie=2.2.1}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, TXIMETA_TXIMPORT={bioconductor-tximeta=1.20.1}, UCSC_BEDCLIP={ucsc=377}, UCSC_BEDGRAPHTOBIGWIG={ucsc=445}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T16:30:35.233269" + }, + "Params: --featurecounts_group_type false - stub": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=null}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, FASTQC={fastqc=0.12.1}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, STAR_GENOMEGENERATE={star=2.7.10a, samtools=1.18, gawk=5.1.0}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}", + "genome_transcriptome.fasta", + "genome_transcriptome.gtf", + "RAP1_IAA_30M_REP1_raw.html", + "RAP1_IAA_30M_REP1_raw.zip", + "RAP1_UNINDUCED_REP1_raw.html", + "RAP1_UNINDUCED_REP1_raw.zip", + "RAP1_UNINDUCED_REP2_raw.html", + "RAP1_UNINDUCED_REP2_raw.zip", + "WT_REP1_raw.html", + "WT_REP1_raw.zip", + "WT_REP2_raw.html", + "WT_REP2_raw.zip", + "multiqc_report.html", + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T16:31:29.50571" + }, + "star_salmon/stringtie": { + "content": [ + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,3f149502efe2a9d4bac98b1dd18c15e7", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,a052ab04070e72cc318fb7680b0764e3", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,e82329a443b9ff50a86e42aff91bd704", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,d279003d92f7feef9adb31203f84474a", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,10e2d00f93f9e74f224bd3c1bfbeb29b", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,525413b70bcf62c24c8f96182e09883e", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,9aa371befc36478d7720d3ea275e6f4d", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,907ab2e06346df131cbdb929afc005a8", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,b03f3118d1aa58fceadcb3311028e856", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,041edee3193df311f621c09f4991892b", + "t_data.ctab", + "RAP1_IAA_30M_REP1.coverage.gtf", + "RAP1_IAA_30M_REP1.gene.abundance.txt", + "RAP1_IAA_30M_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP1.coverage.gtf", + "RAP1_UNINDUCED_REP1.gene.abundance.txt", + "RAP1_UNINDUCED_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP2.coverage.gtf", + "RAP1_UNINDUCED_REP2.gene.abundance.txt", + "RAP1_UNINDUCED_REP2.transcripts.gtf", + "t_data.ctab", + "WT_REP1.coverage.gtf", + "WT_REP1.gene.abundance.txt", + "WT_REP1.transcripts.gtf", + "t_data.ctab", + "WT_REP2.coverage.gtf", + "WT_REP2.gene.abundance.txt", + "WT_REP2.transcripts.gtf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T17:43:26.873868" + }, + "fastqc/trim": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip", + "WT_REP1_trimmed_1_val_1_fastqc.html", + "WT_REP1_trimmed_1_val_1_fastqc.zip", + "WT_REP1_trimmed_2_val_2_fastqc.html", + "WT_REP1_trimmed_2_val_2_fastqc.zip", + "WT_REP2_trimmed_1_val_1_fastqc.html", + "WT_REP2_trimmed_1_val_1_fastqc.zip", + "WT_REP2_trimmed_2_val_2_fastqc.html", + "WT_REP2_trimmed_2_val_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T15:44:10.142955" + }, + "star_salmon/dupradar": { + "content": [ + "RAP1_IAA_30M_REP1_dupMatrix.txt:md5,2e0d518a450bb57801cdd075d4e9c217", + "RAP1_UNINDUCED_REP1_dupMatrix.txt:md5,96e2f9e1fc5a22a7d468e6fb4a613370", + "RAP1_UNINDUCED_REP2_dupMatrix.txt:md5,28c30ce734d78d53b1c47c3f87414e4b", + "WT_REP1_dupMatrix.txt:md5,b6aa1b99d91f5fa7a94efeed1c496c00", + "WT_REP2_dupMatrix.txt:md5,02236769150436cf31b7339f612119a5", + "RAP1_IAA_30M_REP1_intercept_slope.txt:md5,c677048855caf5190f29fa5f7137cd79", + "RAP1_UNINDUCED_REP1_intercept_slope.txt:md5,ea1b4323d3bc83759e8a026416bca32b", + "RAP1_UNINDUCED_REP2_intercept_slope.txt:md5,b062f49a5223a3452075062cdd308043", + "WT_REP1_intercept_slope.txt:md5,e7fcac6d125a7ba746a5cba4a1e66aef", + "WT_REP2_intercept_slope.txt:md5,5af16b07a734b73a2c1103b535f9e26e", + "RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf", + "WT_REP1_duprateExpBoxplot.pdf", + "WT_REP2_duprateExpBoxplot.pdf", + "RAP1_IAA_30M_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP2_expressionHist.pdf", + "WT_REP1_expressionHist.pdf", + "WT_REP2_expressionHist.pdf", + "RAP1_IAA_30M_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP2_duprateExpDens.pdf", + "WT_REP1_duprateExpDens.pdf", + "WT_REP2_duprateExpDens.pdf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T17:34:58.606096" + }, + "bbsplit": { + "content": [ + "RAP1_IAA_30M_REP1.stats.txt", + "RAP1_UNINDUCED_REP1.stats.txt", + "RAP1_UNINDUCED_REP2.stats.txt", + "WT_REP1.stats.txt", + "WT_REP2.stats.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T16:30:34.908301" + }, + "salmon_quant": { + "content": [ + "ambig_info.tsv:md5,de973a4b22a4457217ae3dc04caf9401", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,1215f0c20f87d3aef8553ef119e1e74c", + "lib_format_counts.json:md5,c24ffe28d70476b5ccdd8bc2d22c0ac1", + "ambig_info.tsv:md5,45f252b4f0e11e6730cf0c29f800fdbb", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,621c6601aade5b1f2e3d6ca2fc71f636", + "lib_format_counts.json:md5,f6d44c0221f7fd559f11a9afe04c9935", + "ambig_info.tsv:md5,6dcc2891ea572e9b8d1ba52cd434ab84", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,9bed6e4dc5428d6f6297adcea29a6326", + "lib_format_counts.json:md5,7c562bf2f70e42f3a7292687dfd328c3", + "ambig_info.tsv:md5,194f574e0586416155e3f33d42e2b167", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,c7ed0aaa5d6c7934ddbebfd29e4eb86d", + "lib_format_counts.json:md5,d46250bb3677d72feeefc435fe6395a6", + "ambig_info.tsv:md5,a26e3f936e65d7da66392603c2f91f6f", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,69ebfc2c7ca6b221a0a22fa1dc8c20ac", + "lib_format_counts.json:md5,088fd51db07022ffde47033bbd029400", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-22T17:34:58.29814" + }, + "star_salmon/qualimap": { + "content": [ + "Coverage Profile Along Genes (High).png:md5,876c1b88f33bd3e5fe1a41679729573d", + "Coverage Profile Along Genes (Low).png:md5,ee1f2c9cc4dd4867811eda1e68864ab4", + "Coverage Profile Along Genes (Total).png:md5,53747a8f9813744902756ad60638380a", + "Transcript coverage histogram.png:md5,4f9072d4b11216373b59396293803a37", + "coverage_profile_along_genes_(high).txt:md5,fcb06d460810c0555de5396b9dae05e8", + "coverage_profile_along_genes_(low).txt:md5,e3c9a1ddfdb89f8534ff7548b70fce32", + "coverage_profile_along_genes_(total).txt:md5,e3c9a1ddfdb89f8534ff7548b70fce32", + "Coverage Profile Along Genes (High).png:md5,bbf0531018e7fccfc1dfdd1c05715518", + "Coverage Profile Along Genes (Low).png:md5,3c147d9c831d4be98615a22a72fad05d", + "Coverage Profile Along Genes (Total).png:md5,5a8a6db3a8d19a2dcb8f715b11e67c50", + "Transcript coverage histogram.png:md5,488440d7b6d73bcd4567316712e281fe", + "coverage_profile_along_genes_(high).txt:md5,9f1e29a4d6eec52e8796b080daaedca3", + "coverage_profile_along_genes_(low).txt:md5,353f42a84ff34167646fc83909eac2ff", + "coverage_profile_along_genes_(total).txt:md5,353f42a84ff34167646fc83909eac2ff", + "Coverage Profile Along Genes (High).png:md5,5a5d99cc7a1dba3762d67f4aa4adad58", + "Coverage Profile Along Genes (Low).png:md5,b6adc296e9a732aa0495a6da8fa4ed90", + "Coverage Profile Along Genes (Total).png:md5,fcb94fb9c1a51c1db32f884d05929cc8", + "Transcript coverage histogram.png:md5,3aeb52ff3e3752727a370b0d7ceb0518", + "coverage_profile_along_genes_(high).txt:md5,3b20a736708df02ea8c86dc5829ae67e", + "coverage_profile_along_genes_(low).txt:md5,02b314b76ef1317f20e129412340755d", + "coverage_profile_along_genes_(total).txt:md5,02b314b76ef1317f20e129412340755d", + "Coverage Profile Along Genes (High).png:md5,c974d47996bcc57b99dfaf6903f61f41", + "Coverage Profile Along Genes (Low).png:md5,c8fe631f0580c93adb5be107c6a7a1a3", + "Coverage Profile Along Genes (Total).png:md5,424d245e9f3e626d9e79f51d1b93e946", + "Transcript coverage histogram.png:md5,17404146ad5e0a9bce97ce622e00975e", + "coverage_profile_along_genes_(high).txt:md5,8bf366c7dbc6170035ee64a057c581f1", + "coverage_profile_along_genes_(low).txt:md5,a9102de3ff9679d1f7a86afa85997211", + "coverage_profile_along_genes_(total).txt:md5,a9102de3ff9679d1f7a86afa85997211", + "Coverage Profile Along Genes (High).png:md5,40edd79c21f3e8d8bbac384156c472d6", + "Coverage Profile Along Genes (Low).png:md5,935c0372259a953a4c99569e9b236ae5", + "Coverage Profile Along Genes (Total).png:md5,34f7a4307be1ea674b7b98eee564d96b", + "Transcript coverage histogram.png:md5,e2abf8a9c62fef57f0be1ca0e01e502d", + "coverage_profile_along_genes_(high).txt:md5,3f13eb908d6e97e6831306e9527cc2e3", + "coverage_profile_along_genes_(low).txt:md5,24df553662d0cedaa74cf06a8fead40b", + "coverage_profile_along_genes_(total).txt:md5,24df553662d0cedaa74cf06a8fead40b", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T14:18:38.410297" + } +} \ No newline at end of file diff --git a/tests/hisat2.nf.test b/tests/hisat2.nf.test new file mode 100644 index 000000000..9577086ea --- /dev/null +++ b/tests/hisat2.nf.test @@ -0,0 +1,861 @@ +nextflow_pipeline { + + name "Test pipeline with HISAT2 aligner" + script "../main.nf" + + test("Params: --aligner hisat2") { + + when { + params { + outdir = "$outputDir" + aligner = 'hisat2' + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/bbsplit/RAP1_IAA_30M_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP2.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP2.stats.txt").name + ).match("bbsplit") }, + { assert snapshot( + path("${params.outdir}/custom/out/genome_gfp.fasta"), + path("${params.outdir}/custom/out/genome_gfp.gtf") + ).match("references") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.zip").name + ).match("fastqc/raw") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.zip").name + ).match("fastqc/trim") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/hisat2/bigwig/RAP1_IAA_30M_REP1.forward.bigWig").name, + file("${params.outdir}/hisat2/bigwig/RAP1_IAA_30M_REP1.reverse.bigWig").name, + file("${params.outdir}/hisat2/bigwig/RAP1_UNINDUCED_REP1.forward.bigWig").name, + file("${params.outdir}/hisat2/bigwig/RAP1_UNINDUCED_REP1.reverse.bigWig").name, + file("${params.outdir}/hisat2/bigwig/RAP1_UNINDUCED_REP2.forward.bigWig").name, + file("${params.outdir}/hisat2/bigwig/RAP1_UNINDUCED_REP2.reverse.bigWig").name, + file("${params.outdir}/hisat2/bigwig/WT_REP1.forward.bigWig").name, + file("${params.outdir}/hisat2/bigwig/WT_REP1.reverse.bigWig").name, + file("${params.outdir}/hisat2/bigwig/WT_REP2.forward.bigWig").name, + file("${params.outdir}/hisat2/bigwig/WT_REP2.reverse.bigWig").name + ).match("hisat2/bigwig") }, + { assert snapshot( + path("${params.outdir}/hisat2/dupradar/gene_data/RAP1_IAA_30M_REP1_dupMatrix.txt"), + path("${params.outdir}/hisat2/dupradar/gene_data/RAP1_UNINDUCED_REP1_dupMatrix.txt"), + path("${params.outdir}/hisat2/dupradar/gene_data/RAP1_UNINDUCED_REP2_dupMatrix.txt"), + path("${params.outdir}/hisat2/dupradar/gene_data/WT_REP1_dupMatrix.txt"), + path("${params.outdir}/hisat2/dupradar/gene_data/WT_REP2_dupMatrix.txt"), + path("${params.outdir}/hisat2/dupradar/intercepts_slope/RAP1_IAA_30M_REP1_intercept_slope.txt"), + path("${params.outdir}/hisat2/dupradar/intercepts_slope/RAP1_UNINDUCED_REP1_intercept_slope.txt"), + path("${params.outdir}/hisat2/dupradar/intercepts_slope/RAP1_UNINDUCED_REP2_intercept_slope.txt"), + path("${params.outdir}/hisat2/dupradar/intercepts_slope/WT_REP1_intercept_slope.txt"), + path("${params.outdir}/hisat2/dupradar/intercepts_slope/WT_REP2_intercept_slope.txt"), + // PDFs are not stable + file("${params.outdir}/hisat2/dupradar/box_plot/RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/hisat2/dupradar/box_plot/RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/hisat2/dupradar/box_plot/RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf").name, + file("${params.outdir}/hisat2/dupradar/box_plot/WT_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/hisat2/dupradar/box_plot/WT_REP2_duprateExpBoxplot.pdf").name, + file("${params.outdir}/hisat2/dupradar/histogram/RAP1_IAA_30M_REP1_expressionHist.pdf").name, + file("${params.outdir}/hisat2/dupradar/histogram/RAP1_UNINDUCED_REP1_expressionHist.pdf").name, + file("${params.outdir}/hisat2/dupradar/histogram/RAP1_UNINDUCED_REP2_expressionHist.pdf").name, + file("${params.outdir}/hisat2/dupradar/histogram/WT_REP1_expressionHist.pdf").name, + file("${params.outdir}/hisat2/dupradar/histogram/WT_REP2_expressionHist.pdf").name, + file("${params.outdir}/hisat2/dupradar/scatter_plot/RAP1_IAA_30M_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/hisat2/dupradar/scatter_plot/RAP1_UNINDUCED_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/hisat2/dupradar/scatter_plot/RAP1_UNINDUCED_REP2_duprateExpDens.pdf").name, + file("${params.outdir}/hisat2/dupradar/scatter_plot/WT_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/hisat2/dupradar/scatter_plot/WT_REP2_duprateExpDens.pdf").name + ).match("hisat2/dupradar") }, + { assert snapshot( + path("${params.outdir}/hisat2/featurecounts/RAP1_IAA_30M_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/hisat2/featurecounts/RAP1_IAA_30M_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/hisat2/featurecounts/RAP1_IAA_30M_REP1.featureCounts.txt"), + path("${params.outdir}/hisat2/featurecounts/RAP1_UNINDUCED_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/hisat2/featurecounts/RAP1_UNINDUCED_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/hisat2/featurecounts/RAP1_UNINDUCED_REP1.featureCounts.txt"), + path("${params.outdir}/hisat2/featurecounts/RAP1_UNINDUCED_REP2.biotype_counts_mqc.tsv"), + path("${params.outdir}/hisat2/featurecounts/RAP1_UNINDUCED_REP2.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/hisat2/featurecounts/RAP1_UNINDUCED_REP2.featureCounts.txt"), + path("${params.outdir}/hisat2/featurecounts/WT_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/hisat2/featurecounts/WT_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/hisat2/featurecounts/WT_REP1.featureCounts.txt"), + path("${params.outdir}/hisat2/featurecounts/WT_REP2.biotype_counts_mqc.tsv"), + path("${params.outdir}/hisat2/featurecounts/WT_REP2.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/hisat2/featurecounts/WT_REP2.featureCounts.txt"), + file("${params.outdir}/hisat2/featurecounts/RAP1_IAA_30M_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/hisat2/featurecounts/RAP1_UNINDUCED_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/hisat2/featurecounts/RAP1_UNINDUCED_REP2.featureCounts.txt.summary").name, + file("${params.outdir}/hisat2/featurecounts/WT_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/hisat2/featurecounts/WT_REP2.featureCounts.txt.summary").name + ).match("hisat2/featurecounts") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/hisat2/RAP1_IAA_30M_REP1.markdup.sorted.bam").name, + file("${params.outdir}/hisat2/RAP1_IAA_30M_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/hisat2/RAP1_UNINDUCED_REP1.markdup.sorted.bam").name, + file("${params.outdir}/hisat2/RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/hisat2/RAP1_UNINDUCED_REP2.markdup.sorted.bam").name, + file("${params.outdir}/hisat2/RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai").name, + file("${params.outdir}/hisat2/WT_REP1.markdup.sorted.bam").name, + file("${params.outdir}/hisat2/WT_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/hisat2/WT_REP2.markdup.sorted.bam").name, + file("${params.outdir}/hisat2/WT_REP2.markdup.sorted.bam.bai").name + ).match("hisat2/markdup") }, + { assert snapshot( + file("${params.outdir}/hisat2/log/RAP1_IAA_30M_REP1.hisat2.summary.log").name, + file("${params.outdir}/hisat2/log/RAP1_UNINDUCED_REP1.hisat2.summary.log").name, + file("${params.outdir}/hisat2/log/RAP1_UNINDUCED_REP2.hisat2.summary.log").name, + file("${params.outdir}/hisat2/log/WT_REP1.hisat2.summary.log").name, + file("${params.outdir}/hisat2/log/WT_REP2.hisat2.summary.log").name + ).match("hisat2") }, + { assert snapshot( + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/cutadapt_filtered_reads_plot.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Counts.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc-status-check-heatmap-1.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc-status-check-heatmap.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_adapter_content_plot.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_overrepresented_sequences_plot-1.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_overrepresented_sequences_plot.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_per_base_n_content_plot-1.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_per_base_n_content_plot.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_per_base_sequence_quality_plot-1.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_per_base_sequence_quality_plot.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_per_sequence_gc_content_plot-1_Counts.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_per_sequence_gc_content_plot-1_Percentages.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Counts.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Percentages.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_per_sequence_quality_scores_plot-1.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_per_sequence_quality_scores_plot.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_sequence_counts_plot-1.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_sequence_counts_plot.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_sequence_duplication_levels_plot-1.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_sequence_duplication_levels_plot.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_sequence_length_distribution_plot.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_citations.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_cutadapt.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_fastqc_fastqc_raw.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_fastqc_fastqc_trimmed.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_featurecounts_biotype_plot.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_samtools_idxstats.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/picard_histogram.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/picard_histogram_1.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/picard_histogram_2.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/qualimap_gene_coverage_profile_Counts.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/qualimap_gene_coverage_profile_Normalised.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/qualimap_rnaseq_cov_hist.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_infer_experiment_plot.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt"), + // These files are not stable + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_top_overrepresented_sequences_table-1.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/fastqc_top_overrepresented_sequences_table.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/hisat2_pe_plot.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/hisat2_se_plot.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/junction_saturation_known.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/junction_saturation_novel.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_data.json").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_dupradar-section-plot.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_fail_strand_check_table.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_general_stats.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_hisat2.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_hisat2_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_hisat2_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_hisat2_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_hisat2_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_hisat2_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_hisat2_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_picard_dups.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_rseqc_infer_experiment.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_rseqc_junction_annotation.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_rseqc_read_distribution.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_salmon.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_salmon_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_samtools_flagstat.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_samtools_stats.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_software_versions.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/multiqc_sources.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/picard_deduplication.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/qualimap_genomic_origin.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_inner_distance.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_inner_distance_plot_Counts.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_inner_distance_plot_Percentages.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Events.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Junctions.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_junction_saturation_all.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_junction_saturation_plot_All_Junctions.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_junction_saturation_plot_Known_Junctions.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_junction_saturation_plot_Novel_Junctions.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_read_distribution_plot.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_read_dups.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/rseqc_read_dups_plot.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/salmon_plot.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/samtools-flagstat-dp_Percentage_of_total.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/samtools-flagstat-dp_Read_counts.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/samtools-stats-dp.txt").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_data/samtools_alignment_plot.txt").name + ).match("multiqc_data") }, + { assert snapshot( + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/cutadapt_filtered_reads_plot-cnt.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/cutadapt_filtered_reads_plot-pct.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Counts.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Obs_Exp.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/dupradar-section-plot.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc-status-check-heatmap-1.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc-status-check-heatmap.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot-1.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot-1_Counts.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot-1_Percentages.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot-1.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_sequence_counts_plot-1-cnt.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_sequence_counts_plot-1-pct.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_sequence_counts_plot-cnt.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_sequence_counts_plot-pct.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot-1.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/featurecounts_biotype_plot-cnt.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/featurecounts_biotype_plot-pct.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/qualimap_gene_coverage_profile_Counts.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/qualimap_gene_coverage_profile_Normalised.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_infer_experiment_plot.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_read_dups_plot.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png"), + path("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png"), + // PDFs, SVGs, some PNGs and HTML reports are not stable + file("${params.outdir}/multiqc/hisat2/multiqc_report.html").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-pct.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Counts.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/dupradar-section-plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fail_strand_check_table.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc-status-check-heatmap-1.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc-status-check-heatmap.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_adapter_content_plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot-1.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot-1.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot-1.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot-1_Counts.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot-1_Percentages.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot-1.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-1-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-1-pct.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-pct.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot-1.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_sequence_length_distribution_plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table-1.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/featurecounts_biotype_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/featurecounts_biotype_plot-pct.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/general_stats_table.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/hisat2_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/hisat2_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/hisat2_pe_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/hisat2_pe_plot-pct.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/hisat2_se_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/hisat2_se_plot-pct.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/picard_deduplication-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/picard_deduplication-pct.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Counts.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Normalised.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/qualimap_genomic_origin-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/qualimap_genomic_origin-pct.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_bam_stat.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_infer_experiment_plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-pct.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_All_Junctions.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Known_Junctions.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Novel_Junctions.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_read_distribution_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_read_distribution_plot-pct.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/rseqc_read_dups_plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/salmon_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/salmon_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/salmon_plot.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/samtools-flagstat-dp_Percentage_of_total.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/samtools-flagstat-dp_Read_counts.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/samtools-stats-dp.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/samtools_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/pdf/samtools_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fail_strand_check_table.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_adapter_content_plot.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_per_base_n_content_plot-1.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_per_base_n_content_plot.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot-1.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_sequence_length_distribution_plot.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table-1.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/general_stats_table.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/hisat2_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/hisat2_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/hisat2_pe_plot-cnt.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/hisat2_pe_plot-pct.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/hisat2_se_plot-cnt.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/hisat2_se_plot-pct.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/picard_deduplication-cnt.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/picard_deduplication-pct.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/qualimap_genomic_origin-cnt.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/qualimap_genomic_origin-pct.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_bam_stat.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_inner_distance_plot_Counts.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_inner_distance_plot_Percentages.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-cnt.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-pct.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-cnt.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-pct.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_junction_saturation_plot_All_Junctions.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_junction_saturation_plot_Known_Junctions.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_junction_saturation_plot_Novel_Junctions.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_read_distribution_plot-cnt.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/rseqc_read_distribution_plot-pct.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/salmon_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/salmon_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/salmon_plot.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/samtools-flagstat-dp_Percentage_of_total.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/samtools-flagstat-dp_Read_counts.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/samtools-stats-dp.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/samtools_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/png/samtools_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-pct.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Counts.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/dupradar-section-plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fail_strand_check_table.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc-status-check-heatmap-1.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc-status-check-heatmap.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_adapter_content_plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot-1.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_per_base_n_content_plot-1.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_per_base_n_content_plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot-1.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot-1_Counts.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot-1_Percentages.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot-1.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_sequence_counts_plot-1-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_sequence_counts_plot-1-pct.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_sequence_counts_plot-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_sequence_counts_plot-pct.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot-1.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_sequence_length_distribution_plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table-1.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/featurecounts_biotype_plot-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/featurecounts_biotype_plot-pct.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/general_stats_table.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/hisat2_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/hisat2_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/hisat2_pe_plot-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/hisat2_pe_plot-pct.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/hisat2_se_plot-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/hisat2_se_plot-pct.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/picard_deduplication-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/picard_deduplication-pct.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Counts.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Normalised.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/qualimap_genomic_origin-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/qualimap_genomic_origin-pct.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_bam_stat.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_infer_experiment_plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_inner_distance_plot_Counts.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_inner_distance_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-pct.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-pct.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_junction_saturation_plot_All_Junctions.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Known_Junctions.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Novel_Junctions.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_read_distribution_plot-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_read_distribution_plot-pct.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/rseqc_read_dups_plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/salmon_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/salmon_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/salmon_plot.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/samtools-flagstat-dp_Percentage_of_total.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/samtools-flagstat-dp_Read_counts.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/samtools-stats-dp.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/samtools_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report_plots/svg/samtools_alignment_plot-pct.svg").name + ).match("multiqc_plots") }, + { assert snapshot( + // Metrics are not stable + file("${params.outdir}/hisat2/picard_metrics/RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/hisat2/picard_metrics/RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/hisat2/picard_metrics/RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/hisat2/picard_metrics/WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/hisat2/picard_metrics/WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name + ).match("hisat2/picard_metrics") }, + { assert snapshot( + path("${params.outdir}/hisat2/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/hisat2/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/hisat2/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/hisat2/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/hisat2/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/hisat2/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/hisat2/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/hisat2/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/hisat2/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/hisat2/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/hisat2/qualimap/WT_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/hisat2/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/hisat2/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/hisat2/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/hisat2/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/hisat2/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/hisat2/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/hisat2/qualimap/WT_REP2/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/hisat2/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/hisat2/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/hisat2/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + // HTML reports and these files are not stable + file("${params.outdir}/hisat2/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/hisat2/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/hisat2/qualimap/RAP1_IAA_30M_REP1/qualimapReport.html").name, + file("${params.outdir}/hisat2/qualimap/RAP1_IAA_30M_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP1/qualimapReport.html").name, + file("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP2/qualimapReport.html").name, + file("${params.outdir}/hisat2/qualimap/RAP1_UNINDUCED_REP2/rnaseq_qc_results.txt").name, + file("${params.outdir}/hisat2/qualimap/WT_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/hisat2/qualimap/WT_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/hisat2/qualimap/WT_REP1/qualimapReport.html").name, + file("${params.outdir}/hisat2/qualimap/WT_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/hisat2/qualimap/WT_REP2/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/hisat2/qualimap/WT_REP2/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/hisat2/qualimap/WT_REP2/qualimapReport.html").name, + file("${params.outdir}/hisat2/qualimap/WT_REP2/rnaseq_qc_results.txt").name + ).match("hisat2/qualimap") }, + { assert snapshot( + path("${params.outdir}/hisat2/rseqc/infer_experiment/RAP1_IAA_30M_REP1.infer_experiment.txt"), + path("${params.outdir}/hisat2/rseqc/infer_experiment/RAP1_UNINDUCED_REP1.infer_experiment.txt"), + path("${params.outdir}/hisat2/rseqc/infer_experiment/RAP1_UNINDUCED_REP2.infer_experiment.txt"), + path("${params.outdir}/hisat2/rseqc/infer_experiment/WT_REP1.infer_experiment.txt"), + path("${params.outdir}/hisat2/rseqc/infer_experiment/WT_REP2.infer_experiment.txt"), + // PDFs, R scripts and all these files are not stable + file("${params.outdir}/hisat2/rseqc/bam_stat/RAP1_IAA_30M_REP1.bam_stat.txt").name, + file("${params.outdir}/hisat2/rseqc/bam_stat/RAP1_UNINDUCED_REP1.bam_stat.txt").name, + file("${params.outdir}/hisat2/rseqc/bam_stat/RAP1_UNINDUCED_REP2.bam_stat.txt").name, + file("${params.outdir}/hisat2/rseqc/bam_stat/WT_REP1.bam_stat.txt").name, + file("${params.outdir}/hisat2/rseqc/bam_stat/WT_REP2.bam_stat.txt").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/pdf/RAP1_IAA_30M_REP1.inner_distance_plot.pdf").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/pdf/WT_REP1.inner_distance_plot.pdf").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/pdf/WT_REP2.inner_distance_plot.pdf").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/rscript/RAP1_IAA_30M_REP1.inner_distance_plot.r").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/rscript/WT_REP1.inner_distance_plot.r").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/rscript/WT_REP2.inner_distance_plot.r").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance.txt").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_freq.txt").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_mean.txt").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/txt/WT_REP1.inner_distance.txt").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/txt/WT_REP1.inner_distance_freq.txt").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/txt/WT_REP1.inner_distance_mean.txt").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/txt/WT_REP2.inner_distance.txt").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/txt/WT_REP2.inner_distance_freq.txt").name, + file("${params.outdir}/hisat2/rseqc/inner_distance/txt/WT_REP2.inner_distance_mean.txt").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.Interact.bed").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.bed").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.Interact.bed").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.bed").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.Interact.bed").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.bed").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/bed/WT_REP1.junction.Interact.bed").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/bed/WT_REP1.junction.bed").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/bed/WT_REP2.junction.Interact.bed").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/bed/WT_REP2.junction.bed").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/log/RAP1_IAA_30M_REP1.junction_annotation.log").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP1.junction_annotation.log").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP2.junction_annotation.log").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/log/WT_REP1.junction_annotation.log").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/log/WT_REP2.junction_annotation.log").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_events.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_junction.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_events.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_junction.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_events.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_junction.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/pdf/WT_REP1.splice_events.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/pdf/WT_REP1.splice_junction.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/pdf/WT_REP2.splice_events.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/pdf/WT_REP2.splice_junction.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/rscript/RAP1_IAA_30M_REP1.junction_plot.r").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP1.junction_plot.r").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP2.junction_plot.r").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/rscript/WT_REP1.junction_plot.r").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/rscript/WT_REP2.junction_plot.r").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/xls/RAP1_IAA_30M_REP1.junction.xls").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP1.junction.xls").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP2.junction.xls").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/xls/WT_REP1.junction.xls").name, + file("${params.outdir}/hisat2/rseqc/junction_annotation/xls/WT_REP2.junction.xls").name, + file("${params.outdir}/hisat2/rseqc/junction_saturation/pdf/RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_saturation/pdf/WT_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_saturation/pdf/WT_REP2.junctionSaturation_plot.pdf").name, + file("${params.outdir}/hisat2/rseqc/junction_saturation/rscript/RAP1_IAA_30M_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/hisat2/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/hisat2/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP2.junctionSaturation_plot.r").name, + file("${params.outdir}/hisat2/rseqc/junction_saturation/rscript/WT_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/hisat2/rseqc/junction_saturation/rscript/WT_REP2.junctionSaturation_plot.r").name, + file("${params.outdir}/hisat2/rseqc/read_distribution/RAP1_IAA_30M_REP1.read_distribution.txt").name, + file("${params.outdir}/hisat2/rseqc/read_distribution/RAP1_UNINDUCED_REP1.read_distribution.txt").name, + file("${params.outdir}/hisat2/rseqc/read_distribution/RAP1_UNINDUCED_REP2.read_distribution.txt").name, + file("${params.outdir}/hisat2/rseqc/read_distribution/WT_REP1.read_distribution.txt").name, + file("${params.outdir}/hisat2/rseqc/read_distribution/WT_REP2.read_distribution.txt").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/pdf/RAP1_IAA_30M_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP2.DupRate_plot.pdf").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/pdf/WT_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/pdf/WT_REP2.DupRate_plot.pdf").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/rscript/RAP1_IAA_30M_REP1.DupRate_plot.r").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP1.DupRate_plot.r").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP2.DupRate_plot.r").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/rscript/WT_REP1.DupRate_plot.r").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/rscript/WT_REP2.DupRate_plot.r").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.pos.DupRate.xls").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.seq.DupRate.xls").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.pos.DupRate.xls").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.seq.DupRate.xls").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.pos.DupRate.xls").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.seq.DupRate.xls").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/xls/WT_REP1.pos.DupRate.xls").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/xls/WT_REP1.seq.DupRate.xls").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/xls/WT_REP2.pos.DupRate.xls").name, + file("${params.outdir}/hisat2/rseqc/read_duplication/xls/WT_REP2.seq.DupRate.xls").name + ).match("hisat2/rseqc") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/hisat2/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.stats").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.stats").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/hisat2/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.stats").name, + file("${params.outdir}/hisat2/samtools_stats/WT_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/hisat2/samtools_stats/WT_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/hisat2/samtools_stats/WT_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/hisat2/samtools_stats/WT_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/hisat2/samtools_stats/WT_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/hisat2/samtools_stats/WT_REP1.sorted.bam.stats").name, + file("${params.outdir}/hisat2/samtools_stats/WT_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/hisat2/samtools_stats/WT_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/hisat2/samtools_stats/WT_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/hisat2/samtools_stats/WT_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/hisat2/samtools_stats/WT_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/hisat2/samtools_stats/WT_REP2.sorted.bam.stats").name + ).match("hisat2/samtools_stats") }, + { assert snapshot( + path("${params.outdir}/hisat2/stringtie/RAP1_IAA_30M_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/hisat2/stringtie/RAP1_IAA_30M_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/hisat2/stringtie/RAP1_IAA_30M_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/hisat2/stringtie/RAP1_IAA_30M_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP2.ballgown/i_data.ctab"), + path("${params.outdir}/hisat2/stringtie/WT_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/hisat2/stringtie/WT_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/hisat2/stringtie/WT_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/hisat2/stringtie/WT_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/hisat2/stringtie/WT_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/hisat2/stringtie/WT_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/hisat2/stringtie/WT_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/hisat2/stringtie/WT_REP2.ballgown/i_data.ctab"), + // These files are not stable + file("${params.outdir}/hisat2/stringtie/RAP1_IAA_30M_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/hisat2/stringtie/RAP1_IAA_30M_REP1.coverage.gtf").name, + file("${params.outdir}/hisat2/stringtie/RAP1_IAA_30M_REP1.gene.abundance.txt").name, + file("${params.outdir}/hisat2/stringtie/RAP1_IAA_30M_REP1.transcripts.gtf").name, + file("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP1.coverage.gtf").name, + file("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP1.gene.abundance.txt").name, + file("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP1.transcripts.gtf").name, + file("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP2.coverage.gtf").name, + file("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP2.gene.abundance.txt").name, + file("${params.outdir}/hisat2/stringtie/RAP1_UNINDUCED_REP2.transcripts.gtf").name, + file("${params.outdir}/hisat2/stringtie/WT_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/hisat2/stringtie/WT_REP1.coverage.gtf").name, + file("${params.outdir}/hisat2/stringtie/WT_REP1.gene.abundance.txt").name, + file("${params.outdir}/hisat2/stringtie/WT_REP1.transcripts.gtf").name, + file("${params.outdir}/hisat2/stringtie/WT_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/hisat2/stringtie/WT_REP2.coverage.gtf").name, + file("${params.outdir}/hisat2/stringtie/WT_REP2.gene.abundance.txt").name, + file("${params.outdir}/hisat2/stringtie/WT_REP2.transcripts.gtf").name + ).match("hisat2/stringtie") }, + { assert snapshot( + path("${params.outdir}/salmon/deseq2_qc/R_sessionInfo.log"), + // These files are not stable + file("${params.outdir}/salmon/deseq2_qc/deseq2.dds.RData").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.pca.vals.txt").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.plots.pdf").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.sample.dists.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_IAA_30M_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/deseq2.size_factors.RData").name + ).match("salmon/deseq2_qc") }, + { assert snapshot( + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP2/lib_format_counts.json"), + // These files are not stable + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP2/quant.sf").name + ).match("salmon_quant") }, + { assert snapshot( + path("${params.outdir}/salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_tpm.tsv").name + ).match("salmon") }, + { assert snapshot( + // These reports are not stable + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match("trimgalore") }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml") + ).match("versions") } + ) + } + } + + test("Params: --aligner hisat2 - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + aligner = 'hisat2' + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml"), + file("${params.outdir}/custom/out/genome_transcriptome.fasta").name, + file("${params.outdir}/custom/out/genome_transcriptome.gtf").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.zip").name, + file("${params.outdir}/multiqc/hisat2/multiqc_report.html").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match() } + ) + } + } +} diff --git a/tests/hisat2.nf.test.snap b/tests/hisat2.nf.test.snap new file mode 100644 index 000000000..db5ac14e1 --- /dev/null +++ b/tests/hisat2.nf.test.snap @@ -0,0 +1,961 @@ +{ + "hisat2/rseqc": { + "content": [ + "RAP1_IAA_30M_REP1.infer_experiment.txt:md5,1d4348685fa61819ff8076213d0873b3", + "RAP1_UNINDUCED_REP1.infer_experiment.txt:md5,3ee0f64e82f0b1ac16b5f3e2b30b024c", + "RAP1_UNINDUCED_REP2.infer_experiment.txt:md5,3d17628d178e5a3cc9dc03f32614bff7", + "WT_REP1.infer_experiment.txt:md5,13e3c748f5b968455a39eb9fefd87053", + "WT_REP2.infer_experiment.txt:md5,230910b354a5531d1c4bf711ccd6e493", + "RAP1_IAA_30M_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP2.bam_stat.txt", + "WT_REP1.bam_stat.txt", + "WT_REP2.bam_stat.txt", + "RAP1_IAA_30M_REP1.inner_distance_plot.pdf", + "WT_REP1.inner_distance_plot.pdf", + "WT_REP2.inner_distance_plot.pdf", + "RAP1_IAA_30M_REP1.inner_distance_plot.r", + "WT_REP1.inner_distance_plot.r", + "WT_REP2.inner_distance_plot.r", + "RAP1_IAA_30M_REP1.inner_distance.txt", + "RAP1_IAA_30M_REP1.inner_distance_freq.txt", + "RAP1_IAA_30M_REP1.inner_distance_mean.txt", + "WT_REP1.inner_distance.txt", + "WT_REP1.inner_distance_freq.txt", + "WT_REP1.inner_distance_mean.txt", + "WT_REP2.inner_distance.txt", + "WT_REP2.inner_distance_freq.txt", + "WT_REP2.inner_distance_mean.txt", + "RAP1_IAA_30M_REP1.junction.Interact.bed", + "RAP1_IAA_30M_REP1.junction.bed", + "RAP1_UNINDUCED_REP1.junction.Interact.bed", + "RAP1_UNINDUCED_REP1.junction.bed", + "RAP1_UNINDUCED_REP2.junction.Interact.bed", + "RAP1_UNINDUCED_REP2.junction.bed", + "WT_REP1.junction.Interact.bed", + "WT_REP1.junction.bed", + "WT_REP2.junction.Interact.bed", + "WT_REP2.junction.bed", + "RAP1_IAA_30M_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP2.junction_annotation.log", + "WT_REP1.junction_annotation.log", + "WT_REP2.junction_annotation.log", + "RAP1_IAA_30M_REP1.splice_events.pdf", + "RAP1_IAA_30M_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP1.splice_events.pdf", + "RAP1_UNINDUCED_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP2.splice_events.pdf", + "RAP1_UNINDUCED_REP2.splice_junction.pdf", + "WT_REP1.splice_events.pdf", + "WT_REP1.splice_junction.pdf", + "WT_REP2.splice_events.pdf", + "WT_REP2.splice_junction.pdf", + "RAP1_IAA_30M_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP2.junction_plot.r", + "WT_REP1.junction_plot.r", + "WT_REP2.junction_plot.r", + "RAP1_IAA_30M_REP1.junction.xls", + "RAP1_UNINDUCED_REP1.junction.xls", + "RAP1_UNINDUCED_REP2.junction.xls", + "WT_REP1.junction.xls", + "WT_REP2.junction.xls", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf", + "WT_REP1.junctionSaturation_plot.pdf", + "WT_REP2.junctionSaturation_plot.pdf", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.r", + "WT_REP1.junctionSaturation_plot.r", + "WT_REP2.junctionSaturation_plot.r", + "RAP1_IAA_30M_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP2.read_distribution.txt", + "WT_REP1.read_distribution.txt", + "WT_REP2.read_distribution.txt", + "RAP1_IAA_30M_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP2.DupRate_plot.pdf", + "WT_REP1.DupRate_plot.pdf", + "WT_REP2.DupRate_plot.pdf", + "RAP1_IAA_30M_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP2.DupRate_plot.r", + "WT_REP1.DupRate_plot.r", + "WT_REP2.DupRate_plot.r", + "RAP1_IAA_30M_REP1.pos.DupRate.xls", + "RAP1_IAA_30M_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP1.pos.DupRate.xls", + "RAP1_UNINDUCED_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP2.pos.DupRate.xls", + "RAP1_UNINDUCED_REP2.seq.DupRate.xls", + "WT_REP1.pos.DupRate.xls", + "WT_REP1.seq.DupRate.xls", + "WT_REP2.pos.DupRate.xls", + "WT_REP2.seq.DupRate.xls" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T13:55:07.472724" + }, + "trimgalore": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T10:32:15.607595" + }, + "multiqc_data": { + "content": [ + "cutadapt_filtered_reads_plot.txt:md5,bf033e64e9d23bee85b6277f11c663f1", + "cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,13dfa866fd91dbb072689efe9aa83b1f", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,07145dd8dd3db654859b18eb0389046c", + "fastqc-status-check-heatmap-1.txt:md5,22a03548736b88b23be6bc0c9ef1b4a6", + "fastqc-status-check-heatmap.txt:md5,5a89b0d8d162f6b1dbdaf39457bbc03b", + "fastqc_adapter_content_plot.txt:md5,da0389be84cfdd189b1d045212eb2974", + "fastqc_overrepresented_sequences_plot-1.txt:md5,4adfeacd3a3a6c7c808f121b24e6b247", + "fastqc_overrepresented_sequences_plot.txt:md5,25d88ea8a72f55e8a374ae802bc7f0b1", + "fastqc_per_base_n_content_plot-1.txt:md5,418610c1ce119cb786ad434db75d366e", + "fastqc_per_base_n_content_plot.txt:md5,d368d7e36ca2f73dcde61f2b486d8213", + "fastqc_per_base_sequence_quality_plot-1.txt:md5,bd22e06e41c096ad4f745d40fe96a1e5", + "fastqc_per_base_sequence_quality_plot.txt:md5,5c3065b549129702b185ea1b817da420", + "fastqc_per_sequence_gc_content_plot-1_Counts.txt:md5,004c60768ceb6197765154e3eaa37b7a", + "fastqc_per_sequence_gc_content_plot-1_Percentages.txt:md5,95d29060b687f745288ad1ec47750037", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,9ddaa50167117d3c9188ccf015427704", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,f10ee2881b61308af35f304aa3d810a3", + "fastqc_per_sequence_quality_scores_plot-1.txt:md5,0f9834cc19f76dd5c87cf8cba7435a7c", + "fastqc_per_sequence_quality_scores_plot.txt:md5,b5f9a02933e3065952237afd2ec9ce82", + "fastqc_sequence_counts_plot-1.txt:md5,3861354bbedfbde7ca36a72994f9425c", + "fastqc_sequence_counts_plot.txt:md5,d385a3e2c2573a0902c66e8c93876d3c", + "fastqc_sequence_duplication_levels_plot-1.txt:md5,c73407d55fc532e864fa1dc8dbc12874", + "fastqc_sequence_duplication_levels_plot.txt:md5,8812cee16f6ca65e2c33635754de1772", + "fastqc_sequence_length_distribution_plot.txt:md5,6fe2c985606abad947bcca99b015ae33", + "multiqc_citations.txt:md5,da5043f8ab9b5bd51d91ccf3111c655e", + "multiqc_cutadapt.txt:md5,aac9581a5670cb55edf564f3d6c1f9a7", + "multiqc_fastqc_fastqc_raw.txt:md5,81c3c1a2575a1891a7f2a9637a0f2cc0", + "multiqc_fastqc_fastqc_trimmed.txt:md5,a3238f515e01d158d875d69968753804", + "multiqc_featurecounts_biotype_plot.txt:md5,d35ad008181f0f7be84d5770d17a3a65", + "multiqc_samtools_idxstats.txt:md5,66a8e8aecb6233f5a3521151b1ce8d49", + "picard_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_2.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "qualimap_gene_coverage_profile_Counts.txt:md5,f3b9bb1902af4c7b5e04c0830ded2c02", + "qualimap_gene_coverage_profile_Normalised.txt:md5,ebcedec8e5c959414a4e89ccae3fc07e", + "qualimap_rnaseq_cov_hist.txt:md5,b78ff616f267f9b061b3297b767e88fb", + "rseqc_infer_experiment_plot.txt:md5,0556a013129be7d78fac4345fddbe8c5", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,75acd04232d1804b5f960ee4c5db4722", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,3625f666cc09d0f07990716aeccd869f", + "samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,6c323b383a6506d124506405b9463d93", + "fastqc_top_overrepresented_sequences_table-1.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "hisat2_pe_plot.txt", + "hisat2_se_plot.txt", + "junction_saturation_known.txt", + "junction_saturation_novel.txt", + "multiqc_data.json", + "multiqc_dupradar-section-plot.txt", + "multiqc_fail_strand_check_table.txt", + "multiqc_general_stats.txt", + "multiqc_hisat2.txt", + "multiqc_hisat2_deseq2_clustering-plot.txt", + "multiqc_hisat2_deseq2_clustering-plot_1.txt", + "multiqc_hisat2_deseq2_clustering-plot_2.txt", + "multiqc_hisat2_deseq2_clustering-plot_3.txt", + "multiqc_hisat2_deseq2_clustering-plot_4.txt", + "multiqc_hisat2_deseq2_pca-plot.txt", + "multiqc_picard_dups.txt", + "multiqc_rseqc_bam_stat.txt", + "multiqc_rseqc_infer_experiment.txt", + "multiqc_rseqc_junction_annotation.txt", + "multiqc_rseqc_read_distribution.txt", + "multiqc_salmon.txt", + "multiqc_salmon_deseq2_clustering-plot.txt", + "multiqc_salmon_deseq2_clustering-plot_1.txt", + "multiqc_salmon_deseq2_clustering-plot_2.txt", + "multiqc_salmon_deseq2_clustering-plot_3.txt", + "multiqc_salmon_deseq2_clustering-plot_4.txt", + "multiqc_salmon_deseq2_pca-plot.txt", + "multiqc_samtools_flagstat.txt", + "multiqc_samtools_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt", + "picard_deduplication.txt", + "qualimap_genomic_origin.txt", + "rseqc_bam_stat.txt", + "rseqc_inner_distance.txt", + "rseqc_inner_distance_plot_Counts.txt", + "rseqc_inner_distance_plot_Percentages.txt", + "rseqc_junction_annotation_junctions_plot_Events.txt", + "rseqc_junction_annotation_junctions_plot_Junctions.txt", + "rseqc_junction_saturation_all.txt", + "rseqc_junction_saturation_plot_All_Junctions.txt", + "rseqc_junction_saturation_plot_Known_Junctions.txt", + "rseqc_junction_saturation_plot_Novel_Junctions.txt", + "rseqc_read_distribution_plot.txt", + "rseqc_read_dups.txt", + "rseqc_read_dups_plot.txt", + "salmon_plot.txt", + "samtools-flagstat-dp_Percentage_of_total.txt", + "samtools-flagstat-dp_Read_counts.txt", + "samtools-stats-dp.txt", + "samtools_alignment_plot.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:01:52.559836" + }, + "hisat2/picard_metrics": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T12:35:11.735947" + }, + "references": { + "content": [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055", + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T10:32:15.597034" + }, + "hisat2/featurecounts": { + "content": [ + "RAP1_IAA_30M_REP1.biotype_counts_mqc.tsv:md5,079b099e5c5e9fe5e2559dfc938aa48b", + "RAP1_IAA_30M_REP1.biotype_counts_rrna_mqc.tsv:md5,dde2de0cb90e10d0195c726f768e9941", + "RAP1_IAA_30M_REP1.featureCounts.txt:md5,eedff929765dbc950528ee499e6d63ba", + "RAP1_UNINDUCED_REP1.biotype_counts_mqc.tsv:md5,4d1820a35481f454f17a14326356253d", + "RAP1_UNINDUCED_REP1.biotype_counts_rrna_mqc.tsv:md5,845ff9059c72bc6722a8de69776e22bb", + "RAP1_UNINDUCED_REP1.featureCounts.txt:md5,b007abbc78b08d8d2bb37a267665947d", + "RAP1_UNINDUCED_REP2.biotype_counts_mqc.tsv:md5,3632da2126cb33391428ba0d6d10787f", + "RAP1_UNINDUCED_REP2.biotype_counts_rrna_mqc.tsv:md5,6d3fa4c88c7fe61f638e4624ad5e22f0", + "RAP1_UNINDUCED_REP2.featureCounts.txt:md5,ea897231d1c447d8e395716741b876ab", + "WT_REP1.biotype_counts_mqc.tsv:md5,abc303e93390bb5bd8f916f8f5978de3", + "WT_REP1.biotype_counts_rrna_mqc.tsv:md5,8ef76d717492ca23764938aee8ea33a9", + "WT_REP1.featureCounts.txt:md5,39721c0d981304996438bc2f505bf98c", + "WT_REP2.biotype_counts_mqc.tsv:md5,74a5436a716a7d99f425f73914cb2794", + "WT_REP2.biotype_counts_rrna_mqc.tsv:md5,12294618fe44df1e7f39348372dcb481", + "WT_REP2.featureCounts.txt:md5,702446d50a5019c84fcef85d1cfef78c", + "RAP1_IAA_30M_REP1.featureCounts.txt.summary", + "RAP1_UNINDUCED_REP1.featureCounts.txt.summary", + "RAP1_UNINDUCED_REP2.featureCounts.txt.summary", + "WT_REP1.featureCounts.txt.summary", + "WT_REP2.featureCounts.txt.summary" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:58:36.389406" + }, + "hisat2/samtools_stats": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.stats", + "RAP1_IAA_30M_REP1.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.sorted.bam.stats", + "WT_REP1.markdup.sorted.bam.flagstat", + "WT_REP1.markdup.sorted.bam.idxstats", + "WT_REP1.markdup.sorted.bam.stats", + "WT_REP1.sorted.bam.flagstat", + "WT_REP1.sorted.bam.idxstats", + "WT_REP1.sorted.bam.stats", + "WT_REP2.markdup.sorted.bam.flagstat", + "WT_REP2.markdup.sorted.bam.idxstats", + "WT_REP2.markdup.sorted.bam.stats", + "WT_REP2.sorted.bam.flagstat", + "WT_REP2.sorted.bam.idxstats", + "WT_REP2.sorted.bam.stats" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:01:52.753084" + }, + "salmon/deseq2_qc": { + "content": [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "deseq2.dds.RData", + "deseq2.pca.vals.txt", + "deseq2.plots.pdf", + "deseq2.sample.dists.txt", + "RAP1_IAA_30M_REP1.txt", + "RAP1_UNINDUCED_REP1.txt", + "RAP1_UNINDUCED_REP2.txt", + "WT_REP1.txt", + "WT_REP2.txt", + "deseq2.size_factors.RData" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T12:35:11.9096" + }, + "salmon": { + "content": [ + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T12:35:12.005199" + }, + "hisat2/bigwig": { + "content": [ + "RAP1_IAA_30M_REP1.forward.bigWig", + "RAP1_IAA_30M_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP1.forward.bigWig", + "RAP1_UNINDUCED_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP2.forward.bigWig", + "RAP1_UNINDUCED_REP2.reverse.bigWig", + "WT_REP1.forward.bigWig", + "WT_REP1.reverse.bigWig", + "WT_REP2.forward.bigWig", + "WT_REP2.reverse.bigWig" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T12:35:11.683972" + }, + "multiqc_plots": { + "content": [ + "cutadapt_filtered_reads_plot-cnt.png:md5,704cf0d91bfa3dd658dd8c9590f669a2", + "cutadapt_filtered_reads_plot-pct.png:md5,2684d8b2afca3300e5786486b80237f0", + "cutadapt_trimmed_sequences_plot_3_Counts.png:md5,bef41d894629b0c4dab4478bbf197f50", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.png:md5,1e0d01537d3797623d0b3fd8fbe42787", + "dupradar-section-plot.png:md5,6074ea2315d296094bd10fad3dcc475b", + "fastqc-status-check-heatmap-1.png:md5,2402522f8c02e12aea9af088c6595890", + "fastqc-status-check-heatmap.png:md5,fe8b5b4ab4480d46a12a9005932a9b84", + "fastqc_overrepresented_sequences_plot-1.png:md5,40e450251b80ec0efc9364434234ec7f", + "fastqc_overrepresented_sequences_plot.png:md5,6f5ffbdf1bf61fabe5e028c8bc85de14", + "fastqc_per_sequence_gc_content_plot-1_Counts.png:md5,8a806cec2142f9911502e0a253d83d13", + "fastqc_per_sequence_gc_content_plot-1_Percentages.png:md5,953929d50c8490029880e205e4db7959", + "fastqc_per_sequence_gc_content_plot_Counts.png:md5,01f124545af788fd5cc7bbf41b005e16", + "fastqc_per_sequence_gc_content_plot_Percentages.png:md5,eba3abf8bedb2cb20bad90c54e9c8881", + "fastqc_per_sequence_quality_scores_plot-1.png:md5,d2c29cae169f35744500c751b4a7366e", + "fastqc_per_sequence_quality_scores_plot.png:md5,42fd7369a8aca78f620164a9e887c3cb", + "fastqc_sequence_counts_plot-1-cnt.png:md5,2874fea747c7ff46828bf4f17668caf8", + "fastqc_sequence_counts_plot-1-pct.png:md5,0022d7f5ac78b6eff157de24e37c5ab0", + "fastqc_sequence_counts_plot-cnt.png:md5,3890d5555f2a39b46b9f6efb14cb91f2", + "fastqc_sequence_counts_plot-pct.png:md5,55fa5838c8b2db978fcfa5cb83f6b054", + "fastqc_sequence_duplication_levels_plot-1.png:md5,fcd3b1ec2b95fe4bcd607dc28179a754", + "fastqc_sequence_duplication_levels_plot.png:md5,747431f0f38f8e4c41a11a072fa18780", + "featurecounts_biotype_plot-cnt.png:md5,138e00d2fe0af27f2979cf7bdff83b46", + "featurecounts_biotype_plot-pct.png:md5,3b7550efe9068f3ada2cc64e311f3338", + "qualimap_gene_coverage_profile_Counts.png:md5,1aa39028b017760d0b09f1b6f8c1fa3a", + "qualimap_gene_coverage_profile_Normalised.png:md5,1cd382a79b89564a006afe431aa3916d", + "rseqc_infer_experiment_plot.png:md5,73f5b860029912da9c3f6a887238d251", + "rseqc_read_dups_plot.png:md5,fbb8a2268f0468be5a94c960bd2ebd2a", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png:md5,ce6abb232fd5b5f2e66c0fe9a571d75f", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png:md5,6b44818f886ef020fb3646f152ad4af6", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png:md5,a56226e705754ce81c7709d40794dd92", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png:md5,3bb99f72a15a4159860008beea8c802b", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png:md5,25015f9be4710c4eccc50f30db3bf521", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png:md5,baa90f5ad4d999fc60db30840b72d8c6", + "multiqc_report.html", + "cutadapt_filtered_reads_plot-cnt.pdf", + "cutadapt_filtered_reads_plot-pct.pdf", + "cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "dupradar-section-plot.pdf", + "fail_strand_check_table.pdf", + "fastqc-status-check-heatmap-1.pdf", + "fastqc-status-check-heatmap.pdf", + "fastqc_adapter_content_plot.pdf", + "fastqc_overrepresented_sequences_plot-1.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot-1.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot-1.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot-1_Counts.pdf", + "fastqc_per_sequence_gc_content_plot-1_Percentages.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot-1.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-1-cnt.pdf", + "fastqc_sequence_counts_plot-1-pct.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot-1.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table-1.pdf", + "fastqc_top_overrepresented_sequences_table.pdf", + "featurecounts_biotype_plot-cnt.pdf", + "featurecounts_biotype_plot-pct.pdf", + "general_stats_table.pdf", + "hisat2_deseq2_clustering-plot.pdf", + "hisat2_deseq2_pca-plot.pdf", + "hisat2_pe_plot-cnt.pdf", + "hisat2_pe_plot-pct.pdf", + "hisat2_se_plot-cnt.pdf", + "hisat2_se_plot-pct.pdf", + "picard_deduplication-cnt.pdf", + "picard_deduplication-pct.pdf", + "qualimap_gene_coverage_profile_Counts.pdf", + "qualimap_gene_coverage_profile_Normalised.pdf", + "qualimap_genomic_origin-cnt.pdf", + "qualimap_genomic_origin-pct.pdf", + "rseqc_bam_stat.pdf", + "rseqc_infer_experiment_plot.pdf", + "rseqc_inner_distance_plot_Counts.pdf", + "rseqc_inner_distance_plot_Percentages.pdf", + "rseqc_junction_annotation_junctions_plot_Events-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Events-pct.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf", + "rseqc_junction_saturation_plot_All_Junctions.pdf", + "rseqc_junction_saturation_plot_Known_Junctions.pdf", + "rseqc_junction_saturation_plot_Novel_Junctions.pdf", + "rseqc_read_distribution_plot-cnt.pdf", + "rseqc_read_distribution_plot-pct.pdf", + "rseqc_read_dups_plot.pdf", + "salmon_deseq2_clustering-plot.pdf", + "salmon_deseq2_pca-plot.pdf", + "salmon_plot.pdf", + "samtools-flagstat-dp_Percentage_of_total.pdf", + "samtools-flagstat-dp_Read_counts.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", + "samtools-stats-dp.pdf", + "samtools_alignment_plot-cnt.pdf", + "samtools_alignment_plot-pct.pdf", + "fail_strand_check_table.png", + "fastqc_adapter_content_plot.png", + "fastqc_per_base_n_content_plot-1.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot-1.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table-1.png", + "fastqc_top_overrepresented_sequences_table.png", + "general_stats_table.png", + "hisat2_deseq2_clustering-plot.png", + "hisat2_deseq2_pca-plot.png", + "hisat2_pe_plot-cnt.png", + "hisat2_pe_plot-pct.png", + "hisat2_se_plot-cnt.png", + "hisat2_se_plot-pct.png", + "picard_deduplication-cnt.png", + "picard_deduplication-pct.png", + "qualimap_genomic_origin-cnt.png", + "qualimap_genomic_origin-pct.png", + "rseqc_bam_stat.png", + "rseqc_inner_distance_plot_Counts.png", + "rseqc_inner_distance_plot_Percentages.png", + "rseqc_junction_annotation_junctions_plot_Events-cnt.png", + "rseqc_junction_annotation_junctions_plot_Events-pct.png", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.png", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.png", + "rseqc_junction_saturation_plot_All_Junctions.png", + "rseqc_junction_saturation_plot_Known_Junctions.png", + "rseqc_junction_saturation_plot_Novel_Junctions.png", + "rseqc_read_distribution_plot-cnt.png", + "rseqc_read_distribution_plot-pct.png", + "salmon_deseq2_clustering-plot.png", + "salmon_deseq2_pca-plot.png", + "salmon_plot.png", + "samtools-flagstat-dp_Percentage_of_total.png", + "samtools-flagstat-dp_Read_counts.png", + "samtools-stats-dp.png", + "samtools_alignment_plot-cnt.png", + "samtools_alignment_plot-pct.png", + "cutadapt_filtered_reads_plot-cnt.svg", + "cutadapt_filtered_reads_plot-pct.svg", + "cutadapt_trimmed_sequences_plot_3_Counts.svg", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "dupradar-section-plot.svg", + "fail_strand_check_table.svg", + "fastqc-status-check-heatmap-1.svg", + "fastqc-status-check-heatmap.svg", + "fastqc_adapter_content_plot.svg", + "fastqc_overrepresented_sequences_plot-1.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot-1.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot-1.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot-1_Counts.svg", + "fastqc_per_sequence_gc_content_plot-1_Percentages.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot-1.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-1-cnt.svg", + "fastqc_sequence_counts_plot-1-pct.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot-1.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table-1.svg", + "fastqc_top_overrepresented_sequences_table.svg", + "featurecounts_biotype_plot-cnt.svg", + "featurecounts_biotype_plot-pct.svg", + "general_stats_table.svg", + "hisat2_deseq2_clustering-plot.svg", + "hisat2_deseq2_pca-plot.svg", + "hisat2_pe_plot-cnt.svg", + "hisat2_pe_plot-pct.svg", + "hisat2_se_plot-cnt.svg", + "hisat2_se_plot-pct.svg", + "picard_deduplication-cnt.svg", + "picard_deduplication-pct.svg", + "qualimap_gene_coverage_profile_Counts.svg", + "qualimap_gene_coverage_profile_Normalised.svg", + "qualimap_genomic_origin-cnt.svg", + "qualimap_genomic_origin-pct.svg", + "rseqc_bam_stat.svg", + "rseqc_infer_experiment_plot.svg", + "rseqc_inner_distance_plot_Counts.svg", + "rseqc_inner_distance_plot_Percentages.svg", + "rseqc_junction_annotation_junctions_plot_Events-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Events-pct.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.svg", + "rseqc_junction_saturation_plot_All_Junctions.svg", + "rseqc_junction_saturation_plot_Known_Junctions.svg", + "rseqc_junction_saturation_plot_Novel_Junctions.svg", + "rseqc_read_distribution_plot-cnt.svg", + "rseqc_read_distribution_plot-pct.svg", + "rseqc_read_dups_plot.svg", + "salmon_deseq2_clustering-plot.svg", + "salmon_deseq2_pca-plot.svg", + "salmon_plot.svg", + "samtools-flagstat-dp_Percentage_of_total.svg", + "samtools-flagstat-dp_Read_counts.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", + "samtools-stats-dp.svg", + "samtools_alignment_plot-cnt.svg", + "samtools_alignment_plot-pct.svg" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:01:52.649421" + }, + "fastqc/raw": { + "content": [ + "RAP1_IAA_30M_REP1_raw_1_fastqc.html", + "RAP1_IAA_30M_REP1_raw_1_fastqc.zip", + "RAP1_IAA_30M_REP1_raw_2_fastqc.html", + "RAP1_IAA_30M_REP1_raw_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_raw_fastqc.html", + "RAP1_UNINDUCED_REP1_raw_fastqc.zip", + "RAP1_UNINDUCED_REP2_raw_fastqc.html", + "RAP1_UNINDUCED_REP2_raw_fastqc.zip", + "WT_REP1_raw_1_fastqc.html", + "WT_REP1_raw_1_fastqc.zip", + "WT_REP1_raw_2_fastqc.html", + "WT_REP1_raw_2_fastqc.zip", + "WT_REP2_raw_1_fastqc.html", + "WT_REP2_raw_1_fastqc.zip", + "WT_REP2_raw_2_fastqc.html", + "WT_REP2_raw_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T12:35:11.678184" + }, + "Params: --aligner hisat2 - stub": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=null}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, FASTQC={fastqc=0.12.1}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, HISAT2_EXTRACTSPLICESITES={hisat2=2.2.1}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, UNTAR_HISAT2_INDEX={untar=1.34}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}", + "genome_transcriptome.fasta", + "genome_transcriptome.gtf", + "RAP1_IAA_30M_REP1_raw.html", + "RAP1_IAA_30M_REP1_raw.zip", + "RAP1_UNINDUCED_REP1_raw.html", + "RAP1_UNINDUCED_REP1_raw.zip", + "RAP1_UNINDUCED_REP2_raw.html", + "RAP1_UNINDUCED_REP2_raw.zip", + "WT_REP1_raw.html", + "WT_REP1_raw.zip", + "WT_REP2_raw.html", + "WT_REP2_raw.zip", + "multiqc_report.html", + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T10:32:59.957379" + }, + "hisat2/qualimap": { + "content": [ + "Coverage Profile Along Genes (High).png:md5,99a8749fb819be0f1bde152e2246d964", + "Coverage Profile Along Genes (Low).png:md5,31bed1d299f6e763c61a2866abc847c9", + "Coverage Profile Along Genes (Total).png:md5,97d15c2ffd8163b800b1ca6378ae0ce9", + "Transcript coverage histogram.png:md5,a0cd920b7f67ee02deb4fd5ee5a5b0fc", + "coverage_profile_along_genes_(high).txt:md5,b56043c3546cac003461c57abad93536", + "coverage_profile_along_genes_(low).txt:md5,1b55d86defcc541643137497c4c6bb06", + "coverage_profile_along_genes_(total).txt:md5,1b55d86defcc541643137497c4c6bb06", + "Coverage Profile Along Genes (High).png:md5,0c9e9983e2bb5688bca25d1697bcde9c", + "Coverage Profile Along Genes (Low).png:md5,07df4715abe4e9c49265b7cecec79fe6", + "Coverage Profile Along Genes (Total).png:md5,a4ed549db9b210e43955386957fdcd49", + "Transcript coverage histogram.png:md5,1ee5a0ec7f0eec36dd51e312d303ea55", + "coverage_profile_along_genes_(high).txt:md5,9ffadadb953cc9ea1b1c01ac92fcdf61", + "coverage_profile_along_genes_(low).txt:md5,fb281c857a2c4e093b0d8e1f756abf81", + "coverage_profile_along_genes_(total).txt:md5,fb281c857a2c4e093b0d8e1f756abf81", + "Coverage Profile Along Genes (High).png:md5,9e530e83b3ab308ece285c115b7bde7d", + "Coverage Profile Along Genes (Low).png:md5,b4181c86e9764bf7f543b24232ffea77", + "Coverage Profile Along Genes (Total).png:md5,ec77f7b0919d8537f31ecf3a6dd245b0", + "Transcript coverage histogram.png:md5,4017dc4254884805a327a6fd45e06562", + "coverage_profile_along_genes_(high).txt:md5,a31cb4ba804080544072cd57fc1bdf1c", + "coverage_profile_along_genes_(low).txt:md5,f744e295c3d034b1a86e1dde8bb18eff", + "coverage_profile_along_genes_(total).txt:md5,f744e295c3d034b1a86e1dde8bb18eff", + "Coverage Profile Along Genes (High).png:md5,9e4a7aa85ae86a7ab5b1c949ed10d913", + "Coverage Profile Along Genes (Low).png:md5,3f9d7d3842d827bb5a7a46a80e88e14b", + "Coverage Profile Along Genes (Total).png:md5,44826c2d3263ff4aaedfa3b4d0c068db", + "Transcript coverage histogram.png:md5,51e934c908640c9dda94d3de8c4dd81f", + "coverage_profile_along_genes_(high).txt:md5,be72a2c9023f6eb81bd5816af33abb65", + "coverage_profile_along_genes_(low).txt:md5,9fce120533ff57f8bc2a2f44f1b6decb", + "coverage_profile_along_genes_(total).txt:md5,9fce120533ff57f8bc2a2f44f1b6decb", + "Coverage Profile Along Genes (High).png:md5,f63458b8564de80c90c992926ea273ed", + "Coverage Profile Along Genes (Low).png:md5,44f0dd7c647a2ce2c1f06e3920266e95", + "Coverage Profile Along Genes (Total).png:md5,12780d9ad7b76dbdd39736099c45cf07", + "Transcript coverage histogram.png:md5,fcc848c9d318a28c7dff00cb2960e038", + "coverage_profile_along_genes_(high).txt:md5,83d436e0ddb7435bb343db5e4dfb744a", + "coverage_profile_along_genes_(low).txt:md5,58021e91f3595a0d6dc74abc41690638", + "coverage_profile_along_genes_(total).txt:md5,58021e91f3595a0d6dc74abc41690638", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T13:55:07.345475" + }, + "versions": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, BEDTOOLS_GENOMECOV_FW={bedtools=2.31.1}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=3.9.5}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, CUSTOM_TX2GENE={python=3.9.5}, DESEQ2_QC_PSEUDO={r-base=4.0.3, bioconductor-deseq2=1.28.0}, DUPRADAR={bioconductor-dupradar=1.32.0}, FASTQC={fastqc=0.12.1}, FQ_SUBSAMPLE={fq=0.9.1 (2022-02-22)}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, HISAT2_ALIGN={hisat2=2.2.1, samtools=1.16.1}, HISAT2_EXTRACTSPLICESITES={hisat2=2.2.1}, MULTIQC_CUSTOM_BIOTYPE={python=3.9.5}, PICARD_MARKDUPLICATES={picard=3.1.1}, QUALIMAP_RNASEQ={qualimap=2.3}, RSEQC_BAMSTAT={rseqc=5.0.2}, RSEQC_INFEREXPERIMENT={rseqc=5.0.2}, RSEQC_INNERDISTANCE={rseqc=5.0.2}, RSEQC_JUNCTIONANNOTATION={rseqc=5.0.2}, RSEQC_JUNCTIONSATURATION={rseqc=5.0.2}, RSEQC_READDISTRIBUTION={rseqc=5.0.2}, RSEQC_READDUPLICATION={rseqc=5.0.2}, SALMON_QUANT={salmon=1.10.1}, SAMTOOLS_FLAGSTAT={samtools=1.2}, SAMTOOLS_IDXSTATS={samtools=1.2}, SAMTOOLS_INDEX={samtools=1.2}, SAMTOOLS_SORT={samtools=1.2}, SAMTOOLS_STATS={samtools=1.2}, SE_GENE={bioconductor-summarizedexperiment=1.32.0}, STRINGTIE_STRINGTIE={stringtie=2.2.1}, SUBREAD_FEATURECOUNTS={subread=2.0.1}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, TXIMETA_TXIMPORT={bioconductor-tximeta=1.20.1}, UCSC_BEDCLIP={ucsc=377}, UCSC_BEDGRAPHTOBIGWIG={ucsc=445}, UNTAR_HISAT2_INDEX={untar=1.34}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T10:32:15.832405" + }, + "fastqc/trim": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip", + "WT_REP1_trimmed_1_val_1_fastqc.html", + "WT_REP1_trimmed_1_val_1_fastqc.zip", + "WT_REP1_trimmed_2_val_2_fastqc.html", + "WT_REP1_trimmed_2_val_2_fastqc.zip", + "WT_REP2_trimmed_1_val_1_fastqc.html", + "WT_REP2_trimmed_1_val_1_fastqc.zip", + "WT_REP2_trimmed_2_val_2_fastqc.html", + "WT_REP2_trimmed_2_val_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T12:35:11.679664" + }, + "hisat2/dupradar": { + "content": [ + "RAP1_IAA_30M_REP1_dupMatrix.txt:md5,8a6bf324a928534cb7ed7a5522aff7d0", + "RAP1_UNINDUCED_REP1_dupMatrix.txt:md5,ae3e70edc98ec8117608f8f608effab9", + "RAP1_UNINDUCED_REP2_dupMatrix.txt:md5,9a5c2672c5817e930c7b884ada8fd92c", + "WT_REP1_dupMatrix.txt:md5,11371da7a087879340c2e7e6842a5d89", + "WT_REP2_dupMatrix.txt:md5,5176c7447c4295f94e2683dd9995cea0", + "RAP1_IAA_30M_REP1_intercept_slope.txt:md5,1285c70833b46849b726412858736ed7", + "RAP1_UNINDUCED_REP1_intercept_slope.txt:md5,a2efe7c3cad6f910d5dc208c2825a245", + "RAP1_UNINDUCED_REP2_intercept_slope.txt:md5,117712525fcbd396f77710f4f4b605d9", + "WT_REP1_intercept_slope.txt:md5,df33cbc6c3cb1c85c0c06cdba7df3873", + "WT_REP2_intercept_slope.txt:md5,38fbb93a419e666bc81020602852b1e2", + "RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf", + "WT_REP1_duprateExpBoxplot.pdf", + "WT_REP2_duprateExpBoxplot.pdf", + "RAP1_IAA_30M_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP2_expressionHist.pdf", + "WT_REP1_expressionHist.pdf", + "WT_REP2_expressionHist.pdf", + "RAP1_IAA_30M_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP2_duprateExpDens.pdf", + "WT_REP1_duprateExpDens.pdf", + "WT_REP2_duprateExpDens.pdf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T12:35:11.695025" + }, + "hisat2": { + "content": [ + "RAP1_IAA_30M_REP1.hisat2.summary.log", + "RAP1_UNINDUCED_REP1.hisat2.summary.log", + "RAP1_UNINDUCED_REP2.hisat2.summary.log", + "WT_REP1.hisat2.summary.log", + "WT_REP2.hisat2.summary.log" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T13:40:29.865928" + }, + "hisat2/stringtie": { + "content": [ + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,c93ce5b90352398208e3d88c68df45c6", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,fe9d92d1d28e1bc1b223e2ce22b4ef05", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,293d64f70bd8353b822e4fa8a6f082a3", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,d279003d92f7feef9adb31203f84474a", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,ed48a29b77c315cb61a6bf09e68c877d", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,cf2506824949c02e0bfde17a9ed86e61", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,a17c7749a005a89875876eb2d90721d4", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,2e2d760739539fba09cbb666ab95afa1", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,22bdc84c1c4acce9798868e8c7b56004", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,80fe14762a8f7230d516bba37b7275d1", + "t_data.ctab", + "RAP1_IAA_30M_REP1.coverage.gtf", + "RAP1_IAA_30M_REP1.gene.abundance.txt", + "RAP1_IAA_30M_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP1.coverage.gtf", + "RAP1_UNINDUCED_REP1.gene.abundance.txt", + "RAP1_UNINDUCED_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP2.coverage.gtf", + "RAP1_UNINDUCED_REP2.gene.abundance.txt", + "RAP1_UNINDUCED_REP2.transcripts.gtf", + "t_data.ctab", + "WT_REP1.coverage.gtf", + "WT_REP1.gene.abundance.txt", + "WT_REP1.transcripts.gtf", + "t_data.ctab", + "WT_REP2.coverage.gtf", + "WT_REP2.gene.abundance.txt", + "WT_REP2.transcripts.gtf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T12:35:11.865423" + }, + "bbsplit": { + "content": [ + "RAP1_IAA_30M_REP1.stats.txt", + "RAP1_UNINDUCED_REP1.stats.txt", + "RAP1_UNINDUCED_REP2.stats.txt", + "WT_REP1.stats.txt", + "WT_REP2.stats.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T10:32:15.589105" + }, + "salmon_quant": { + "content": [ + "ambig_info.tsv:md5,de973a4b22a4457217ae3dc04caf9401", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,1215f0c20f87d3aef8553ef119e1e74c", + "lib_format_counts.json:md5,c24ffe28d70476b5ccdd8bc2d22c0ac1", + "ambig_info.tsv:md5,45f252b4f0e11e6730cf0c29f800fdbb", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,621c6601aade5b1f2e3d6ca2fc71f636", + "lib_format_counts.json:md5,f6d44c0221f7fd559f11a9afe04c9935", + "ambig_info.tsv:md5,6dcc2891ea572e9b8d1ba52cd434ab84", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,9bed6e4dc5428d6f6297adcea29a6326", + "lib_format_counts.json:md5,7c562bf2f70e42f3a7292687dfd328c3", + "ambig_info.tsv:md5,194f574e0586416155e3f33d42e2b167", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,c7ed0aaa5d6c7934ddbebfd29e4eb86d", + "lib_format_counts.json:md5,d46250bb3677d72feeefc435fe6395a6", + "ambig_info.tsv:md5,a26e3f936e65d7da66392603c2f91f6f", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,69ebfc2c7ca6b221a0a22fa1dc8c20ac", + "lib_format_counts.json:md5,088fd51db07022ffde47033bbd029400", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T12:35:11.954394" + }, + "hisat2/markdup": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai", + "WT_REP1.markdup.sorted.bam", + "WT_REP1.markdup.sorted.bam.bai", + "WT_REP2.markdup.sorted.bam", + "WT_REP2.markdup.sorted.bam.bai" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T13:40:29.820359" + } +} \ No newline at end of file diff --git a/tests/kallisto.nf.test b/tests/kallisto.nf.test new file mode 100644 index 000000000..7343798f7 --- /dev/null +++ b/tests/kallisto.nf.test @@ -0,0 +1,225 @@ +nextflow_pipeline { + + name "Test pipeline with Kallisto, skipping both QC and alignment" + script "../main.nf" + + test("Params: --pseudo_aligner kallisto --skip_qc --skip_alignment") { + + when { + params { + outdir = "$outputDir" + pseudo_aligner = 'kallisto' + skip_qc = true + skip_alignment = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/bbsplit/RAP1_IAA_30M_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP2.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP2.stats.txt").name + ).match("bbsplit") }, + { assert snapshot( + path("${params.outdir}/custom/out/genome_gfp.fasta"), + path("${params.outdir}/custom/out/genome_gfp.gtf") + ).match("references") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.zip").name + ).match("fastqc/trim") }, + { assert snapshot( + path("${params.outdir}/kallisto/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/kallisto/RAP1_IAA_30M_REP1/abundance.h5").name, + file("${params.outdir}/kallisto/RAP1_IAA_30M_REP1/abundance.tsv").name, + file("${params.outdir}/kallisto/RAP1_IAA_30M_REP1/kallisto_quant.log").name, + file("${params.outdir}/kallisto/RAP1_IAA_30M_REP1/run_info.json").name, + file("${params.outdir}/kallisto/RAP1_UNINDUCED_REP1/abundance.h5").name, + file("${params.outdir}/kallisto/RAP1_UNINDUCED_REP1/abundance.tsv").name, + file("${params.outdir}/kallisto/RAP1_UNINDUCED_REP1/kallisto_quant.log").name, + file("${params.outdir}/kallisto/RAP1_UNINDUCED_REP1/run_info.json").name, + file("${params.outdir}/kallisto/RAP1_UNINDUCED_REP2/abundance.h5").name, + file("${params.outdir}/kallisto/RAP1_UNINDUCED_REP2/abundance.tsv").name, + file("${params.outdir}/kallisto/RAP1_UNINDUCED_REP2/kallisto_quant.log").name, + file("${params.outdir}/kallisto/RAP1_UNINDUCED_REP2/run_info.json").name, + file("${params.outdir}/kallisto/WT_REP1/abundance.h5").name, + file("${params.outdir}/kallisto/WT_REP1/abundance.tsv").name, + file("${params.outdir}/kallisto/WT_REP1/kallisto_quant.log").name, + file("${params.outdir}/kallisto/WT_REP1/run_info.json").name, + file("${params.outdir}/kallisto/WT_REP2/abundance.h5").name, + file("${params.outdir}/kallisto/WT_REP2/abundance.tsv").name, + file("${params.outdir}/kallisto/WT_REP2/kallisto_quant.log").name, + file("${params.outdir}/kallisto/WT_REP2/run_info.json").name, + file("${params.outdir}/kallisto/kallisto.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/kallisto/kallisto.merged.gene_counts.tsv").name, + file("${params.outdir}/kallisto/kallisto.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/kallisto/kallisto.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/kallisto/kallisto.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/kallisto/kallisto.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/kallisto/kallisto.merged.gene_lengths.tsv").name, + file("${params.outdir}/kallisto/kallisto.merged.gene_tpm.tsv").name, + file("${params.outdir}/kallisto/kallisto.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/kallisto/kallisto.merged.transcript_counts.tsv").name, + file("${params.outdir}/kallisto/kallisto.merged.transcript_lengths.tsv").name, + file("${params.outdir}/kallisto/kallisto.merged.transcript_tpm.tsv").name + ).match("kallisto") }, + { assert snapshot( + path("${params.outdir}/multiqc/multiqc_report_data/cutadapt_filtered_reads_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Counts.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc-status-check-heatmap.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_overrepresented_sequences_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_per_base_n_content_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_per_base_sequence_quality_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Counts.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Percentages.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_per_sequence_quality_scores_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_sequence_counts_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_sequence_duplication_levels_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_sequence_length_distribution_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/multiqc_citations.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/multiqc_cutadapt.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/multiqc_fastqc_fastqc_trimmed.txt"), + // These files are not stable + file("${params.outdir}/multiqc/multiqc_report_data/fastqc_top_overrepresented_sequences_table.txt").name, + file("${params.outdir}/multiqc/multiqc_report_data/kallisto_alignment.txt").name, + file("${params.outdir}/multiqc/multiqc_report_data/multiqc_data.json").name, + file("${params.outdir}/multiqc/multiqc_report_data/multiqc_general_stats.txt").name, + file("${params.outdir}/multiqc/multiqc_report_data/multiqc_kallisto.txt").name, + file("${params.outdir}/multiqc/multiqc_report_data/multiqc_software_versions.txt").name, + file("${params.outdir}/multiqc/multiqc_report_data/multiqc_sources.txt").name + ).match("multiqc_data") }, + { assert snapshot( + path("${params.outdir}/multiqc/multiqc_report_plots/png/cutadapt_filtered_reads_plot-cnt.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/cutadapt_filtered_reads_plot-pct.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Counts.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Obs_Exp.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc-status-check-heatmap.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_sequence_counts_plot-cnt.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_sequence_counts_plot-pct.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot.png"), + // PDFs, SVGs, some PNGs and HTML reports are not stable + file("${params.outdir}/multiqc/multiqc_report.html").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-pct.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Counts.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc-status-check-heatmap.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-pct.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_sequence_length_distribution_plot.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/general_stats_table.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/kallisto_alignment-cnt.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/kallisto_alignment-pct.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_per_base_n_content_plot.png").name, + file("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot.png").name, + file("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_sequence_length_distribution_plot.png").name, + file("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table.png").name, + file("${params.outdir}/multiqc/multiqc_report_plots/png/general_stats_table.png").name, + file("${params.outdir}/multiqc/multiqc_report_plots/png/kallisto_alignment-cnt.png").name, + file("${params.outdir}/multiqc/multiqc_report_plots/png/kallisto_alignment-pct.png").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-cnt.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-pct.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Counts.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc-status-check-heatmap.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_per_base_n_content_plot.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_sequence_counts_plot-cnt.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_sequence_counts_plot-pct.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_sequence_length_distribution_plot.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/general_stats_table.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/kallisto_alignment-cnt.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/kallisto_alignment-pct.svg").name + ).match("multiqc_plots") }, + { assert snapshot( + // These reports are not stable + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match("trimgalore") }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml") + ).match("versions") } + ) + } + } + + test("Params: --pseudo_aligner kallisto --skip_qc --skip_alignment - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + pseudo_aligner = 'kallisto' + skip_qc = true + skip_alignment = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml"), + file("${params.outdir}/custom/out/genome_transcriptome.fasta").name, + file("${params.outdir}/custom/out/genome_transcriptome.gtf").name, + file("${params.outdir}/multiqc/multiqc_report.html").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match() } + ) + } + } +} diff --git a/tests/kallisto.nf.test.snap b/tests/kallisto.nf.test.snap new file mode 100644 index 000000000..809f4e0f2 --- /dev/null +++ b/tests/kallisto.nf.test.snap @@ -0,0 +1,241 @@ +{ + "multiqc_data": { + "content": [ + "cutadapt_filtered_reads_plot.txt:md5,bf033e64e9d23bee85b6277f11c663f1", + "cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,13dfa866fd91dbb072689efe9aa83b1f", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,07145dd8dd3db654859b18eb0389046c", + "fastqc-status-check-heatmap.txt:md5,22a03548736b88b23be6bc0c9ef1b4a6", + "fastqc_overrepresented_sequences_plot.txt:md5,4adfeacd3a3a6c7c808f121b24e6b247", + "fastqc_per_base_n_content_plot.txt:md5,418610c1ce119cb786ad434db75d366e", + "fastqc_per_base_sequence_quality_plot.txt:md5,bd22e06e41c096ad4f745d40fe96a1e5", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,004c60768ceb6197765154e3eaa37b7a", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,95d29060b687f745288ad1ec47750037", + "fastqc_per_sequence_quality_scores_plot.txt:md5,0f9834cc19f76dd5c87cf8cba7435a7c", + "fastqc_sequence_counts_plot.txt:md5,3861354bbedfbde7ca36a72994f9425c", + "fastqc_sequence_duplication_levels_plot.txt:md5,c73407d55fc532e864fa1dc8dbc12874", + "fastqc_sequence_length_distribution_plot.txt:md5,6fe2c985606abad947bcca99b015ae33", + "multiqc_citations.txt:md5,4cece87a056a29c1338277736855e6ee", + "multiqc_cutadapt.txt:md5,aac9581a5670cb55edf564f3d6c1f9a7", + "multiqc_fastqc_fastqc_trimmed.txt:md5,a3238f515e01d158d875d69968753804", + "fastqc_top_overrepresented_sequences_table.txt", + "kallisto_alignment.txt", + "multiqc_data.json", + "multiqc_general_stats.txt", + "multiqc_kallisto.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T15:53:37.272547" + }, + "trimgalore": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T15:35:31.545385" + }, + "kallisto": { + "content": [ + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "abundance.h5", + "abundance.tsv", + "kallisto_quant.log", + "run_info.json", + "abundance.h5", + "abundance.tsv", + "kallisto_quant.log", + "run_info.json", + "abundance.h5", + "abundance.tsv", + "kallisto_quant.log", + "run_info.json", + "abundance.h5", + "abundance.tsv", + "kallisto_quant.log", + "run_info.json", + "abundance.h5", + "abundance.tsv", + "kallisto_quant.log", + "run_info.json", + "kallisto.merged.gene_counts.SummarizedExperiment.rds", + "kallisto.merged.gene_counts.tsv", + "kallisto.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "kallisto.merged.gene_counts_length_scaled.tsv", + "kallisto.merged.gene_counts_scaled.SummarizedExperiment.rds", + "kallisto.merged.gene_counts_scaled.tsv", + "kallisto.merged.gene_lengths.tsv", + "kallisto.merged.gene_tpm.tsv", + "kallisto.merged.transcript_counts.SummarizedExperiment.rds", + "kallisto.merged.transcript_counts.tsv", + "kallisto.merged.transcript_lengths.tsv", + "kallisto.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T15:53:37.166056" + }, + "references": { + "content": [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055", + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T15:25:12.683541" + }, + "versions": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=3.9.5}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, CUSTOM_TX2GENE={python=3.9.5}, FQ_SUBSAMPLE={fq=0.9.1 (2022-02-22)}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, KALLISTO_INDEX={kallisto=0.48.0}, KALLISTO_QUANT={kallisto=0.48.0}, SALMON_QUANT={salmon=1.10.1}, SE_GENE={bioconductor-summarizedexperiment=1.32.0}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, TXIMETA_TXIMPORT={bioconductor-tximeta=1.20.1}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T15:35:31.742801" + }, + "fastqc/trim": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip", + "WT_REP1_trimmed_1_val_1_fastqc.html", + "WT_REP1_trimmed_1_val_1_fastqc.zip", + "WT_REP1_trimmed_2_val_2_fastqc.html", + "WT_REP1_trimmed_2_val_2_fastqc.zip", + "WT_REP2_trimmed_1_val_1_fastqc.html", + "WT_REP2_trimmed_1_val_1_fastqc.zip", + "WT_REP2_trimmed_2_val_2_fastqc.html", + "WT_REP2_trimmed_2_val_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T15:25:12.695474" + }, + "multiqc_plots": { + "content": [ + "cutadapt_filtered_reads_plot-cnt.png:md5,704cf0d91bfa3dd658dd8c9590f669a2", + "cutadapt_filtered_reads_plot-pct.png:md5,2684d8b2afca3300e5786486b80237f0", + "cutadapt_trimmed_sequences_plot_3_Counts.png:md5,bef41d894629b0c4dab4478bbf197f50", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.png:md5,1e0d01537d3797623d0b3fd8fbe42787", + "fastqc-status-check-heatmap.png:md5,2402522f8c02e12aea9af088c6595890", + "fastqc_overrepresented_sequences_plot.png:md5,40e450251b80ec0efc9364434234ec7f", + "fastqc_per_sequence_gc_content_plot_Counts.png:md5,8a806cec2142f9911502e0a253d83d13", + "fastqc_per_sequence_gc_content_plot_Percentages.png:md5,953929d50c8490029880e205e4db7959", + "fastqc_per_sequence_quality_scores_plot.png:md5,d2c29cae169f35744500c751b4a7366e", + "fastqc_sequence_counts_plot-cnt.png:md5,2874fea747c7ff46828bf4f17668caf8", + "fastqc_sequence_counts_plot-pct.png:md5,0022d7f5ac78b6eff157de24e37c5ab0", + "fastqc_sequence_duplication_levels_plot.png:md5,fcd3b1ec2b95fe4bcd607dc28179a754", + "multiqc_report.html", + "cutadapt_filtered_reads_plot-cnt.pdf", + "cutadapt_filtered_reads_plot-pct.pdf", + "cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf", + "general_stats_table.pdf", + "kallisto_alignment-cnt.pdf", + "kallisto_alignment-pct.pdf", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png", + "general_stats_table.png", + "kallisto_alignment-cnt.png", + "kallisto_alignment-pct.png", + "cutadapt_filtered_reads_plot-cnt.svg", + "cutadapt_filtered_reads_plot-pct.svg", + "cutadapt_trimmed_sequences_plot_3_Counts.svg", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg", + "general_stats_table.svg", + "kallisto_alignment-cnt.svg", + "kallisto_alignment-pct.svg" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T15:53:37.413284" + }, + "bbsplit": { + "content": [ + "RAP1_IAA_30M_REP1.stats.txt", + "RAP1_UNINDUCED_REP1.stats.txt", + "RAP1_UNINDUCED_REP2.stats.txt", + "WT_REP1.stats.txt", + "WT_REP2.stats.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T15:25:12.672876" + }, + "Params: --pseudo_aligner kallisto --skip_qc --skip_alignment - stub": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=null}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, KALLISTO_INDEX={kallisto=0.48.0}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}", + "genome_transcriptome.fasta", + "genome_transcriptome.gtf", + "multiqc_report.html", + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T15:36:19.174739" + } +} \ No newline at end of file diff --git a/tests/lib/UTILS.groovy b/tests/lib/UTILS.groovy new file mode 100644 index 000000000..1bd58a496 --- /dev/null +++ b/tests/lib/UTILS.groovy @@ -0,0 +1,11 @@ +// Function to remove Nextflow version from pipeline_software_mqc_versions.yml + +class UTILS { + public static String removeNextflowVersion(pipeline_software_mqc_versions) { + def softwareVersions = path(pipeline_software_mqc_versions).yaml + if (softwareVersions.containsKey("Workflow")) { + softwareVersions.Workflow.remove("Nextflow") + } + return softwareVersions + } +} diff --git a/tests/min_mapped_reads.nf.test b/tests/min_mapped_reads.nf.test new file mode 100644 index 000000000..dde1c3706 --- /dev/null +++ b/tests/min_mapped_reads.nf.test @@ -0,0 +1,852 @@ +nextflow_pipeline { + + name "Test pipeline with a minimum mapped read threshold of 90" + script "../main.nf" + + test("Params: --min_mapped_reads 90") { + + when { + params { + outdir = "$outputDir" + min_mapped_reads = 90 + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/bbsplit/RAP1_IAA_30M_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP2.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP2.stats.txt").name + ).match("bbsplit") }, + { assert snapshot( + path("${params.outdir}/custom/out/genome_gfp.fasta"), + path("${params.outdir}/custom/out/genome_gfp.gtf") + ).match("references") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.zip").name + ).match("fastqc/raw") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.zip").name + ).match("fastqc/trim") }, + { assert snapshot( + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_filtered_reads_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc-status-check-heatmap-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc-status-check-heatmap.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_adapter_content_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_overrepresented_sequences_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_overrepresented_sequences_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_n_content_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_n_content_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_sequence_quality_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_sequence_quality_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot-1_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot-1_Percentages.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Percentages.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_quality_scores_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_quality_scores_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_counts_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_counts_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_duplication_levels_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_duplication_levels_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_length_distribution_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_citations.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_cutadapt.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fail_mapped_samples_table.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fastqc_fastqc_raw.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fastqc_fastqc_trimmed.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_featurecounts_biotype_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_idxstats.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram_1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram_2.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_gene_coverage_profile_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_gene_coverage_profile_Normalised.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_rnaseq_cov_hist.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_infer_experiment_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt"), + // These files are not stable + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_top_overrepresented_sequences_table-1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_top_overrepresented_sequences_table.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/junction_saturation_known.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/junction_saturation_novel.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_data.json").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_dupradar-section-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fail_strand_check_table.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_general_stats.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_picard_dups.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_infer_experiment.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_junction_annotation.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_read_distribution.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_flagstat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_stats.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_software_versions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_sources.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_deduplication.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_genomic_origin.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_rnaseq_genome_results.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance_plot_Counts.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance_plot_Percentages.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Events.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_all.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_All_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_Known_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_Novel_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_distribution_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_dups.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_dups_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/salmon_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-flagstat-dp_Percentage_of_total.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-flagstat-dp_Read_counts.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-stats-dp.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/star_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/star_summary_table.txt").name + ).match("multiqc_data") }, + { assert snapshot( + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_filtered_reads_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_filtered_reads_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Obs_Exp.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/dupradar-section-plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fail_mapped_samples_table.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc-status-check-heatmap-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc-status-check-heatmap.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot-1_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot-1_Percentages.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-1-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-1-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/featurecounts_biotype_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/featurecounts_biotype_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_gene_coverage_profile_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_gene_coverage_profile_Normalised.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_infer_experiment_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_dups_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png"), + // PDFs, SVGs, some PNGs and HTML reports are not stable + file("${params.outdir}/multiqc/star_salmon/multiqc_report.html").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/dupradar-section-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fail_mapped_samples_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fail_strand_check_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc-status-check-heatmap-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc-status-check-heatmap.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_adapter_content_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot-1_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot-1_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-1-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-1-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_length_distribution_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/featurecounts_biotype_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/featurecounts_biotype_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/general_stats_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/picard_deduplication-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/picard_deduplication-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Normalised.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_genomic_origin-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_genomic_origin-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_bam_stat.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_infer_experiment_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_All_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Known_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Novel_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_distribution_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_distribution_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_dups_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-flagstat-dp_Percentage_of_total.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-flagstat-dp_Read_counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-stats-dp.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_salmon_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_salmon_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_summary_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fail_strand_check_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_adapter_content_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_n_content_plot-1.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_n_content_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot-1.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_length_distribution_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table-1.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/general_stats_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/picard_deduplication-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/picard_deduplication-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_genomic_origin-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_genomic_origin-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_bam_stat.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_inner_distance_plot_Counts.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_inner_distance_plot_Percentages.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_All_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_Known_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_Novel_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_distribution_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_distribution_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-flagstat-dp_Percentage_of_total.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-flagstat-dp_Read_counts.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-stats-dp.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_salmon_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_salmon_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_summary_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/dupradar-section-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fail_mapped_samples_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fail_strand_check_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc-status-check-heatmap-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc-status-check-heatmap.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_adapter_content_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_n_content_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_n_content_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot-1_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot-1_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-1-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-1-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_length_distribution_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/featurecounts_biotype_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/featurecounts_biotype_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/general_stats_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/picard_deduplication-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/picard_deduplication-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Normalised.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_genomic_origin-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_genomic_origin-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_bam_stat.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_infer_experiment_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_inner_distance_plot_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_inner_distance_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_All_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Known_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Novel_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_distribution_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_distribution_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_dups_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-flagstat-dp_Percentage_of_total.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-flagstat-dp_Read_counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-stats-dp.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_salmon_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_salmon_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_summary_table.svg").name + ).match("multiqc_plots") }, + { assert snapshot( + path("${params.outdir}/salmon/deseq2_qc/R_sessionInfo.log"), + // These files are not stable + file("${params.outdir}/salmon/deseq2_qc/deseq2.dds.RData").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.pca.vals.txt").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.plots.pdf").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.sample.dists.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_IAA_30M_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/deseq2.size_factors.RData").name + ).match("salmon/deseq2_qc") }, + { assert snapshot( + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP2/lib_format_counts.json"), + // These files are not stable + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP2/quant.sf").name + ).match("salmon_quant") }, + { assert snapshot( + path("${params.outdir}/salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_tpm.tsv").name + ).match("salmon") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/bigwig/RAP1_IAA_30M_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_IAA_30M_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP2.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP2.reverse.bigWig").name + ).match("star_salmon/bigwig") }, + { assert snapshot( + path("${params.outdir}/star_salmon/deseq2_qc/R_sessionInfo.log"), + // These files are not stable + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_IAA_30M_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP2.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/WT_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/WT_REP2.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/deseq2.size_factors.RData").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.dds.RData").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.pca.vals.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.plots.pdf").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.sample.dists.txt").name + ).match("star_salmon/deseq2_qc") }, + { assert snapshot( + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_IAA_30M_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_UNINDUCED_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_UNINDUCED_REP2_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_IAA_30M_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_UNINDUCED_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_UNINDUCED_REP2_intercept_slope.txt"), + // PDFs are not stable + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_IAA_30M_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_UNINDUCED_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_UNINDUCED_REP2_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_IAA_30M_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_UNINDUCED_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_UNINDUCED_REP2_duprateExpDens.pdf").name + ).match("star_salmon/dupradar") }, + { assert snapshot( + path("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.featureCounts.txt"), + file("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.featureCounts.txt.summary").name + ).match("star_salmon/featurecounts") }, + { assert snapshot( + path("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/WT_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/WT_REP2.SJ.out.tab"), + // Logs are not stable + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.final.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.progress.out").name + ).match("star_salmon/log") }, + { assert snapshot( + // Metrics are not stable + file("${params.outdir}/star_salmon/picard_metrics/RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name + ).match("star_salmon/picard_metrics") }, + { assert snapshot( + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + // HTML reports and these files are not stable + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/rnaseq_qc_results.txt").name + ).match("star_salmon/qualimap") }, + { assert snapshot( + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_IAA_30M_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_UNINDUCED_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_UNINDUCED_REP2.infer_experiment.txt"), + // PDFs, R scripts and all these files are not stable + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_IAA_30M_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_UNINDUCED_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_UNINDUCED_REP2.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/pdf/RAP1_IAA_30M_REP1.inner_distance_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/rscript/RAP1_IAA_30M_REP1.inner_distance_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_freq.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_mean.txt").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_IAA_30M_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP2.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_IAA_30M_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP2.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_IAA_30M_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP2.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_IAA_30M_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP2.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_IAA_30M_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_UNINDUCED_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_UNINDUCED_REP2.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_IAA_30M_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP2.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_IAA_30M_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP2.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.seq.DupRate.xls").name + ).match("star_salmon/rseqc") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_tpm.tsv").name + ).match("star_salmon/salmon") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.stats").name + ).match("star_salmon/samtools_stats") }, + { assert snapshot( + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/i_data.ctab"), + // These files are not stable + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.transcripts.gtf").name + ).match("star_salmon/stringtie") }, + { assert snapshot( + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai").name + ).match("star_salmon/markdup") }, + { assert snapshot( + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/star_salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/star_salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/star_salmon/WT_REP2/quant.sf").name + ).match("star_salmon/salmon_quant") }, + { assert snapshot( + // These reports are not stable + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match("trimgalore") }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml") + ).match("versions") } + ) + } + } + + test("Params: --min_mapped_reads 90 - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + min_mapped_reads = 90 + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml"), + file("${params.outdir}/custom/out/genome_transcriptome.fasta").name, + file("${params.outdir}/custom/out/genome_transcriptome.gtf").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.zip").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report.html").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match() } + ) + } + } +} diff --git a/tests/min_mapped_reads.nf.test.snap b/tests/min_mapped_reads.nf.test.snap new file mode 100644 index 000000000..941a21a58 --- /dev/null +++ b/tests/min_mapped_reads.nf.test.snap @@ -0,0 +1,970 @@ +{ + "star_salmon/log": { + "content": [ + "RAP1_IAA_30M_REP1.SJ.out.tab:md5,ea95e243278af55534f2c52eb5fff7ee", + "RAP1_UNINDUCED_REP1.SJ.out.tab:md5,e548d13942535dc0821f3ec6d9743ec8", + "RAP1_UNINDUCED_REP2.SJ.out.tab:md5,1f294365343a1a5e95682792fdb77033", + "WT_REP1.SJ.out.tab:md5,1350c2fa6a675bf107386c6cd3fc5204", + "WT_REP2.SJ.out.tab:md5,f6cc03643a5e3c1025a5b4754eb1be23", + "RAP1_IAA_30M_REP1.Log.final.out", + "RAP1_IAA_30M_REP1.Log.out", + "RAP1_IAA_30M_REP1.Log.progress.out", + "RAP1_UNINDUCED_REP1.Log.final.out", + "RAP1_UNINDUCED_REP1.Log.out", + "RAP1_UNINDUCED_REP1.Log.progress.out", + "RAP1_UNINDUCED_REP2.Log.final.out", + "RAP1_UNINDUCED_REP2.Log.out", + "RAP1_UNINDUCED_REP2.Log.progress.out", + "WT_REP1.Log.final.out", + "WT_REP1.Log.out", + "WT_REP1.Log.progress.out", + "WT_REP2.Log.final.out", + "WT_REP2.Log.out", + "WT_REP2.Log.progress.out" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:36:12.254374" + }, + "star_salmon/salmon_quant": { + "content": [ + "ambig_info.tsv:md5,f9a605d54a0a103566f7a9b8e0867a73", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,4cc2492f557e5e0a2911a0bd83a51020", + "ambig_info.tsv:md5,8f97be8af4e47cc48650c62227a40203", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,dc750c3564c63da54979c852794d58a5", + "ambig_info.tsv:md5,a044fe7a3ad445c9a91a0d54ab5015d1", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,db43ed650e6e7b42cd2c5b8101bb6748", + "ambig_info.tsv:md5,7a8ea02d74058efb801e8c62bca96fd4", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,e418b4e899623449c6babdf53e5aabde", + "ambig_info.tsv:md5,543a047a549437026a1363ea8ddf5b03", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,f234c8d322df3b59d990594c63b24eae", + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:36:12.647521" + }, + "trimgalore": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:36:12.719201" + }, + "star_salmon/rseqc": { + "content": [ + "RAP1_IAA_30M_REP1.infer_experiment.txt:md5,169d25b95c008bebe9ce886fea6a4e33", + "RAP1_UNINDUCED_REP1.infer_experiment.txt:md5,2ca0ce0fd3204bd2cc4812c4655b1f1f", + "RAP1_UNINDUCED_REP2.infer_experiment.txt:md5,7d5705880188f9beab1939e08d6b8f40", + "RAP1_IAA_30M_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP2.bam_stat.txt", + "RAP1_IAA_30M_REP1.inner_distance_plot.pdf", + "RAP1_IAA_30M_REP1.inner_distance_plot.r", + "RAP1_IAA_30M_REP1.inner_distance.txt", + "RAP1_IAA_30M_REP1.inner_distance_freq.txt", + "RAP1_IAA_30M_REP1.inner_distance_mean.txt", + "RAP1_IAA_30M_REP1.junction.Interact.bed", + "RAP1_IAA_30M_REP1.junction.bed", + "RAP1_UNINDUCED_REP1.junction.Interact.bed", + "RAP1_UNINDUCED_REP1.junction.bed", + "RAP1_UNINDUCED_REP2.junction.Interact.bed", + "RAP1_UNINDUCED_REP2.junction.bed", + "RAP1_IAA_30M_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP2.junction_annotation.log", + "RAP1_IAA_30M_REP1.splice_events.pdf", + "RAP1_IAA_30M_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP1.splice_events.pdf", + "RAP1_UNINDUCED_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP2.splice_events.pdf", + "RAP1_UNINDUCED_REP2.splice_junction.pdf", + "RAP1_IAA_30M_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP2.junction_plot.r", + "RAP1_IAA_30M_REP1.junction.xls", + "RAP1_UNINDUCED_REP1.junction.xls", + "RAP1_UNINDUCED_REP2.junction.xls", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.r", + "RAP1_IAA_30M_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP2.read_distribution.txt", + "RAP1_IAA_30M_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP2.DupRate_plot.pdf", + "RAP1_IAA_30M_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP2.DupRate_plot.r", + "RAP1_IAA_30M_REP1.pos.DupRate.xls", + "RAP1_IAA_30M_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP1.pos.DupRate.xls", + "RAP1_UNINDUCED_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP2.pos.DupRate.xls", + "RAP1_UNINDUCED_REP2.seq.DupRate.xls" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T13:06:37.124481" + }, + "references": { + "content": [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055", + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:04:54.733969" + }, + "star_salmon/samtools_stats": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.stats", + "RAP1_IAA_30M_REP1.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.sorted.bam.stats", + "WT_REP1.sorted.bam.flagstat", + "WT_REP1.sorted.bam.idxstats", + "WT_REP1.sorted.bam.stats", + "WT_REP2.sorted.bam.flagstat", + "WT_REP2.sorted.bam.idxstats", + "WT_REP2.sorted.bam.stats" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:09:21.84327" + }, + "multiqc_plots": { + "content": [ + "cutadapt_filtered_reads_plot-cnt.png:md5,704cf0d91bfa3dd658dd8c9590f669a2", + "cutadapt_filtered_reads_plot-pct.png:md5,2684d8b2afca3300e5786486b80237f0", + "cutadapt_trimmed_sequences_plot_3_Counts.png:md5,bef41d894629b0c4dab4478bbf197f50", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.png:md5,1e0d01537d3797623d0b3fd8fbe42787", + "dupradar-section-plot.png:md5,eacbc664cc29a7a59a6aa366b4618582", + "fail_mapped_samples_table.png:md5,e0702273ab75b55895e566cb2945d893", + "fastqc-status-check-heatmap-1.png:md5,2402522f8c02e12aea9af088c6595890", + "fastqc-status-check-heatmap.png:md5,fe8b5b4ab4480d46a12a9005932a9b84", + "fastqc_overrepresented_sequences_plot-1.png:md5,40e450251b80ec0efc9364434234ec7f", + "fastqc_overrepresented_sequences_plot.png:md5,6f5ffbdf1bf61fabe5e028c8bc85de14", + "fastqc_per_sequence_gc_content_plot-1_Counts.png:md5,8a806cec2142f9911502e0a253d83d13", + "fastqc_per_sequence_gc_content_plot-1_Percentages.png:md5,953929d50c8490029880e205e4db7959", + "fastqc_per_sequence_gc_content_plot_Counts.png:md5,01f124545af788fd5cc7bbf41b005e16", + "fastqc_per_sequence_gc_content_plot_Percentages.png:md5,eba3abf8bedb2cb20bad90c54e9c8881", + "fastqc_per_sequence_quality_scores_plot-1.png:md5,d2c29cae169f35744500c751b4a7366e", + "fastqc_per_sequence_quality_scores_plot.png:md5,42fd7369a8aca78f620164a9e887c3cb", + "fastqc_sequence_counts_plot-1-cnt.png:md5,2874fea747c7ff46828bf4f17668caf8", + "fastqc_sequence_counts_plot-1-pct.png:md5,0022d7f5ac78b6eff157de24e37c5ab0", + "fastqc_sequence_counts_plot-cnt.png:md5,3890d5555f2a39b46b9f6efb14cb91f2", + "fastqc_sequence_counts_plot-pct.png:md5,55fa5838c8b2db978fcfa5cb83f6b054", + "fastqc_sequence_duplication_levels_plot-1.png:md5,fcd3b1ec2b95fe4bcd607dc28179a754", + "fastqc_sequence_duplication_levels_plot.png:md5,747431f0f38f8e4c41a11a072fa18780", + "featurecounts_biotype_plot-cnt.png:md5,95b10627fff1af0a209b8e380f4a4d0b", + "featurecounts_biotype_plot-pct.png:md5,f9c1cf03824ff9ba7da8537ecd93945b", + "qualimap_gene_coverage_profile_Counts.png:md5,2d54a60bef3dfa978da48c1b6872c41c", + "qualimap_gene_coverage_profile_Normalised.png:md5,a85a901be4c08c9dfcfd9fc87d890c1e", + "rseqc_infer_experiment_plot.png:md5,5ce01a7b923f4e6433b76dd88ca22f42", + "rseqc_read_dups_plot.png:md5,bdc7281c52b54a5784aa0d714f9c255e", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png:md5,ce6abb232fd5b5f2e66c0fe9a571d75f", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png:md5,6b44818f886ef020fb3646f152ad4af6", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png:md5,d5d8a85b7ad72a0cb93d9283ea12b23f", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png:md5,19317ad8f1448cd7eb1d319f85cc5c4d", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png:md5,a6849cd92ae738441212b681a411614d", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png:md5,4c06988372df63a1fb5f8be93f73ae8f", + "multiqc_report.html", + "cutadapt_filtered_reads_plot-cnt.pdf", + "cutadapt_filtered_reads_plot-pct.pdf", + "cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "dupradar-section-plot.pdf", + "fail_mapped_samples_table.pdf", + "fail_strand_check_table.pdf", + "fastqc-status-check-heatmap-1.pdf", + "fastqc-status-check-heatmap.pdf", + "fastqc_adapter_content_plot.pdf", + "fastqc_overrepresented_sequences_plot-1.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot-1.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot-1.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot-1_Counts.pdf", + "fastqc_per_sequence_gc_content_plot-1_Percentages.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot-1.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-1-cnt.pdf", + "fastqc_sequence_counts_plot-1-pct.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot-1.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table-1.pdf", + "fastqc_top_overrepresented_sequences_table.pdf", + "featurecounts_biotype_plot-cnt.pdf", + "featurecounts_biotype_plot-pct.pdf", + "general_stats_table.pdf", + "picard_deduplication-cnt.pdf", + "picard_deduplication-pct.pdf", + "qualimap_gene_coverage_profile_Counts.pdf", + "qualimap_gene_coverage_profile_Normalised.pdf", + "qualimap_genomic_origin-cnt.pdf", + "qualimap_genomic_origin-pct.pdf", + "rseqc_bam_stat.pdf", + "rseqc_infer_experiment_plot.pdf", + "rseqc_inner_distance_plot_Counts.pdf", + "rseqc_inner_distance_plot_Percentages.pdf", + "rseqc_junction_annotation_junctions_plot_Events-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Events-pct.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf", + "rseqc_junction_saturation_plot_All_Junctions.pdf", + "rseqc_junction_saturation_plot_Known_Junctions.pdf", + "rseqc_junction_saturation_plot_Novel_Junctions.pdf", + "rseqc_read_distribution_plot-cnt.pdf", + "rseqc_read_distribution_plot-pct.pdf", + "rseqc_read_dups_plot.pdf", + "salmon_deseq2_clustering-plot.pdf", + "salmon_deseq2_pca-plot.pdf", + "salmon_plot.pdf", + "samtools-flagstat-dp_Percentage_of_total.pdf", + "samtools-flagstat-dp_Read_counts.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", + "samtools-stats-dp.pdf", + "samtools_alignment_plot-cnt.pdf", + "samtools_alignment_plot-pct.pdf", + "star_alignment_plot-cnt.pdf", + "star_alignment_plot-pct.pdf", + "star_salmon_deseq2_clustering-plot.pdf", + "star_salmon_deseq2_pca-plot.pdf", + "star_summary_table.pdf", + "fail_strand_check_table.png", + "fastqc_adapter_content_plot.png", + "fastqc_per_base_n_content_plot-1.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot-1.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table-1.png", + "fastqc_top_overrepresented_sequences_table.png", + "general_stats_table.png", + "picard_deduplication-cnt.png", + "picard_deduplication-pct.png", + "qualimap_genomic_origin-cnt.png", + "qualimap_genomic_origin-pct.png", + "rseqc_bam_stat.png", + "rseqc_inner_distance_plot_Counts.png", + "rseqc_inner_distance_plot_Percentages.png", + "rseqc_junction_annotation_junctions_plot_Events-cnt.png", + "rseqc_junction_annotation_junctions_plot_Events-pct.png", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.png", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.png", + "rseqc_junction_saturation_plot_All_Junctions.png", + "rseqc_junction_saturation_plot_Known_Junctions.png", + "rseqc_junction_saturation_plot_Novel_Junctions.png", + "rseqc_read_distribution_plot-cnt.png", + "rseqc_read_distribution_plot-pct.png", + "salmon_deseq2_clustering-plot.png", + "salmon_deseq2_pca-plot.png", + "salmon_plot.png", + "samtools-flagstat-dp_Percentage_of_total.png", + "samtools-flagstat-dp_Read_counts.png", + "samtools-stats-dp.png", + "samtools_alignment_plot-cnt.png", + "samtools_alignment_plot-pct.png", + "star_alignment_plot-cnt.png", + "star_alignment_plot-pct.png", + "star_salmon_deseq2_clustering-plot.png", + "star_salmon_deseq2_pca-plot.png", + "star_summary_table.png", + "cutadapt_filtered_reads_plot-cnt.svg", + "cutadapt_filtered_reads_plot-pct.svg", + "cutadapt_trimmed_sequences_plot_3_Counts.svg", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "dupradar-section-plot.svg", + "fail_mapped_samples_table.svg", + "fail_strand_check_table.svg", + "fastqc-status-check-heatmap-1.svg", + "fastqc-status-check-heatmap.svg", + "fastqc_adapter_content_plot.svg", + "fastqc_overrepresented_sequences_plot-1.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot-1.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot-1.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot-1_Counts.svg", + "fastqc_per_sequence_gc_content_plot-1_Percentages.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot-1.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-1-cnt.svg", + "fastqc_sequence_counts_plot-1-pct.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot-1.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table-1.svg", + "fastqc_top_overrepresented_sequences_table.svg", + "featurecounts_biotype_plot-cnt.svg", + "featurecounts_biotype_plot-pct.svg", + "general_stats_table.svg", + "picard_deduplication-cnt.svg", + "picard_deduplication-pct.svg", + "qualimap_gene_coverage_profile_Counts.svg", + "qualimap_gene_coverage_profile_Normalised.svg", + "qualimap_genomic_origin-cnt.svg", + "qualimap_genomic_origin-pct.svg", + "rseqc_bam_stat.svg", + "rseqc_infer_experiment_plot.svg", + "rseqc_inner_distance_plot_Counts.svg", + "rseqc_inner_distance_plot_Percentages.svg", + "rseqc_junction_annotation_junctions_plot_Events-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Events-pct.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.svg", + "rseqc_junction_saturation_plot_All_Junctions.svg", + "rseqc_junction_saturation_plot_Known_Junctions.svg", + "rseqc_junction_saturation_plot_Novel_Junctions.svg", + "rseqc_read_distribution_plot-cnt.svg", + "rseqc_read_distribution_plot-pct.svg", + "rseqc_read_dups_plot.svg", + "salmon_deseq2_clustering-plot.svg", + "salmon_deseq2_pca-plot.svg", + "salmon_plot.svg", + "samtools-flagstat-dp_Percentage_of_total.svg", + "samtools-flagstat-dp_Read_counts.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", + "samtools-stats-dp.svg", + "samtools_alignment_plot-cnt.svg", + "samtools_alignment_plot-pct.svg", + "star_alignment_plot-cnt.svg", + "star_alignment_plot-pct.svg", + "star_salmon_deseq2_clustering-plot.svg", + "star_salmon_deseq2_pca-plot.svg", + "star_summary_table.svg" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:09:21.766479" + }, + "Params: --min_mapped_reads 90 - stub": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=null}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, FASTQC={fastqc=0.12.1}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, STAR_GENOMEGENERATE={star=2.7.10a, samtools=1.18, gawk=5.1.0}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}", + "genome_transcriptome.fasta", + "genome_transcriptome.gtf", + "RAP1_IAA_30M_REP1_raw.html", + "RAP1_IAA_30M_REP1_raw.zip", + "RAP1_UNINDUCED_REP1_raw.html", + "RAP1_UNINDUCED_REP1_raw.zip", + "RAP1_UNINDUCED_REP2_raw.html", + "RAP1_UNINDUCED_REP2_raw.zip", + "WT_REP1_raw.html", + "WT_REP1_raw.zip", + "WT_REP2_raw.html", + "WT_REP2_raw.zip", + "multiqc_report.html", + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:57:32.155191" + }, + "fastqc/raw": { + "content": [ + "RAP1_IAA_30M_REP1_raw_1_fastqc.html", + "RAP1_IAA_30M_REP1_raw_1_fastqc.zip", + "RAP1_IAA_30M_REP1_raw_2_fastqc.html", + "RAP1_IAA_30M_REP1_raw_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_raw_fastqc.html", + "RAP1_UNINDUCED_REP1_raw_fastqc.zip", + "RAP1_UNINDUCED_REP2_raw_fastqc.html", + "RAP1_UNINDUCED_REP2_raw_fastqc.zip", + "WT_REP1_raw_1_fastqc.html", + "WT_REP1_raw_1_fastqc.zip", + "WT_REP1_raw_2_fastqc.html", + "WT_REP1_raw_2_fastqc.zip", + "WT_REP2_raw_1_fastqc.html", + "WT_REP2_raw_1_fastqc.zip", + "WT_REP2_raw_2_fastqc.html", + "WT_REP2_raw_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:04:54.746531" + }, + "star_salmon/stringtie": { + "content": [ + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,3f149502efe2a9d4bac98b1dd18c15e7", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,a052ab04070e72cc318fb7680b0764e3", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,e82329a443b9ff50a86e42aff91bd704", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,d279003d92f7feef9adb31203f84474a", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,10e2d00f93f9e74f224bd3c1bfbeb29b", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,525413b70bcf62c24c8f96182e09883e", + "t_data.ctab", + "RAP1_IAA_30M_REP1.coverage.gtf", + "RAP1_IAA_30M_REP1.gene.abundance.txt", + "RAP1_IAA_30M_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP1.coverage.gtf", + "RAP1_UNINDUCED_REP1.gene.abundance.txt", + "RAP1_UNINDUCED_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP2.coverage.gtf", + "RAP1_UNINDUCED_REP2.gene.abundance.txt", + "RAP1_UNINDUCED_REP2.transcripts.gtf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:36:12.537334" + }, + "salmon_quant": { + "content": [ + "ambig_info.tsv:md5,de973a4b22a4457217ae3dc04caf9401", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,1215f0c20f87d3aef8553ef119e1e74c", + "lib_format_counts.json:md5,c24ffe28d70476b5ccdd8bc2d22c0ac1", + "ambig_info.tsv:md5,45f252b4f0e11e6730cf0c29f800fdbb", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,621c6601aade5b1f2e3d6ca2fc71f636", + "lib_format_counts.json:md5,f6d44c0221f7fd559f11a9afe04c9935", + "ambig_info.tsv:md5,6dcc2891ea572e9b8d1ba52cd434ab84", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,9bed6e4dc5428d6f6297adcea29a6326", + "lib_format_counts.json:md5,7c562bf2f70e42f3a7292687dfd328c3", + "ambig_info.tsv:md5,194f574e0586416155e3f33d42e2b167", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,c7ed0aaa5d6c7934ddbebfd29e4eb86d", + "lib_format_counts.json:md5,d46250bb3677d72feeefc435fe6395a6", + "ambig_info.tsv:md5,a26e3f936e65d7da66392603c2f91f6f", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,69ebfc2c7ca6b221a0a22fa1dc8c20ac", + "lib_format_counts.json:md5,088fd51db07022ffde47033bbd029400", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:04:55.0893" + }, + "multiqc_data": { + "content": [ + "cutadapt_filtered_reads_plot.txt:md5,bf033e64e9d23bee85b6277f11c663f1", + "cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,13dfa866fd91dbb072689efe9aa83b1f", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,07145dd8dd3db654859b18eb0389046c", + "fastqc-status-check-heatmap-1.txt:md5,22a03548736b88b23be6bc0c9ef1b4a6", + "fastqc-status-check-heatmap.txt:md5,5a89b0d8d162f6b1dbdaf39457bbc03b", + "fastqc_adapter_content_plot.txt:md5,da0389be84cfdd189b1d045212eb2974", + "fastqc_overrepresented_sequences_plot-1.txt:md5,4adfeacd3a3a6c7c808f121b24e6b247", + "fastqc_overrepresented_sequences_plot.txt:md5,25d88ea8a72f55e8a374ae802bc7f0b1", + "fastqc_per_base_n_content_plot-1.txt:md5,418610c1ce119cb786ad434db75d366e", + "fastqc_per_base_n_content_plot.txt:md5,d368d7e36ca2f73dcde61f2b486d8213", + "fastqc_per_base_sequence_quality_plot-1.txt:md5,bd22e06e41c096ad4f745d40fe96a1e5", + "fastqc_per_base_sequence_quality_plot.txt:md5,5c3065b549129702b185ea1b817da420", + "fastqc_per_sequence_gc_content_plot-1_Counts.txt:md5,004c60768ceb6197765154e3eaa37b7a", + "fastqc_per_sequence_gc_content_plot-1_Percentages.txt:md5,95d29060b687f745288ad1ec47750037", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,9ddaa50167117d3c9188ccf015427704", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,f10ee2881b61308af35f304aa3d810a3", + "fastqc_per_sequence_quality_scores_plot-1.txt:md5,0f9834cc19f76dd5c87cf8cba7435a7c", + "fastqc_per_sequence_quality_scores_plot.txt:md5,b5f9a02933e3065952237afd2ec9ce82", + "fastqc_sequence_counts_plot-1.txt:md5,3861354bbedfbde7ca36a72994f9425c", + "fastqc_sequence_counts_plot.txt:md5,d385a3e2c2573a0902c66e8c93876d3c", + "fastqc_sequence_duplication_levels_plot-1.txt:md5,c73407d55fc532e864fa1dc8dbc12874", + "fastqc_sequence_duplication_levels_plot.txt:md5,8812cee16f6ca65e2c33635754de1772", + "fastqc_sequence_length_distribution_plot.txt:md5,6fe2c985606abad947bcca99b015ae33", + "multiqc_citations.txt:md5,2d2ab6df367e36e98e081c33dec187a0", + "multiqc_cutadapt.txt:md5,aac9581a5670cb55edf564f3d6c1f9a7", + "multiqc_fail_mapped_samples_table.txt:md5,5dd9b06f326b1a55d78878343af89927", + "multiqc_fastqc_fastqc_raw.txt:md5,81c3c1a2575a1891a7f2a9637a0f2cc0", + "multiqc_fastqc_fastqc_trimmed.txt:md5,a3238f515e01d158d875d69968753804", + "multiqc_featurecounts_biotype_plot.txt:md5,f3c566d2eaf6bf2ffe5ad12036ce3500", + "multiqc_samtools_idxstats.txt:md5,fd7d03a91f0b9e01a6939941f7f2243f", + "picard_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_2.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "qualimap_gene_coverage_profile_Counts.txt:md5,6d377444d29c3d4135980982ab1df2fb", + "qualimap_gene_coverage_profile_Normalised.txt:md5,dc8b4f9fddc08e06668f9ee87faac008", + "qualimap_rnaseq_cov_hist.txt:md5,a409821701f60811027daef4e7f3ebee", + "rseqc_infer_experiment_plot.txt:md5,749a802379ada3ec9d2083ecbe6aef7e", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,75acd04232d1804b5f960ee4c5db4722", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,ae45731d8d4595f77e6b271004f3a070", + "samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,01637c600d3840500851eb4118564cc6", + "fastqc_top_overrepresented_sequences_table-1.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "junction_saturation_known.txt", + "junction_saturation_novel.txt", + "multiqc_data.json", + "multiqc_dupradar-section-plot.txt", + "multiqc_fail_strand_check_table.txt", + "multiqc_general_stats.txt", + "multiqc_picard_dups.txt", + "multiqc_rseqc_bam_stat.txt", + "multiqc_rseqc_infer_experiment.txt", + "multiqc_rseqc_junction_annotation.txt", + "multiqc_rseqc_read_distribution.txt", + "multiqc_salmon.txt", + "multiqc_salmon_deseq2_clustering-plot.txt", + "multiqc_salmon_deseq2_clustering-plot_1.txt", + "multiqc_salmon_deseq2_clustering-plot_2.txt", + "multiqc_salmon_deseq2_clustering-plot_3.txt", + "multiqc_salmon_deseq2_clustering-plot_4.txt", + "multiqc_salmon_deseq2_pca-plot.txt", + "multiqc_samtools_flagstat.txt", + "multiqc_samtools_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt", + "multiqc_star.txt", + "multiqc_star_salmon_deseq2_clustering-plot.txt", + "multiqc_star_salmon_deseq2_clustering-plot_1.txt", + "multiqc_star_salmon_deseq2_clustering-plot_2.txt", + "multiqc_star_salmon_deseq2_clustering-plot_3.txt", + "multiqc_star_salmon_deseq2_clustering-plot_4.txt", + "multiqc_star_salmon_deseq2_pca-plot.txt", + "picard_deduplication.txt", + "qualimap_genomic_origin.txt", + "qualimap_rnaseq_genome_results.txt", + "rseqc_bam_stat.txt", + "rseqc_inner_distance.txt", + "rseqc_inner_distance_plot_Counts.txt", + "rseqc_inner_distance_plot_Percentages.txt", + "rseqc_junction_annotation_junctions_plot_Events.txt", + "rseqc_junction_annotation_junctions_plot_Junctions.txt", + "rseqc_junction_saturation_all.txt", + "rseqc_junction_saturation_plot_All_Junctions.txt", + "rseqc_junction_saturation_plot_Known_Junctions.txt", + "rseqc_junction_saturation_plot_Novel_Junctions.txt", + "rseqc_read_distribution_plot.txt", + "rseqc_read_dups.txt", + "rseqc_read_dups_plot.txt", + "salmon_plot.txt", + "samtools-flagstat-dp_Percentage_of_total.txt", + "samtools-flagstat-dp_Read_counts.txt", + "samtools-stats-dp.txt", + "samtools_alignment_plot.txt", + "star_alignment_plot.txt", + "star_summary_table.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:09:21.700284" + }, + "star_salmon/deseq2_qc": { + "content": [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "RAP1_IAA_30M_REP1.txt", + "RAP1_UNINDUCED_REP1.txt", + "RAP1_UNINDUCED_REP2.txt", + "WT_REP1.txt", + "WT_REP2.txt", + "deseq2.size_factors.RData", + "deseq2.dds.RData", + "deseq2.pca.vals.txt", + "deseq2.plots.pdf", + "deseq2.sample.dists.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:20:15.658024" + }, + "star_salmon/markdup": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:36:12.596967" + }, + "star_salmon/featurecounts": { + "content": [ + "RAP1_IAA_30M_REP1.biotype_counts_mqc.tsv:md5,f3688a214d33a43ad79abe4b31df0c4b", + "RAP1_IAA_30M_REP1.biotype_counts_rrna_mqc.tsv:md5,dde2de0cb90e10d0195c726f768e9941", + "RAP1_IAA_30M_REP1.featureCounts.txt:md5,b38da3230d4d29ebc8d4af36852d7212", + "RAP1_UNINDUCED_REP1.biotype_counts_mqc.tsv:md5,d241d50e582ceb97e6f16b3556f5f5a9", + "RAP1_UNINDUCED_REP1.biotype_counts_rrna_mqc.tsv:md5,845ff9059c72bc6722a8de69776e22bb", + "RAP1_UNINDUCED_REP1.featureCounts.txt:md5,2ab175746532de1c54020c1eabc27bb5", + "RAP1_UNINDUCED_REP2.biotype_counts_mqc.tsv:md5,b621ce1e803d8670ece6c66391c33ba4", + "RAP1_UNINDUCED_REP2.biotype_counts_rrna_mqc.tsv:md5,6d3fa4c88c7fe61f638e4624ad5e22f0", + "RAP1_UNINDUCED_REP2.featureCounts.txt:md5,480b2586a878bc22f5b73f94051b41d8", + "RAP1_IAA_30M_REP1.featureCounts.txt.summary", + "RAP1_UNINDUCED_REP1.featureCounts.txt.summary", + "RAP1_UNINDUCED_REP2.featureCounts.txt.summary" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T13:06:36.957812" + }, + "salmon/deseq2_qc": { + "content": [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "deseq2.dds.RData", + "deseq2.pca.vals.txt", + "deseq2.plots.pdf", + "deseq2.sample.dists.txt", + "RAP1_IAA_30M_REP1.txt", + "RAP1_UNINDUCED_REP1.txt", + "RAP1_UNINDUCED_REP2.txt", + "WT_REP1.txt", + "WT_REP2.txt", + "deseq2.size_factors.RData" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:04:54.964861" + }, + "salmon": { + "content": [ + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:04:55.21324" + }, + "star_salmon/picard_metrics": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:36:12.280587" + }, + "star_salmon/salmon": { + "content": [ + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:36:12.406892" + }, + "star_salmon/bigwig": { + "content": [ + "RAP1_IAA_30M_REP1.forward.bigWig", + "RAP1_IAA_30M_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP1.forward.bigWig", + "RAP1_UNINDUCED_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP2.forward.bigWig", + "RAP1_UNINDUCED_REP2.reverse.bigWig" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:20:15.635275" + }, + "versions": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, BEDTOOLS_GENOMECOV_FW={bedtools=2.31.1}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=3.9.5}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, CUSTOM_TX2GENE={python=3.9.5}, DESEQ2_QC_PSEUDO={r-base=4.0.3, bioconductor-deseq2=1.28.0}, DESEQ2_QC_STAR_SALMON={r-base=4.0.3, bioconductor-deseq2=1.28.0}, DUPRADAR={bioconductor-dupradar=1.32.0}, FASTQC={fastqc=0.12.1}, FQ_SUBSAMPLE={fq=0.9.1 (2022-02-22)}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, MULTIQC_CUSTOM_BIOTYPE={python=3.9.5}, PICARD_MARKDUPLICATES={picard=3.1.1}, QUALIMAP_RNASEQ={qualimap=2.3}, RSEQC_BAMSTAT={rseqc=5.0.2}, RSEQC_INFEREXPERIMENT={rseqc=5.0.2}, RSEQC_INNERDISTANCE={rseqc=5.0.2}, RSEQC_JUNCTIONANNOTATION={rseqc=5.0.2}, RSEQC_JUNCTIONSATURATION={rseqc=5.0.2}, RSEQC_READDISTRIBUTION={rseqc=5.0.2}, RSEQC_READDUPLICATION={rseqc=5.0.2}, SALMON_QUANT={salmon=1.10.1}, SAMTOOLS_FLAGSTAT={samtools=1.2}, SAMTOOLS_IDXSTATS={samtools=1.2}, SAMTOOLS_INDEX={samtools=1.2}, SAMTOOLS_SORT={samtools=1.2}, SAMTOOLS_STATS={samtools=1.2}, SE_GENE={bioconductor-summarizedexperiment=1.32.0}, STAR_ALIGN={star=2.7.10a, samtools=1.18, gawk=5.1.0}, STAR_GENOMEGENERATE={star=2.7.10a, samtools=1.18, gawk=5.1.0}, STRINGTIE_STRINGTIE={stringtie=2.2.1}, SUBREAD_FEATURECOUNTS={subread=2.0.1}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, TXIMETA_TXIMPORT={bioconductor-tximeta=1.20.1}, UCSC_BEDCLIP={ucsc=377}, UCSC_BEDGRAPHTOBIGWIG={ucsc=445}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:36:12.954252" + }, + "fastqc/trim": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip", + "WT_REP1_trimmed_1_val_1_fastqc.html", + "WT_REP1_trimmed_1_val_1_fastqc.zip", + "WT_REP1_trimmed_2_val_2_fastqc.html", + "WT_REP1_trimmed_2_val_2_fastqc.zip", + "WT_REP2_trimmed_1_val_1_fastqc.html", + "WT_REP2_trimmed_1_val_1_fastqc.zip", + "WT_REP2_trimmed_2_val_2_fastqc.html", + "WT_REP2_trimmed_2_val_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:04:54.759052" + }, + "star_salmon/dupradar": { + "content": [ + "RAP1_IAA_30M_REP1_dupMatrix.txt:md5,2e0d518a450bb57801cdd075d4e9c217", + "RAP1_UNINDUCED_REP1_dupMatrix.txt:md5,96e2f9e1fc5a22a7d468e6fb4a613370", + "RAP1_UNINDUCED_REP2_dupMatrix.txt:md5,28c30ce734d78d53b1c47c3f87414e4b", + "RAP1_IAA_30M_REP1_intercept_slope.txt:md5,c677048855caf5190f29fa5f7137cd79", + "RAP1_UNINDUCED_REP1_intercept_slope.txt:md5,ea1b4323d3bc83759e8a026416bca32b", + "RAP1_UNINDUCED_REP2_intercept_slope.txt:md5,b062f49a5223a3452075062cdd308043", + "RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf", + "RAP1_IAA_30M_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP2_expressionHist.pdf", + "RAP1_IAA_30M_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP2_duprateExpDens.pdf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:36:12.202189" + }, + "bbsplit": { + "content": [ + "RAP1_IAA_30M_REP1.stats.txt", + "RAP1_UNINDUCED_REP1.stats.txt", + "RAP1_UNINDUCED_REP2.stats.txt", + "WT_REP1.stats.txt", + "WT_REP2.stats.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T16:04:54.719906" + }, + "star_salmon/qualimap": { + "content": [ + "Coverage Profile Along Genes (High).png:md5,876c1b88f33bd3e5fe1a41679729573d", + "Coverage Profile Along Genes (Low).png:md5,ee1f2c9cc4dd4867811eda1e68864ab4", + "Coverage Profile Along Genes (Total).png:md5,53747a8f9813744902756ad60638380a", + "Transcript coverage histogram.png:md5,4f9072d4b11216373b59396293803a37", + "coverage_profile_along_genes_(high).txt:md5,fcb06d460810c0555de5396b9dae05e8", + "coverage_profile_along_genes_(low).txt:md5,e3c9a1ddfdb89f8534ff7548b70fce32", + "coverage_profile_along_genes_(total).txt:md5,e3c9a1ddfdb89f8534ff7548b70fce32", + "Coverage Profile Along Genes (High).png:md5,bbf0531018e7fccfc1dfdd1c05715518", + "Coverage Profile Along Genes (Low).png:md5,3c147d9c831d4be98615a22a72fad05d", + "Coverage Profile Along Genes (Total).png:md5,5a8a6db3a8d19a2dcb8f715b11e67c50", + "Transcript coverage histogram.png:md5,488440d7b6d73bcd4567316712e281fe", + "coverage_profile_along_genes_(high).txt:md5,9f1e29a4d6eec52e8796b080daaedca3", + "coverage_profile_along_genes_(low).txt:md5,353f42a84ff34167646fc83909eac2ff", + "coverage_profile_along_genes_(total).txt:md5,353f42a84ff34167646fc83909eac2ff", + "Coverage Profile Along Genes (High).png:md5,5a5d99cc7a1dba3762d67f4aa4adad58", + "Coverage Profile Along Genes (Low).png:md5,b6adc296e9a732aa0495a6da8fa4ed90", + "Coverage Profile Along Genes (Total).png:md5,fcb94fb9c1a51c1db32f884d05929cc8", + "Transcript coverage histogram.png:md5,3aeb52ff3e3752727a370b0d7ceb0518", + "coverage_profile_along_genes_(high).txt:md5,3b20a736708df02ea8c86dc5829ae67e", + "coverage_profile_along_genes_(low).txt:md5,02b314b76ef1317f20e129412340755d", + "coverage_profile_along_genes_(total).txt:md5,02b314b76ef1317f20e129412340755d", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T13:06:37.041504" + } +} \ No newline at end of file diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 000000000..6bf8f2929 --- /dev/null +++ b/tests/nextflow.config @@ -0,0 +1,41 @@ +/* +======================================================================================== + Nextflow config file for running tests +======================================================================================== +*/ + +params { + // Base directory for nf-core/modules test data + modules_testdata_base_path = 's3://ngi-igenomes/testdata/nf-core/modules/' + + // Base directory for nf-core/rnaseq test data + pipelines_testdata_base_path = 's3://ngi-igenomes/testdata/nf-core/pipelines/rnaseq/3.15/' + + // for hisat2 + hisat2_build_memory = '3.GB' + + validationSchemaIgnoreParams = 'genomes,igenomes_base,modules_testdata_base_path,pipelines_testdata_base_path' + + // TODO: check if we rather do this or disable publishdir for all processes when testing modules/subworkflows + outdir = 'results' +} + +// Impose sensible resource limits for testing +process { + withName: '.*' { + cpus = 2 + memory = 3.GB + time = 2.h + } +} + +// Impose same minimum Nextflow version as the pipeline for testing +manifest { + nextflowVersion = '!>=23.04.0' +} + +// Disable all Nextflow reporting options +timeline { enabled = false } +report { enabled = false } +trace { enabled = false } +dag { enabled = false } diff --git a/tests/remove_ribo_rna.nf.test b/tests/remove_ribo_rna.nf.test new file mode 100644 index 000000000..430f18b6f --- /dev/null +++ b/tests/remove_ribo_rna.nf.test @@ -0,0 +1,978 @@ +nextflow_pipeline { + + name "Test pipeline with ribosomal RNA removal" + script "../main.nf" + + test("Params: --remove_ribo_rna") { + + when { + params { + outdir = "$outputDir" + remove_ribo_rna = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/bbsplit/RAP1_IAA_30M_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP2.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP2.stats.txt").name + ).match("bbsplit") }, + { assert snapshot( + path("${params.outdir}/custom/out/genome_gfp.fasta"), + path("${params.outdir}/custom/out/genome_gfp.gtf") + ).match("references") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.zip").name + ).match("fastqc/raw") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.zip").name + ).match("fastqc/trim") }, + { assert snapshot( + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_filtered_reads_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc-status-check-heatmap-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc-status-check-heatmap.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_adapter_content_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_overrepresented_sequences_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_overrepresented_sequences_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_n_content_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_n_content_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_sequence_quality_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_sequence_quality_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot-1_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot-1_Percentages.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Percentages.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_quality_scores_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_quality_scores_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_counts_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_counts_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_duplication_levels_plot-1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_duplication_levels_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_length_distribution_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_citations.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_cutadapt.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fastqc_fastqc_raw.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fastqc_fastqc_trimmed.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_featurecounts_biotype_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_idxstats.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram_1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram_2.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_gene_coverage_profile_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_gene_coverage_profile_Normalised.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_rnaseq_cov_hist.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_infer_experiment_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt"), + // These files are not stable + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_top_overrepresented_sequences_table-1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_top_overrepresented_sequences_table.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/junction_saturation_known.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/junction_saturation_novel.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_data.json").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_dupradar-section-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fail_strand_check_table.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_general_stats.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_picard_dups.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_infer_experiment.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_junction_annotation.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_read_distribution.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_flagstat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_stats.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_software_versions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_sortmerna.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_sources.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_deduplication.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_genomic_origin.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_rnaseq_genome_results.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance_plot_Counts.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance_plot_Percentages.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Events.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_all.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_All_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_Known_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_Novel_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_distribution_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_dups.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_dups_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/salmon_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-flagstat-dp_Percentage_of_total.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-flagstat-dp_Read_counts.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-stats-dp.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/sortmerna-detailed-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/star_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/star_summary_table.txt").name + ).match("multiqc_data") }, + { assert snapshot( + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_filtered_reads_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_filtered_reads_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Obs_Exp.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/dupradar-section-plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc-status-check-heatmap-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc-status-check-heatmap.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot-1_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot-1_Percentages.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-1-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-1-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot-1.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/featurecounts_biotype_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/featurecounts_biotype_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_gene_coverage_profile_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_gene_coverage_profile_Normalised.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_infer_experiment_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_dups_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/sortmerna-detailed-plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/sortmerna-detailed-plot-pct.png"), + // PDFs, SVGs, some PNGs and HTML reports are not stable + file("${params.outdir}/multiqc/star_salmon/multiqc_report.html").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/dupradar-section-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fail_strand_check_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc-status-check-heatmap-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc-status-check-heatmap.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_adapter_content_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot-1_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot-1_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-1-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-1-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_length_distribution_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table-1.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/featurecounts_biotype_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/featurecounts_biotype_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/general_stats_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/picard_deduplication-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/picard_deduplication-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Normalised.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_genomic_origin-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_genomic_origin-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_bam_stat.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_infer_experiment_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_All_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Known_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Novel_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_distribution_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_distribution_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_dups_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-flagstat-dp_Percentage_of_total.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-flagstat-dp_Read_counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-stats-dp.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/sortmerna-detailed-plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/sortmerna-detailed-plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_salmon_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_salmon_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_summary_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fail_strand_check_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_adapter_content_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_n_content_plot-1.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_n_content_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot-1.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_length_distribution_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table-1.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/general_stats_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/picard_deduplication-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/picard_deduplication-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_genomic_origin-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_genomic_origin-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_bam_stat.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_inner_distance_plot_Counts.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_inner_distance_plot_Percentages.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_All_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_Known_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_Novel_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_distribution_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_distribution_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-flagstat-dp_Percentage_of_total.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-flagstat-dp_Read_counts.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-stats-dp.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_salmon_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_salmon_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_summary_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/dupradar-section-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fail_strand_check_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc-status-check-heatmap-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc-status-check-heatmap.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_adapter_content_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_n_content_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_n_content_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot-1_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot-1_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-1-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-1-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_length_distribution_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table-1.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/featurecounts_biotype_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/featurecounts_biotype_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/general_stats_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/picard_deduplication-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/picard_deduplication-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Normalised.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_genomic_origin-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_genomic_origin-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_bam_stat.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_infer_experiment_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_inner_distance_plot_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_inner_distance_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_All_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Known_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Novel_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_distribution_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_distribution_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_dups_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-flagstat-dp_Percentage_of_total.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-flagstat-dp_Read_counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-stats-dp.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/sortmerna-detailed-plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/sortmerna-detailed-plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_salmon_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_salmon_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_summary_table.svg").name + ).match("multiqc_plots") }, + { assert snapshot( + path("${params.outdir}/salmon/deseq2_qc/R_sessionInfo.log"), + // These files are not stable + file("${params.outdir}/salmon/deseq2_qc/deseq2.dds.RData").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.pca.vals.txt").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.plots.pdf").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.sample.dists.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_IAA_30M_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/deseq2.size_factors.RData").name + ).match("salmon/deseq2_qc") }, + { assert snapshot( + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP2/lib_format_counts.json"), + // These files are not stable + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP2/quant.sf").name + ).match("salmon_quant") }, + { assert snapshot( + path("${params.outdir}/salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_tpm.tsv").name + ).match("salmon") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/sortmerna/RAP1_IAA_30M_REP1.sortmerna.log").name, + file("${params.outdir}/sortmerna/RAP1_UNINDUCED_REP1.sortmerna.log").name, + file("${params.outdir}/sortmerna/RAP1_UNINDUCED_REP2.sortmerna.log").name, + file("${params.outdir}/sortmerna/WT_REP1.sortmerna.log").name, + file("${params.outdir}/sortmerna/WT_REP2.sortmerna.log").name + ).match("star_salmon/sortmerna") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/bigwig/RAP1_IAA_30M_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_IAA_30M_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP2.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP2.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP2.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP2.reverse.bigWig").name + ).match("star_salmon/bigwig") }, + { assert snapshot( + path("${params.outdir}/star_salmon/deseq2_qc/R_sessionInfo.log"), + // These files are not stable + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_IAA_30M_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP2.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/WT_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/WT_REP2.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/deseq2.size_factors.RData").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.dds.RData").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.pca.vals.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.plots.pdf").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.sample.dists.txt").name + ).match("star_salmon/deseq2_qc") }, + { assert snapshot( + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_IAA_30M_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_UNINDUCED_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_UNINDUCED_REP2_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/WT_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/WT_REP2_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_IAA_30M_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_UNINDUCED_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_UNINDUCED_REP2_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/WT_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/WT_REP2_intercept_slope.txt"), + // PDFs are not stable + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/WT_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/WT_REP2_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_IAA_30M_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_UNINDUCED_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_UNINDUCED_REP2_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/WT_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/WT_REP2_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_IAA_30M_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_UNINDUCED_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_UNINDUCED_REP2_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/WT_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/WT_REP2_duprateExpDens.pdf").name + ).match("star_salmon/dupradar") }, + { assert snapshot( + path("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP1.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP2.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP2.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP2.featureCounts.txt"), + file("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/WT_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/WT_REP2.featureCounts.txt.summary").name + ).match("star_salmon/featurecounts") }, + { assert snapshot( + path("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/WT_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/WT_REP2.SJ.out.tab"), + // Logs are not stable + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.final.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.progress.out").name + ).match("star_salmon/log") }, + { assert snapshot( + // Metrics are not stable + file("${params.outdir}/star_salmon/picard_metrics/RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name + ).match("star_salmon/picard_metrics") }, + { assert snapshot( + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + // HTML reports and these files are not stable + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/rnaseq_qc_results.txt").name + ).match("star_salmon/qualimap") }, + { assert snapshot( + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_IAA_30M_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_UNINDUCED_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_UNINDUCED_REP2.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/WT_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/WT_REP2.infer_experiment.txt"), + // PDFs, R scripts and all these files are not stable + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_IAA_30M_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_UNINDUCED_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_UNINDUCED_REP2.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/WT_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/WT_REP2.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/pdf/RAP1_IAA_30M_REP1.inner_distance_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/pdf/WT_REP1.inner_distance_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/pdf/WT_REP2.inner_distance_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/rscript/RAP1_IAA_30M_REP1.inner_distance_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/rscript/WT_REP1.inner_distance_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/rscript/WT_REP2.inner_distance_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_freq.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_mean.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP1.inner_distance.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP1.inner_distance_freq.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP1.inner_distance_mean.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP2.inner_distance.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP2.inner_distance_freq.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP2.inner_distance_mean.txt").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP2.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP2.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_IAA_30M_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP2.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/WT_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/WT_REP2.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP2.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP2.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_IAA_30M_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP2.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/WT_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/WT_REP2.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_IAA_30M_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP2.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/WT_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/WT_REP2.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/WT_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/WT_REP2.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_IAA_30M_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP2.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/WT_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/WT_REP2.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_IAA_30M_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_UNINDUCED_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_UNINDUCED_REP2.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/WT_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/WT_REP2.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_IAA_30M_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP2.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/WT_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/WT_REP2.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_IAA_30M_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP2.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/WT_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/WT_REP2.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP2.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP2.seq.DupRate.xls").name + ).match("star_salmon/rseqc") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_tpm.tsv").name + ).match("star_salmon/salmon") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.stats").name + ).match("star_salmon/samtools_stats") }, + { assert snapshot( + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/i_data.ctab"), + // These files are not stable + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.transcripts.gtf").name + ).match("star_salmon/stringtie") }, + { assert snapshot( + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/WT_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/WT_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/WT_REP2.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/WT_REP2.markdup.sorted.bam.bai").name + ).match("star_salmon/markdup") }, + { assert snapshot( + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/star_salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/star_salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/star_salmon/WT_REP2/quant.sf").name + ).match("star_salmon/salmon_quant") }, + { assert snapshot( + // These reports are not stable + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match("trimgalore") }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml") + ).match("versions") } + ) + } + } + + test("Params: --remove_ribo_rna - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + remove_ribo_rna = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml"), + file("${params.outdir}/custom/out/genome_transcriptome.fasta").name, + file("${params.outdir}/custom/out/genome_transcriptome.gtf").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.zip").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report.html").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match() } + ) + } + } +} diff --git a/tests/remove_ribo_rna.nf.test.snap b/tests/remove_ribo_rna.nf.test.snap new file mode 100644 index 000000000..73cd09c7c --- /dev/null +++ b/tests/remove_ribo_rna.nf.test.snap @@ -0,0 +1,1102 @@ +{ + "star_salmon/log": { + "content": [ + "RAP1_IAA_30M_REP1.SJ.out.tab:md5,ea95e243278af55534f2c52eb5fff7ee", + "RAP1_UNINDUCED_REP1.SJ.out.tab:md5,e548d13942535dc0821f3ec6d9743ec8", + "RAP1_UNINDUCED_REP2.SJ.out.tab:md5,1f294365343a1a5e95682792fdb77033", + "WT_REP1.SJ.out.tab:md5,1350c2fa6a675bf107386c6cd3fc5204", + "WT_REP2.SJ.out.tab:md5,f6cc03643a5e3c1025a5b4754eb1be23", + "RAP1_IAA_30M_REP1.Log.final.out", + "RAP1_IAA_30M_REP1.Log.out", + "RAP1_IAA_30M_REP1.Log.progress.out", + "RAP1_UNINDUCED_REP1.Log.final.out", + "RAP1_UNINDUCED_REP1.Log.out", + "RAP1_UNINDUCED_REP1.Log.progress.out", + "RAP1_UNINDUCED_REP2.Log.final.out", + "RAP1_UNINDUCED_REP2.Log.out", + "RAP1_UNINDUCED_REP2.Log.progress.out", + "WT_REP1.Log.final.out", + "WT_REP1.Log.out", + "WT_REP1.Log.progress.out", + "WT_REP2.Log.final.out", + "WT_REP2.Log.out", + "WT_REP2.Log.progress.out" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:12.426991" + }, + "star_salmon/salmon_quant": { + "content": [ + "ambig_info.tsv:md5,6cd02367152bb2dd59a6f1f70df2d7f8", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,4cc2492f557e5e0a2911a0bd83a51020", + "ambig_info.tsv:md5,8611b6c03f6aa1a5f3dfceb0e65ad4ef", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,dc750c3564c63da54979c852794d58a5", + "ambig_info.tsv:md5,1b69f9b651dfa6799e310004c1e3309f", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,db43ed650e6e7b42cd2c5b8101bb6748", + "ambig_info.tsv:md5,070c7d50eab5ce0f211cdb06f9d7cc29", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,e418b4e899623449c6babdf53e5aabde", + "ambig_info.tsv:md5,b8c61854b56a1c9a0fc8f158ea0c7599", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,f234c8d322df3b59d990594c63b24eae", + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:13.580621" + }, + "trimgalore": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:13.706881" + }, + "star_salmon/rseqc": { + "content": [ + "RAP1_IAA_30M_REP1.infer_experiment.txt:md5,ee69422d6e76fba223aa6b20a13027d2", + "RAP1_UNINDUCED_REP1.infer_experiment.txt:md5,ec9ec42ddfd3ffbb5373d3d6b6713b2c", + "RAP1_UNINDUCED_REP2.infer_experiment.txt:md5,484e2860c6c496b1da5fac475a0cd3e4", + "WT_REP1.infer_experiment.txt:md5,298c430c61cb7a46b48af867a0dfe00b", + "WT_REP2.infer_experiment.txt:md5,18758f433cf5c19bce599e5329da39a9", + "RAP1_IAA_30M_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP2.bam_stat.txt", + "WT_REP1.bam_stat.txt", + "WT_REP2.bam_stat.txt", + "RAP1_IAA_30M_REP1.inner_distance_plot.pdf", + "WT_REP1.inner_distance_plot.pdf", + "WT_REP2.inner_distance_plot.pdf", + "RAP1_IAA_30M_REP1.inner_distance_plot.r", + "WT_REP1.inner_distance_plot.r", + "WT_REP2.inner_distance_plot.r", + "RAP1_IAA_30M_REP1.inner_distance.txt", + "RAP1_IAA_30M_REP1.inner_distance_freq.txt", + "RAP1_IAA_30M_REP1.inner_distance_mean.txt", + "WT_REP1.inner_distance.txt", + "WT_REP1.inner_distance_freq.txt", + "WT_REP1.inner_distance_mean.txt", + "WT_REP2.inner_distance.txt", + "WT_REP2.inner_distance_freq.txt", + "WT_REP2.inner_distance_mean.txt", + "RAP1_IAA_30M_REP1.junction.Interact.bed", + "RAP1_IAA_30M_REP1.junction.bed", + "RAP1_UNINDUCED_REP1.junction.Interact.bed", + "RAP1_UNINDUCED_REP1.junction.bed", + "RAP1_UNINDUCED_REP2.junction.Interact.bed", + "RAP1_UNINDUCED_REP2.junction.bed", + "WT_REP1.junction.Interact.bed", + "WT_REP1.junction.bed", + "WT_REP2.junction.Interact.bed", + "WT_REP2.junction.bed", + "RAP1_IAA_30M_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP2.junction_annotation.log", + "WT_REP1.junction_annotation.log", + "WT_REP2.junction_annotation.log", + "RAP1_IAA_30M_REP1.splice_events.pdf", + "RAP1_IAA_30M_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP1.splice_events.pdf", + "RAP1_UNINDUCED_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP2.splice_events.pdf", + "RAP1_UNINDUCED_REP2.splice_junction.pdf", + "WT_REP1.splice_events.pdf", + "WT_REP1.splice_junction.pdf", + "WT_REP2.splice_events.pdf", + "WT_REP2.splice_junction.pdf", + "RAP1_IAA_30M_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP2.junction_plot.r", + "WT_REP1.junction_plot.r", + "WT_REP2.junction_plot.r", + "RAP1_IAA_30M_REP1.junction.xls", + "RAP1_UNINDUCED_REP1.junction.xls", + "RAP1_UNINDUCED_REP2.junction.xls", + "WT_REP1.junction.xls", + "WT_REP2.junction.xls", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf", + "WT_REP1.junctionSaturation_plot.pdf", + "WT_REP2.junctionSaturation_plot.pdf", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.r", + "WT_REP1.junctionSaturation_plot.r", + "WT_REP2.junctionSaturation_plot.r", + "RAP1_IAA_30M_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP2.read_distribution.txt", + "WT_REP1.read_distribution.txt", + "WT_REP2.read_distribution.txt", + "RAP1_IAA_30M_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP2.DupRate_plot.pdf", + "WT_REP1.DupRate_plot.pdf", + "WT_REP2.DupRate_plot.pdf", + "RAP1_IAA_30M_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP2.DupRate_plot.r", + "WT_REP1.DupRate_plot.r", + "WT_REP2.DupRate_plot.r", + "RAP1_IAA_30M_REP1.pos.DupRate.xls", + "RAP1_IAA_30M_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP1.pos.DupRate.xls", + "RAP1_UNINDUCED_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP2.pos.DupRate.xls", + "RAP1_UNINDUCED_REP2.seq.DupRate.xls", + "WT_REP1.pos.DupRate.xls", + "WT_REP1.seq.DupRate.xls", + "WT_REP2.pos.DupRate.xls", + "WT_REP2.seq.DupRate.xls" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T13:19:36.262464" + }, + "references": { + "content": [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055", + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:10.758518" + }, + "star_salmon/samtools_stats": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.stats", + "RAP1_IAA_30M_REP1.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.sorted.bam.stats", + "WT_REP1.markdup.sorted.bam.flagstat", + "WT_REP1.markdup.sorted.bam.idxstats", + "WT_REP1.markdup.sorted.bam.stats", + "WT_REP1.sorted.bam.flagstat", + "WT_REP1.sorted.bam.idxstats", + "WT_REP1.sorted.bam.stats", + "WT_REP2.markdup.sorted.bam.flagstat", + "WT_REP2.markdup.sorted.bam.idxstats", + "WT_REP2.markdup.sorted.bam.stats", + "WT_REP2.sorted.bam.flagstat", + "WT_REP2.sorted.bam.idxstats", + "WT_REP2.sorted.bam.stats" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:21:47.319657" + }, + "multiqc_plots": { + "content": [ + "cutadapt_filtered_reads_plot-cnt.png:md5,704cf0d91bfa3dd658dd8c9590f669a2", + "cutadapt_filtered_reads_plot-pct.png:md5,2684d8b2afca3300e5786486b80237f0", + "cutadapt_trimmed_sequences_plot_3_Counts.png:md5,bef41d894629b0c4dab4478bbf197f50", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.png:md5,1e0d01537d3797623d0b3fd8fbe42787", + "dupradar-section-plot.png:md5,62ee84d3b32bdbfb9766fa970680f92c", + "fastqc-status-check-heatmap-1.png:md5,2402522f8c02e12aea9af088c6595890", + "fastqc-status-check-heatmap.png:md5,fe8b5b4ab4480d46a12a9005932a9b84", + "fastqc_overrepresented_sequences_plot-1.png:md5,40e450251b80ec0efc9364434234ec7f", + "fastqc_overrepresented_sequences_plot.png:md5,6f5ffbdf1bf61fabe5e028c8bc85de14", + "fastqc_per_sequence_gc_content_plot-1_Counts.png:md5,8a806cec2142f9911502e0a253d83d13", + "fastqc_per_sequence_gc_content_plot-1_Percentages.png:md5,953929d50c8490029880e205e4db7959", + "fastqc_per_sequence_gc_content_plot_Counts.png:md5,01f124545af788fd5cc7bbf41b005e16", + "fastqc_per_sequence_gc_content_plot_Percentages.png:md5,eba3abf8bedb2cb20bad90c54e9c8881", + "fastqc_per_sequence_quality_scores_plot-1.png:md5,d2c29cae169f35744500c751b4a7366e", + "fastqc_per_sequence_quality_scores_plot.png:md5,42fd7369a8aca78f620164a9e887c3cb", + "fastqc_sequence_counts_plot-1-cnt.png:md5,2874fea747c7ff46828bf4f17668caf8", + "fastqc_sequence_counts_plot-1-pct.png:md5,0022d7f5ac78b6eff157de24e37c5ab0", + "fastqc_sequence_counts_plot-cnt.png:md5,3890d5555f2a39b46b9f6efb14cb91f2", + "fastqc_sequence_counts_plot-pct.png:md5,55fa5838c8b2db978fcfa5cb83f6b054", + "fastqc_sequence_duplication_levels_plot-1.png:md5,fcd3b1ec2b95fe4bcd607dc28179a754", + "fastqc_sequence_duplication_levels_plot.png:md5,747431f0f38f8e4c41a11a072fa18780", + "featurecounts_biotype_plot-cnt.png:md5,ed2c5826034fcf2417afe79902897c45", + "featurecounts_biotype_plot-pct.png:md5,96abf028d347f568289b3a741aa8c08d", + "qualimap_gene_coverage_profile_Counts.png:md5,fb739f4297a156f0913f21f20090f598", + "qualimap_gene_coverage_profile_Normalised.png:md5,710960caa692f0d0eceadcc83650cf00", + "rseqc_infer_experiment_plot.png:md5,49f1faa0849545b8a75af2657d0ee5fa", + "rseqc_read_dups_plot.png:md5,1a18ce4ca5f36722f1fdd579d7eb41e1", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png:md5,ce6abb232fd5b5f2e66c0fe9a571d75f", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png:md5,6b44818f886ef020fb3646f152ad4af6", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png:md5,af332971e3158b3cfee3a65311ebfe2c", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png:md5,f12bcf930eac8ed45da7b4668b1169c8", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png:md5,ff8e0f61b02f8c9abcce5e83214c87fd", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png:md5,1a029e5d23f82d537470363a065b644a", + "sortmerna-detailed-plot-cnt.png:md5,3875997f21c98e8906cd182d959e0020", + "sortmerna-detailed-plot-pct.png:md5,971398875e5cbd50313b6fee7eeb302c", + "multiqc_report.html", + "cutadapt_filtered_reads_plot-cnt.pdf", + "cutadapt_filtered_reads_plot-pct.pdf", + "cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "dupradar-section-plot.pdf", + "fail_strand_check_table.pdf", + "fastqc-status-check-heatmap-1.pdf", + "fastqc-status-check-heatmap.pdf", + "fastqc_adapter_content_plot.pdf", + "fastqc_overrepresented_sequences_plot-1.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot-1.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot-1.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot-1_Counts.pdf", + "fastqc_per_sequence_gc_content_plot-1_Percentages.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot-1.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-1-cnt.pdf", + "fastqc_sequence_counts_plot-1-pct.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot-1.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table-1.pdf", + "fastqc_top_overrepresented_sequences_table.pdf", + "featurecounts_biotype_plot-cnt.pdf", + "featurecounts_biotype_plot-pct.pdf", + "general_stats_table.pdf", + "picard_deduplication-cnt.pdf", + "picard_deduplication-pct.pdf", + "qualimap_gene_coverage_profile_Counts.pdf", + "qualimap_gene_coverage_profile_Normalised.pdf", + "qualimap_genomic_origin-cnt.pdf", + "qualimap_genomic_origin-pct.pdf", + "rseqc_bam_stat.pdf", + "rseqc_infer_experiment_plot.pdf", + "rseqc_inner_distance_plot_Counts.pdf", + "rseqc_inner_distance_plot_Percentages.pdf", + "rseqc_junction_annotation_junctions_plot_Events-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Events-pct.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf", + "rseqc_junction_saturation_plot_All_Junctions.pdf", + "rseqc_junction_saturation_plot_Known_Junctions.pdf", + "rseqc_junction_saturation_plot_Novel_Junctions.pdf", + "rseqc_read_distribution_plot-cnt.pdf", + "rseqc_read_distribution_plot-pct.pdf", + "rseqc_read_dups_plot.pdf", + "salmon_deseq2_clustering-plot.pdf", + "salmon_deseq2_pca-plot.pdf", + "salmon_plot.pdf", + "samtools-flagstat-dp_Percentage_of_total.pdf", + "samtools-flagstat-dp_Read_counts.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", + "samtools-stats-dp.pdf", + "samtools_alignment_plot-cnt.pdf", + "samtools_alignment_plot-pct.pdf", + "sortmerna-detailed-plot-cnt.pdf", + "sortmerna-detailed-plot-pct.pdf", + "star_alignment_plot-cnt.pdf", + "star_alignment_plot-pct.pdf", + "star_salmon_deseq2_clustering-plot.pdf", + "star_salmon_deseq2_pca-plot.pdf", + "star_summary_table.pdf", + "fail_strand_check_table.png", + "fastqc_adapter_content_plot.png", + "fastqc_per_base_n_content_plot-1.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot-1.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table-1.png", + "fastqc_top_overrepresented_sequences_table.png", + "general_stats_table.png", + "picard_deduplication-cnt.png", + "picard_deduplication-pct.png", + "qualimap_genomic_origin-cnt.png", + "qualimap_genomic_origin-pct.png", + "rseqc_bam_stat.png", + "rseqc_inner_distance_plot_Counts.png", + "rseqc_inner_distance_plot_Percentages.png", + "rseqc_junction_annotation_junctions_plot_Events-cnt.png", + "rseqc_junction_annotation_junctions_plot_Events-pct.png", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.png", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.png", + "rseqc_junction_saturation_plot_All_Junctions.png", + "rseqc_junction_saturation_plot_Known_Junctions.png", + "rseqc_junction_saturation_plot_Novel_Junctions.png", + "rseqc_read_distribution_plot-cnt.png", + "rseqc_read_distribution_plot-pct.png", + "salmon_deseq2_clustering-plot.png", + "salmon_deseq2_pca-plot.png", + "salmon_plot.png", + "samtools-flagstat-dp_Percentage_of_total.png", + "samtools-flagstat-dp_Read_counts.png", + "samtools-stats-dp.png", + "samtools_alignment_plot-cnt.png", + "samtools_alignment_plot-pct.png", + "star_alignment_plot-cnt.png", + "star_alignment_plot-pct.png", + "star_salmon_deseq2_clustering-plot.png", + "star_salmon_deseq2_pca-plot.png", + "star_summary_table.png", + "cutadapt_filtered_reads_plot-cnt.svg", + "cutadapt_filtered_reads_plot-pct.svg", + "cutadapt_trimmed_sequences_plot_3_Counts.svg", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "dupradar-section-plot.svg", + "fail_strand_check_table.svg", + "fastqc-status-check-heatmap-1.svg", + "fastqc-status-check-heatmap.svg", + "fastqc_adapter_content_plot.svg", + "fastqc_overrepresented_sequences_plot-1.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot-1.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot-1.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot-1_Counts.svg", + "fastqc_per_sequence_gc_content_plot-1_Percentages.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot-1.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-1-cnt.svg", + "fastqc_sequence_counts_plot-1-pct.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot-1.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table-1.svg", + "fastqc_top_overrepresented_sequences_table.svg", + "featurecounts_biotype_plot-cnt.svg", + "featurecounts_biotype_plot-pct.svg", + "general_stats_table.svg", + "picard_deduplication-cnt.svg", + "picard_deduplication-pct.svg", + "qualimap_gene_coverage_profile_Counts.svg", + "qualimap_gene_coverage_profile_Normalised.svg", + "qualimap_genomic_origin-cnt.svg", + "qualimap_genomic_origin-pct.svg", + "rseqc_bam_stat.svg", + "rseqc_infer_experiment_plot.svg", + "rseqc_inner_distance_plot_Counts.svg", + "rseqc_inner_distance_plot_Percentages.svg", + "rseqc_junction_annotation_junctions_plot_Events-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Events-pct.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.svg", + "rseqc_junction_saturation_plot_All_Junctions.svg", + "rseqc_junction_saturation_plot_Known_Junctions.svg", + "rseqc_junction_saturation_plot_Novel_Junctions.svg", + "rseqc_read_distribution_plot-cnt.svg", + "rseqc_read_distribution_plot-pct.svg", + "rseqc_read_dups_plot.svg", + "salmon_deseq2_clustering-plot.svg", + "salmon_deseq2_pca-plot.svg", + "salmon_plot.svg", + "samtools-flagstat-dp_Percentage_of_total.svg", + "samtools-flagstat-dp_Read_counts.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", + "samtools-stats-dp.svg", + "samtools_alignment_plot-cnt.svg", + "samtools_alignment_plot-pct.svg", + "sortmerna-detailed-plot-cnt.svg", + "sortmerna-detailed-plot-pct.svg", + "star_alignment_plot-cnt.svg", + "star_alignment_plot-pct.svg", + "star_salmon_deseq2_clustering-plot.svg", + "star_salmon_deseq2_pca-plot.svg", + "star_summary_table.svg" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:21:47.217167" + }, + "Params: --remove_ribo_rna - stub": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=null}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, FASTQC={fastqc=0.12.1}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, SORTMERNA_INDEX={sortmerna=4.3.6}, STAR_GENOMEGENERATE={star=2.7.10a, samtools=1.18, gawk=5.1.0}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}", + "genome_transcriptome.fasta", + "genome_transcriptome.gtf", + "RAP1_IAA_30M_REP1_raw.html", + "RAP1_IAA_30M_REP1_raw.zip", + "RAP1_UNINDUCED_REP1_raw.html", + "RAP1_UNINDUCED_REP1_raw.zip", + "RAP1_UNINDUCED_REP2_raw.html", + "RAP1_UNINDUCED_REP2_raw.zip", + "WT_REP1_raw.html", + "WT_REP1_raw.zip", + "WT_REP2_raw.html", + "WT_REP2_raw.zip", + "multiqc_report.html", + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:20:03.148673" + }, + "fastqc/raw": { + "content": [ + "RAP1_IAA_30M_REP1_raw_1_fastqc.html", + "RAP1_IAA_30M_REP1_raw_1_fastqc.zip", + "RAP1_IAA_30M_REP1_raw_2_fastqc.html", + "RAP1_IAA_30M_REP1_raw_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_raw_fastqc.html", + "RAP1_UNINDUCED_REP1_raw_fastqc.zip", + "RAP1_UNINDUCED_REP2_raw_fastqc.html", + "RAP1_UNINDUCED_REP2_raw_fastqc.zip", + "WT_REP1_raw_1_fastqc.html", + "WT_REP1_raw_1_fastqc.zip", + "WT_REP1_raw_2_fastqc.html", + "WT_REP1_raw_2_fastqc.zip", + "WT_REP2_raw_1_fastqc.html", + "WT_REP2_raw_1_fastqc.zip", + "WT_REP2_raw_2_fastqc.html", + "WT_REP2_raw_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:10.774446" + }, + "star_salmon/stringtie": { + "content": [ + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,ee43fdd5d543e24c53b6031cdbabb656", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,a052ab04070e72cc318fb7680b0764e3", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,52a62313943891cc8dcb3b4c1e117f18", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,d279003d92f7feef9adb31203f84474a", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,3c7b9cf3bb1dcb98d79f8226eef7aa4c", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,525413b70bcf62c24c8f96182e09883e", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,682817a9d0a1ac9c1637249e007d3514", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,907ab2e06346df131cbdb929afc005a8", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,f2cf8aa2786c710fb6be5857e1545e0e", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,041edee3193df311f621c09f4991892b", + "t_data.ctab", + "RAP1_IAA_30M_REP1.coverage.gtf", + "RAP1_IAA_30M_REP1.gene.abundance.txt", + "RAP1_IAA_30M_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP1.coverage.gtf", + "RAP1_UNINDUCED_REP1.gene.abundance.txt", + "RAP1_UNINDUCED_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP2.coverage.gtf", + "RAP1_UNINDUCED_REP2.gene.abundance.txt", + "RAP1_UNINDUCED_REP2.transcripts.gtf", + "t_data.ctab", + "WT_REP1.coverage.gtf", + "WT_REP1.gene.abundance.txt", + "WT_REP1.transcripts.gtf", + "t_data.ctab", + "WT_REP2.coverage.gtf", + "WT_REP2.gene.abundance.txt", + "WT_REP2.transcripts.gtf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:13.357765" + }, + "salmon_quant": { + "content": [ + "ambig_info.tsv:md5,25ced9693254994a7878241225baabb6", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,306609f606004616a89ec50dc59f22b0", + "lib_format_counts.json:md5,b814fed52bd197a64544086dba0f127a", + "ambig_info.tsv:md5,c83b0f9ebe9b8dfc284595ec56d4f092", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,6b367a9cdd2837b88890209459acf45f", + "lib_format_counts.json:md5,3f4d67ace359562564dd336aa47a479c", + "ambig_info.tsv:md5,00a1f9de7095a68dfb43e0a0301b6ecd", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,c8c6208e1082ec150de56679b2b8cfe3", + "lib_format_counts.json:md5,f56087bcbd494c7fa78200f65a2400e2", + "ambig_info.tsv:md5,54d942ddf69b4e8f1598064e09428256", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,5523405c02d30489d276e5d734cb54da", + "lib_format_counts.json:md5,43fc5463eada79e466d6ba9848739f06", + "ambig_info.tsv:md5,933feffdaf6cf6ff407469ade0d7684d", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,998c89efb00fa5e63fd1d18c0602a019", + "lib_format_counts.json:md5,e6e3d7746e9abee6a0e097ae0ee1781a", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:11.15975" + }, + "multiqc_data": { + "content": [ + "cutadapt_filtered_reads_plot.txt:md5,bf033e64e9d23bee85b6277f11c663f1", + "cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,13dfa866fd91dbb072689efe9aa83b1f", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,07145dd8dd3db654859b18eb0389046c", + "fastqc-status-check-heatmap-1.txt:md5,22a03548736b88b23be6bc0c9ef1b4a6", + "fastqc-status-check-heatmap.txt:md5,5a89b0d8d162f6b1dbdaf39457bbc03b", + "fastqc_adapter_content_plot.txt:md5,da0389be84cfdd189b1d045212eb2974", + "fastqc_overrepresented_sequences_plot-1.txt:md5,4adfeacd3a3a6c7c808f121b24e6b247", + "fastqc_overrepresented_sequences_plot.txt:md5,25d88ea8a72f55e8a374ae802bc7f0b1", + "fastqc_per_base_n_content_plot-1.txt:md5,418610c1ce119cb786ad434db75d366e", + "fastqc_per_base_n_content_plot.txt:md5,d368d7e36ca2f73dcde61f2b486d8213", + "fastqc_per_base_sequence_quality_plot-1.txt:md5,bd22e06e41c096ad4f745d40fe96a1e5", + "fastqc_per_base_sequence_quality_plot.txt:md5,5c3065b549129702b185ea1b817da420", + "fastqc_per_sequence_gc_content_plot-1_Counts.txt:md5,004c60768ceb6197765154e3eaa37b7a", + "fastqc_per_sequence_gc_content_plot-1_Percentages.txt:md5,95d29060b687f745288ad1ec47750037", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,9ddaa50167117d3c9188ccf015427704", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,f10ee2881b61308af35f304aa3d810a3", + "fastqc_per_sequence_quality_scores_plot-1.txt:md5,0f9834cc19f76dd5c87cf8cba7435a7c", + "fastqc_per_sequence_quality_scores_plot.txt:md5,b5f9a02933e3065952237afd2ec9ce82", + "fastqc_sequence_counts_plot-1.txt:md5,3861354bbedfbde7ca36a72994f9425c", + "fastqc_sequence_counts_plot.txt:md5,d385a3e2c2573a0902c66e8c93876d3c", + "fastqc_sequence_duplication_levels_plot-1.txt:md5,c73407d55fc532e864fa1dc8dbc12874", + "fastqc_sequence_duplication_levels_plot.txt:md5,8812cee16f6ca65e2c33635754de1772", + "fastqc_sequence_length_distribution_plot.txt:md5,6fe2c985606abad947bcca99b015ae33", + "multiqc_citations.txt:md5,bfa9fd61367cd7265e324d009c974778", + "multiqc_cutadapt.txt:md5,aac9581a5670cb55edf564f3d6c1f9a7", + "multiqc_fastqc_fastqc_raw.txt:md5,81c3c1a2575a1891a7f2a9637a0f2cc0", + "multiqc_fastqc_fastqc_trimmed.txt:md5,a3238f515e01d158d875d69968753804", + "multiqc_featurecounts_biotype_plot.txt:md5,54f0eef4ab0ecf6a03505b18752b43cd", + "multiqc_samtools_idxstats.txt:md5,413ba06f3d8e4ab0dbde8ef8952c4b32", + "picard_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_2.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "qualimap_gene_coverage_profile_Counts.txt:md5,50e9209baeaafe181ce3b5caa05cf789", + "qualimap_gene_coverage_profile_Normalised.txt:md5,6ed32f112c679e73396350cbe5cb9459", + "qualimap_rnaseq_cov_hist.txt:md5,a895b3af229f661da1edbc21ec72edaa", + "rseqc_infer_experiment_plot.txt:md5,d8741451248f1a5a4ebe3230c1af9c95", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,75acd04232d1804b5f960ee4c5db4722", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,53addd7b78d8ae224920ec9b97489d72", + "samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,97fc7bde65a7efc5ab3af48ef0400c20", + "fastqc_top_overrepresented_sequences_table-1.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "junction_saturation_known.txt", + "junction_saturation_novel.txt", + "multiqc_data.json", + "multiqc_dupradar-section-plot.txt", + "multiqc_fail_strand_check_table.txt", + "multiqc_general_stats.txt", + "multiqc_picard_dups.txt", + "multiqc_rseqc_bam_stat.txt", + "multiqc_rseqc_infer_experiment.txt", + "multiqc_rseqc_junction_annotation.txt", + "multiqc_rseqc_read_distribution.txt", + "multiqc_salmon.txt", + "multiqc_salmon_deseq2_clustering-plot.txt", + "multiqc_salmon_deseq2_clustering-plot_1.txt", + "multiqc_salmon_deseq2_clustering-plot_2.txt", + "multiqc_salmon_deseq2_clustering-plot_3.txt", + "multiqc_salmon_deseq2_clustering-plot_4.txt", + "multiqc_salmon_deseq2_pca-plot.txt", + "multiqc_samtools_flagstat.txt", + "multiqc_samtools_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sortmerna.txt", + "multiqc_sources.txt", + "multiqc_star.txt", + "multiqc_star_salmon_deseq2_clustering-plot.txt", + "multiqc_star_salmon_deseq2_clustering-plot_1.txt", + "multiqc_star_salmon_deseq2_clustering-plot_2.txt", + "multiqc_star_salmon_deseq2_clustering-plot_3.txt", + "multiqc_star_salmon_deseq2_clustering-plot_4.txt", + "multiqc_star_salmon_deseq2_pca-plot.txt", + "picard_deduplication.txt", + "qualimap_genomic_origin.txt", + "qualimap_rnaseq_genome_results.txt", + "rseqc_bam_stat.txt", + "rseqc_inner_distance.txt", + "rseqc_inner_distance_plot_Counts.txt", + "rseqc_inner_distance_plot_Percentages.txt", + "rseqc_junction_annotation_junctions_plot_Events.txt", + "rseqc_junction_annotation_junctions_plot_Junctions.txt", + "rseqc_junction_saturation_all.txt", + "rseqc_junction_saturation_plot_All_Junctions.txt", + "rseqc_junction_saturation_plot_Known_Junctions.txt", + "rseqc_junction_saturation_plot_Novel_Junctions.txt", + "rseqc_read_distribution_plot.txt", + "rseqc_read_dups.txt", + "rseqc_read_dups_plot.txt", + "salmon_plot.txt", + "samtools-flagstat-dp_Percentage_of_total.txt", + "samtools-flagstat-dp_Read_counts.txt", + "samtools-stats-dp.txt", + "samtools_alignment_plot.txt", + "sortmerna-detailed-plot.txt", + "star_alignment_plot.txt", + "star_summary_table.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:21:47.111212" + }, + "star_salmon/deseq2_qc": { + "content": [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "RAP1_IAA_30M_REP1.txt", + "RAP1_UNINDUCED_REP1.txt", + "RAP1_UNINDUCED_REP2.txt", + "WT_REP1.txt", + "WT_REP2.txt", + "deseq2.size_factors.RData", + "deseq2.dds.RData", + "deseq2.pca.vals.txt", + "deseq2.plots.pdf", + "deseq2.sample.dists.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:11.802609" + }, + "star_salmon/markdup": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai", + "WT_REP1.markdup.sorted.bam", + "WT_REP1.markdup.sorted.bam.bai", + "WT_REP2.markdup.sorted.bam", + "WT_REP2.markdup.sorted.bam.bai" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:13.466637" + }, + "star_salmon/featurecounts": { + "content": [ + "RAP1_IAA_30M_REP1.biotype_counts_mqc.tsv:md5,f36792d25b268b6d556f8728300f4afc", + "RAP1_IAA_30M_REP1.biotype_counts_rrna_mqc.tsv:md5,dde2de0cb90e10d0195c726f768e9941", + "RAP1_IAA_30M_REP1.featureCounts.txt:md5,c5865ded7168476d93057d2aedaec694", + "RAP1_UNINDUCED_REP1.biotype_counts_mqc.tsv:md5,782f5001d411ba79314ba77f7d36b157", + "RAP1_UNINDUCED_REP1.biotype_counts_rrna_mqc.tsv:md5,845ff9059c72bc6722a8de69776e22bb", + "RAP1_UNINDUCED_REP1.featureCounts.txt:md5,a0fb30c2b937a5a41ac865ab09367af7", + "RAP1_UNINDUCED_REP2.biotype_counts_mqc.tsv:md5,1c9d07d9f9d12219d2b9f761f854eced", + "RAP1_UNINDUCED_REP2.biotype_counts_rrna_mqc.tsv:md5,6d3fa4c88c7fe61f638e4624ad5e22f0", + "RAP1_UNINDUCED_REP2.featureCounts.txt:md5,de016e691f5d56b13bbaa626ce2cc93e", + "WT_REP1.biotype_counts_mqc.tsv:md5,eca4a76b9243248d01df5f4289b8201e", + "WT_REP1.biotype_counts_rrna_mqc.tsv:md5,8ef76d717492ca23764938aee8ea33a9", + "WT_REP1.featureCounts.txt:md5,7aadafd0a26f5047a9ae7266eccfce05", + "WT_REP2.biotype_counts_mqc.tsv:md5,530605b80da27915a90d452249f3243a", + "WT_REP2.biotype_counts_rrna_mqc.tsv:md5,12294618fe44df1e7f39348372dcb481", + "WT_REP2.featureCounts.txt:md5,809af01851125c401d576c21efca7b5a", + "RAP1_IAA_30M_REP1.featureCounts.txt.summary", + "RAP1_UNINDUCED_REP1.featureCounts.txt.summary", + "RAP1_UNINDUCED_REP2.featureCounts.txt.summary", + "WT_REP1.featureCounts.txt.summary", + "WT_REP2.featureCounts.txt.summary" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T13:19:35.982363" + }, + "salmon/deseq2_qc": { + "content": [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "deseq2.dds.RData", + "deseq2.pca.vals.txt", + "deseq2.plots.pdf", + "deseq2.sample.dists.txt", + "RAP1_IAA_30M_REP1.txt", + "RAP1_UNINDUCED_REP1.txt", + "RAP1_UNINDUCED_REP2.txt", + "WT_REP1.txt", + "WT_REP2.txt", + "deseq2.size_factors.RData" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:11.010569" + }, + "salmon": { + "content": [ + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:11.336679" + }, + "star_salmon/picard_metrics": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:12.629115" + }, + "star_salmon/salmon": { + "content": [ + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:13.112566" + }, + "star_salmon/bigwig": { + "content": [ + "RAP1_IAA_30M_REP1.forward.bigWig", + "RAP1_IAA_30M_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP1.forward.bigWig", + "RAP1_UNINDUCED_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP2.forward.bigWig", + "RAP1_UNINDUCED_REP2.reverse.bigWig", + "WT_REP1.forward.bigWig", + "WT_REP1.reverse.bigWig", + "WT_REP2.forward.bigWig", + "WT_REP2.reverse.bigWig" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:18:52.080654" + }, + "star_salmon/sortmerna": { + "content": [ + "RAP1_IAA_30M_REP1.sortmerna.log", + "RAP1_UNINDUCED_REP1.sortmerna.log", + "RAP1_UNINDUCED_REP2.sortmerna.log", + "WT_REP1.sortmerna.log", + "WT_REP2.sortmerna.log" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:18:51.881667" + }, + "versions": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, BEDTOOLS_GENOMECOV_FW={bedtools=2.31.1}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=3.9.5}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, CUSTOM_TX2GENE={python=3.9.5}, DESEQ2_QC_PSEUDO={r-base=4.0.3, bioconductor-deseq2=1.28.0}, DESEQ2_QC_STAR_SALMON={r-base=4.0.3, bioconductor-deseq2=1.28.0}, DUPRADAR={bioconductor-dupradar=1.32.0}, FASTQC={fastqc=0.12.1}, FQ_SUBSAMPLE={fq=0.9.1 (2022-02-22)}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, MULTIQC_CUSTOM_BIOTYPE={python=3.9.5}, PICARD_MARKDUPLICATES={picard=3.1.1}, QUALIMAP_RNASEQ={qualimap=2.3}, RSEQC_BAMSTAT={rseqc=5.0.2}, RSEQC_INFEREXPERIMENT={rseqc=5.0.2}, RSEQC_INNERDISTANCE={rseqc=5.0.2}, RSEQC_JUNCTIONANNOTATION={rseqc=5.0.2}, RSEQC_JUNCTIONSATURATION={rseqc=5.0.2}, RSEQC_READDISTRIBUTION={rseqc=5.0.2}, RSEQC_READDUPLICATION={rseqc=5.0.2}, SALMON_QUANT={salmon=1.10.1}, SAMTOOLS_FLAGSTAT={samtools=1.2}, SAMTOOLS_IDXSTATS={samtools=1.2}, SAMTOOLS_INDEX={samtools=1.2}, SAMTOOLS_SORT={samtools=1.2}, SAMTOOLS_STATS={samtools=1.2}, SE_GENE={bioconductor-summarizedexperiment=1.32.0}, SORTMERNA={sortmerna=4.3.6}, SORTMERNA_INDEX={sortmerna=4.3.6}, STAR_ALIGN={star=2.7.10a, samtools=1.18, gawk=5.1.0}, STAR_GENOMEGENERATE={star=2.7.10a, samtools=1.18, gawk=5.1.0}, STRINGTIE_STRINGTIE={stringtie=2.2.1}, SUBREAD_FEATURECOUNTS={subread=2.0.1}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, TXIMETA_TXIMPORT={bioconductor-tximeta=1.20.1}, UCSC_BEDCLIP={ucsc=377}, UCSC_BEDGRAPHTOBIGWIG={ucsc=445}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:14.01652" + }, + "fastqc/trim": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip", + "WT_REP1_trimmed_1_val_1_fastqc.html", + "WT_REP1_trimmed_1_val_1_fastqc.zip", + "WT_REP1_trimmed_2_val_2_fastqc.html", + "WT_REP1_trimmed_2_val_2_fastqc.zip", + "WT_REP2_trimmed_1_val_1_fastqc.html", + "WT_REP2_trimmed_1_val_1_fastqc.zip", + "WT_REP2_trimmed_2_val_2_fastqc.html", + "WT_REP2_trimmed_2_val_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:10.790876" + }, + "star_salmon/dupradar": { + "content": [ + "RAP1_IAA_30M_REP1_dupMatrix.txt:md5,ddadea4a08511aae6faeb632eb6aafea", + "RAP1_UNINDUCED_REP1_dupMatrix.txt:md5,1db4c86723cf69052c4386760a9750bb", + "RAP1_UNINDUCED_REP2_dupMatrix.txt:md5,c0bf1135d2d70c5918d87f706c0c54bc", + "WT_REP1_dupMatrix.txt:md5,b0de1683f2a9bfa42437e924a11648fd", + "WT_REP2_dupMatrix.txt:md5,bab18079153627205e5d907d8dfba677", + "RAP1_IAA_30M_REP1_intercept_slope.txt:md5,b21a53b0156b0afdfc28c237cb11218d", + "RAP1_UNINDUCED_REP1_intercept_slope.txt:md5,eccc5ca37855c717d35477e684188695", + "RAP1_UNINDUCED_REP2_intercept_slope.txt:md5,c3900f3bb24cd339d0e0ecf65ae43217", + "WT_REP1_intercept_slope.txt:md5,f38c8525b7fcb990b7158f1518e451ad", + "WT_REP2_intercept_slope.txt:md5,9bcbc18d0d331fe3c972538456ffd5b2", + "RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf", + "WT_REP1_duprateExpBoxplot.pdf", + "WT_REP2_duprateExpBoxplot.pdf", + "RAP1_IAA_30M_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP2_expressionHist.pdf", + "WT_REP1_expressionHist.pdf", + "WT_REP2_expressionHist.pdf", + "RAP1_IAA_30M_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP2_duprateExpDens.pdf", + "WT_REP1_duprateExpDens.pdf", + "WT_REP2_duprateExpDens.pdf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:12.064305" + }, + "bbsplit": { + "content": [ + "RAP1_IAA_30M_REP1.stats.txt", + "RAP1_UNINDUCED_REP1.stats.txt", + "RAP1_UNINDUCED_REP2.stats.txt", + "WT_REP1.stats.txt", + "WT_REP2.stats.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-23T18:00:10.74095" + }, + "star_salmon/qualimap": { + "content": [ + "Coverage Profile Along Genes (High).png:md5,1a837e43161d7133e9156c7b18123aa9", + "Coverage Profile Along Genes (Low).png:md5,46c5ba09af49602b956efd780f7a39e4", + "Coverage Profile Along Genes (Total).png:md5,b04cac9c2d15b1b9623d87d44caadff6", + "Transcript coverage histogram.png:md5,cbb250c6903bfe6ecab5fb4b2ca661e5", + "coverage_profile_along_genes_(high).txt:md5,5aee6c959137a8c9bfbd0ddaa79dddba", + "coverage_profile_along_genes_(low).txt:md5,d2742410803e0de7cc606ef118010ea8", + "coverage_profile_along_genes_(total).txt:md5,d2742410803e0de7cc606ef118010ea8", + "Coverage Profile Along Genes (High).png:md5,8c8b46f9bfb6cf952a95d85a6b917444", + "Coverage Profile Along Genes (Low).png:md5,5c56671f085c6db7fd86b41bb5b7e6d0", + "Coverage Profile Along Genes (Total).png:md5,b83fbaedfe4dcfdd7b3970d2ff27d517", + "Transcript coverage histogram.png:md5,488440d7b6d73bcd4567316712e281fe", + "coverage_profile_along_genes_(high).txt:md5,f5ac8f74fcad5d9ac72dbb6b65184bd0", + "coverage_profile_along_genes_(low).txt:md5,d66da6e3f49b0870184fc881a162e785", + "coverage_profile_along_genes_(total).txt:md5,d66da6e3f49b0870184fc881a162e785", + "Coverage Profile Along Genes (High).png:md5,015aa34b0d32f38bade831a3ef497984", + "Coverage Profile Along Genes (Low).png:md5,5798e0d977e0fee55ec4fc5192bfc0f4", + "Coverage Profile Along Genes (Total).png:md5,2bbec5e165075024cb1f74a042b1385a", + "Transcript coverage histogram.png:md5,bfd09f8b3282958a6a73b7924edac664", + "coverage_profile_along_genes_(high).txt:md5,634f447f91db940d2148af74cf36febd", + "coverage_profile_along_genes_(low).txt:md5,db2e0acbe9f07c68bcd7e08e036f02d3", + "coverage_profile_along_genes_(total).txt:md5,db2e0acbe9f07c68bcd7e08e036f02d3", + "Coverage Profile Along Genes (High).png:md5,d8a36870a6f262c41995b4b5bd26a149", + "Coverage Profile Along Genes (Low).png:md5,5570af90ee685a3c95117519aa6bdc46", + "Coverage Profile Along Genes (Total).png:md5,eb53e699213ce453cbea7f71f5204b08", + "Transcript coverage histogram.png:md5,f0bd8d82a8b7adec6e1f1ef85633eded", + "coverage_profile_along_genes_(high).txt:md5,a349232d75f6c0adab6afcd9f6cbbafb", + "coverage_profile_along_genes_(low).txt:md5,b2c696661e6c524b1641eb7267c70edc", + "coverage_profile_along_genes_(total).txt:md5,b2c696661e6c524b1641eb7267c70edc", + "Coverage Profile Along Genes (High).png:md5,3c1c603d63f3f7f9ba1ab6e7749b7771", + "Coverage Profile Along Genes (Low).png:md5,9f80251ed043cf900fa939cc254ccc81", + "Coverage Profile Along Genes (Total).png:md5,a420f287f986a8db317be712ac0a2237", + "Transcript coverage histogram.png:md5,c467c5eac12a95f8569198927434440d", + "coverage_profile_along_genes_(high).txt:md5,3f76529bd723d5320c86cc407fbb3294", + "coverage_profile_along_genes_(low).txt:md5,b9be191fdec82c78057e083d3adf20dd", + "coverage_profile_along_genes_(total).txt:md5,b9be191fdec82c78057e083d3adf20dd", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T13:19:36.107982" + } +} \ No newline at end of file diff --git a/tests/salmon.nf.test b/tests/salmon.nf.test new file mode 100644 index 000000000..9105ed9fa --- /dev/null +++ b/tests/salmon.nf.test @@ -0,0 +1,275 @@ +nextflow_pipeline { + + name "Test pipeline with Salmon, skipping both QC and alignment" + script "../main.nf" + + test("Params: --pseudo_aligner salmon --skip_qc --skip_alignment") { + + when { + params { + outdir = "$outputDir" + pseudo_aligner = 'salmon' + skip_qc = true + skip_alignment = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/bbsplit/RAP1_IAA_30M_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP2.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP2.stats.txt").name + ).match("bbsplit") }, + { assert snapshot( + path("${params.outdir}/custom/out/genome_gfp.fasta"), + path("${params.outdir}/custom/out/genome_gfp.gtf") + ).match("references") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.zip").name + ).match("fastqc/trim") }, + { assert snapshot( + path("${params.outdir}/multiqc/multiqc_report_data/cutadapt_filtered_reads_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Counts.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc-status-check-heatmap.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_overrepresented_sequences_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_per_base_n_content_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_per_base_sequence_quality_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Counts.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Percentages.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_per_sequence_quality_scores_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_sequence_counts_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_sequence_duplication_levels_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/fastqc_sequence_length_distribution_plot.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/multiqc_citations.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/multiqc_cutadapt.txt"), + path("${params.outdir}/multiqc/multiqc_report_data/multiqc_fastqc_fastqc_trimmed.txt"), + // These files are not stable + file("${params.outdir}/multiqc/multiqc_report_data/fastqc_top_overrepresented_sequences_table.txt").name, + file("${params.outdir}/multiqc/multiqc_report_data/multiqc_data.json").name, + file("${params.outdir}/multiqc/multiqc_report_data/multiqc_general_stats.txt").name, + file("${params.outdir}/multiqc/multiqc_report_data/multiqc_salmon.txt").name, + file("${params.outdir}/multiqc/multiqc_report_data/multiqc_software_versions.txt").name, + file("${params.outdir}/multiqc/multiqc_report_data/multiqc_sources.txt").name, + file("${params.outdir}/multiqc/multiqc_report_data/salmon_plot.txt").name + ).match("multiqc_data") }, + { assert snapshot( + path("${params.outdir}/multiqc/multiqc_report_plots/png/cutadapt_filtered_reads_plot-cnt.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/cutadapt_filtered_reads_plot-pct.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Counts.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Obs_Exp.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc-status-check-heatmap.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_sequence_counts_plot-cnt.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_sequence_counts_plot-pct.png"), + path("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot.png"), + // PDFs, SVGs, some PNGs and HTML reports are not stable + file("${params.outdir}/multiqc/multiqc_report.html").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-pct.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Counts.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc-status-check-heatmap.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-pct.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_sequence_length_distribution_plot.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/general_stats_table.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/pdf/salmon_plot.pdf").name, + file("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_per_base_n_content_plot.png").name, + file("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot.png").name, + file("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_sequence_length_distribution_plot.png").name, + file("${params.outdir}/multiqc/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table.png").name, + file("${params.outdir}/multiqc/multiqc_report_plots/png/general_stats_table.png").name, + file("${params.outdir}/multiqc/multiqc_report_plots/png/salmon_plot.png").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-cnt.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-pct.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Counts.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc-status-check-heatmap.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_per_base_n_content_plot.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_sequence_counts_plot-cnt.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_sequence_counts_plot-pct.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_sequence_length_distribution_plot.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/general_stats_table.svg").name, + file("${params.outdir}/multiqc/multiqc_report_plots/svg/salmon_plot.svg").name + ).match("multiqc_plots") }, + { assert snapshot( + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP2/lib_format_counts.json"), + // These files are not stable + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP2/quant.sf").name + ).match("salmon_quant") }, + { assert snapshot( + path("${params.outdir}/salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_tpm.tsv").name + ).match("salmon") }, + { assert snapshot( + // These reports are not stable + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match("trimgalore") }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml") + ).match("versions") } + ) + } + } + + test("Params: --pseudo_aligner salmon --skip_qc --skip_alignment - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + pseudo_aligner = 'salmon' + skip_qc = true + skip_alignment = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml"), + file("${params.outdir}/custom/out/genome_transcriptome.fasta").name, + file("${params.outdir}/custom/out/genome_transcriptome.gtf").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.zip").name, + file("${params.outdir}/multiqc/multiqc_report.html").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match() } + ) + } + } +} diff --git a/tests/salmon.nf.test.snap b/tests/salmon.nf.test.snap new file mode 100644 index 000000000..93f7cc786 --- /dev/null +++ b/tests/salmon.nf.test.snap @@ -0,0 +1,297 @@ +{ + "multiqc_data": { + "content": [ + "cutadapt_filtered_reads_plot.txt:md5,bf033e64e9d23bee85b6277f11c663f1", + "cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,13dfa866fd91dbb072689efe9aa83b1f", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,07145dd8dd3db654859b18eb0389046c", + "fastqc-status-check-heatmap.txt:md5,22a03548736b88b23be6bc0c9ef1b4a6", + "fastqc_overrepresented_sequences_plot.txt:md5,4adfeacd3a3a6c7c808f121b24e6b247", + "fastqc_per_base_n_content_plot.txt:md5,418610c1ce119cb786ad434db75d366e", + "fastqc_per_base_sequence_quality_plot.txt:md5,bd22e06e41c096ad4f745d40fe96a1e5", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,004c60768ceb6197765154e3eaa37b7a", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,95d29060b687f745288ad1ec47750037", + "fastqc_per_sequence_quality_scores_plot.txt:md5,0f9834cc19f76dd5c87cf8cba7435a7c", + "fastqc_sequence_counts_plot.txt:md5,3861354bbedfbde7ca36a72994f9425c", + "fastqc_sequence_duplication_levels_plot.txt:md5,c73407d55fc532e864fa1dc8dbc12874", + "fastqc_sequence_length_distribution_plot.txt:md5,6fe2c985606abad947bcca99b015ae33", + "multiqc_citations.txt:md5,f789abe663d4b4214f0ddeb413a7f150", + "multiqc_cutadapt.txt:md5,aac9581a5670cb55edf564f3d6c1f9a7", + "multiqc_fastqc_fastqc_trimmed.txt:md5,a3238f515e01d158d875d69968753804", + "fastqc_top_overrepresented_sequences_table.txt", + "multiqc_data.json", + "multiqc_general_stats.txt", + "multiqc_salmon.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt", + "salmon_plot.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T10:25:09.703525" + }, + "trimgalore": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T10:25:09.861436" + }, + "references": { + "content": [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055", + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T10:25:09.678308" + }, + "versions": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=3.9.5}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, CUSTOM_TX2GENE={python=3.9.5}, FQ_SUBSAMPLE={fq=0.9.1 (2022-02-22)}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, SALMON_QUANT={salmon=1.10.1}, SE_GENE={bioconductor-summarizedexperiment=1.32.0}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, TXIMETA_TXIMPORT={bioconductor-tximeta=1.20.1}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T10:25:10.110511" + }, + "fastqc/trim": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip", + "WT_REP1_trimmed_1_val_1_fastqc.html", + "WT_REP1_trimmed_1_val_1_fastqc.zip", + "WT_REP1_trimmed_2_val_2_fastqc.html", + "WT_REP1_trimmed_2_val_2_fastqc.zip", + "WT_REP2_trimmed_1_val_1_fastqc.html", + "WT_REP2_trimmed_1_val_1_fastqc.zip", + "WT_REP2_trimmed_2_val_2_fastqc.html", + "WT_REP2_trimmed_2_val_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T10:25:09.69038" + }, + "salmon": { + "content": [ + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T10:25:09.804203" + }, + "multiqc_plots": { + "content": [ + "cutadapt_filtered_reads_plot-cnt.png:md5,704cf0d91bfa3dd658dd8c9590f669a2", + "cutadapt_filtered_reads_plot-pct.png:md5,2684d8b2afca3300e5786486b80237f0", + "cutadapt_trimmed_sequences_plot_3_Counts.png:md5,bef41d894629b0c4dab4478bbf197f50", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.png:md5,1e0d01537d3797623d0b3fd8fbe42787", + "fastqc-status-check-heatmap.png:md5,2402522f8c02e12aea9af088c6595890", + "fastqc_overrepresented_sequences_plot.png:md5,40e450251b80ec0efc9364434234ec7f", + "fastqc_per_sequence_gc_content_plot_Counts.png:md5,8a806cec2142f9911502e0a253d83d13", + "fastqc_per_sequence_gc_content_plot_Percentages.png:md5,953929d50c8490029880e205e4db7959", + "fastqc_per_sequence_quality_scores_plot.png:md5,d2c29cae169f35744500c751b4a7366e", + "fastqc_sequence_counts_plot-cnt.png:md5,2874fea747c7ff46828bf4f17668caf8", + "fastqc_sequence_counts_plot-pct.png:md5,0022d7f5ac78b6eff157de24e37c5ab0", + "fastqc_sequence_duplication_levels_plot.png:md5,fcd3b1ec2b95fe4bcd607dc28179a754", + "multiqc_report.html", + "cutadapt_filtered_reads_plot-cnt.pdf", + "cutadapt_filtered_reads_plot-pct.pdf", + "cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf", + "general_stats_table.pdf", + "salmon_plot.pdf", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png", + "general_stats_table.png", + "salmon_plot.png", + "cutadapt_filtered_reads_plot-cnt.svg", + "cutadapt_filtered_reads_plot-pct.svg", + "cutadapt_trimmed_sequences_plot_3_Counts.svg", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg", + "general_stats_table.svg", + "salmon_plot.svg" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T10:25:09.724424" + }, + "bbsplit": { + "content": [ + "RAP1_IAA_30M_REP1.stats.txt", + "RAP1_UNINDUCED_REP1.stats.txt", + "RAP1_UNINDUCED_REP2.stats.txt", + "WT_REP1.stats.txt", + "WT_REP2.stats.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T10:25:09.665867" + }, + "salmon_quant": { + "content": [ + "ambig_info.tsv:md5,de973a4b22a4457217ae3dc04caf9401", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,1215f0c20f87d3aef8553ef119e1e74c", + "lib_format_counts.json:md5,c24ffe28d70476b5ccdd8bc2d22c0ac1", + "ambig_info.tsv:md5,45f252b4f0e11e6730cf0c29f800fdbb", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,621c6601aade5b1f2e3d6ca2fc71f636", + "lib_format_counts.json:md5,f6d44c0221f7fd559f11a9afe04c9935", + "ambig_info.tsv:md5,6dcc2891ea572e9b8d1ba52cd434ab84", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,9bed6e4dc5428d6f6297adcea29a6326", + "lib_format_counts.json:md5,7c562bf2f70e42f3a7292687dfd328c3", + "ambig_info.tsv:md5,194f574e0586416155e3f33d42e2b167", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,c7ed0aaa5d6c7934ddbebfd29e4eb86d", + "lib_format_counts.json:md5,d46250bb3677d72feeefc435fe6395a6", + "ambig_info.tsv:md5,a26e3f936e65d7da66392603c2f91f6f", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,69ebfc2c7ca6b221a0a22fa1dc8c20ac", + "lib_format_counts.json:md5,088fd51db07022ffde47033bbd029400", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T10:25:09.758031" + }, + "Params: --pseudo_aligner salmon --skip_qc --skip_alignment - stub": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=null}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}", + "genome_transcriptome.fasta", + "genome_transcriptome.gtf", + "RAP1_IAA_30M_REP1_raw.html", + "RAP1_IAA_30M_REP1_raw.zip", + "RAP1_UNINDUCED_REP1_raw.html", + "RAP1_UNINDUCED_REP1_raw.zip", + "RAP1_UNINDUCED_REP2_raw.html", + "RAP1_UNINDUCED_REP2_raw.zip", + "WT_REP1_raw.html", + "WT_REP1_raw.zip", + "WT_REP2_raw.html", + "WT_REP2_raw.zip", + "multiqc_report.html", + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T10:25:58.654392" + } +} \ No newline at end of file diff --git a/tests/skip_qc.nf.test b/tests/skip_qc.nf.test new file mode 100644 index 000000000..8fd703462 --- /dev/null +++ b/tests/skip_qc.nf.test @@ -0,0 +1,527 @@ +nextflow_pipeline { + + name "Test pipeline by skipping QC options" + script "../main.nf" + + test("Params: --skip_qc") { + + when { + params { + outdir = "$outputDir" + skip_qc = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/bbsplit/RAP1_IAA_30M_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP2.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP2.stats.txt").name + ).match("bbsplit") }, + { assert snapshot( + path("${params.outdir}/custom/out/genome_gfp.fasta"), + path("${params.outdir}/custom/out/genome_gfp.gtf") + ).match("references") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.zip").name + ).match("fastqc/trim") }, + { assert snapshot( + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_filtered_reads_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc-status-check-heatmap.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_overrepresented_sequences_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_n_content_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_sequence_quality_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Percentages.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_quality_scores_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_counts_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_duplication_levels_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_length_distribution_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_citations.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_cutadapt.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fastqc_fastqc_trimmed.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_idxstats.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram_1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram_2.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt"), + // These files are not stable + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_top_overrepresented_sequences_table.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/junction_saturation_known.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/junction_saturation_novel.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_data.json").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_general_stats.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_picard_dups.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_flagstat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_stats.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_software_versions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_sources.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_deduplication.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/salmon_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-flagstat-dp_Percentage_of_total.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-flagstat-dp_Read_counts.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-stats-dp.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/star_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/star_summary_table.txt").name + ).match("multiqc_data") }, + { assert snapshot( + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_filtered_reads_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_filtered_reads_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Obs_Exp.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc-status-check-heatmap.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png"), + // PDFs, SVGs, some PNGs and HTML reports are not stable + file("${params.outdir}/multiqc/star_salmon/multiqc_report.html").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc-status-check-heatmap.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_length_distribution_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/general_stats_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/picard_deduplication-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/picard_deduplication-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-flagstat-dp_Percentage_of_total.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-flagstat-dp_Read_counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-stats-dp.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_summary_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_n_content_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_length_distribution_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/general_stats_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/picard_deduplication-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/picard_deduplication-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-flagstat-dp_Percentage_of_total.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-flagstat-dp_Read_counts.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-stats-dp.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_summary_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc-status-check-heatmap.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_n_content_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_length_distribution_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/general_stats_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/picard_deduplication-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/picard_deduplication-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-flagstat-dp_Percentage_of_total.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-flagstat-dp_Read_counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-stats-dp.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_summary_table.svg").name + ).match("multiqc_plots") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.stats").name + ).match("star_salmon/samtools_stats") }, + { assert snapshot( + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/i_data.ctab"), + // These files are not stable + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.transcripts.gtf").name + ).match("star_salmon/stringtie") }, + { assert snapshot( + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/WT_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/WT_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/WT_REP2.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/WT_REP2.markdup.sorted.bam.bai").name + ).match("star_salmon/markdup") }, + { assert snapshot( + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP2/lib_format_counts.json"), + // These files are not stable + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP2/quant.sf").name + ).match("salmon_quant") }, + { assert snapshot( + path("${params.outdir}/salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_tpm.tsv").name + ).match("salmon") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/bigwig/RAP1_IAA_30M_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_IAA_30M_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP2.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP2.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP2.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP2.reverse.bigWig").name + ).match("star_salmon/bigwig") }, + { assert snapshot( + path("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/WT_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/WT_REP2.SJ.out.tab"), + // Logs are not stable + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.final.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.progress.out").name + ).match("star_salmon/log") }, + { assert snapshot( + // Metrics are not stable + file("${params.outdir}/star_salmon/picard_metrics/RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name + ).match("star_salmon/picard_metrics") }, + { assert snapshot( + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/star_salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/star_salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/star_salmon/WT_REP2/quant.sf").name + ).match("star_salmon/salmon_quant") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_tpm.tsv").name + ).match("star_salmon/salmon") }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml") + ).match("versions") } + ) + } + } + + test("Params: --skip_qc - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + skip_qc = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml"), + file("${params.outdir}/custom/out/genome_transcriptome.fasta").name, + file("${params.outdir}/custom/out/genome_transcriptome.gtf").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.zip").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report.html").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match() } + ) + } + } +} diff --git a/tests/skip_qc.nf.test.snap b/tests/skip_qc.nf.test.snap new file mode 100644 index 000000000..563f4913e --- /dev/null +++ b/tests/skip_qc.nf.test.snap @@ -0,0 +1,596 @@ +{ + "star_salmon/log": { + "content": [ + "RAP1_IAA_30M_REP1.SJ.out.tab:md5,ea95e243278af55534f2c52eb5fff7ee", + "RAP1_UNINDUCED_REP1.SJ.out.tab:md5,e548d13942535dc0821f3ec6d9743ec8", + "RAP1_UNINDUCED_REP2.SJ.out.tab:md5,1f294365343a1a5e95682792fdb77033", + "WT_REP1.SJ.out.tab:md5,1350c2fa6a675bf107386c6cd3fc5204", + "WT_REP2.SJ.out.tab:md5,f6cc03643a5e3c1025a5b4754eb1be23", + "RAP1_IAA_30M_REP1.Log.final.out", + "RAP1_IAA_30M_REP1.Log.out", + "RAP1_IAA_30M_REP1.Log.progress.out", + "RAP1_UNINDUCED_REP1.Log.final.out", + "RAP1_UNINDUCED_REP1.Log.out", + "RAP1_UNINDUCED_REP1.Log.progress.out", + "RAP1_UNINDUCED_REP2.Log.final.out", + "RAP1_UNINDUCED_REP2.Log.out", + "RAP1_UNINDUCED_REP2.Log.progress.out", + "WT_REP1.Log.final.out", + "WT_REP1.Log.out", + "WT_REP1.Log.progress.out", + "WT_REP2.Log.final.out", + "WT_REP2.Log.out", + "WT_REP2.Log.progress.out" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:11:58.323422" + }, + "star_salmon/salmon_quant": { + "content": [ + "ambig_info.tsv:md5,f9a605d54a0a103566f7a9b8e0867a73", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,4cc2492f557e5e0a2911a0bd83a51020", + "ambig_info.tsv:md5,8f97be8af4e47cc48650c62227a40203", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,dc750c3564c63da54979c852794d58a5", + "ambig_info.tsv:md5,a044fe7a3ad445c9a91a0d54ab5015d1", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,db43ed650e6e7b42cd2c5b8101bb6748", + "ambig_info.tsv:md5,7a8ea02d74058efb801e8c62bca96fd4", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,e418b4e899623449c6babdf53e5aabde", + "ambig_info.tsv:md5,543a047a549437026a1363ea8ddf5b03", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,f234c8d322df3b59d990594c63b24eae", + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:11:58.511869" + }, + "multiqc_data": { + "content": [ + "cutadapt_filtered_reads_plot.txt:md5,bf033e64e9d23bee85b6277f11c663f1", + "cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,13dfa866fd91dbb072689efe9aa83b1f", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,07145dd8dd3db654859b18eb0389046c", + "fastqc-status-check-heatmap.txt:md5,22a03548736b88b23be6bc0c9ef1b4a6", + "fastqc_overrepresented_sequences_plot.txt:md5,4adfeacd3a3a6c7c808f121b24e6b247", + "fastqc_per_base_n_content_plot.txt:md5,418610c1ce119cb786ad434db75d366e", + "fastqc_per_base_sequence_quality_plot.txt:md5,bd22e06e41c096ad4f745d40fe96a1e5", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,004c60768ceb6197765154e3eaa37b7a", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,95d29060b687f745288ad1ec47750037", + "fastqc_per_sequence_quality_scores_plot.txt:md5,0f9834cc19f76dd5c87cf8cba7435a7c", + "fastqc_sequence_counts_plot.txt:md5,3861354bbedfbde7ca36a72994f9425c", + "fastqc_sequence_duplication_levels_plot.txt:md5,c73407d55fc532e864fa1dc8dbc12874", + "fastqc_sequence_length_distribution_plot.txt:md5,6fe2c985606abad947bcca99b015ae33", + "multiqc_citations.txt:md5,ef51c78faebdd32bad296ba14406b41e", + "multiqc_cutadapt.txt:md5,aac9581a5670cb55edf564f3d6c1f9a7", + "multiqc_fastqc_fastqc_trimmed.txt:md5,a3238f515e01d158d875d69968753804", + "multiqc_samtools_idxstats.txt:md5,fd7d03a91f0b9e01a6939941f7f2243f", + "picard_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_2.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,75acd04232d1804b5f960ee4c5db4722", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,ae45731d8d4595f77e6b271004f3a070", + "fastqc_top_overrepresented_sequences_table.txt", + "junction_saturation_known.txt", + "junction_saturation_novel.txt", + "multiqc_data.json", + "multiqc_general_stats.txt", + "multiqc_picard_dups.txt", + "multiqc_salmon.txt", + "multiqc_samtools_flagstat.txt", + "multiqc_samtools_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt", + "multiqc_star.txt", + "picard_deduplication.txt", + "salmon_plot.txt", + "samtools-flagstat-dp_Percentage_of_total.txt", + "samtools-flagstat-dp_Read_counts.txt", + "samtools-stats-dp.txt", + "samtools_alignment_plot.txt", + "star_alignment_plot.txt", + "star_summary_table.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:28:48.798947" + }, + "references": { + "content": [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055", + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T11:24:48.102924" + }, + "Params: --skip_qc - stub": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=null}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, STAR_GENOMEGENERATE={star=2.7.10a, samtools=1.18, gawk=5.1.0}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}", + "genome_transcriptome.fasta", + "genome_transcriptome.gtf", + "RAP1_IAA_30M_REP1_raw.html", + "RAP1_IAA_30M_REP1_raw.zip", + "RAP1_UNINDUCED_REP1_raw.html", + "RAP1_UNINDUCED_REP1_raw.zip", + "RAP1_UNINDUCED_REP2_raw.html", + "RAP1_UNINDUCED_REP2_raw.zip", + "WT_REP1_raw.html", + "WT_REP1_raw.zip", + "WT_REP2_raw.html", + "WT_REP2_raw.zip", + "multiqc_report.html", + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:12:49.33444" + }, + "star_salmon/markdup": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai", + "WT_REP1.markdup.sorted.bam", + "WT_REP1.markdup.sorted.bam.bai", + "WT_REP2.markdup.sorted.bam", + "WT_REP2.markdup.sorted.bam.bai" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:11:58.003184" + }, + "star_salmon/samtools_stats": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.stats", + "RAP1_IAA_30M_REP1.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.sorted.bam.stats", + "WT_REP1.markdup.sorted.bam.flagstat", + "WT_REP1.markdup.sorted.bam.idxstats", + "WT_REP1.markdup.sorted.bam.stats", + "WT_REP1.sorted.bam.flagstat", + "WT_REP1.sorted.bam.idxstats", + "WT_REP1.sorted.bam.stats", + "WT_REP2.markdup.sorted.bam.flagstat", + "WT_REP2.markdup.sorted.bam.idxstats", + "WT_REP2.markdup.sorted.bam.stats", + "WT_REP2.sorted.bam.flagstat", + "WT_REP2.sorted.bam.idxstats", + "WT_REP2.sorted.bam.stats" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:28:48.898246" + }, + "salmon": { + "content": [ + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:11:58.152801" + }, + "multiqc_plots": { + "content": [ + "cutadapt_filtered_reads_plot-cnt.png:md5,704cf0d91bfa3dd658dd8c9590f669a2", + "cutadapt_filtered_reads_plot-pct.png:md5,2684d8b2afca3300e5786486b80237f0", + "cutadapt_trimmed_sequences_plot_3_Counts.png:md5,bef41d894629b0c4dab4478bbf197f50", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.png:md5,1e0d01537d3797623d0b3fd8fbe42787", + "fastqc-status-check-heatmap.png:md5,2402522f8c02e12aea9af088c6595890", + "fastqc_overrepresented_sequences_plot.png:md5,40e450251b80ec0efc9364434234ec7f", + "fastqc_per_sequence_gc_content_plot_Counts.png:md5,8a806cec2142f9911502e0a253d83d13", + "fastqc_per_sequence_gc_content_plot_Percentages.png:md5,953929d50c8490029880e205e4db7959", + "fastqc_per_sequence_quality_scores_plot.png:md5,d2c29cae169f35744500c751b4a7366e", + "fastqc_sequence_counts_plot-cnt.png:md5,2874fea747c7ff46828bf4f17668caf8", + "fastqc_sequence_counts_plot-pct.png:md5,0022d7f5ac78b6eff157de24e37c5ab0", + "fastqc_sequence_duplication_levels_plot.png:md5,fcd3b1ec2b95fe4bcd607dc28179a754", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png:md5,ce6abb232fd5b5f2e66c0fe9a571d75f", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png:md5,6b44818f886ef020fb3646f152ad4af6", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png:md5,d5d8a85b7ad72a0cb93d9283ea12b23f", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png:md5,19317ad8f1448cd7eb1d319f85cc5c4d", + "multiqc_report.html", + "cutadapt_filtered_reads_plot-cnt.pdf", + "cutadapt_filtered_reads_plot-pct.pdf", + "cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf", + "general_stats_table.pdf", + "picard_deduplication-cnt.pdf", + "picard_deduplication-pct.pdf", + "salmon_plot.pdf", + "samtools-flagstat-dp_Percentage_of_total.pdf", + "samtools-flagstat-dp_Read_counts.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "samtools-stats-dp.pdf", + "samtools_alignment_plot-cnt.pdf", + "samtools_alignment_plot-pct.pdf", + "star_alignment_plot-cnt.pdf", + "star_alignment_plot-pct.pdf", + "star_summary_table.pdf", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png", + "general_stats_table.png", + "picard_deduplication-cnt.png", + "picard_deduplication-pct.png", + "salmon_plot.png", + "samtools-flagstat-dp_Percentage_of_total.png", + "samtools-flagstat-dp_Read_counts.png", + "samtools-stats-dp.png", + "samtools_alignment_plot-cnt.png", + "samtools_alignment_plot-pct.png", + "star_alignment_plot-cnt.png", + "star_alignment_plot-pct.png", + "star_summary_table.png", + "cutadapt_filtered_reads_plot-cnt.svg", + "cutadapt_filtered_reads_plot-pct.svg", + "cutadapt_trimmed_sequences_plot_3_Counts.svg", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg", + "general_stats_table.svg", + "picard_deduplication-cnt.svg", + "picard_deduplication-pct.svg", + "salmon_plot.svg", + "samtools-flagstat-dp_Percentage_of_total.svg", + "samtools-flagstat-dp_Read_counts.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "samtools-stats-dp.svg", + "samtools_alignment_plot-cnt.svg", + "samtools_alignment_plot-pct.svg", + "star_alignment_plot-cnt.svg", + "star_alignment_plot-pct.svg", + "star_summary_table.svg" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:28:48.850602" + }, + "star_salmon/picard_metrics": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:11:58.412083" + }, + "star_salmon/salmon": { + "content": [ + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:11:58.679186" + }, + "star_salmon/bigwig": { + "content": [ + "RAP1_IAA_30M_REP1.forward.bigWig", + "RAP1_IAA_30M_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP1.forward.bigWig", + "RAP1_UNINDUCED_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP2.forward.bigWig", + "RAP1_UNINDUCED_REP2.reverse.bigWig", + "WT_REP1.forward.bigWig", + "WT_REP1.reverse.bigWig", + "WT_REP2.forward.bigWig", + "WT_REP2.reverse.bigWig" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:11:58.232941" + }, + "star_salmon/stringtie": { + "content": [ + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,3f149502efe2a9d4bac98b1dd18c15e7", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,a052ab04070e72cc318fb7680b0764e3", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,e82329a443b9ff50a86e42aff91bd704", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,d279003d92f7feef9adb31203f84474a", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,10e2d00f93f9e74f224bd3c1bfbeb29b", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,525413b70bcf62c24c8f96182e09883e", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,9aa371befc36478d7720d3ea275e6f4d", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,907ab2e06346df131cbdb929afc005a8", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,b03f3118d1aa58fceadcb3311028e856", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,041edee3193df311f621c09f4991892b", + "t_data.ctab", + "RAP1_IAA_30M_REP1.coverage.gtf", + "RAP1_IAA_30M_REP1.gene.abundance.txt", + "RAP1_IAA_30M_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP1.coverage.gtf", + "RAP1_UNINDUCED_REP1.gene.abundance.txt", + "RAP1_UNINDUCED_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP2.coverage.gtf", + "RAP1_UNINDUCED_REP2.gene.abundance.txt", + "RAP1_UNINDUCED_REP2.transcripts.gtf", + "t_data.ctab", + "WT_REP1.coverage.gtf", + "WT_REP1.gene.abundance.txt", + "WT_REP1.transcripts.gtf", + "t_data.ctab", + "WT_REP2.coverage.gtf", + "WT_REP2.gene.abundance.txt", + "WT_REP2.transcripts.gtf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:11:57.943545" + }, + "versions": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, BEDTOOLS_GENOMECOV_FW={bedtools=2.31.1}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=3.9.5}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, CUSTOM_TX2GENE={python=3.9.5}, FQ_SUBSAMPLE={fq=0.9.1 (2022-02-22)}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, PICARD_MARKDUPLICATES={picard=3.1.1}, SALMON_QUANT={salmon=1.10.1}, SAMTOOLS_FLAGSTAT={samtools=1.2}, SAMTOOLS_IDXSTATS={samtools=1.2}, SAMTOOLS_INDEX={samtools=1.2}, SAMTOOLS_SORT={samtools=1.2}, SAMTOOLS_STATS={samtools=1.2}, SE_GENE={bioconductor-summarizedexperiment=1.32.0}, STAR_ALIGN={star=2.7.10a, samtools=1.18, gawk=5.1.0}, STAR_GENOMEGENERATE={star=2.7.10a, samtools=1.18, gawk=5.1.0}, STRINGTIE_STRINGTIE={stringtie=2.2.1}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, TXIMETA_TXIMPORT={bioconductor-tximeta=1.20.1}, UCSC_BEDCLIP={ucsc=377}, UCSC_BEDGRAPHTOBIGWIG={ucsc=445}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:11:59.164489" + }, + "fastqc/trim": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip", + "WT_REP1_trimmed_1_val_1_fastqc.html", + "WT_REP1_trimmed_1_val_1_fastqc.zip", + "WT_REP1_trimmed_2_val_2_fastqc.html", + "WT_REP1_trimmed_2_val_2_fastqc.zip", + "WT_REP2_trimmed_1_val_1_fastqc.html", + "WT_REP2_trimmed_1_val_1_fastqc.zip", + "WT_REP2_trimmed_2_val_2_fastqc.html", + "WT_REP2_trimmed_2_val_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T11:24:48.114664" + }, + "bbsplit": { + "content": [ + "RAP1_IAA_30M_REP1.stats.txt", + "RAP1_UNINDUCED_REP1.stats.txt", + "RAP1_UNINDUCED_REP2.stats.txt", + "WT_REP1.stats.txt", + "WT_REP2.stats.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T11:24:48.0918" + }, + "salmon_quant": { + "content": [ + "ambig_info.tsv:md5,de973a4b22a4457217ae3dc04caf9401", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,1215f0c20f87d3aef8553ef119e1e74c", + "lib_format_counts.json:md5,c24ffe28d70476b5ccdd8bc2d22c0ac1", + "ambig_info.tsv:md5,45f252b4f0e11e6730cf0c29f800fdbb", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,621c6601aade5b1f2e3d6ca2fc71f636", + "lib_format_counts.json:md5,f6d44c0221f7fd559f11a9afe04c9935", + "ambig_info.tsv:md5,6dcc2891ea572e9b8d1ba52cd434ab84", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,9bed6e4dc5428d6f6297adcea29a6326", + "lib_format_counts.json:md5,7c562bf2f70e42f3a7292687dfd328c3", + "ambig_info.tsv:md5,194f574e0586416155e3f33d42e2b167", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,c7ed0aaa5d6c7934ddbebfd29e4eb86d", + "lib_format_counts.json:md5,d46250bb3677d72feeefc435fe6395a6", + "ambig_info.tsv:md5,a26e3f936e65d7da66392603c2f91f6f", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,69ebfc2c7ca6b221a0a22fa1dc8c20ac", + "lib_format_counts.json:md5,088fd51db07022ffde47033bbd029400", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T12:11:58.071145" + } +} \ 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 000000000..e5b3aa080 --- /dev/null +++ b/tests/skip_trimming.nf.test @@ -0,0 +1,830 @@ +nextflow_pipeline { + + name "Test pipeline by skipping trimming options" + script "../main.nf" + + test("Params: --skip_trimming") { + + when { + params { + outdir = "$outputDir" + skip_trimming = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/bbsplit/RAP1_IAA_30M_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP2.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP2.stats.txt").name + ).match("bbsplit") }, + { assert snapshot( + path("${params.outdir}/custom/out/genome_gfp.fasta"), + path("${params.outdir}/custom/out/genome_gfp.gtf") + ).match("references") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.zip").name + ).match("fastqc/raw") }, + { assert snapshot( + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc-status-check-heatmap.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_adapter_content_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_overrepresented_sequences_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_n_content_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_base_sequence_quality_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Percentages.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_per_sequence_quality_scores_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_counts_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_sequence_duplication_levels_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_citations.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fastqc_fastqc_raw.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_featurecounts_biotype_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_idxstats.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram_1.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_histogram_2.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_gene_coverage_profile_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_gene_coverage_profile_Normalised.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_rnaseq_cov_hist.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_infer_experiment_plot.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt"), + // These files are not stable + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/fastqc_top_overrepresented_sequences_table.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/junction_saturation_known.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/junction_saturation_novel.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_data.json").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_dupradar-section-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_fail_strand_check_table.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_general_stats.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_picard_dups.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_infer_experiment.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_junction_annotation.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_rseqc_read_distribution.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_salmon_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_flagstat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_samtools_stats.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_software_versions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_sources.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/multiqc_star_salmon_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/picard_deduplication.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_genomic_origin.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/qualimap_rnaseq_genome_results.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance_plot_Counts.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_inner_distance_plot_Percentages.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Events.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_all.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_All_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_Known_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_junction_saturation_plot_Novel_Junctions.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_distribution_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_dups.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/rseqc_read_dups_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/salmon_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-flagstat-dp_Percentage_of_total.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-flagstat-dp_Read_counts.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools-stats-dp.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/samtools_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/star_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_data/star_summary_table.txt").name + ).match("multiqc_data") }, + { assert snapshot( + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/dupradar-section-plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc-status-check-heatmap.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_counts_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/featurecounts_biotype_plot-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/featurecounts_biotype_plot-pct.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_gene_coverage_profile_Counts.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_gene_coverage_profile_Normalised.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_infer_experiment_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_dups_plot.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png"), + // PDFs, SVGs, some PNGs and HTML reports are not stable + file("${params.outdir}/multiqc/star_salmon/multiqc_report.html").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/dupradar-section-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fail_strand_check_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc-status-check-heatmap.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_adapter_content_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/featurecounts_biotype_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/featurecounts_biotype_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/general_stats_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/picard_deduplication-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/picard_deduplication-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Normalised.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_genomic_origin-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/qualimap_genomic_origin-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_bam_stat.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_infer_experiment_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_All_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Known_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Novel_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_distribution_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_distribution_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/rseqc_read_dups_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/salmon_plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-flagstat-dp_Percentage_of_total.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-flagstat-dp_Read_counts.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools-stats-dp.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/samtools_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_salmon_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_salmon_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/pdf/star_summary_table.pdf").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fail_strand_check_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_adapter_content_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_n_content_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/general_stats_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/picard_deduplication-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/picard_deduplication-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_genomic_origin-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/qualimap_genomic_origin-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_bam_stat.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_inner_distance_plot_Counts.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_inner_distance_plot_Percentages.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_All_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_Known_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_junction_saturation_plot_Novel_Junctions.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_distribution_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/rseqc_read_distribution_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/salmon_plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-flagstat-dp_Percentage_of_total.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-flagstat-dp_Read_counts.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools-stats-dp.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/samtools_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_salmon_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_salmon_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/png/star_summary_table.png").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/dupradar-section-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fail_strand_check_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc-status-check-heatmap.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_adapter_content_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_n_content_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_counts_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/featurecounts_biotype_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/featurecounts_biotype_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/general_stats_table.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/picard_deduplication-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/picard_deduplication-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Normalised.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_genomic_origin-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/qualimap_genomic_origin-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_bam_stat.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_infer_experiment_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_inner_distance_plot_Counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_inner_distance_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_All_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Known_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Novel_Junctions.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_distribution_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_distribution_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/rseqc_read_dups_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/salmon_plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-flagstat-dp_Percentage_of_total.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-flagstat-dp_Read_counts.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools-stats-dp.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/samtools_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_salmon_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_salmon_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/star_salmon/multiqc_report_plots/svg/star_summary_table.svg").name + ).match("multiqc_plots") }, + { assert snapshot( + path("${params.outdir}/salmon/deseq2_qc/R_sessionInfo.log"), + // These files are not stable + file("${params.outdir}/salmon/deseq2_qc/deseq2.dds.RData").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.pca.vals.txt").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.plots.pdf").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.sample.dists.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_IAA_30M_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/deseq2.size_factors.RData").name + ).match("salmon/deseq2_qc") }, + { assert snapshot( + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP2/lib_format_counts.json"), + // These files are not stable + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP2/quant.sf").name + ).match("salmon_quant") }, + { assert snapshot( + path("${params.outdir}/salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_tpm.tsv").name + ).match("salmon") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/bigwig/RAP1_IAA_30M_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_IAA_30M_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP2.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/RAP1_UNINDUCED_REP2.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP1.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP1.reverse.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP2.forward.bigWig").name, + file("${params.outdir}/star_salmon/bigwig/WT_REP2.reverse.bigWig").name + ).match("star_salmon/bigwig") }, + { assert snapshot( + path("${params.outdir}/star_salmon/deseq2_qc/R_sessionInfo.log"), + // These files are not stable + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_IAA_30M_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP2.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/WT_REP1.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/WT_REP2.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/size_factors/deseq2.size_factors.RData").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.dds.RData").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.pca.vals.txt").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.plots.pdf").name, + file("${params.outdir}/star_salmon/deseq2_qc/deseq2.sample.dists.txt").name + ).match("star_salmon/deseq2_qc") }, + { assert snapshot( + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_IAA_30M_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_UNINDUCED_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/RAP1_UNINDUCED_REP2_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/WT_REP1_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/gene_data/WT_REP2_dupMatrix.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_IAA_30M_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_UNINDUCED_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/RAP1_UNINDUCED_REP2_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/WT_REP1_intercept_slope.txt"), + path("${params.outdir}/star_salmon/dupradar/intercepts_slope/WT_REP2_intercept_slope.txt"), + // PDFs are not stable + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/WT_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/box_plot/WT_REP2_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_IAA_30M_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_UNINDUCED_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/RAP1_UNINDUCED_REP2_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/WT_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/histogram/WT_REP2_expressionHist.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_IAA_30M_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_UNINDUCED_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/RAP1_UNINDUCED_REP2_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/WT_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_salmon/dupradar/scatter_plot/WT_REP2_duprateExpDens.pdf").name + ).match("star_salmon/dupradar") }, + { assert snapshot( + path("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP1.featureCounts.txt"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP2.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP2.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_salmon/featurecounts/WT_REP2.featureCounts.txt"), + // These files are unstable + file("${params.outdir}/star_salmon/featurecounts/RAP1_IAA_30M_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/RAP1_UNINDUCED_REP2.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/WT_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_salmon/featurecounts/WT_REP2.featureCounts.txt.summary").name + ).match("star_salmon/featurecounts") }, + { assert snapshot( + path("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/WT_REP1.SJ.out.tab"), + path("${params.outdir}/star_salmon/log/WT_REP2.SJ.out.tab"), + // Logs are not stable + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_IAA_30M_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.final.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.out").name, + file("${params.outdir}/star_salmon/log/RAP1_UNINDUCED_REP2.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.final.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.out").name, + file("${params.outdir}/star_salmon/log/WT_REP1.Log.progress.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.final.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.out").name, + file("${params.outdir}/star_salmon/log/WT_REP2.Log.progress.out").name + ).match("star_salmon/log") }, + { assert snapshot( + // Metrics are not stable + file("${params.outdir}/star_salmon/picard_metrics/RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_salmon/picard_metrics/WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name + ).match("star_salmon/picard_metrics") }, + { assert snapshot( + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_salmon/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + // HTML reports and these files are not stable + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_IAA_30M_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/RAP1_UNINDUCED_REP2/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/qualimapReport.html").name, + file("${params.outdir}/star_salmon/qualimap/WT_REP2/rnaseq_qc_results.txt").name + ).match("star_salmon/qualimap") }, + { assert snapshot( + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_IAA_30M_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_UNINDUCED_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/RAP1_UNINDUCED_REP2.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/WT_REP1.infer_experiment.txt"), + path("${params.outdir}/star_salmon/rseqc/infer_experiment/WT_REP2.infer_experiment.txt"), + // PDFs, R scripts and all these files are not stable + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_IAA_30M_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_UNINDUCED_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/RAP1_UNINDUCED_REP2.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/WT_REP1.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/bam_stat/WT_REP2.bam_stat.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/pdf/RAP1_IAA_30M_REP1.inner_distance_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/pdf/WT_REP1.inner_distance_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/pdf/WT_REP2.inner_distance_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/rscript/RAP1_IAA_30M_REP1.inner_distance_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/rscript/WT_REP1.inner_distance_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/rscript/WT_REP2.inner_distance_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_freq.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_mean.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP1.inner_distance.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP1.inner_distance_freq.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP1.inner_distance_mean.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP2.inner_distance.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP2.inner_distance_freq.txt").name, + file("${params.outdir}/star_salmon/rseqc/inner_distance/txt/WT_REP2.inner_distance_mean.txt").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP1.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP2.junction.Interact.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/bed/WT_REP2.junction.bed").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_IAA_30M_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP2.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/WT_REP1.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/log/WT_REP2.junction_annotation.log").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP1.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP2.splice_events.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/pdf/WT_REP2.splice_junction.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_IAA_30M_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP2.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/WT_REP1.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/rscript/WT_REP2.junction_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_IAA_30M_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP2.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/WT_REP1.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_annotation/xls/WT_REP2.junction.xls").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/WT_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/pdf/WT_REP2.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_IAA_30M_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP2.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/WT_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/junction_saturation/rscript/WT_REP2.junctionSaturation_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_IAA_30M_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_UNINDUCED_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/RAP1_UNINDUCED_REP2.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/WT_REP1.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_distribution/WT_REP2.read_distribution.txt").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_IAA_30M_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP2.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/WT_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/pdf/WT_REP2.DupRate_plot.pdf").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_IAA_30M_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP2.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/WT_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/rscript/WT_REP2.DupRate_plot.r").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP2.pos.DupRate.xls").name, + file("${params.outdir}/star_salmon/rseqc/read_duplication/xls/WT_REP2.seq.DupRate.xls").name + ).match("star_salmon/rseqc") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/star_salmon/salmon.merged.transcript_tpm.tsv").name + ).match("star_salmon/salmon") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_salmon/samtools_stats/WT_REP2.sorted.bam.stats").name + ).match("star_salmon/samtools_stats") }, + { assert snapshot( + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/i_data.ctab"), + // These files are not stable + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_IAA_30M_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/RAP1_UNINDUCED_REP2.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP1.transcripts.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.coverage.gtf").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.gene.abundance.txt").name, + file("${params.outdir}/star_salmon/stringtie/WT_REP2.transcripts.gtf").name + ).match("star_salmon/stringtie") }, + { assert snapshot( + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/WT_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/WT_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_salmon/WT_REP2.markdup.sorted.bam").name, + file("${params.outdir}/star_salmon/WT_REP2.markdup.sorted.bam.bai").name + ).match("star_salmon/markdup") }, + { assert snapshot( + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/star_salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/star_salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/star_salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/star_salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/star_salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/star_salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/star_salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/star_salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/star_salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/star_salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/star_salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/star_salmon/WT_REP2/quant.sf").name + ).match("star_salmon/salmon_quant") }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml") + ).match("versions") } + ) + } + } + + // STUB ARE CURRENTLY NOT POSSIBLE + +} diff --git a/tests/skip_trimming.nf.test.snap b/tests/skip_trimming.nf.test.snap new file mode 100644 index 000000000..da3e572cc --- /dev/null +++ b/tests/skip_trimming.nf.test.snap @@ -0,0 +1,943 @@ +{ + "star_salmon/log": { + "content": [ + "RAP1_IAA_30M_REP1.SJ.out.tab:md5,20c790387ef68e041bc4ffdcd032a22f", + "RAP1_UNINDUCED_REP1.SJ.out.tab:md5,ba2636236fa1d26aa72f7aff73bd41f8", + "RAP1_UNINDUCED_REP2.SJ.out.tab:md5,1c0458f66e4af56a56f4409c120434b3", + "WT_REP1.SJ.out.tab:md5,299a948b1aaf329152224ba573402a51", + "WT_REP2.SJ.out.tab:md5,073498a8fb5fb4da664c9129a6777c42", + "RAP1_IAA_30M_REP1.Log.final.out", + "RAP1_IAA_30M_REP1.Log.out", + "RAP1_IAA_30M_REP1.Log.progress.out", + "RAP1_UNINDUCED_REP1.Log.final.out", + "RAP1_UNINDUCED_REP1.Log.out", + "RAP1_UNINDUCED_REP1.Log.progress.out", + "RAP1_UNINDUCED_REP2.Log.final.out", + "RAP1_UNINDUCED_REP2.Log.out", + "RAP1_UNINDUCED_REP2.Log.progress.out", + "WT_REP1.Log.final.out", + "WT_REP1.Log.out", + "WT_REP1.Log.progress.out", + "WT_REP2.Log.final.out", + "WT_REP2.Log.out", + "WT_REP2.Log.progress.out" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:29.632524" + }, + "star_salmon/salmon_quant": { + "content": [ + "ambig_info.tsv:md5,d1d3bd2a5617220b29a9063cb29f0578", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,4cc2492f557e5e0a2911a0bd83a51020", + "ambig_info.tsv:md5,452bbc83465339d2467663b061400b95", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,dc750c3564c63da54979c852794d58a5", + "ambig_info.tsv:md5,f2aed38ba5251664024392bc89ae3f01", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,db43ed650e6e7b42cd2c5b8101bb6748", + "ambig_info.tsv:md5,8d2b5ec0c441d9e078610480d179d116", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,e418b4e899623449c6babdf53e5aabde", + "ambig_info.tsv:md5,44dad5d05b3c0c2ccb5a19a3a80333b3", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,f234c8d322df3b59d990594c63b24eae", + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:31.038414" + }, + "multiqc_data": { + "content": [ + "fastqc-status-check-heatmap.txt:md5,5a89b0d8d162f6b1dbdaf39457bbc03b", + "fastqc_adapter_content_plot.txt:md5,da0389be84cfdd189b1d045212eb2974", + "fastqc_overrepresented_sequences_plot.txt:md5,25d88ea8a72f55e8a374ae802bc7f0b1", + "fastqc_per_base_n_content_plot.txt:md5,d368d7e36ca2f73dcde61f2b486d8213", + "fastqc_per_base_sequence_quality_plot.txt:md5,5c3065b549129702b185ea1b817da420", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,9ddaa50167117d3c9188ccf015427704", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,f10ee2881b61308af35f304aa3d810a3", + "fastqc_per_sequence_quality_scores_plot.txt:md5,b5f9a02933e3065952237afd2ec9ce82", + "fastqc_sequence_counts_plot.txt:md5,d385a3e2c2573a0902c66e8c93876d3c", + "fastqc_sequence_duplication_levels_plot.txt:md5,8812cee16f6ca65e2c33635754de1772", + "multiqc_citations.txt:md5,1f80cefb6f0103d9a316c396a9441a90", + "multiqc_fastqc_fastqc_raw.txt:md5,81c3c1a2575a1891a7f2a9637a0f2cc0", + "multiqc_featurecounts_biotype_plot.txt:md5,567475905baa63091cfd0560fb297e10", + "multiqc_samtools_idxstats.txt:md5,adf5f32fa1485ad0f4dacdfedc7b4bbc", + "picard_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_2.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "qualimap_gene_coverage_profile_Counts.txt:md5,b16bc0437cb340aaf6fa1472888b6930", + "qualimap_gene_coverage_profile_Normalised.txt:md5,209b0020fcd4c3c497e3abbd1f8cd593", + "qualimap_rnaseq_cov_hist.txt:md5,3be7bc41531ce84b42092a742bfeb0ab", + "rseqc_infer_experiment_plot.txt:md5,382397ae264336395e2a3b03af8d7023", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,75acd04232d1804b5f960ee4c5db4722", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,ae45731d8d4595f77e6b271004f3a070", + "samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,a557130553131c893398532377d3b525", + "fastqc_top_overrepresented_sequences_table.txt", + "junction_saturation_known.txt", + "junction_saturation_novel.txt", + "multiqc_data.json", + "multiqc_dupradar-section-plot.txt", + "multiqc_fail_strand_check_table.txt", + "multiqc_general_stats.txt", + "multiqc_picard_dups.txt", + "multiqc_rseqc_bam_stat.txt", + "multiqc_rseqc_infer_experiment.txt", + "multiqc_rseqc_junction_annotation.txt", + "multiqc_rseqc_read_distribution.txt", + "multiqc_salmon.txt", + "multiqc_salmon_deseq2_clustering-plot.txt", + "multiqc_salmon_deseq2_clustering-plot_1.txt", + "multiqc_salmon_deseq2_clustering-plot_2.txt", + "multiqc_salmon_deseq2_clustering-plot_3.txt", + "multiqc_salmon_deseq2_clustering-plot_4.txt", + "multiqc_salmon_deseq2_pca-plot.txt", + "multiqc_samtools_flagstat.txt", + "multiqc_samtools_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt", + "multiqc_star.txt", + "multiqc_star_salmon_deseq2_clustering-plot.txt", + "multiqc_star_salmon_deseq2_clustering-plot_1.txt", + "multiqc_star_salmon_deseq2_clustering-plot_2.txt", + "multiqc_star_salmon_deseq2_clustering-plot_3.txt", + "multiqc_star_salmon_deseq2_clustering-plot_4.txt", + "multiqc_star_salmon_deseq2_pca-plot.txt", + "picard_deduplication.txt", + "qualimap_genomic_origin.txt", + "qualimap_rnaseq_genome_results.txt", + "rseqc_bam_stat.txt", + "rseqc_inner_distance.txt", + "rseqc_inner_distance_plot_Counts.txt", + "rseqc_inner_distance_plot_Percentages.txt", + "rseqc_junction_annotation_junctions_plot_Events.txt", + "rseqc_junction_annotation_junctions_plot_Junctions.txt", + "rseqc_junction_saturation_all.txt", + "rseqc_junction_saturation_plot_All_Junctions.txt", + "rseqc_junction_saturation_plot_Known_Junctions.txt", + "rseqc_junction_saturation_plot_Novel_Junctions.txt", + "rseqc_read_distribution_plot.txt", + "rseqc_read_dups.txt", + "rseqc_read_dups_plot.txt", + "salmon_plot.txt", + "samtools-flagstat-dp_Percentage_of_total.txt", + "samtools-flagstat-dp_Read_counts.txt", + "samtools-stats-dp.txt", + "samtools_alignment_plot.txt", + "star_alignment_plot.txt", + "star_summary_table.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:36:32.752543" + }, + "star_salmon/rseqc": { + "content": [ + "RAP1_IAA_30M_REP1.infer_experiment.txt:md5,e1de3aba230cf3d40f04d682dfe4e803", + "RAP1_UNINDUCED_REP1.infer_experiment.txt:md5,0bc268f09da1676522f8adda63509f14", + "RAP1_UNINDUCED_REP2.infer_experiment.txt:md5,be4b322faffa736ab6ac39ff39c7aa9d", + "WT_REP1.infer_experiment.txt:md5,7e8c79fa27780693523ad7acd8f109c4", + "WT_REP2.infer_experiment.txt:md5,c895dbd41b5a075ad4032e2732145b6a", + "RAP1_IAA_30M_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP2.bam_stat.txt", + "WT_REP1.bam_stat.txt", + "WT_REP2.bam_stat.txt", + "RAP1_IAA_30M_REP1.inner_distance_plot.pdf", + "WT_REP1.inner_distance_plot.pdf", + "WT_REP2.inner_distance_plot.pdf", + "RAP1_IAA_30M_REP1.inner_distance_plot.r", + "WT_REP1.inner_distance_plot.r", + "WT_REP2.inner_distance_plot.r", + "RAP1_IAA_30M_REP1.inner_distance.txt", + "RAP1_IAA_30M_REP1.inner_distance_freq.txt", + "RAP1_IAA_30M_REP1.inner_distance_mean.txt", + "WT_REP1.inner_distance.txt", + "WT_REP1.inner_distance_freq.txt", + "WT_REP1.inner_distance_mean.txt", + "WT_REP2.inner_distance.txt", + "WT_REP2.inner_distance_freq.txt", + "WT_REP2.inner_distance_mean.txt", + "RAP1_IAA_30M_REP1.junction.Interact.bed", + "RAP1_IAA_30M_REP1.junction.bed", + "RAP1_UNINDUCED_REP1.junction.Interact.bed", + "RAP1_UNINDUCED_REP1.junction.bed", + "RAP1_UNINDUCED_REP2.junction.Interact.bed", + "RAP1_UNINDUCED_REP2.junction.bed", + "WT_REP1.junction.Interact.bed", + "WT_REP1.junction.bed", + "WT_REP2.junction.Interact.bed", + "WT_REP2.junction.bed", + "RAP1_IAA_30M_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP2.junction_annotation.log", + "WT_REP1.junction_annotation.log", + "WT_REP2.junction_annotation.log", + "RAP1_IAA_30M_REP1.splice_events.pdf", + "RAP1_IAA_30M_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP1.splice_events.pdf", + "RAP1_UNINDUCED_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP2.splice_events.pdf", + "RAP1_UNINDUCED_REP2.splice_junction.pdf", + "WT_REP1.splice_events.pdf", + "WT_REP1.splice_junction.pdf", + "WT_REP2.splice_events.pdf", + "WT_REP2.splice_junction.pdf", + "RAP1_IAA_30M_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP2.junction_plot.r", + "WT_REP1.junction_plot.r", + "WT_REP2.junction_plot.r", + "RAP1_IAA_30M_REP1.junction.xls", + "RAP1_UNINDUCED_REP1.junction.xls", + "RAP1_UNINDUCED_REP2.junction.xls", + "WT_REP1.junction.xls", + "WT_REP2.junction.xls", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf", + "WT_REP1.junctionSaturation_plot.pdf", + "WT_REP2.junctionSaturation_plot.pdf", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.r", + "WT_REP1.junctionSaturation_plot.r", + "WT_REP2.junctionSaturation_plot.r", + "RAP1_IAA_30M_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP2.read_distribution.txt", + "WT_REP1.read_distribution.txt", + "WT_REP2.read_distribution.txt", + "RAP1_IAA_30M_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP2.DupRate_plot.pdf", + "WT_REP1.DupRate_plot.pdf", + "WT_REP2.DupRate_plot.pdf", + "RAP1_IAA_30M_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP2.DupRate_plot.r", + "WT_REP1.DupRate_plot.r", + "WT_REP2.DupRate_plot.r", + "RAP1_IAA_30M_REP1.pos.DupRate.xls", + "RAP1_IAA_30M_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP1.pos.DupRate.xls", + "RAP1_UNINDUCED_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP2.pos.DupRate.xls", + "RAP1_UNINDUCED_REP2.seq.DupRate.xls", + "WT_REP1.pos.DupRate.xls", + "WT_REP1.seq.DupRate.xls", + "WT_REP2.pos.DupRate.xls", + "WT_REP2.seq.DupRate.xls" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:30.206514" + }, + "references": { + "content": [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055", + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T14:44:49.451362" + }, + "star_salmon/deseq2_qc": { + "content": [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "RAP1_IAA_30M_REP1.txt", + "RAP1_UNINDUCED_REP1.txt", + "RAP1_UNINDUCED_REP2.txt", + "WT_REP1.txt", + "WT_REP2.txt", + "deseq2.size_factors.RData", + "deseq2.dds.RData", + "deseq2.pca.vals.txt", + "deseq2.plots.pdf", + "deseq2.sample.dists.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:29.135111" + }, + "star_salmon/markdup": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai", + "WT_REP1.markdup.sorted.bam", + "WT_REP1.markdup.sorted.bam.bai", + "WT_REP2.markdup.sorted.bam", + "WT_REP2.markdup.sorted.bam.bai" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:30.89199" + }, + "star_salmon/featurecounts": { + "content": [ + "RAP1_IAA_30M_REP1.biotype_counts_mqc.tsv:md5,27087a1c2e3cc2a0826818a04fe2647f", + "RAP1_IAA_30M_REP1.biotype_counts_rrna_mqc.tsv:md5,dde2de0cb90e10d0195c726f768e9941", + "RAP1_IAA_30M_REP1.featureCounts.txt:md5,e8ec41e6e79f378e2f301e245a4f8e73", + "RAP1_UNINDUCED_REP1.biotype_counts_mqc.tsv:md5,2e1d531352e9ad5935308e588dbaffe7", + "RAP1_UNINDUCED_REP1.biotype_counts_rrna_mqc.tsv:md5,845ff9059c72bc6722a8de69776e22bb", + "RAP1_UNINDUCED_REP1.featureCounts.txt:md5,3afe2b0bcf265526c247016c32482314", + "RAP1_UNINDUCED_REP2.biotype_counts_mqc.tsv:md5,6fedc1d11bc8d558f61c4c4a6060040f", + "RAP1_UNINDUCED_REP2.biotype_counts_rrna_mqc.tsv:md5,6d3fa4c88c7fe61f638e4624ad5e22f0", + "RAP1_UNINDUCED_REP2.featureCounts.txt:md5,6fed16d5ab57aa762891fde0c3720160", + "WT_REP1.biotype_counts_mqc.tsv:md5,ddcf909eacd91a49cc4fd3beed0b74f4", + "WT_REP1.biotype_counts_rrna_mqc.tsv:md5,8ef76d717492ca23764938aee8ea33a9", + "WT_REP1.featureCounts.txt:md5,5155de67cf7537016c9ded607797f5c5", + "WT_REP2.biotype_counts_mqc.tsv:md5,d5d731cea7c5083a54069c1820101ba3", + "WT_REP2.biotype_counts_rrna_mqc.tsv:md5,12294618fe44df1e7f39348372dcb481", + "WT_REP2.featureCounts.txt:md5,94d2ccd74ec4338ddc8ad7bdbf297826", + "RAP1_IAA_30M_REP1.featureCounts.txt.summary", + "RAP1_UNINDUCED_REP1.featureCounts.txt.summary", + "RAP1_UNINDUCED_REP2.featureCounts.txt.summary", + "WT_REP1.featureCounts.txt.summary", + "WT_REP2.featureCounts.txt.summary" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:29.457662" + }, + "star_salmon/samtools_stats": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.stats", + "RAP1_IAA_30M_REP1.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.sorted.bam.stats", + "WT_REP1.markdup.sorted.bam.flagstat", + "WT_REP1.markdup.sorted.bam.idxstats", + "WT_REP1.markdup.sorted.bam.stats", + "WT_REP1.sorted.bam.flagstat", + "WT_REP1.sorted.bam.idxstats", + "WT_REP1.sorted.bam.stats", + "WT_REP2.markdup.sorted.bam.flagstat", + "WT_REP2.markdup.sorted.bam.idxstats", + "WT_REP2.markdup.sorted.bam.stats", + "WT_REP2.sorted.bam.flagstat", + "WT_REP2.sorted.bam.idxstats", + "WT_REP2.sorted.bam.stats" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:36:32.899658" + }, + "salmon/deseq2_qc": { + "content": [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "deseq2.dds.RData", + "deseq2.pca.vals.txt", + "deseq2.plots.pdf", + "deseq2.sample.dists.txt", + "RAP1_IAA_30M_REP1.txt", + "RAP1_UNINDUCED_REP1.txt", + "RAP1_UNINDUCED_REP2.txt", + "WT_REP1.txt", + "WT_REP2.txt", + "deseq2.size_factors.RData" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:28.510896" + }, + "salmon": { + "content": [ + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:28.849468" + }, + "multiqc_plots": { + "content": [ + "dupradar-section-plot.png:md5,5e5487f0e1f1521264462d5cb9ee9089", + "fastqc-status-check-heatmap.png:md5,fe8b5b4ab4480d46a12a9005932a9b84", + "fastqc_overrepresented_sequences_plot.png:md5,6f5ffbdf1bf61fabe5e028c8bc85de14", + "fastqc_per_sequence_gc_content_plot_Counts.png:md5,01f124545af788fd5cc7bbf41b005e16", + "fastqc_per_sequence_gc_content_plot_Percentages.png:md5,eba3abf8bedb2cb20bad90c54e9c8881", + "fastqc_per_sequence_quality_scores_plot.png:md5,42fd7369a8aca78f620164a9e887c3cb", + "fastqc_sequence_counts_plot-cnt.png:md5,3890d5555f2a39b46b9f6efb14cb91f2", + "fastqc_sequence_counts_plot-pct.png:md5,55fa5838c8b2db978fcfa5cb83f6b054", + "fastqc_sequence_duplication_levels_plot.png:md5,747431f0f38f8e4c41a11a072fa18780", + "featurecounts_biotype_plot-cnt.png:md5,dcb37b4ce2fff5ca2e22767b172e55a8", + "featurecounts_biotype_plot-pct.png:md5,b15370ba2c056815939251f820d9e2af", + "qualimap_gene_coverage_profile_Counts.png:md5,8312f777db61509caa66d1f53a4b6b07", + "qualimap_gene_coverage_profile_Normalised.png:md5,66acb12427130766801a8376f95ed88b", + "rseqc_infer_experiment_plot.png:md5,c3108e35020ee93a77a62ea0167613b2", + "rseqc_read_dups_plot.png:md5,1e43ad78c4a87f7736b552ad71d25c16", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png:md5,ce6abb232fd5b5f2e66c0fe9a571d75f", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png:md5,6b44818f886ef020fb3646f152ad4af6", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png:md5,d5d8a85b7ad72a0cb93d9283ea12b23f", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png:md5,19317ad8f1448cd7eb1d319f85cc5c4d", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png:md5,64f2501f91db6dd0edd5e49c0b9ca8b7", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png:md5,52f30fc3448f43735ce9eca54b306c8e", + "multiqc_report.html", + "dupradar-section-plot.pdf", + "fail_strand_check_table.pdf", + "fastqc-status-check-heatmap.pdf", + "fastqc_adapter_content_plot.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf", + "featurecounts_biotype_plot-cnt.pdf", + "featurecounts_biotype_plot-pct.pdf", + "general_stats_table.pdf", + "picard_deduplication-cnt.pdf", + "picard_deduplication-pct.pdf", + "qualimap_gene_coverage_profile_Counts.pdf", + "qualimap_gene_coverage_profile_Normalised.pdf", + "qualimap_genomic_origin-cnt.pdf", + "qualimap_genomic_origin-pct.pdf", + "rseqc_bam_stat.pdf", + "rseqc_infer_experiment_plot.pdf", + "rseqc_inner_distance_plot_Counts.pdf", + "rseqc_inner_distance_plot_Percentages.pdf", + "rseqc_junction_annotation_junctions_plot_Events-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Events-pct.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf", + "rseqc_junction_saturation_plot_All_Junctions.pdf", + "rseqc_junction_saturation_plot_Known_Junctions.pdf", + "rseqc_junction_saturation_plot_Novel_Junctions.pdf", + "rseqc_read_distribution_plot-cnt.pdf", + "rseqc_read_distribution_plot-pct.pdf", + "rseqc_read_dups_plot.pdf", + "salmon_deseq2_clustering-plot.pdf", + "salmon_deseq2_pca-plot.pdf", + "salmon_plot.pdf", + "samtools-flagstat-dp_Percentage_of_total.pdf", + "samtools-flagstat-dp_Read_counts.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", + "samtools-stats-dp.pdf", + "samtools_alignment_plot-cnt.pdf", + "samtools_alignment_plot-pct.pdf", + "star_alignment_plot-cnt.pdf", + "star_alignment_plot-pct.pdf", + "star_salmon_deseq2_clustering-plot.pdf", + "star_salmon_deseq2_pca-plot.pdf", + "star_summary_table.pdf", + "fail_strand_check_table.png", + "fastqc_adapter_content_plot.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_top_overrepresented_sequences_table.png", + "general_stats_table.png", + "picard_deduplication-cnt.png", + "picard_deduplication-pct.png", + "qualimap_genomic_origin-cnt.png", + "qualimap_genomic_origin-pct.png", + "rseqc_bam_stat.png", + "rseqc_inner_distance_plot_Counts.png", + "rseqc_inner_distance_plot_Percentages.png", + "rseqc_junction_annotation_junctions_plot_Events-cnt.png", + "rseqc_junction_annotation_junctions_plot_Events-pct.png", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.png", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.png", + "rseqc_junction_saturation_plot_All_Junctions.png", + "rseqc_junction_saturation_plot_Known_Junctions.png", + "rseqc_junction_saturation_plot_Novel_Junctions.png", + "rseqc_read_distribution_plot-cnt.png", + "rseqc_read_distribution_plot-pct.png", + "salmon_deseq2_clustering-plot.png", + "salmon_deseq2_pca-plot.png", + "salmon_plot.png", + "samtools-flagstat-dp_Percentage_of_total.png", + "samtools-flagstat-dp_Read_counts.png", + "samtools-stats-dp.png", + "samtools_alignment_plot-cnt.png", + "samtools_alignment_plot-pct.png", + "star_alignment_plot-cnt.png", + "star_alignment_plot-pct.png", + "star_salmon_deseq2_clustering-plot.png", + "star_salmon_deseq2_pca-plot.png", + "star_summary_table.png", + "dupradar-section-plot.svg", + "fail_strand_check_table.svg", + "fastqc-status-check-heatmap.svg", + "fastqc_adapter_content_plot.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg", + "featurecounts_biotype_plot-cnt.svg", + "featurecounts_biotype_plot-pct.svg", + "general_stats_table.svg", + "picard_deduplication-cnt.svg", + "picard_deduplication-pct.svg", + "qualimap_gene_coverage_profile_Counts.svg", + "qualimap_gene_coverage_profile_Normalised.svg", + "qualimap_genomic_origin-cnt.svg", + "qualimap_genomic_origin-pct.svg", + "rseqc_bam_stat.svg", + "rseqc_infer_experiment_plot.svg", + "rseqc_inner_distance_plot_Counts.svg", + "rseqc_inner_distance_plot_Percentages.svg", + "rseqc_junction_annotation_junctions_plot_Events-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Events-pct.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.svg", + "rseqc_junction_saturation_plot_All_Junctions.svg", + "rseqc_junction_saturation_plot_Known_Junctions.svg", + "rseqc_junction_saturation_plot_Novel_Junctions.svg", + "rseqc_read_distribution_plot-cnt.svg", + "rseqc_read_distribution_plot-pct.svg", + "rseqc_read_dups_plot.svg", + "salmon_deseq2_clustering-plot.svg", + "salmon_deseq2_pca-plot.svg", + "salmon_plot.svg", + "samtools-flagstat-dp_Percentage_of_total.svg", + "samtools-flagstat-dp_Read_counts.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", + "samtools-stats-dp.svg", + "samtools_alignment_plot-cnt.svg", + "samtools_alignment_plot-pct.svg", + "star_alignment_plot-cnt.svg", + "star_alignment_plot-pct.svg", + "star_salmon_deseq2_clustering-plot.svg", + "star_salmon_deseq2_pca-plot.svg", + "star_summary_table.svg" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:36:32.816392" + }, + "star_salmon/picard_metrics": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:29.813744" + }, + "star_salmon/salmon": { + "content": [ + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:30.405348" + }, + "fastqc/raw": { + "content": [ + "RAP1_IAA_30M_REP1_raw_1_fastqc.html", + "RAP1_IAA_30M_REP1_raw_1_fastqc.zip", + "RAP1_IAA_30M_REP1_raw_2_fastqc.html", + "RAP1_IAA_30M_REP1_raw_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_raw_fastqc.html", + "RAP1_UNINDUCED_REP1_raw_fastqc.zip", + "RAP1_UNINDUCED_REP2_raw_fastqc.html", + "RAP1_UNINDUCED_REP2_raw_fastqc.zip", + "WT_REP1_raw_1_fastqc.html", + "WT_REP1_raw_1_fastqc.zip", + "WT_REP1_raw_2_fastqc.html", + "WT_REP1_raw_2_fastqc.zip", + "WT_REP2_raw_1_fastqc.html", + "WT_REP2_raw_1_fastqc.zip", + "WT_REP2_raw_2_fastqc.html", + "WT_REP2_raw_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T14:44:49.461839" + }, + "star_salmon/bigwig": { + "content": [ + "RAP1_IAA_30M_REP1.forward.bigWig", + "RAP1_IAA_30M_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP1.forward.bigWig", + "RAP1_UNINDUCED_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP2.forward.bigWig", + "RAP1_UNINDUCED_REP2.reverse.bigWig", + "WT_REP1.forward.bigWig", + "WT_REP1.reverse.bigWig", + "WT_REP2.forward.bigWig", + "WT_REP2.reverse.bigWig" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:28.99559" + }, + "star_salmon/stringtie": { + "content": [ + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,9225250f729f9688c50718ad82989f4c", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,319f3eaf67c02b6198a4d746f8b11a44", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,1c69593079c7bff8b3e36b9d9aa616f9", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,db2e9c245b5db90551b83c799194113c", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,9628d551f88776248ace242ba43978e3", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,50d273bef261ddb395260dc74eff1a8b", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,9c0bf54804f5624b567481de8f5a5ae4", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,d92fcfde4016a15c3f54340e8637e554", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,3bddb4b7381a62a0104b7004e5b71f20", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,cd4c62717bb0a0db1a17e9c6d8788599", + "t_data.ctab", + "RAP1_IAA_30M_REP1.coverage.gtf", + "RAP1_IAA_30M_REP1.gene.abundance.txt", + "RAP1_IAA_30M_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP1.coverage.gtf", + "RAP1_UNINDUCED_REP1.gene.abundance.txt", + "RAP1_UNINDUCED_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP2.coverage.gtf", + "RAP1_UNINDUCED_REP2.gene.abundance.txt", + "RAP1_UNINDUCED_REP2.transcripts.gtf", + "t_data.ctab", + "WT_REP1.coverage.gtf", + "WT_REP1.gene.abundance.txt", + "WT_REP1.transcripts.gtf", + "t_data.ctab", + "WT_REP2.coverage.gtf", + "WT_REP2.gene.abundance.txt", + "WT_REP2.transcripts.gtf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:30.738255" + }, + "versions": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, BEDTOOLS_GENOMECOV_FW={bedtools=2.31.1}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=3.9.5}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, CUSTOM_TX2GENE={python=3.9.5}, DESEQ2_QC_PSEUDO={r-base=4.0.3, bioconductor-deseq2=1.28.0}, DESEQ2_QC_STAR_SALMON={r-base=4.0.3, bioconductor-deseq2=1.28.0}, DUPRADAR={bioconductor-dupradar=1.32.0}, FASTQC={fastqc=0.12.1}, FQ_SUBSAMPLE={fq=0.9.1 (2022-02-22)}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, MULTIQC_CUSTOM_BIOTYPE={python=3.9.5}, PICARD_MARKDUPLICATES={picard=3.1.1}, QUALIMAP_RNASEQ={qualimap=2.3}, RSEQC_BAMSTAT={rseqc=5.0.2}, RSEQC_INFEREXPERIMENT={rseqc=5.0.2}, RSEQC_INNERDISTANCE={rseqc=5.0.2}, RSEQC_JUNCTIONANNOTATION={rseqc=5.0.2}, RSEQC_JUNCTIONSATURATION={rseqc=5.0.2}, RSEQC_READDISTRIBUTION={rseqc=5.0.2}, RSEQC_READDUPLICATION={rseqc=5.0.2}, SALMON_QUANT={salmon=1.10.1}, SAMTOOLS_FLAGSTAT={samtools=1.2}, SAMTOOLS_IDXSTATS={samtools=1.2}, SAMTOOLS_INDEX={samtools=1.2}, SAMTOOLS_SORT={samtools=1.2}, SAMTOOLS_STATS={samtools=1.2}, SE_GENE={bioconductor-summarizedexperiment=1.32.0}, STAR_ALIGN={star=2.7.10a, samtools=1.18, gawk=5.1.0}, STAR_GENOMEGENERATE={star=2.7.10a, samtools=1.18, gawk=5.1.0}, STRINGTIE_STRINGTIE={stringtie=2.2.1}, SUBREAD_FEATURECOUNTS={subread=2.0.1}, TXIMETA_TXIMPORT={bioconductor-tximeta=1.20.1}, UCSC_BEDCLIP={ucsc=377}, UCSC_BEDGRAPHTOBIGWIG={ucsc=445}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:31.618005" + }, + "star_salmon/dupradar": { + "content": [ + "RAP1_IAA_30M_REP1_dupMatrix.txt:md5,fdeebc4f056cbb52fee53e82c2e0096f", + "RAP1_UNINDUCED_REP1_dupMatrix.txt:md5,aa94a148bdbebec4e82cd18a00316506", + "RAP1_UNINDUCED_REP2_dupMatrix.txt:md5,bf065e266566c3fb96dc9319a3ed12cf", + "WT_REP1_dupMatrix.txt:md5,04512c8be70c1898d0262935ed5ec5bd", + "WT_REP2_dupMatrix.txt:md5,5052efd01f5086d394499b9c4626deb1", + "RAP1_IAA_30M_REP1_intercept_slope.txt:md5,7962ee6ba989f9af6465aaf1101ba13b", + "RAP1_UNINDUCED_REP1_intercept_slope.txt:md5,6c69ccc819c14847eef319b7fa8ccb4f", + "RAP1_UNINDUCED_REP2_intercept_slope.txt:md5,147b051de3f1e5c75821176851d13612", + "WT_REP1_intercept_slope.txt:md5,395cde13da1a90cf4378be2597c4f297", + "WT_REP2_intercept_slope.txt:md5,7ddae43baa3c4e499fbc319b95627c41", + "RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf", + "WT_REP1_duprateExpBoxplot.pdf", + "WT_REP2_duprateExpBoxplot.pdf", + "RAP1_IAA_30M_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP2_expressionHist.pdf", + "WT_REP1_expressionHist.pdf", + "WT_REP2_expressionHist.pdf", + "RAP1_IAA_30M_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP2_duprateExpDens.pdf", + "WT_REP1_duprateExpDens.pdf", + "WT_REP2_duprateExpDens.pdf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:29.283253" + }, + "bbsplit": { + "content": [ + "RAP1_IAA_30M_REP1.stats.txt", + "RAP1_UNINDUCED_REP1.stats.txt", + "RAP1_UNINDUCED_REP2.stats.txt", + "WT_REP1.stats.txt", + "WT_REP2.stats.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T14:44:49.441331" + }, + "salmon_quant": { + "content": [ + "ambig_info.tsv:md5,e099a9ec06de792219139248712f7f40", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,1215f0c20f87d3aef8553ef119e1e74c", + "lib_format_counts.json:md5,406e1457f0f0506bd8e605a217477436", + "ambig_info.tsv:md5,0e0895adb376929bec8e0dd0677bf7d8", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,621c6601aade5b1f2e3d6ca2fc71f636", + "lib_format_counts.json:md5,afd2a0ddf0fd0ec4f99be898608a59db", + "ambig_info.tsv:md5,6ed1b46c69917d6af3f093f9503bb962", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,9bed6e4dc5428d6f6297adcea29a6326", + "lib_format_counts.json:md5,f7b7048fd2ac63fd792e71b85e4ed6d1", + "ambig_info.tsv:md5,2f4c6a5953e41252a89851a9a7c36d9b", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,c7ed0aaa5d6c7934ddbebfd29e4eb86d", + "lib_format_counts.json:md5,03f0b70a4bb428fab96c29f04f895b6f", + "ambig_info.tsv:md5,5fff63493bf3c223707ac90b9bb3a8f3", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,69ebfc2c7ca6b221a0a22fa1dc8c20ac", + "lib_format_counts.json:md5,4bf135c93c37f90c493f761f2709a28b", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:28.672506" + }, + "star_salmon/qualimap": { + "content": [ + "Coverage Profile Along Genes (High).png:md5,3a6e83a9a2e0e983b1191a622bfc8ef1", + "Coverage Profile Along Genes (Low).png:md5,1f075e71d4c281be2ecad16cf13f52bc", + "Coverage Profile Along Genes (Total).png:md5,f32d6ff38cfe4d01c6cbc917cb6e21c1", + "Transcript coverage histogram.png:md5,4e4a8d520a3018a888e5840936e9f4e0", + "coverage_profile_along_genes_(high).txt:md5,59a01cd5d9bc7b6096490d7f3d6d6877", + "coverage_profile_along_genes_(low).txt:md5,8a5255e6f9f142bbd22c636296f41d72", + "coverage_profile_along_genes_(total).txt:md5,8a5255e6f9f142bbd22c636296f41d72", + "Coverage Profile Along Genes (High).png:md5,a0efd6fc7c7c803a3b51e7fc4600ed98", + "Coverage Profile Along Genes (Low).png:md5,212d68ca87f5bc4c60ed04a33df126af", + "Coverage Profile Along Genes (Total).png:md5,a72b6252a3ece3fb911da724274eabae", + "Transcript coverage histogram.png:md5,1daabf214a2d2c32748834188c8bea5d", + "coverage_profile_along_genes_(high).txt:md5,61683a2fcf35174fe72a648be63d45ac", + "coverage_profile_along_genes_(low).txt:md5,031046ef33de379e0463fddc0b924ecd", + "coverage_profile_along_genes_(total).txt:md5,031046ef33de379e0463fddc0b924ecd", + "Coverage Profile Along Genes (High).png:md5,75dbf9d2b8bde265fdda486c050d5ff5", + "Coverage Profile Along Genes (Low).png:md5,8e792e6037158381a50e3668c54b7254", + "Coverage Profile Along Genes (Total).png:md5,beaf835a8aaf95df20815032a5f92622", + "Transcript coverage histogram.png:md5,6428ffa766e3c59ca42a9fb5e011d866", + "coverage_profile_along_genes_(high).txt:md5,2745780cc56258bbe587f9b6db03e9e4", + "coverage_profile_along_genes_(low).txt:md5,85154785601b18118ae2e6a19d0a1c0a", + "coverage_profile_along_genes_(total).txt:md5,85154785601b18118ae2e6a19d0a1c0a", + "Coverage Profile Along Genes (High).png:md5,6491fbf74a1444b98fdfe495b8c26a7f", + "Coverage Profile Along Genes (Low).png:md5,ee6b911d01b1cfbcebb5864a1f6f5fda", + "Coverage Profile Along Genes (Total).png:md5,f286514f978d5bcb9508a908068ff6c7", + "Transcript coverage histogram.png:md5,e925b300e71d23188aa45907e0754536", + "coverage_profile_along_genes_(high).txt:md5,6afb5ffc9ddad52f69c518e32118ac61", + "coverage_profile_along_genes_(low).txt:md5,248345fdf0f8de2a8d7d329edd0a5c42", + "coverage_profile_along_genes_(total).txt:md5,248345fdf0f8de2a8d7d329edd0a5c42", + "Coverage Profile Along Genes (High).png:md5,f9f0caee3156d32588c12daab8895a0f", + "Coverage Profile Along Genes (Low).png:md5,35ac4785ed0ffb80aaeec1fb26825f4b", + "Coverage Profile Along Genes (Total).png:md5,781cc1b68e9f7afc30a84b7e45b06f85", + "Transcript coverage histogram.png:md5,a4a300dc782deea67f18e516e0c50b3b", + "coverage_profile_along_genes_(high).txt:md5,f7c11dace9fc4f446fc29e5db7b3ee24", + "coverage_profile_along_genes_(low).txt:md5,f53cfe3e30c560e3261818c2e6df3d5d", + "coverage_profile_along_genes_(total).txt:md5,f53cfe3e30c560e3261818c2e6df3d5d", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T15:27:29.998661" + } +} \ No newline at end of file diff --git a/tests/star_rsem.nf.test b/tests/star_rsem.nf.test new file mode 100644 index 000000000..0f03bc6db --- /dev/null +++ b/tests/star_rsem.nf.test @@ -0,0 +1,920 @@ +nextflow_pipeline { + + name "Test pipeline with STAR aligner and RSEM for quantification" + script "../main.nf" + + test("Params: --aligner star_rsem") { + + when { + params { + outdir = "$outputDir" + aligner = 'star_rsem' + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/bbsplit/RAP1_IAA_30M_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/RAP1_UNINDUCED_REP2.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP1.stats.txt").name, + file("${params.outdir}/bbsplit/WT_REP2.stats.txt").name + ).match("bbsplit") }, + { assert snapshot( + path("${params.outdir}/custom/out/genome_gfp.fasta"), + path("${params.outdir}/custom/out/genome_gfp.gtf") + ).match("references") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw_2_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_1_fastqc.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw_2_fastqc.zip").name + ).match("fastqc/raw") }, + { assert snapshot( + // HTMLs and ZIPs are not stable + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html").name, + file("${params.outdir}/fastqc/trim/RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP1_trimmed_2_val_2_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_1_val_1_fastqc.zip").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.html").name, + file("${params.outdir}/fastqc/trim/WT_REP2_trimmed_2_val_2_fastqc.zip").name + ).match("fastqc/trim") }, + { assert snapshot( + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/cutadapt_filtered_reads_plot.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Counts.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc-status-check-heatmap-1.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc-status-check-heatmap.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_adapter_content_plot.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_overrepresented_sequences_plot-1.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_overrepresented_sequences_plot.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_per_base_n_content_plot-1.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_per_base_n_content_plot.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_per_base_sequence_quality_plot-1.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_per_base_sequence_quality_plot.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_per_sequence_gc_content_plot-1_Counts.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_per_sequence_gc_content_plot-1_Percentages.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Counts.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_per_sequence_gc_content_plot_Percentages.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_per_sequence_quality_scores_plot-1.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_per_sequence_quality_scores_plot.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_sequence_counts_plot-1.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_sequence_counts_plot.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_sequence_duplication_levels_plot-1.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_sequence_duplication_levels_plot.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_sequence_length_distribution_plot.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_citations.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_cutadapt.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_fastqc_fastqc_raw.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_fastqc_fastqc_trimmed.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_featurecounts_biotype_plot.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_samtools_idxstats.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/picard_histogram.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/picard_histogram_1.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/picard_histogram_2.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/qualimap_gene_coverage_profile_Counts.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/qualimap_gene_coverage_profile_Normalised.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/qualimap_rnaseq_cov_hist.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_infer_experiment_plot.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt"), + // These files are not stable + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_top_overrepresented_sequences_table-1.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/fastqc_top_overrepresented_sequences_table.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/junction_saturation_known.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/junction_saturation_novel.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_data.json").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_dupradar-section-plot.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_fail_strand_check_table.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_general_stats.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_picard_dups.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/picard_deduplication.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_rsem.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_rseqc_infer_experiment.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_rseqc_junction_annotation.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_rseqc_read_distribution.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_salmon.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_salmon_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_salmon_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_samtools_flagstat.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_samtools_stats.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_software_versions.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_sources.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_star.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_star_rsem_deseq2_clustering-plot.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_star_rsem_deseq2_clustering-plot_1.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_star_rsem_deseq2_clustering-plot_2.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_star_rsem_deseq2_clustering-plot_3.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_star_rsem_deseq2_clustering-plot_4.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/multiqc_star_rsem_deseq2_pca-plot.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/qualimap_genomic_origin.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/qualimap_rnaseq_genome_results.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rsem_assignment_plot.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rsem_multimapping_rates.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_bam_stat.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_inner_distance.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_inner_distance_plot_Counts.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_inner_distance_plot_Percentages.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Events.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_junction_annotation_junctions_plot_Junctions.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_junction_saturation_all.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_junction_saturation_plot_All_Junctions.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_junction_saturation_plot_Known_Junctions.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_junction_saturation_plot_Novel_Junctions.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_read_distribution_plot.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_read_dups.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/rseqc_read_dups_plot.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/salmon_plot.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/samtools-flagstat-dp_Percentage_of_total.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/samtools-flagstat-dp_Read_counts.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/samtools-stats-dp.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/samtools_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/star_alignment_plot.txt").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_data/star_summary_table.txt").name + ).match("multiqc_data") }, + { assert snapshot( + + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/cutadapt_filtered_reads_plot-cnt.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/cutadapt_filtered_reads_plot-pct.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Counts.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/cutadapt_trimmed_sequences_plot_3_Obs_Exp.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/dupradar-section-plot.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc-status-check-heatmap-1.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc-status-check-heatmap.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot-1.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_overrepresented_sequences_plot.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot-1_Counts.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot-1_Percentages.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot-1.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_per_sequence_quality_scores_plot.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_sequence_counts_plot-1-cnt.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_sequence_counts_plot-1-pct.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_sequence_counts_plot-cnt.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_sequence_counts_plot-pct.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot-1.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_sequence_duplication_levels_plot.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/featurecounts_biotype_plot-cnt.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/featurecounts_biotype_plot-pct.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/qualimap_gene_coverage_profile_Counts.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/qualimap_gene_coverage_profile_Normalised.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rsem_multimapping_rates.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_infer_experiment_plot.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_read_dups_plot.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png"), + path("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png"), + // PDFs, SVGs, some PNGs and HTML reports are not stable + file("${params.outdir}/multiqc/star_rsem/multiqc_report.html").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/cutadapt_filtered_reads_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Counts.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/dupradar-section-plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fail_strand_check_table.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc-status-check-heatmap-1.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc-status-check-heatmap.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_adapter_content_plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_overrepresented_sequences_plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_per_base_n_content_plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot-1_Counts.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot-1_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-1-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-1-pct.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_sequence_counts_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot-1.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_sequence_length_distribution_plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table-1.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/featurecounts_biotype_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/featurecounts_biotype_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/general_stats_table.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/picard_deduplication-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/picard_deduplication-pct.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Counts.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/qualimap_gene_coverage_profile_Normalised.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/qualimap_genomic_origin-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/qualimap_genomic_origin-pct.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rsem_assignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rsem_assignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rsem_multimapping_rates.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_bam_stat.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_infer_experiment_plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Counts.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_inner_distance_plot_Percentages.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Events-pct.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_All_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Known_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_junction_saturation_plot_Novel_Junctions.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_read_distribution_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_read_distribution_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/rseqc_read_dups_plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/salmon_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/salmon_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/salmon_plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/samtools-flagstat-dp_Percentage_of_total.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/samtools-flagstat-dp_Read_counts.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/samtools-stats-dp.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/samtools_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/samtools_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/star_alignment_plot-cnt.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/star_alignment_plot-pct.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/star_rsem_deseq2_clustering-plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/star_rsem_deseq2_pca-plot.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/pdf/star_summary_table.pdf").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fail_strand_check_table.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_adapter_content_plot.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_per_base_n_content_plot-1.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_per_base_n_content_plot.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot-1.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_per_base_sequence_quality_plot.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_sequence_length_distribution_plot.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table-1.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/fastqc_top_overrepresented_sequences_table.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/general_stats_table.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/picard_deduplication-cnt.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/picard_deduplication-pct.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/qualimap_genomic_origin-cnt.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/qualimap_genomic_origin-pct.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rsem_assignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rsem_assignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_bam_stat.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_inner_distance_plot_Counts.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_inner_distance_plot_Percentages.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-cnt.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Events-pct.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-cnt.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_junction_annotation_junctions_plot_Junctions-pct.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_junction_saturation_plot_All_Junctions.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_junction_saturation_plot_Known_Junctions.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_junction_saturation_plot_Novel_Junctions.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_read_distribution_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/rseqc_read_distribution_plot-pct.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/salmon_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/salmon_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/salmon_plot.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/samtools-flagstat-dp_Percentage_of_total.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/samtools-flagstat-dp_Read_counts.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/samtools-stats-dp.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/samtools_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/samtools_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/star_alignment_plot-cnt.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/star_alignment_plot-pct.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/star_rsem_deseq2_clustering-plot.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/star_rsem_deseq2_pca-plot.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/png/star_summary_table.png").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/cutadapt_filtered_reads_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Counts.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/dupradar-section-plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fail_strand_check_table.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc-status-check-heatmap-1.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc-status-check-heatmap.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_adapter_content_plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot-1.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_overrepresented_sequences_plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_per_base_n_content_plot-1.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_per_base_n_content_plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot-1.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_per_base_sequence_quality_plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot-1_Counts.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot-1_Percentages.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot-1.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_per_sequence_quality_scores_plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_sequence_counts_plot-1-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_sequence_counts_plot-1-pct.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_sequence_counts_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_sequence_counts_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot-1.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_sequence_duplication_levels_plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_sequence_length_distribution_plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table-1.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/fastqc_top_overrepresented_sequences_table.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/featurecounts_biotype_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/featurecounts_biotype_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/general_stats_table.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/picard_deduplication-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/picard_deduplication-pct.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Counts.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/qualimap_gene_coverage_profile_Normalised.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/qualimap_genomic_origin-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/qualimap_genomic_origin-pct.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rsem_assignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rsem_assignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rsem_multimapping_rates.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_bam_stat.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_infer_experiment_plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_inner_distance_plot_Counts.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_inner_distance_plot_Percentages.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Events-pct.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_junction_annotation_junctions_plot_Junctions-pct.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_junction_saturation_plot_All_Junctions.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Known_Junctions.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_junction_saturation_plot_Novel_Junctions.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_read_distribution_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_read_distribution_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/rseqc_read_dups_plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/salmon_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/salmon_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/salmon_plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/samtools-flagstat-dp_Percentage_of_total.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/samtools-flagstat-dp_Read_counts.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/samtools-stats-dp.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/samtools_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/samtools_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/star_alignment_plot-cnt.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/star_alignment_plot-pct.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/star_rsem_deseq2_clustering-plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/star_rsem_deseq2_pca-plot.svg").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report_plots/svg/star_summary_table.svg").name + ).match("multiqc_plots") }, + { assert snapshot( + path("${params.outdir}/salmon/deseq2_qc/R_sessionInfo.log"), + // These files are not stable + file("${params.outdir}/salmon/deseq2_qc/deseq2.dds.RData").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.pca.vals.txt").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.plots.pdf").name, + file("${params.outdir}/salmon/deseq2_qc/deseq2.sample.dists.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_IAA_30M_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/RAP1_UNINDUCED_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP1.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/WT_REP2.txt").name, + file("${params.outdir}/salmon/deseq2_qc/size_factors/deseq2.size_factors.RData").name + ).match("salmon/deseq2_qc") }, + { assert snapshot( + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_IAA_30M_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/cmd_info.json"), + path("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP1/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP1/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP1/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP1/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP1/lib_format_counts.json"), + path("${params.outdir}/salmon/WT_REP2/aux_info/ambig_info.tsv"), + path("${params.outdir}/salmon/WT_REP2/aux_info/expected_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias.gz"), + path("${params.outdir}/salmon/WT_REP2/aux_info/observed_bias_3p.gz"), + path("${params.outdir}/salmon/WT_REP2/cmd_info.json"), + path("${params.outdir}/salmon/WT_REP2/lib_format_counts.json"), + // These files are not stable + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_IAA_30M_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP1/quant.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/RAP1_UNINDUCED_REP2/quant.sf").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP1/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP1/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP1/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP1/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP1/quant.sf").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/fld.gz").name, + file("${params.outdir}/salmon/WT_REP2/aux_info/meta_info.json").name, + file("${params.outdir}/salmon/WT_REP2/libParams/flenDist.txt").name, + file("${params.outdir}/salmon/WT_REP2/logs/salmon_quant.log").name, + file("${params.outdir}/salmon/WT_REP2/quant.genes.sf").name, + file("${params.outdir}/salmon/WT_REP2/quant.sf").name + ).match("salmon_quant") }, + { assert snapshot( + path("${params.outdir}/salmon/tx2gene.tsv"), + // These files are not stable + file("${params.outdir}/salmon/salmon.merged.gene_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_length_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.gene_counts_scaled.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.gene_tpm.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.SummarizedExperiment.rds").name, + file("${params.outdir}/salmon/salmon.merged.transcript_counts.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_lengths.tsv").name, + file("${params.outdir}/salmon/salmon.merged.transcript_tpm.tsv").name + ).match("salmon") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_rsem/bigwig/RAP1_IAA_30M_REP1.forward.bigWig").name, + file("${params.outdir}/star_rsem/bigwig/RAP1_IAA_30M_REP1.reverse.bigWig").name, + file("${params.outdir}/star_rsem/bigwig/RAP1_UNINDUCED_REP1.forward.bigWig").name, + file("${params.outdir}/star_rsem/bigwig/RAP1_UNINDUCED_REP1.reverse.bigWig").name, + file("${params.outdir}/star_rsem/bigwig/RAP1_UNINDUCED_REP2.forward.bigWig").name, + file("${params.outdir}/star_rsem/bigwig/RAP1_UNINDUCED_REP2.reverse.bigWig").name, + file("${params.outdir}/star_rsem/bigwig/WT_REP1.forward.bigWig").name, + file("${params.outdir}/star_rsem/bigwig/WT_REP1.reverse.bigWig").name, + file("${params.outdir}/star_rsem/bigwig/WT_REP2.forward.bigWig").name, + file("${params.outdir}/star_rsem/bigwig/WT_REP2.reverse.bigWig").name + ).match("star_rsem/bigwig") }, + { assert snapshot( + path("${params.outdir}/star_rsem/deseq2_qc/R_sessionInfo.log"), + // These files are not stable + file("${params.outdir}/star_rsem/deseq2_qc/size_factors/RAP1_IAA_30M_REP1.txt").name, + file("${params.outdir}/star_rsem/deseq2_qc/size_factors/RAP1_UNINDUCED_REP1.txt").name, + file("${params.outdir}/star_rsem/deseq2_qc/size_factors/RAP1_UNINDUCED_REP2.txt").name, + file("${params.outdir}/star_rsem/deseq2_qc/size_factors/WT_REP1.txt").name, + file("${params.outdir}/star_rsem/deseq2_qc/size_factors/WT_REP2.txt").name, + file("${params.outdir}/star_rsem/deseq2_qc/size_factors/deseq2.size_factors.RData").name, + file("${params.outdir}/star_rsem/deseq2_qc/deseq2.dds.RData").name, + file("${params.outdir}/star_rsem/deseq2_qc/deseq2.pca.vals.txt").name, + file("${params.outdir}/star_rsem/deseq2_qc/deseq2.plots.pdf").name, + file("${params.outdir}/star_rsem/deseq2_qc/deseq2.sample.dists.txt").name + ).match("star_rsem/deseq2_qc") }, + { assert snapshot( + path("${params.outdir}/star_rsem/dupradar/gene_data/RAP1_IAA_30M_REP1_dupMatrix.txt"), + path("${params.outdir}/star_rsem/dupradar/gene_data/RAP1_UNINDUCED_REP1_dupMatrix.txt"), + path("${params.outdir}/star_rsem/dupradar/gene_data/RAP1_UNINDUCED_REP2_dupMatrix.txt"), + path("${params.outdir}/star_rsem/dupradar/gene_data/WT_REP1_dupMatrix.txt"), + path("${params.outdir}/star_rsem/dupradar/gene_data/WT_REP2_dupMatrix.txt"), + path("${params.outdir}/star_rsem/dupradar/intercepts_slope/RAP1_IAA_30M_REP1_intercept_slope.txt"), + path("${params.outdir}/star_rsem/dupradar/intercepts_slope/RAP1_UNINDUCED_REP1_intercept_slope.txt"), + path("${params.outdir}/star_rsem/dupradar/intercepts_slope/RAP1_UNINDUCED_REP2_intercept_slope.txt"), + path("${params.outdir}/star_rsem/dupradar/intercepts_slope/WT_REP1_intercept_slope.txt"), + path("${params.outdir}/star_rsem/dupradar/intercepts_slope/WT_REP2_intercept_slope.txt"), + // PDFs are not stable + file("${params.outdir}/star_rsem/dupradar/box_plot/RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_rsem/dupradar/box_plot/RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_rsem/dupradar/box_plot/RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_rsem/dupradar/box_plot/WT_REP1_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_rsem/dupradar/box_plot/WT_REP2_duprateExpBoxplot.pdf").name, + file("${params.outdir}/star_rsem/dupradar/histogram/RAP1_IAA_30M_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_rsem/dupradar/histogram/RAP1_UNINDUCED_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_rsem/dupradar/histogram/RAP1_UNINDUCED_REP2_expressionHist.pdf").name, + file("${params.outdir}/star_rsem/dupradar/histogram/WT_REP1_expressionHist.pdf").name, + file("${params.outdir}/star_rsem/dupradar/histogram/WT_REP2_expressionHist.pdf").name, + file("${params.outdir}/star_rsem/dupradar/scatter_plot/RAP1_IAA_30M_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_rsem/dupradar/scatter_plot/RAP1_UNINDUCED_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_rsem/dupradar/scatter_plot/RAP1_UNINDUCED_REP2_duprateExpDens.pdf").name, + file("${params.outdir}/star_rsem/dupradar/scatter_plot/WT_REP1_duprateExpDens.pdf").name, + file("${params.outdir}/star_rsem/dupradar/scatter_plot/WT_REP2_duprateExpDens.pdf").name + ).match("star_rsem/dupradar") }, + { assert snapshot( + path("${params.outdir}/star_rsem/featurecounts/RAP1_IAA_30M_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_rsem/featurecounts/RAP1_IAA_30M_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_rsem/featurecounts/RAP1_IAA_30M_REP1.featureCounts.txt"), + path("${params.outdir}/star_rsem/featurecounts/RAP1_UNINDUCED_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_rsem/featurecounts/RAP1_UNINDUCED_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_rsem/featurecounts/RAP1_UNINDUCED_REP1.featureCounts.txt"), + path("${params.outdir}/star_rsem/featurecounts/RAP1_UNINDUCED_REP2.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_rsem/featurecounts/RAP1_UNINDUCED_REP2.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_rsem/featurecounts/RAP1_UNINDUCED_REP2.featureCounts.txt"), + path("${params.outdir}/star_rsem/featurecounts/WT_REP1.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_rsem/featurecounts/WT_REP1.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_rsem/featurecounts/WT_REP1.featureCounts.txt"), + path("${params.outdir}/star_rsem/featurecounts/WT_REP2.biotype_counts_mqc.tsv"), + path("${params.outdir}/star_rsem/featurecounts/WT_REP2.biotype_counts_rrna_mqc.tsv"), + path("${params.outdir}/star_rsem/featurecounts/WT_REP2.featureCounts.txt"), + // These files are unstable + file("${params.outdir}/star_rsem/featurecounts/RAP1_IAA_30M_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_rsem/featurecounts/RAP1_UNINDUCED_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_rsem/featurecounts/RAP1_UNINDUCED_REP2.featureCounts.txt.summary").name, + file("${params.outdir}/star_rsem/featurecounts/WT_REP1.featureCounts.txt.summary").name, + file("${params.outdir}/star_rsem/featurecounts/WT_REP2.featureCounts.txt.summary").name + ).match("star_rsem/featurecounts") }, + { assert snapshot( + // These files are unstable + file("${params.outdir}/star_rsem/log/RAP1_IAA_30M_REP1.log").name, + file("${params.outdir}/star_rsem/log/RAP1_UNINDUCED_REP1.log").name, + file("${params.outdir}/star_rsem/log/RAP1_UNINDUCED_REP2.log").name, + file("${params.outdir}/star_rsem/log/WT_REP1.log").name, + file("${params.outdir}/star_rsem/log/WT_REP2.log").name + ).match("star_rsem/log") }, + { assert snapshot( + // Metrics are not stable + file("${params.outdir}/star_rsem/picard_metrics/RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_rsem/picard_metrics/RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_rsem/picard_metrics/RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_rsem/picard_metrics/WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt").name, + file("${params.outdir}/star_rsem/picard_metrics/WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt").name + ).match("star_rsem/picard_metrics") }, + { assert snapshot( + path("${params.outdir}/star_rsem/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_rsem/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_rsem/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_rsem/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_rsem/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_rsem/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_rsem/qualimap/RAP1_IAA_30M_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_rsem/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_rsem/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_rsem/qualimap/WT_REP1/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_rsem/qualimap/WT_REP1/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_rsem/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_rsem/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_rsem/qualimap/WT_REP1/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + path("${params.outdir}/star_rsem/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (High).png"), + path("${params.outdir}/star_rsem/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (Low).png"), + path("${params.outdir}/star_rsem/qualimap/WT_REP2/images_qualimapReport/Coverage Profile Along Genes (Total).png"), + path("${params.outdir}/star_rsem/qualimap/WT_REP2/images_qualimapReport/Transcript coverage histogram.png"), + path("${params.outdir}/star_rsem/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(high).txt"), + path("${params.outdir}/star_rsem/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(low).txt"), + path("${params.outdir}/star_rsem/qualimap/WT_REP2/raw_data_qualimapReport/coverage_profile_along_genes_(total).txt"), + // HTML reports and these files are not stable + file("${params.outdir}/star_rsem/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_rsem/qualimap/RAP1_IAA_30M_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_rsem/qualimap/RAP1_IAA_30M_REP1/qualimapReport.html").name, + file("${params.outdir}/star_rsem/qualimap/RAP1_IAA_30M_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP1/qualimapReport.html").name, + file("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP2/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP2/qualimapReport.html").name, + file("${params.outdir}/star_rsem/qualimap/RAP1_UNINDUCED_REP2/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_rsem/qualimap/WT_REP1/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_rsem/qualimap/WT_REP1/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_rsem/qualimap/WT_REP1/qualimapReport.html").name, + file("${params.outdir}/star_rsem/qualimap/WT_REP1/rnaseq_qc_results.txt").name, + file("${params.outdir}/star_rsem/qualimap/WT_REP2/images_qualimapReport/Junction Analysis.png").name, + file("${params.outdir}/star_rsem/qualimap/WT_REP2/images_qualimapReport/Reads Genomic Origin.png").name, + file("${params.outdir}/star_rsem/qualimap/WT_REP2/qualimapReport.html").name, + file("${params.outdir}/star_rsem/qualimap/WT_REP2/rnaseq_qc_results.txt").name + ).match("star_rsem/qualimap") }, + { assert snapshot( + path("${params.outdir}/star_rsem/RAP1_IAA_30M_REP1.genes.results"), + path("${params.outdir}/star_rsem/RAP1_IAA_30M_REP1.isoforms.results"), + path("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP1.genes.results"), + path("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP1.isoforms.results"), + path("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP2.genes.results"), + path("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP2.isoforms.results"), + path("${params.outdir}/star_rsem/WT_REP1.genes.results"), + path("${params.outdir}/star_rsem/WT_REP1.isoforms.results"), + path("${params.outdir}/star_rsem/WT_REP2.genes.results"), + path("${params.outdir}/star_rsem/WT_REP2.isoforms.results"), + path("${params.outdir}/star_rsem/rsem.merged.gene_counts.tsv"), + path("${params.outdir}/star_rsem/rsem.merged.gene_tpm.tsv"), + path("${params.outdir}/star_rsem/rsem.merged.transcript_counts.tsv"), + path("${params.outdir}/star_rsem/rsem.merged.transcript_tpm.tsv"), + // These files are not stable + file("${params.outdir}/star_rsem/RAP1_IAA_30M_REP1.stat/RAP1_IAA_30M_REP1.cnt").name, + file("${params.outdir}/star_rsem/RAP1_IAA_30M_REP1.stat/RAP1_IAA_30M_REP1.model").name, + file("${params.outdir}/star_rsem/RAP1_IAA_30M_REP1.stat/RAP1_IAA_30M_REP1.theta").name, + file("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP1.stat/RAP1_UNINDUCED_REP1.cnt").name, + file("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP1.stat/RAP1_UNINDUCED_REP1.model").name, + file("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP1.stat/RAP1_UNINDUCED_REP1.theta").name, + file("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP2.stat/RAP1_UNINDUCED_REP2.cnt").name, + file("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP2.stat/RAP1_UNINDUCED_REP2.model").name, + file("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP2.stat/RAP1_UNINDUCED_REP2.theta").name, + file("${params.outdir}/star_rsem/WT_REP1.stat/WT_REP1.cnt").name, + file("${params.outdir}/star_rsem/WT_REP1.stat/WT_REP1.model").name, + file("${params.outdir}/star_rsem/WT_REP1.stat/WT_REP1.theta").name, + file("${params.outdir}/star_rsem/WT_REP2.stat/WT_REP2.cnt").name, + file("${params.outdir}/star_rsem/WT_REP2.stat/WT_REP2.model").name, + file("${params.outdir}/star_rsem/WT_REP2.stat/WT_REP2.theta").name + ).match("star_rsem/rsem") }, + { assert snapshot( + path("${params.outdir}/star_rsem/rseqc/infer_experiment/RAP1_IAA_30M_REP1.infer_experiment.txt"), + path("${params.outdir}/star_rsem/rseqc/infer_experiment/RAP1_UNINDUCED_REP1.infer_experiment.txt"), + path("${params.outdir}/star_rsem/rseqc/infer_experiment/RAP1_UNINDUCED_REP2.infer_experiment.txt"), + path("${params.outdir}/star_rsem/rseqc/infer_experiment/WT_REP1.infer_experiment.txt"), + path("${params.outdir}/star_rsem/rseqc/infer_experiment/WT_REP2.infer_experiment.txt"), + // PDFs, R scripts and all these files are not stable + file("${params.outdir}/star_rsem/rseqc/bam_stat/RAP1_IAA_30M_REP1.bam_stat.txt").name, + file("${params.outdir}/star_rsem/rseqc/bam_stat/RAP1_UNINDUCED_REP1.bam_stat.txt").name, + file("${params.outdir}/star_rsem/rseqc/bam_stat/RAP1_UNINDUCED_REP2.bam_stat.txt").name, + file("${params.outdir}/star_rsem/rseqc/bam_stat/WT_REP1.bam_stat.txt").name, + file("${params.outdir}/star_rsem/rseqc/bam_stat/WT_REP2.bam_stat.txt").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/pdf/RAP1_IAA_30M_REP1.inner_distance_plot.pdf").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/pdf/WT_REP1.inner_distance_plot.pdf").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/pdf/WT_REP2.inner_distance_plot.pdf").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/rscript/RAP1_IAA_30M_REP1.inner_distance_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/rscript/WT_REP1.inner_distance_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/rscript/WT_REP2.inner_distance_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance.txt").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_freq.txt").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/txt/RAP1_IAA_30M_REP1.inner_distance_mean.txt").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/txt/WT_REP1.inner_distance.txt").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/txt/WT_REP1.inner_distance_freq.txt").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/txt/WT_REP1.inner_distance_mean.txt").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/txt/WT_REP2.inner_distance.txt").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/txt/WT_REP2.inner_distance_freq.txt").name, + file("${params.outdir}/star_rsem/rseqc/inner_distance/txt/WT_REP2.inner_distance_mean.txt").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/bed/RAP1_IAA_30M_REP1.junction.bed").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP1.junction.bed").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.Interact.bed").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/bed/RAP1_UNINDUCED_REP2.junction.bed").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/bed/WT_REP1.junction.Interact.bed").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/bed/WT_REP1.junction.bed").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/bed/WT_REP2.junction.Interact.bed").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/bed/WT_REP2.junction.bed").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/log/RAP1_IAA_30M_REP1.junction_annotation.log").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP1.junction_annotation.log").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/log/RAP1_UNINDUCED_REP2.junction_annotation.log").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/log/WT_REP1.junction_annotation.log").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/log/WT_REP2.junction_annotation.log").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_events.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/pdf/RAP1_IAA_30M_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_events.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_events.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/pdf/RAP1_UNINDUCED_REP2.splice_junction.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/pdf/WT_REP1.splice_events.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/pdf/WT_REP1.splice_junction.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/pdf/WT_REP2.splice_events.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/pdf/WT_REP2.splice_junction.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/rscript/RAP1_IAA_30M_REP1.junction_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP1.junction_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/rscript/RAP1_UNINDUCED_REP2.junction_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/rscript/WT_REP1.junction_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/rscript/WT_REP2.junction_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/xls/RAP1_IAA_30M_REP1.junction.xls").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP1.junction.xls").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/xls/RAP1_UNINDUCED_REP2.junction.xls").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/xls/WT_REP1.junction.xls").name, + file("${params.outdir}/star_rsem/rseqc/junction_annotation/xls/WT_REP2.junction.xls").name, + file("${params.outdir}/star_rsem/rseqc/junction_saturation/pdf/RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_saturation/pdf/RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_saturation/pdf/WT_REP1.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_saturation/pdf/WT_REP2.junctionSaturation_plot.pdf").name, + file("${params.outdir}/star_rsem/rseqc/junction_saturation/rscript/RAP1_IAA_30M_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/junction_saturation/rscript/RAP1_UNINDUCED_REP2.junctionSaturation_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/junction_saturation/rscript/WT_REP1.junctionSaturation_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/junction_saturation/rscript/WT_REP2.junctionSaturation_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/read_distribution/RAP1_IAA_30M_REP1.read_distribution.txt").name, + file("${params.outdir}/star_rsem/rseqc/read_distribution/RAP1_UNINDUCED_REP1.read_distribution.txt").name, + file("${params.outdir}/star_rsem/rseqc/read_distribution/RAP1_UNINDUCED_REP2.read_distribution.txt").name, + file("${params.outdir}/star_rsem/rseqc/read_distribution/WT_REP1.read_distribution.txt").name, + file("${params.outdir}/star_rsem/rseqc/read_distribution/WT_REP2.read_distribution.txt").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/pdf/RAP1_IAA_30M_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/pdf/RAP1_UNINDUCED_REP2.DupRate_plot.pdf").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/pdf/WT_REP1.DupRate_plot.pdf").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/pdf/WT_REP2.DupRate_plot.pdf").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/rscript/RAP1_IAA_30M_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/rscript/RAP1_UNINDUCED_REP2.DupRate_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/rscript/WT_REP1.DupRate_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/rscript/WT_REP2.DupRate_plot.r").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/xls/RAP1_IAA_30M_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.pos.DupRate.xls").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/xls/RAP1_UNINDUCED_REP2.seq.DupRate.xls").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/xls/WT_REP1.pos.DupRate.xls").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/xls/WT_REP1.seq.DupRate.xls").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/xls/WT_REP2.pos.DupRate.xls").name, + file("${params.outdir}/star_rsem/rseqc/read_duplication/xls/WT_REP2.seq.DupRate.xls").name + ).match("star_rsem/rseqc") }, + { assert snapshot( + // These files are not stable + file("${params.outdir}/star_rsem/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_IAA_30M_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_IAA_30M_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_UNINDUCED_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_rsem/samtools_stats/RAP1_UNINDUCED_REP2.sorted.bam.stats").name, + file("${params.outdir}/star_rsem/samtools_stats/WT_REP1.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_rsem/samtools_stats/WT_REP1.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_rsem/samtools_stats/WT_REP1.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_rsem/samtools_stats/WT_REP1.sorted.bam.flagstat").name, + file("${params.outdir}/star_rsem/samtools_stats/WT_REP1.sorted.bam.idxstats").name, + file("${params.outdir}/star_rsem/samtools_stats/WT_REP1.sorted.bam.stats").name, + file("${params.outdir}/star_rsem/samtools_stats/WT_REP2.markdup.sorted.bam.flagstat").name, + file("${params.outdir}/star_rsem/samtools_stats/WT_REP2.markdup.sorted.bam.idxstats").name, + file("${params.outdir}/star_rsem/samtools_stats/WT_REP2.markdup.sorted.bam.stats").name, + file("${params.outdir}/star_rsem/samtools_stats/WT_REP2.sorted.bam.flagstat").name, + file("${params.outdir}/star_rsem/samtools_stats/WT_REP2.sorted.bam.idxstats").name, + file("${params.outdir}/star_rsem/samtools_stats/WT_REP2.sorted.bam.stats").name + ).match("star_rsem/samtools_stats") }, + { assert snapshot( + path("${params.outdir}/star_rsem/stringtie/RAP1_IAA_30M_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_rsem/stringtie/RAP1_IAA_30M_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_rsem/stringtie/RAP1_IAA_30M_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_rsem/stringtie/RAP1_IAA_30M_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP2.ballgown/i_data.ctab"), + path("${params.outdir}/star_rsem/stringtie/WT_REP1.ballgown/e2t.ctab"), + path("${params.outdir}/star_rsem/stringtie/WT_REP1.ballgown/e_data.ctab"), + path("${params.outdir}/star_rsem/stringtie/WT_REP1.ballgown/i2t.ctab"), + path("${params.outdir}/star_rsem/stringtie/WT_REP1.ballgown/i_data.ctab"), + path("${params.outdir}/star_rsem/stringtie/WT_REP2.ballgown/e2t.ctab"), + path("${params.outdir}/star_rsem/stringtie/WT_REP2.ballgown/e_data.ctab"), + path("${params.outdir}/star_rsem/stringtie/WT_REP2.ballgown/i2t.ctab"), + path("${params.outdir}/star_rsem/stringtie/WT_REP2.ballgown/i_data.ctab"), + // These files are not stable + file("${params.outdir}/star_rsem/stringtie/RAP1_IAA_30M_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_rsem/stringtie/RAP1_IAA_30M_REP1.coverage.gtf").name, + file("${params.outdir}/star_rsem/stringtie/RAP1_IAA_30M_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_rsem/stringtie/RAP1_IAA_30M_REP1.transcripts.gtf").name, + file("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP1.coverage.gtf").name, + file("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP1.transcripts.gtf").name, + file("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP2.coverage.gtf").name, + file("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP2.gene.abundance.txt").name, + file("${params.outdir}/star_rsem/stringtie/RAP1_UNINDUCED_REP2.transcripts.gtf").name, + file("${params.outdir}/star_rsem/stringtie/WT_REP1.ballgown/t_data.ctab").name, + file("${params.outdir}/star_rsem/stringtie/WT_REP1.coverage.gtf").name, + file("${params.outdir}/star_rsem/stringtie/WT_REP1.gene.abundance.txt").name, + file("${params.outdir}/star_rsem/stringtie/WT_REP1.transcripts.gtf").name, + file("${params.outdir}/star_rsem/stringtie/WT_REP2.ballgown/t_data.ctab").name, + file("${params.outdir}/star_rsem/stringtie/WT_REP2.coverage.gtf").name, + file("${params.outdir}/star_rsem/stringtie/WT_REP2.gene.abundance.txt").name, + file("${params.outdir}/star_rsem/stringtie/WT_REP2.transcripts.gtf").name + ).match("star_rsem/stringtie") }, + { assert snapshot( + file("${params.outdir}/star_rsem/RAP1_IAA_30M_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_rsem/RAP1_IAA_30M_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP2.markdup.sorted.bam").name, + file("${params.outdir}/star_rsem/RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_rsem/WT_REP1.markdup.sorted.bam").name, + file("${params.outdir}/star_rsem/WT_REP1.markdup.sorted.bam.bai").name, + file("${params.outdir}/star_rsem/WT_REP2.markdup.sorted.bam").name, + file("${params.outdir}/star_rsem/WT_REP2.markdup.sorted.bam.bai").name + ).match("star_rsem/markdup") }, + { assert snapshot( + // These reports are not stable + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match("trimgalore") }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml") + ).match("versions") } + ) + } + } + + test("Params: --aligner star_rsem - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + aligner = 'star_rsem' + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + UTILS.removeNextflowVersion("$outputDir/pipeline_info/nf_core_rnaseq_software_mqc_versions.yml"), + file("${params.outdir}/custom/out/genome_transcriptome.fasta").name, + file("${params.outdir}/custom/out/genome_transcriptome.gtf").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_IAA_30M_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/RAP1_UNINDUCED_REP2_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP1_raw.zip").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.html").name, + file("${params.outdir}/fastqc/raw/WT_REP2_raw.zip").name, + file("${params.outdir}/multiqc/star_rsem/multiqc_report.html").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP1_trimmed_2.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_1.fastq.gz_trimming_report.txt").name, + file("${params.outdir}/trimgalore/WT_REP2_trimmed_2.fastq.gz_trimming_report.txt").name + ).match() } + ) + } + } +} + diff --git a/tests/star_rsem.nf.test.snap b/tests/star_rsem.nf.test.snap new file mode 100644 index 000000000..945d18f11 --- /dev/null +++ b/tests/star_rsem.nf.test.snap @@ -0,0 +1,1029 @@ +{ + "star_rsem/bigwig": { + "content": [ + "RAP1_IAA_30M_REP1.forward.bigWig", + "RAP1_IAA_30M_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP1.forward.bigWig", + "RAP1_UNINDUCED_REP1.reverse.bigWig", + "RAP1_UNINDUCED_REP2.forward.bigWig", + "RAP1_UNINDUCED_REP2.reverse.bigWig", + "WT_REP1.forward.bigWig", + "WT_REP1.reverse.bigWig", + "WT_REP2.forward.bigWig", + "WT_REP2.reverse.bigWig" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:04.845767" + }, + "star_rsem/dupradar": { + "content": [ + "RAP1_IAA_30M_REP1_dupMatrix.txt:md5,8da31020df3c5b25167345609c6d08c5", + "RAP1_UNINDUCED_REP1_dupMatrix.txt:md5,3f269a6b2e9c8eaab66582e31d208dfc", + "RAP1_UNINDUCED_REP2_dupMatrix.txt:md5,7d96d6ddf1d12d43837b105865aeaafa", + "WT_REP1_dupMatrix.txt:md5,802dd0de10d9118943869239f8659c78", + "WT_REP2_dupMatrix.txt:md5,e97a3c8d2e606d7d4b40cd33eb0b96c4", + "RAP1_IAA_30M_REP1_intercept_slope.txt:md5,d280fe126a5e82d24121d8662fd5a161", + "RAP1_UNINDUCED_REP1_intercept_slope.txt:md5,a498640b0f9e710311ebc3eb67cedbd0", + "RAP1_UNINDUCED_REP2_intercept_slope.txt:md5,a1c5346e3bad40546c793b8914a22e7e", + "WT_REP1_intercept_slope.txt:md5,9c2e2b7890427e79c97e65827102d965", + "WT_REP2_intercept_slope.txt:md5,db7a36459f2036de6657e74d2c98a47c", + "RAP1_IAA_30M_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP1_duprateExpBoxplot.pdf", + "RAP1_UNINDUCED_REP2_duprateExpBoxplot.pdf", + "WT_REP1_duprateExpBoxplot.pdf", + "WT_REP2_duprateExpBoxplot.pdf", + "RAP1_IAA_30M_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP1_expressionHist.pdf", + "RAP1_UNINDUCED_REP2_expressionHist.pdf", + "WT_REP1_expressionHist.pdf", + "WT_REP2_expressionHist.pdf", + "RAP1_IAA_30M_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP1_duprateExpDens.pdf", + "RAP1_UNINDUCED_REP2_duprateExpDens.pdf", + "WT_REP1_duprateExpDens.pdf", + "WT_REP2_duprateExpDens.pdf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:05.410414" + }, + "multiqc_data": { + "content": [ + "cutadapt_filtered_reads_plot.txt:md5,bf033e64e9d23bee85b6277f11c663f1", + "cutadapt_trimmed_sequences_plot_3_Counts.txt:md5,13dfa866fd91dbb072689efe9aa83b1f", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt:md5,07145dd8dd3db654859b18eb0389046c", + "fastqc-status-check-heatmap-1.txt:md5,22a03548736b88b23be6bc0c9ef1b4a6", + "fastqc-status-check-heatmap.txt:md5,5a89b0d8d162f6b1dbdaf39457bbc03b", + "fastqc_adapter_content_plot.txt:md5,da0389be84cfdd189b1d045212eb2974", + "fastqc_overrepresented_sequences_plot-1.txt:md5,4adfeacd3a3a6c7c808f121b24e6b247", + "fastqc_overrepresented_sequences_plot.txt:md5,25d88ea8a72f55e8a374ae802bc7f0b1", + "fastqc_per_base_n_content_plot-1.txt:md5,418610c1ce119cb786ad434db75d366e", + "fastqc_per_base_n_content_plot.txt:md5,d368d7e36ca2f73dcde61f2b486d8213", + "fastqc_per_base_sequence_quality_plot-1.txt:md5,bd22e06e41c096ad4f745d40fe96a1e5", + "fastqc_per_base_sequence_quality_plot.txt:md5,5c3065b549129702b185ea1b817da420", + "fastqc_per_sequence_gc_content_plot-1_Counts.txt:md5,004c60768ceb6197765154e3eaa37b7a", + "fastqc_per_sequence_gc_content_plot-1_Percentages.txt:md5,95d29060b687f745288ad1ec47750037", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,9ddaa50167117d3c9188ccf015427704", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,f10ee2881b61308af35f304aa3d810a3", + "fastqc_per_sequence_quality_scores_plot-1.txt:md5,0f9834cc19f76dd5c87cf8cba7435a7c", + "fastqc_per_sequence_quality_scores_plot.txt:md5,b5f9a02933e3065952237afd2ec9ce82", + "fastqc_sequence_counts_plot-1.txt:md5,3861354bbedfbde7ca36a72994f9425c", + "fastqc_sequence_counts_plot.txt:md5,d385a3e2c2573a0902c66e8c93876d3c", + "fastqc_sequence_duplication_levels_plot-1.txt:md5,c73407d55fc532e864fa1dc8dbc12874", + "fastqc_sequence_duplication_levels_plot.txt:md5,8812cee16f6ca65e2c33635754de1772", + "fastqc_sequence_length_distribution_plot.txt:md5,6fe2c985606abad947bcca99b015ae33", + "multiqc_citations.txt:md5,5a68f7972ea275b21b12acdf43447dfb", + "multiqc_cutadapt.txt:md5,aac9581a5670cb55edf564f3d6c1f9a7", + "multiqc_fastqc_fastqc_raw.txt:md5,81c3c1a2575a1891a7f2a9637a0f2cc0", + "multiqc_fastqc_fastqc_trimmed.txt:md5,a3238f515e01d158d875d69968753804", + "multiqc_featurecounts_biotype_plot.txt:md5,27bb37d346e8f0960c882a3676e219e8", + "multiqc_samtools_idxstats.txt:md5,1cbc64fc9713831a6f45effc0cfe6a39", + "picard_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "picard_histogram_2.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "qualimap_gene_coverage_profile_Counts.txt:md5,387c07f2a93e3d13048c4cd788d1fcc3", + "qualimap_gene_coverage_profile_Normalised.txt:md5,35f0b71796622269bc51cf1e7a0650ab", + "qualimap_rnaseq_cov_hist.txt:md5,a620cb9d1878e86e10e87500e98122f1", + "rseqc_infer_experiment_plot.txt:md5,c0ddf72b026cdc54ad03e75eaa636f7e", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt:md5,75acd04232d1804b5f960ee4c5db4722", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt:md5,3e67e07b5c978fa363965e8e90356eef", + "samtools-idxstats-mapped-reads-plot_Raw_Counts.txt:md5,a83e44c5a22e014d377c41419175784c", + "fastqc_top_overrepresented_sequences_table-1.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "junction_saturation_known.txt", + "junction_saturation_novel.txt", + "multiqc_data.json", + "multiqc_dupradar-section-plot.txt", + "multiqc_fail_strand_check_table.txt", + "multiqc_general_stats.txt", + "multiqc_picard_dups.txt", + "picard_deduplication.txt", + "multiqc_rsem.txt", + "multiqc_rseqc_bam_stat.txt", + "multiqc_rseqc_infer_experiment.txt", + "multiqc_rseqc_junction_annotation.txt", + "multiqc_rseqc_read_distribution.txt", + "multiqc_salmon.txt", + "multiqc_salmon_deseq2_clustering-plot.txt", + "multiqc_salmon_deseq2_clustering-plot_1.txt", + "multiqc_salmon_deseq2_clustering-plot_2.txt", + "multiqc_salmon_deseq2_clustering-plot_3.txt", + "multiqc_salmon_deseq2_clustering-plot_4.txt", + "multiqc_salmon_deseq2_pca-plot.txt", + "multiqc_samtools_flagstat.txt", + "multiqc_samtools_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt", + "multiqc_star.txt", + "multiqc_star_rsem_deseq2_clustering-plot.txt", + "multiqc_star_rsem_deseq2_clustering-plot_1.txt", + "multiqc_star_rsem_deseq2_clustering-plot_2.txt", + "multiqc_star_rsem_deseq2_clustering-plot_3.txt", + "multiqc_star_rsem_deseq2_clustering-plot_4.txt", + "multiqc_star_rsem_deseq2_pca-plot.txt", + "qualimap_genomic_origin.txt", + "qualimap_rnaseq_genome_results.txt", + "rsem_assignment_plot.txt", + "rsem_multimapping_rates.txt", + "rseqc_bam_stat.txt", + "rseqc_inner_distance.txt", + "rseqc_inner_distance_plot_Counts.txt", + "rseqc_inner_distance_plot_Percentages.txt", + "rseqc_junction_annotation_junctions_plot_Events.txt", + "rseqc_junction_annotation_junctions_plot_Junctions.txt", + "rseqc_junction_saturation_all.txt", + "rseqc_junction_saturation_plot_All_Junctions.txt", + "rseqc_junction_saturation_plot_Known_Junctions.txt", + "rseqc_junction_saturation_plot_Novel_Junctions.txt", + "rseqc_read_distribution_plot.txt", + "rseqc_read_dups.txt", + "rseqc_read_dups_plot.txt", + "salmon_plot.txt", + "samtools-flagstat-dp_Percentage_of_total.txt", + "samtools-flagstat-dp_Read_counts.txt", + "samtools-stats-dp.txt", + "samtools_alignment_plot.txt", + "star_alignment_plot.txt", + "star_summary_table.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:43:20.562966" + }, + "star_rsem/samtools_stats": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.stats", + "RAP1_IAA_30M_REP1.sorted.bam.flagstat", + "RAP1_IAA_30M_REP1.sorted.bam.idxstats", + "RAP1_IAA_30M_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP1.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP1.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP1.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.stats", + "RAP1_UNINDUCED_REP2.sorted.bam.flagstat", + "RAP1_UNINDUCED_REP2.sorted.bam.idxstats", + "RAP1_UNINDUCED_REP2.sorted.bam.stats", + "WT_REP1.markdup.sorted.bam.flagstat", + "WT_REP1.markdup.sorted.bam.idxstats", + "WT_REP1.markdup.sorted.bam.stats", + "WT_REP1.sorted.bam.flagstat", + "WT_REP1.sorted.bam.idxstats", + "WT_REP1.sorted.bam.stats", + "WT_REP2.markdup.sorted.bam.flagstat", + "WT_REP2.markdup.sorted.bam.idxstats", + "WT_REP2.markdup.sorted.bam.stats", + "WT_REP2.sorted.bam.flagstat", + "WT_REP2.sorted.bam.idxstats", + "WT_REP2.sorted.bam.stats" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:43:21.034611" + }, + "trimgalore": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:06.390067" + }, + "references": { + "content": [ + "genome_gfp.fasta:md5,e23e302af63736a199985a169fdac055", + "genome_gfp.gtf:md5,c98b12c302f15731bfc36bcf297cfe28" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:03.973573" + }, + "star_rsem/markdup": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.bam", + "RAP1_IAA_30M_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam", + "RAP1_UNINDUCED_REP1.markdup.sorted.bam.bai", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam", + "RAP1_UNINDUCED_REP2.markdup.sorted.bam.bai", + "WT_REP1.markdup.sorted.bam", + "WT_REP1.markdup.sorted.bam.bai", + "WT_REP2.markdup.sorted.bam", + "WT_REP2.markdup.sorted.bam.bai" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:06.293983" + }, + "salmon/deseq2_qc": { + "content": [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "deseq2.dds.RData", + "deseq2.pca.vals.txt", + "deseq2.plots.pdf", + "deseq2.sample.dists.txt", + "RAP1_IAA_30M_REP1.txt", + "RAP1_UNINDUCED_REP1.txt", + "RAP1_UNINDUCED_REP2.txt", + "WT_REP1.txt", + "WT_REP2.txt", + "deseq2.size_factors.RData" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:04.305332" + }, + "salmon": { + "content": [ + "tx2gene.tsv:md5,0e2418a69d2eba45097ebffc2f700bfe", + "salmon.merged.gene_counts.SummarizedExperiment.rds", + "salmon.merged.gene_counts.tsv", + "salmon.merged.gene_counts_length_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_length_scaled.tsv", + "salmon.merged.gene_counts_scaled.SummarizedExperiment.rds", + "salmon.merged.gene_counts_scaled.tsv", + "salmon.merged.gene_lengths.tsv", + "salmon.merged.gene_tpm.tsv", + "salmon.merged.transcript_counts.SummarizedExperiment.rds", + "salmon.merged.transcript_counts.tsv", + "salmon.merged.transcript_lengths.tsv", + "salmon.merged.transcript_tpm.tsv" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:04.624383" + }, + "star_rsem/rsem": { + "content": [ + "RAP1_IAA_30M_REP1.genes.results:md5,9f76f2687983812c29b108b1faadbb92", + "RAP1_IAA_30M_REP1.isoforms.results:md5,7e8af74655cfa3533cdd8de305f101a4", + "RAP1_UNINDUCED_REP1.genes.results:md5,0ebfda99b1e92d071d3d8f12f37d25cd", + "RAP1_UNINDUCED_REP1.isoforms.results:md5,5fe29701e388c9ac813ab0e8f02e1e9b", + "RAP1_UNINDUCED_REP2.genes.results:md5,e6bed419600f1bdc30c59f2c2f0beec3", + "RAP1_UNINDUCED_REP2.isoforms.results:md5,35ede7929d359424798d92398d6d9518", + "WT_REP1.genes.results:md5,8cd8c1d87970dbae9983250530a5915d", + "WT_REP1.isoforms.results:md5,993a65e02daecd9457c529d118b6e8ac", + "WT_REP2.genes.results:md5,78387c8f57175756fda9c153790f3d37", + "WT_REP2.isoforms.results:md5,89bd225b6702ec3edbe13d9443fce40f", + "rsem.merged.gene_counts.tsv:md5,47f272199f24af4473c959df2a9149dc", + "rsem.merged.gene_tpm.tsv:md5,a197b2d131dea75a83f9c219c23fb7a0", + "rsem.merged.transcript_counts.tsv:md5,ffc75fd409d75edf5209e8e1af8ec8fc", + "rsem.merged.transcript_tpm.tsv:md5,b836618c69d111edf635ce7244ee85e5", + "RAP1_IAA_30M_REP1.cnt", + "RAP1_IAA_30M_REP1.model", + "RAP1_IAA_30M_REP1.theta", + "RAP1_UNINDUCED_REP1.cnt", + "RAP1_UNINDUCED_REP1.model", + "RAP1_UNINDUCED_REP1.theta", + "RAP1_UNINDUCED_REP2.cnt", + "RAP1_UNINDUCED_REP2.model", + "RAP1_UNINDUCED_REP2.theta", + "WT_REP1.cnt", + "WT_REP1.model", + "WT_REP1.theta", + "WT_REP2.cnt", + "WT_REP2.model", + "WT_REP2.theta" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:43:20.906583" + }, + "star_rsem/stringtie": { + "content": [ + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,5dfd0678eefe33f2c45eea45f6262557", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,19a438db88bdb92228e64a0a8350adbd", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,a02dec82f07185700cc237e617ecc809", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,addcf0f6836e0f81184d5ddaa525895f", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,5354c397909a72a25607c550170e2874", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,389b41d0123509f18af9da9bb2e626cd", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,282685569dc501a8769c98c0c2885378", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,daedcbf428f3912587722da1c5db50d1", + "e2t.ctab:md5,54dd6de2daa90e973f47524a738a3d69", + "e_data.ctab:md5,49e5912dedb709344c7a14b5980c1b40", + "i2t.ctab:md5,dda3d3ccd7d4184d947c654ae73efb7b", + "i_data.ctab:md5,7e81ace0a68bfe42482420b7275de195", + "t_data.ctab", + "RAP1_IAA_30M_REP1.coverage.gtf", + "RAP1_IAA_30M_REP1.gene.abundance.txt", + "RAP1_IAA_30M_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP1.coverage.gtf", + "RAP1_UNINDUCED_REP1.gene.abundance.txt", + "RAP1_UNINDUCED_REP1.transcripts.gtf", + "t_data.ctab", + "RAP1_UNINDUCED_REP2.coverage.gtf", + "RAP1_UNINDUCED_REP2.gene.abundance.txt", + "RAP1_UNINDUCED_REP2.transcripts.gtf", + "t_data.ctab", + "WT_REP1.coverage.gtf", + "WT_REP1.gene.abundance.txt", + "WT_REP1.transcripts.gtf", + "t_data.ctab", + "WT_REP2.coverage.gtf", + "WT_REP2.gene.abundance.txt", + "WT_REP2.transcripts.gtf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:06.2015" + }, + "multiqc_plots": { + "content": [ + "cutadapt_filtered_reads_plot-cnt.png:md5,704cf0d91bfa3dd658dd8c9590f669a2", + "cutadapt_filtered_reads_plot-pct.png:md5,2684d8b2afca3300e5786486b80237f0", + "cutadapt_trimmed_sequences_plot_3_Counts.png:md5,bef41d894629b0c4dab4478bbf197f50", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.png:md5,1e0d01537d3797623d0b3fd8fbe42787", + "dupradar-section-plot.png:md5,f76a34d2eb6f2351729d79efc1434ee8", + "fastqc-status-check-heatmap-1.png:md5,2402522f8c02e12aea9af088c6595890", + "fastqc-status-check-heatmap.png:md5,fe8b5b4ab4480d46a12a9005932a9b84", + "fastqc_overrepresented_sequences_plot-1.png:md5,40e450251b80ec0efc9364434234ec7f", + "fastqc_overrepresented_sequences_plot.png:md5,6f5ffbdf1bf61fabe5e028c8bc85de14", + "fastqc_per_sequence_gc_content_plot-1_Counts.png:md5,8a806cec2142f9911502e0a253d83d13", + "fastqc_per_sequence_gc_content_plot-1_Percentages.png:md5,953929d50c8490029880e205e4db7959", + "fastqc_per_sequence_gc_content_plot_Counts.png:md5,01f124545af788fd5cc7bbf41b005e16", + "fastqc_per_sequence_gc_content_plot_Percentages.png:md5,eba3abf8bedb2cb20bad90c54e9c8881", + "fastqc_per_sequence_quality_scores_plot-1.png:md5,d2c29cae169f35744500c751b4a7366e", + "fastqc_per_sequence_quality_scores_plot.png:md5,42fd7369a8aca78f620164a9e887c3cb", + "fastqc_sequence_counts_plot-1-cnt.png:md5,2874fea747c7ff46828bf4f17668caf8", + "fastqc_sequence_counts_plot-1-pct.png:md5,0022d7f5ac78b6eff157de24e37c5ab0", + "fastqc_sequence_counts_plot-cnt.png:md5,3890d5555f2a39b46b9f6efb14cb91f2", + "fastqc_sequence_counts_plot-pct.png:md5,55fa5838c8b2db978fcfa5cb83f6b054", + "fastqc_sequence_duplication_levels_plot-1.png:md5,fcd3b1ec2b95fe4bcd607dc28179a754", + "fastqc_sequence_duplication_levels_plot.png:md5,747431f0f38f8e4c41a11a072fa18780", + "featurecounts_biotype_plot-cnt.png:md5,b033cedf28f1b3f6f48f1ed793160679", + "featurecounts_biotype_plot-pct.png:md5,1921c3931d871f8326a6a6c5c8278815", + "qualimap_gene_coverage_profile_Counts.png:md5,04a262d5af169d6d771e48555adab37e", + "qualimap_gene_coverage_profile_Normalised.png:md5,3bddc4f2a7d462996628e33daf490247", + "rsem_multimapping_rates.png:md5,e93d35b86e1be681eae9b6ad19e12350", + "rseqc_infer_experiment_plot.png:md5,1a3a792e9a6e0c0f93c082594b24e566", + "rseqc_read_dups_plot.png:md5,b79c01ce4697ebb7e0ebb4a3da5b44f7", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png:md5,ce6abb232fd5b5f2e66c0fe9a571d75f", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png:md5,6b44818f886ef020fb3646f152ad4af6", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png:md5,62aceda4b51ad1ae066f761de3d70d53", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png:md5,10d7c1023bcf922ac45e653a58ee13c8", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png:md5,2edc4372d981aacfceb4f16da598d63a", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png:md5,5d2286a4f77000c199ed22517338da4a", + "multiqc_report.html", + "cutadapt_filtered_reads_plot-cnt.pdf", + "cutadapt_filtered_reads_plot-pct.pdf", + "cutadapt_trimmed_sequences_plot_3_Counts.pdf", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.pdf", + "dupradar-section-plot.pdf", + "fail_strand_check_table.pdf", + "fastqc-status-check-heatmap-1.pdf", + "fastqc-status-check-heatmap.pdf", + "fastqc_adapter_content_plot.pdf", + "fastqc_overrepresented_sequences_plot-1.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot-1.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot-1.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot-1_Counts.pdf", + "fastqc_per_sequence_gc_content_plot-1_Percentages.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot-1.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-1-cnt.pdf", + "fastqc_sequence_counts_plot-1-pct.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot-1.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table-1.pdf", + "fastqc_top_overrepresented_sequences_table.pdf", + "featurecounts_biotype_plot-cnt.pdf", + "featurecounts_biotype_plot-pct.pdf", + "general_stats_table.pdf", + "picard_deduplication-cnt.pdf", + "picard_deduplication-pct.pdf", + "qualimap_gene_coverage_profile_Counts.pdf", + "qualimap_gene_coverage_profile_Normalised.pdf", + "qualimap_genomic_origin-cnt.pdf", + "qualimap_genomic_origin-pct.pdf", + "rsem_assignment_plot-cnt.pdf", + "rsem_assignment_plot-pct.pdf", + "rsem_multimapping_rates.pdf", + "rseqc_bam_stat.pdf", + "rseqc_infer_experiment_plot.pdf", + "rseqc_inner_distance_plot_Counts.pdf", + "rseqc_inner_distance_plot_Percentages.pdf", + "rseqc_junction_annotation_junctions_plot_Events-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Events-pct.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.pdf", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.pdf", + "rseqc_junction_saturation_plot_All_Junctions.pdf", + "rseqc_junction_saturation_plot_Known_Junctions.pdf", + "rseqc_junction_saturation_plot_Novel_Junctions.pdf", + "rseqc_read_distribution_plot-cnt.pdf", + "rseqc_read_distribution_plot-pct.pdf", + "rseqc_read_dups_plot.pdf", + "salmon_deseq2_clustering-plot.pdf", + "salmon_deseq2_pca-plot.pdf", + "salmon_plot.pdf", + "samtools-flagstat-dp_Percentage_of_total.pdf", + "samtools-flagstat-dp_Read_counts.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", + "samtools-stats-dp.pdf", + "samtools_alignment_plot-cnt.pdf", + "samtools_alignment_plot-pct.pdf", + "star_alignment_plot-cnt.pdf", + "star_alignment_plot-pct.pdf", + "star_rsem_deseq2_clustering-plot.pdf", + "star_rsem_deseq2_pca-plot.pdf", + "star_summary_table.pdf", + "fail_strand_check_table.png", + "fastqc_adapter_content_plot.png", + "fastqc_per_base_n_content_plot-1.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot-1.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table-1.png", + "fastqc_top_overrepresented_sequences_table.png", + "general_stats_table.png", + "picard_deduplication-cnt.png", + "picard_deduplication-pct.png", + "qualimap_genomic_origin-cnt.png", + "qualimap_genomic_origin-pct.png", + "rsem_assignment_plot-cnt.png", + "rsem_assignment_plot-pct.png", + "rseqc_bam_stat.png", + "rseqc_inner_distance_plot_Counts.png", + "rseqc_inner_distance_plot_Percentages.png", + "rseqc_junction_annotation_junctions_plot_Events-cnt.png", + "rseqc_junction_annotation_junctions_plot_Events-pct.png", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.png", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.png", + "rseqc_junction_saturation_plot_All_Junctions.png", + "rseqc_junction_saturation_plot_Known_Junctions.png", + "rseqc_junction_saturation_plot_Novel_Junctions.png", + "rseqc_read_distribution_plot-cnt.png", + "rseqc_read_distribution_plot-pct.png", + "salmon_deseq2_clustering-plot.png", + "salmon_deseq2_pca-plot.png", + "salmon_plot.png", + "samtools-flagstat-dp_Percentage_of_total.png", + "samtools-flagstat-dp_Read_counts.png", + "samtools-stats-dp.png", + "samtools_alignment_plot-cnt.png", + "samtools_alignment_plot-pct.png", + "star_alignment_plot-cnt.png", + "star_alignment_plot-pct.png", + "star_rsem_deseq2_clustering-plot.png", + "star_rsem_deseq2_pca-plot.png", + "star_summary_table.png", + "cutadapt_filtered_reads_plot-cnt.svg", + "cutadapt_filtered_reads_plot-pct.svg", + "cutadapt_trimmed_sequences_plot_3_Counts.svg", + "cutadapt_trimmed_sequences_plot_3_Obs_Exp.svg", + "dupradar-section-plot.svg", + "fail_strand_check_table.svg", + "fastqc-status-check-heatmap-1.svg", + "fastqc-status-check-heatmap.svg", + "fastqc_adapter_content_plot.svg", + "fastqc_overrepresented_sequences_plot-1.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot-1.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot-1.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot-1_Counts.svg", + "fastqc_per_sequence_gc_content_plot-1_Percentages.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot-1.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-1-cnt.svg", + "fastqc_sequence_counts_plot-1-pct.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot-1.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table-1.svg", + "fastqc_top_overrepresented_sequences_table.svg", + "featurecounts_biotype_plot-cnt.svg", + "featurecounts_biotype_plot-pct.svg", + "general_stats_table.svg", + "picard_deduplication-cnt.svg", + "picard_deduplication-pct.svg", + "qualimap_gene_coverage_profile_Counts.svg", + "qualimap_gene_coverage_profile_Normalised.svg", + "qualimap_genomic_origin-cnt.svg", + "qualimap_genomic_origin-pct.svg", + "rsem_assignment_plot-cnt.svg", + "rsem_assignment_plot-pct.svg", + "rsem_multimapping_rates.svg", + "rseqc_bam_stat.svg", + "rseqc_infer_experiment_plot.svg", + "rseqc_inner_distance_plot_Counts.svg", + "rseqc_inner_distance_plot_Percentages.svg", + "rseqc_junction_annotation_junctions_plot_Events-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Events-pct.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-cnt.svg", + "rseqc_junction_annotation_junctions_plot_Junctions-pct.svg", + "rseqc_junction_saturation_plot_All_Junctions.svg", + "rseqc_junction_saturation_plot_Known_Junctions.svg", + "rseqc_junction_saturation_plot_Novel_Junctions.svg", + "rseqc_read_distribution_plot-cnt.svg", + "rseqc_read_distribution_plot-pct.svg", + "rseqc_read_dups_plot.svg", + "salmon_deseq2_clustering-plot.svg", + "salmon_deseq2_pca-plot.svg", + "salmon_plot.svg", + "samtools-flagstat-dp_Percentage_of_total.svg", + "samtools-flagstat-dp_Read_counts.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", + "samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", + "samtools-stats-dp.svg", + "samtools_alignment_plot-cnt.svg", + "samtools_alignment_plot-pct.svg", + "star_alignment_plot-cnt.svg", + "star_alignment_plot-pct.svg", + "star_rsem_deseq2_clustering-plot.svg", + "star_rsem_deseq2_pca-plot.svg", + "star_summary_table.svg" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:43:20.672077" + }, + "star_rsem/picard_metrics": { + "content": [ + "RAP1_IAA_30M_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "RAP1_UNINDUCED_REP2.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP1.markdup.sorted.MarkDuplicates.metrics.txt", + "WT_REP2.markdup.sorted.MarkDuplicates.metrics.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:05.82482" + }, + "fastqc/raw": { + "content": [ + "RAP1_IAA_30M_REP1_raw_1_fastqc.html", + "RAP1_IAA_30M_REP1_raw_1_fastqc.zip", + "RAP1_IAA_30M_REP1_raw_2_fastqc.html", + "RAP1_IAA_30M_REP1_raw_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_raw_fastqc.html", + "RAP1_UNINDUCED_REP1_raw_fastqc.zip", + "RAP1_UNINDUCED_REP2_raw_fastqc.html", + "RAP1_UNINDUCED_REP2_raw_fastqc.zip", + "WT_REP1_raw_1_fastqc.html", + "WT_REP1_raw_1_fastqc.zip", + "WT_REP1_raw_2_fastqc.html", + "WT_REP1_raw_2_fastqc.zip", + "WT_REP2_raw_1_fastqc.html", + "WT_REP2_raw_1_fastqc.zip", + "WT_REP2_raw_2_fastqc.html", + "WT_REP2_raw_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:03.993021" + }, + "star_rsem/rseqc": { + "content": [ + "RAP1_IAA_30M_REP1.infer_experiment.txt:md5,1f31ddae1f98e779e30d846cde3834de", + "RAP1_UNINDUCED_REP1.infer_experiment.txt:md5,a2a8e31dbd0ebd0c12f3f968ffd5391b", + "RAP1_UNINDUCED_REP2.infer_experiment.txt:md5,9ec058d3a4162fd1b4c6175e2106eef4", + "WT_REP1.infer_experiment.txt:md5,d55921c0084806cdf49b9bd8653c8e09", + "WT_REP2.infer_experiment.txt:md5,fe87600c55f433ba995fe18bed5cf5f1", + "RAP1_IAA_30M_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP1.bam_stat.txt", + "RAP1_UNINDUCED_REP2.bam_stat.txt", + "WT_REP1.bam_stat.txt", + "WT_REP2.bam_stat.txt", + "RAP1_IAA_30M_REP1.inner_distance_plot.pdf", + "WT_REP1.inner_distance_plot.pdf", + "WT_REP2.inner_distance_plot.pdf", + "RAP1_IAA_30M_REP1.inner_distance_plot.r", + "WT_REP1.inner_distance_plot.r", + "WT_REP2.inner_distance_plot.r", + "RAP1_IAA_30M_REP1.inner_distance.txt", + "RAP1_IAA_30M_REP1.inner_distance_freq.txt", + "RAP1_IAA_30M_REP1.inner_distance_mean.txt", + "WT_REP1.inner_distance.txt", + "WT_REP1.inner_distance_freq.txt", + "WT_REP1.inner_distance_mean.txt", + "WT_REP2.inner_distance.txt", + "WT_REP2.inner_distance_freq.txt", + "WT_REP2.inner_distance_mean.txt", + "RAP1_IAA_30M_REP1.junction.Interact.bed", + "RAP1_IAA_30M_REP1.junction.bed", + "RAP1_UNINDUCED_REP1.junction.Interact.bed", + "RAP1_UNINDUCED_REP1.junction.bed", + "RAP1_UNINDUCED_REP2.junction.Interact.bed", + "RAP1_UNINDUCED_REP2.junction.bed", + "WT_REP1.junction.Interact.bed", + "WT_REP1.junction.bed", + "WT_REP2.junction.Interact.bed", + "WT_REP2.junction.bed", + "RAP1_IAA_30M_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP1.junction_annotation.log", + "RAP1_UNINDUCED_REP2.junction_annotation.log", + "WT_REP1.junction_annotation.log", + "WT_REP2.junction_annotation.log", + "RAP1_IAA_30M_REP1.splice_events.pdf", + "RAP1_IAA_30M_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP1.splice_events.pdf", + "RAP1_UNINDUCED_REP1.splice_junction.pdf", + "RAP1_UNINDUCED_REP2.splice_events.pdf", + "RAP1_UNINDUCED_REP2.splice_junction.pdf", + "WT_REP1.splice_events.pdf", + "WT_REP1.splice_junction.pdf", + "WT_REP2.splice_events.pdf", + "WT_REP2.splice_junction.pdf", + "RAP1_IAA_30M_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP1.junction_plot.r", + "RAP1_UNINDUCED_REP2.junction_plot.r", + "WT_REP1.junction_plot.r", + "WT_REP2.junction_plot.r", + "RAP1_IAA_30M_REP1.junction.xls", + "RAP1_UNINDUCED_REP1.junction.xls", + "RAP1_UNINDUCED_REP2.junction.xls", + "WT_REP1.junction.xls", + "WT_REP2.junction.xls", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.pdf", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.pdf", + "WT_REP1.junctionSaturation_plot.pdf", + "WT_REP2.junctionSaturation_plot.pdf", + "RAP1_IAA_30M_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP1.junctionSaturation_plot.r", + "RAP1_UNINDUCED_REP2.junctionSaturation_plot.r", + "WT_REP1.junctionSaturation_plot.r", + "WT_REP2.junctionSaturation_plot.r", + "RAP1_IAA_30M_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP1.read_distribution.txt", + "RAP1_UNINDUCED_REP2.read_distribution.txt", + "WT_REP1.read_distribution.txt", + "WT_REP2.read_distribution.txt", + "RAP1_IAA_30M_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP1.DupRate_plot.pdf", + "RAP1_UNINDUCED_REP2.DupRate_plot.pdf", + "WT_REP1.DupRate_plot.pdf", + "WT_REP2.DupRate_plot.pdf", + "RAP1_IAA_30M_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP1.DupRate_plot.r", + "RAP1_UNINDUCED_REP2.DupRate_plot.r", + "WT_REP1.DupRate_plot.r", + "WT_REP2.DupRate_plot.r", + "RAP1_IAA_30M_REP1.pos.DupRate.xls", + "RAP1_IAA_30M_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP1.pos.DupRate.xls", + "RAP1_UNINDUCED_REP1.seq.DupRate.xls", + "RAP1_UNINDUCED_REP2.pos.DupRate.xls", + "RAP1_UNINDUCED_REP2.seq.DupRate.xls", + "WT_REP1.pos.DupRate.xls", + "WT_REP1.seq.DupRate.xls", + "WT_REP2.pos.DupRate.xls", + "WT_REP2.seq.DupRate.xls" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:06.004848" + }, + "star_rsem/log": { + "content": [ + "RAP1_IAA_30M_REP1.log", + "RAP1_UNINDUCED_REP1.log", + "RAP1_UNINDUCED_REP2.log", + "WT_REP1.log", + "WT_REP2.log" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T19:43:20.787774" + }, + "Params: --aligner star_rsem - stub": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=null}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, FASTQC={fastqc=0.12.1}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, UNTAR_RSEM_INDEX={untar=1.34}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}", + "genome_transcriptome.fasta", + "genome_transcriptome.gtf", + "RAP1_IAA_30M_REP1_raw.html", + "RAP1_IAA_30M_REP1_raw.zip", + "RAP1_UNINDUCED_REP1_raw.html", + "RAP1_UNINDUCED_REP1_raw.zip", + "RAP1_UNINDUCED_REP2_raw.html", + "RAP1_UNINDUCED_REP2_raw.zip", + "WT_REP1_raw.html", + "WT_REP1_raw.zip", + "WT_REP2_raw.html", + "WT_REP2_raw.zip", + "multiqc_report.html", + "RAP1_IAA_30M_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "RAP1_IAA_30M_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP1_trimmed.fastq.gz_trimming_report.txt", + "RAP1_UNINDUCED_REP2_trimmed.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP1_trimmed_2.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_1.fastq.gz_trimming_report.txt", + "WT_REP2_trimmed_2.fastq.gz_trimming_report.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:26:18.851648" + }, + "versions": { + "content": [ + "{BBMAP_BBSPLIT={bbmap=39.01}, BEDTOOLS_GENOMECOV_FW={bedtools=2.31.1}, CAT_FASTQ={cat=8.3}, CUSTOM_CATADDITIONALFASTA={python=3.9.5}, CUSTOM_GETCHROMSIZES={getchromsizes=1.2}, CUSTOM_TX2GENE={python=3.9.5}, DESEQ2_QC_PSEUDO={r-base=4.0.3, bioconductor-deseq2=1.28.0}, DESEQ2_QC_RSEM={r-base=4.0.3, bioconductor-deseq2=1.28.0}, DUPRADAR={bioconductor-dupradar=1.32.0}, FASTQC={fastqc=0.12.1}, FQ_SUBSAMPLE={fq=0.9.1 (2022-02-22)}, GTF2BED={perl=5.26.2}, GTF_FILTER={python=3.9.5}, GUNZIP_ADDITIONAL_FASTA={gunzip=1.1}, GUNZIP_GTF={gunzip=1.1}, MULTIQC_CUSTOM_BIOTYPE={python=3.9.5}, PICARD_MARKDUPLICATES={picard=3.1.1}, QUALIMAP_RNASEQ={qualimap=2.3}, RSEM_CALCULATEEXPRESSION={rsem=1.3.1, star=2.7.10a}, RSEM_MERGE_COUNTS={sed=4.7}, RSEQC_BAMSTAT={rseqc=5.0.2}, RSEQC_INFEREXPERIMENT={rseqc=5.0.2}, RSEQC_INNERDISTANCE={rseqc=5.0.2}, RSEQC_JUNCTIONANNOTATION={rseqc=5.0.2}, RSEQC_JUNCTIONSATURATION={rseqc=5.0.2}, RSEQC_READDISTRIBUTION={rseqc=5.0.2}, RSEQC_READDUPLICATION={rseqc=5.0.2}, SALMON_QUANT={salmon=1.10.1}, SAMTOOLS_FLAGSTAT={samtools=1.2}, SAMTOOLS_IDXSTATS={samtools=1.2}, SAMTOOLS_INDEX={samtools=1.2}, SAMTOOLS_SORT={samtools=1.2}, SAMTOOLS_STATS={samtools=1.2}, SE_GENE={bioconductor-summarizedexperiment=1.32.0}, STRINGTIE_STRINGTIE={stringtie=2.2.1}, SUBREAD_FEATURECOUNTS={subread=2.0.1}, TRIMGALORE={trimgalore=0.6.7, cutadapt=3.4}, TXIMETA_TXIMPORT={bioconductor-tximeta=1.20.1}, UCSC_BEDCLIP={ucsc=377}, UCSC_BEDGRAPHTOBIGWIG={ucsc=445}, UNTAR_RSEM_INDEX={untar=1.34}, UNTAR_SALMON_INDEX={untar=1.34}, Workflow={nf-core/rnaseq=v3.15.0}}" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:06.704746" + }, + "fastqc/trim": { + "content": [ + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_1_val_1_fastqc.zip", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.html", + "RAP1_IAA_30M_REP1_trimmed_2_val_2_fastqc.zip", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP1_trimmed_trimmed_fastqc.zip", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.html", + "RAP1_UNINDUCED_REP2_trimmed_trimmed_fastqc.zip", + "WT_REP1_trimmed_1_val_1_fastqc.html", + "WT_REP1_trimmed_1_val_1_fastqc.zip", + "WT_REP1_trimmed_2_val_2_fastqc.html", + "WT_REP1_trimmed_2_val_2_fastqc.zip", + "WT_REP2_trimmed_1_val_1_fastqc.html", + "WT_REP2_trimmed_1_val_1_fastqc.zip", + "WT_REP2_trimmed_2_val_2_fastqc.html", + "WT_REP2_trimmed_2_val_2_fastqc.zip" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:04.017077" + }, + "star_rsem/featurecounts": { + "content": [ + "RAP1_IAA_30M_REP1.biotype_counts_mqc.tsv:md5,e66cd2b584d970ae3827ad2521f795ca", + "RAP1_IAA_30M_REP1.biotype_counts_rrna_mqc.tsv:md5,dde2de0cb90e10d0195c726f768e9941", + "RAP1_IAA_30M_REP1.featureCounts.txt:md5,b3013c797d2fd38a8efa39047f5ba1b1", + "RAP1_UNINDUCED_REP1.biotype_counts_mqc.tsv:md5,548023e639f8eb76f973a2f98bcbc82c", + "RAP1_UNINDUCED_REP1.biotype_counts_rrna_mqc.tsv:md5,845ff9059c72bc6722a8de69776e22bb", + "RAP1_UNINDUCED_REP1.featureCounts.txt:md5,ff59317794fc04d5a4fd18797f0ecb0f", + "RAP1_UNINDUCED_REP2.biotype_counts_mqc.tsv:md5,2c0b5696582493f7a50259679982a6b3", + "RAP1_UNINDUCED_REP2.biotype_counts_rrna_mqc.tsv:md5,6d3fa4c88c7fe61f638e4624ad5e22f0", + "RAP1_UNINDUCED_REP2.featureCounts.txt:md5,6ee84531ba255791a11b487b6aea75ab", + "WT_REP1.biotype_counts_mqc.tsv:md5,512645a8f736eee160c4465e1940f4a5", + "WT_REP1.biotype_counts_rrna_mqc.tsv:md5,8ef76d717492ca23764938aee8ea33a9", + "WT_REP1.featureCounts.txt:md5,289cc95971a3ec550e018659279c1f59", + "WT_REP2.biotype_counts_mqc.tsv:md5,d4957c0197636b68d27fbd60d388bba1", + "WT_REP2.biotype_counts_rrna_mqc.tsv:md5,12294618fe44df1e7f39348372dcb481", + "WT_REP2.featureCounts.txt:md5,152d2f26df56a88fe4b27c742d8f7447", + "RAP1_IAA_30M_REP1.featureCounts.txt.summary", + "RAP1_UNINDUCED_REP1.featureCounts.txt.summary", + "RAP1_UNINDUCED_REP2.featureCounts.txt.summary", + "WT_REP1.featureCounts.txt.summary", + "WT_REP2.featureCounts.txt.summary" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:05.539329" + }, + "star_rsem/deseq2_qc": { + "content": [ + "R_sessionInfo.log:md5,fb0da0d7ad6994ed66a8e68348b19676", + "RAP1_IAA_30M_REP1.txt", + "RAP1_UNINDUCED_REP1.txt", + "RAP1_UNINDUCED_REP2.txt", + "WT_REP1.txt", + "WT_REP2.txt", + "deseq2.size_factors.RData", + "deseq2.dds.RData", + "deseq2.pca.vals.txt", + "deseq2.plots.pdf", + "deseq2.sample.dists.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:05.195993" + }, + "bbsplit": { + "content": [ + "RAP1_IAA_30M_REP1.stats.txt", + "RAP1_UNINDUCED_REP1.stats.txt", + "RAP1_UNINDUCED_REP2.stats.txt", + "WT_REP1.stats.txt", + "WT_REP2.stats.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:03.953274" + }, + "salmon_quant": { + "content": [ + "ambig_info.tsv:md5,de973a4b22a4457217ae3dc04caf9401", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,1215f0c20f87d3aef8553ef119e1e74c", + "lib_format_counts.json:md5,c24ffe28d70476b5ccdd8bc2d22c0ac1", + "ambig_info.tsv:md5,45f252b4f0e11e6730cf0c29f800fdbb", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,621c6601aade5b1f2e3d6ca2fc71f636", + "lib_format_counts.json:md5,f6d44c0221f7fd559f11a9afe04c9935", + "ambig_info.tsv:md5,6dcc2891ea572e9b8d1ba52cd434ab84", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,9bed6e4dc5428d6f6297adcea29a6326", + "lib_format_counts.json:md5,7c562bf2f70e42f3a7292687dfd328c3", + "ambig_info.tsv:md5,194f574e0586416155e3f33d42e2b167", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,c7ed0aaa5d6c7934ddbebfd29e4eb86d", + "lib_format_counts.json:md5,d46250bb3677d72feeefc435fe6395a6", + "ambig_info.tsv:md5,a26e3f936e65d7da66392603c2f91f6f", + "expected_bias.gz:md5,3407f87245d0003e0ffbfdf6d8c04f20", + "observed_bias.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "observed_bias_3p.gz:md5,92bcd0592d22a6a58d0360fc76103e56", + "cmd_info.json:md5,69ebfc2c7ca6b221a0a22fa1dc8c20ac", + "lib_format_counts.json:md5,088fd51db07022ffde47033bbd029400", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf", + "fld.gz", + "meta_info.json", + "flenDist.txt", + "salmon_quant.log", + "quant.genes.sf", + "quant.sf" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:04.459744" + }, + "star_rsem/qualimap": { + "content": [ + "Coverage Profile Along Genes (High).png:md5,55ed67cd9df6d42446a76f49f6e9d6c0", + "Coverage Profile Along Genes (Low).png:md5,cc6887aedf7b0ce65af934849ada52f7", + "Coverage Profile Along Genes (Total).png:md5,ebb7199f5b5c179b3d0ad66b1833d5f0", + "Transcript coverage histogram.png:md5,db451ddb02fa59b2e46a3b7f936dc7e4", + "coverage_profile_along_genes_(high).txt:md5,31ab137e75752225365bd3d89143dbd2", + "coverage_profile_along_genes_(low).txt:md5,eaceda909bf652b8301fa0ed1bba9ae1", + "coverage_profile_along_genes_(total).txt:md5,eaceda909bf652b8301fa0ed1bba9ae1", + "Coverage Profile Along Genes (High).png:md5,36376d7393575a03f6e7a1c5be4f8c32", + "Coverage Profile Along Genes (Low).png:md5,24e1862606452bc53f928ccf086e3699", + "Coverage Profile Along Genes (Total).png:md5,c843e9063c3b15e4de1c0b3f680746a9", + "Transcript coverage histogram.png:md5,519b1b92340d1541d864e56b9a6956e0", + "coverage_profile_along_genes_(high).txt:md5,93822686a53dd40d3ff426ddbfc9314e", + "coverage_profile_along_genes_(low).txt:md5,bd8d58c757e4122caee4b4e8df2f4b00", + "coverage_profile_along_genes_(total).txt:md5,bd8d58c757e4122caee4b4e8df2f4b00", + "Coverage Profile Along Genes (High).png:md5,69dfa9f3eeac16a5615a4346c1d79eab", + "Coverage Profile Along Genes (Low).png:md5,84776e58e5aadee6be3b6225beccd70f", + "Coverage Profile Along Genes (Total).png:md5,2c0ddb2c5004d2f7a65e4814281a0836", + "Transcript coverage histogram.png:md5,2553413f136898302067b0a289f58241", + "coverage_profile_along_genes_(high).txt:md5,cdb2c00c43121e3beccd7f670b34e05e", + "coverage_profile_along_genes_(low).txt:md5,1a9405c8bd7c00f3be082bfebb90b6ed", + "coverage_profile_along_genes_(total).txt:md5,1a9405c8bd7c00f3be082bfebb90b6ed", + "Coverage Profile Along Genes (High).png:md5,4a4eb6c41483181ed9d67c390868026e", + "Coverage Profile Along Genes (Low).png:md5,332640c6bf816ddeec23d9e12070eede", + "Coverage Profile Along Genes (Total).png:md5,64402bed985293e66a634199b64c98f2", + "Transcript coverage histogram.png:md5,72df8608131b28ee5b23bdbc8c6e4891", + "coverage_profile_along_genes_(high).txt:md5,70c95fbc100f14911d2cc348bdff1587", + "coverage_profile_along_genes_(low).txt:md5,86e56ef794277bcf1e0d121a088b8581", + "coverage_profile_along_genes_(total).txt:md5,86e56ef794277bcf1e0d121a088b8581", + "Coverage Profile Along Genes (High).png:md5,8ec27bae1db26eb468ca35843e5eb557", + "Coverage Profile Along Genes (Low).png:md5,5bed9f6b9e27ad01f60d188f24020c6e", + "Coverage Profile Along Genes (Total).png:md5,bb10036285f9e01ed64048597a25766f", + "Transcript coverage histogram.png:md5,e36d2e717f852cc69f2658e6a901a0ec", + "coverage_profile_along_genes_(high).txt:md5,a73462b9ecbd1d2c45d7ca84b5f7925b", + "coverage_profile_along_genes_(low).txt:md5,7adc228bc15e344abb7938ea4d35a846", + "coverage_profile_along_genes_(total).txt:md5,7adc228bc15e344abb7938ea4d35a846", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt", + "Junction Analysis.png", + "Reads Genomic Origin.png", + "qualimapReport.html", + "rnaseq_qc_results.txt" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-08-26T17:25:05.907994" + } +} \ No newline at end of file diff --git a/workflows/rnaseq.nf b/workflows/rnaseq.nf deleted file mode 100755 index 9250125dc..000000000 --- a/workflows/rnaseq.nf +++ /dev/null @@ -1,941 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - PRINT PARAMS SUMMARY -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -include { paramsSummaryLog; paramsSummaryMap; fromSamplesheet } from 'plugin/nf-validation' - -def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) -def citation = '\n' + WorkflowMain.citation(workflow) + '\n' -def summary_params = paramsSummaryMap(workflow) - -// Print parameter summary log to screen -log.info logo + paramsSummaryLog(workflow) + citation - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - VALIDATE INPUTS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -WorkflowRnaseq.initialise(params, log) - -// Check rRNA databases for sortmerna -if (params.remove_ribo_rna) { - ch_ribo_db = file(params.ribo_database_manifest) - if (ch_ribo_db.isEmpty()) {exit 1, "File provided with --ribo_database_manifest is empty: ${ch_ribo_db.getName()}!"} -} - -// Check if file with list of fastas is provided when running BBSplit -if (!params.skip_bbsplit && !params.bbsplit_index && params.bbsplit_fasta_list) { - ch_bbsplit_fasta_list = file(params.bbsplit_fasta_list) - if (ch_bbsplit_fasta_list.isEmpty()) {exit 1, "File provided with --bbsplit_fasta_list is empty: ${ch_bbsplit_fasta_list.getName()}!"} -} - -// Check alignment parameters -def prepareToolIndices = [] -if (!params.skip_bbsplit) { prepareToolIndices << 'bbsplit' } -if (!params.skip_alignment) { prepareToolIndices << params.aligner } -if (!params.skip_pseudo_alignment && params.pseudo_aligner) { prepareToolIndices << params.pseudo_aligner } - -// Determine whether to filter the GTF or not -def filterGtf = - (( - // Condition 1: Alignment is required and aligner is set - !params.skip_alignment && params.aligner - ) || - ( - // Condition 2: Pseudoalignment is required and pseudoaligner is set - !params.skip_pseudo_alignment && params.pseudo_aligner - ) || - ( - // Condition 3: Transcript FASTA file is not provided - !params.transcript_fasta - )) && - ( - // Condition 4: --skip_gtf_filter is not provided - !params.skip_gtf_filter - ) - -// Get RSeqC modules to run -def rseqc_modules = params.rseqc_modules ? params.rseqc_modules.split(',').collect{ it.trim().toLowerCase() } : [] -if (params.bam_csi_index) { - for (rseqc_module in ['read_distribution', 'inner_distance', 'tin']) { - if (rseqc_modules.contains(rseqc_module)) { - rseqc_modules.remove(rseqc_module) - } - } -} - -// Stage dummy file to be used as an optional input where required -ch_dummy_file = file("$projectDir/assets/dummy_file.txt", checkIfExists: true) - -// Check if an AWS iGenome has been provided to use the appropriate version of STAR -def is_aws_igenome = false -if (params.fasta && params.gtf) { - if ((file(params.fasta).getName() - '.gz' == 'genome.fa') && (file(params.gtf).getName() - '.gz' == 'genes.gtf')) { - is_aws_igenome = true - } -} - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 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) : Channel.empty() -ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath(params.multiqc_logo) : Channel.empty() -ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - -// Header files for MultiQC -ch_pca_header_multiqc = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) -ch_clustering_header_multiqc = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) -ch_biotypes_header_multiqc = file("$projectDir/assets/multiqc/biotypes_header.txt", checkIfExists: true) - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IMPORT LOCAL MODULES/SUBWORKFLOWS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -// -// MODULE: Loaded from modules/local/ -// -include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' -include { DESEQ2_QC as DESEQ2_QC_STAR_SALMON } from '../modules/local/deseq2_qc' -include { DESEQ2_QC as DESEQ2_QC_RSEM } from '../modules/local/deseq2_qc' -include { DESEQ2_QC as DESEQ2_QC_PSEUDO } from '../modules/local/deseq2_qc' -include { DUPRADAR } from '../modules/local/dupradar' -include { MULTIQC } from '../modules/local/multiqc' -include { MULTIQC_CUSTOM_BIOTYPE } from '../modules/local/multiqc_custom_biotype' -include { UMITOOLS_PREPAREFORRSEM as UMITOOLS_PREPAREFORSALMON } from '../modules/local/umitools_prepareforrsem' - -// -// SUBWORKFLOW: Consisting of a mix of local and nf-core/modules -// -include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' -include { ALIGN_STAR } from '../subworkflows/local/align_star' -include { QUANTIFY_RSEM } from '../subworkflows/local/quantify_rsem' -include { QUANTIFY_PSEUDO_ALIGNMENT as QUANTIFY_STAR_SALMON } from '../subworkflows/local/quantify_pseudo' -include { QUANTIFY_PSEUDO_ALIGNMENT } from '../subworkflows/local/quantify_pseudo' - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IMPORT NF-CORE MODULES/SUBWORKFLOWS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -// -// MODULE: Installed directly from nf-core/modules -// -include { CAT_FASTQ } from '../modules/nf-core/cat/fastq' -include { BBMAP_BBSPLIT } from '../modules/nf-core/bbmap/bbsplit' -include { SAMTOOLS_SORT } from '../modules/nf-core/samtools/sort' -include { PRESEQ_LCEXTRAP } from '../modules/nf-core/preseq/lcextrap' -include { QUALIMAP_RNASEQ } from '../modules/nf-core/qualimap/rnaseq' -include { SORTMERNA } from '../modules/nf-core/sortmerna' -include { STRINGTIE_STRINGTIE } from '../modules/nf-core/stringtie/stringtie' -include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/subread/featurecounts' -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions' - -// -// SUBWORKFLOW: Consisting entirely of nf-core/modules -// -include { FASTQ_SUBSAMPLE_FQ_SALMON } from '../subworkflows/nf-core/fastq_subsample_fq_salmon' -include { FASTQ_FASTQC_UMITOOLS_TRIMGALORE } from '../subworkflows/nf-core/fastq_fastqc_umitools_trimgalore' -include { FASTQ_FASTQC_UMITOOLS_FASTP } from '../subworkflows/nf-core/fastq_fastqc_umitools_fastp' -include { FASTQ_ALIGN_HISAT2 } from '../subworkflows/nf-core/fastq_align_hisat2' -include { BAM_SORT_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_sort_stats_samtools' -include { BAM_MARKDUPLICATES_PICARD } from '../subworkflows/nf-core/bam_markduplicates_picard' -include { BAM_RSEQC } from '../subworkflows/nf-core/bam_rseqc' -include { BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS as BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME } from '../subworkflows/nf-core/bam_dedup_stats_samtools_umitools' -include { BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS as BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_TRANSCRIPTOME } from '../subworkflows/nf-core/bam_dedup_stats_samtools_umitools' -include { BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG as BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_FORWARD } from '../subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig' -include { BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG as BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_REVERSE } from '../subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig' - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - RUN MAIN WORKFLOW -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -// Info required for completion email and summary -def multiqc_report = [] -def pass_mapped_reads = [:] -def pass_trimmed_reads = [:] -def pass_strand_check = [:] - -workflow RNASEQ { - - ch_versions = Channel.empty() - - // - // SUBWORKFLOW: Uncompress and prepare reference genome files - // - def biotype = params.gencode ? "gene_type" : params.featurecounts_group_type - PREPARE_GENOME ( - params.fasta, - params.gtf, - params.gff, - params.additional_fasta, - params.transcript_fasta, - params.gene_bed, - params.splicesites, - params.bbsplit_fasta_list, - params.star_index, - params.rsem_index, - params.salmon_index, - params.kallisto_index, - params.hisat2_index, - params.bbsplit_index, - params.gencode, - is_aws_igenome, - biotype, - prepareToolIndices, - filterGtf - ) - ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) - - // Check if contigs in genome fasta file > 512 Mbp - if (!params.skip_alignment && !params.bam_csi_index) { - PREPARE_GENOME - .out - .fai - .map { WorkflowRnaseq.checkMaxContigSize(it, log) } - } - - // - // Create input channel from input file provided through params.input - // - Channel - .fromSamplesheet("input") - .map { - meta, fastq_1, fastq_2 -> - if (!fastq_2) { - return [ meta.id, meta + [ single_end:true ], [ fastq_1 ] ] - } else { - return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2 ] ] - } - } - .groupTuple() - .map { - WorkflowRnaseq.validateInput(it) - } - .branch { - meta, fastqs -> - single : fastqs.size() == 1 - return [ meta, fastqs.flatten() ] - multiple: fastqs.size() > 1 - return [ meta, fastqs.flatten() ] - } - .set { ch_fastq } - - // - // MODULE: Concatenate FastQ files from same sample if required - // - CAT_FASTQ ( - ch_fastq.multiple - ) - .reads - .mix(ch_fastq.single) - .set { ch_cat_fastq } - ch_versions = ch_versions.mix(CAT_FASTQ.out.versions.first().ifEmpty(null)) - - // - // SUBWORKFLOW: Read QC, extract UMI and trim adapters with TrimGalore! - // - ch_filtered_reads = Channel.empty() - ch_fastqc_raw_multiqc = Channel.empty() - ch_fastqc_trim_multiqc = Channel.empty() - ch_trim_log_multiqc = Channel.empty() - ch_trim_read_count = Channel.empty() - if (params.trimmer == 'trimgalore') { - FASTQ_FASTQC_UMITOOLS_TRIMGALORE ( - ch_cat_fastq, - params.skip_fastqc || params.skip_qc, - params.with_umi, - params.skip_umi_extract, - params.skip_trimming, - params.umi_discard_read, - params.min_trimmed_reads - ) - ch_filtered_reads = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.reads - ch_fastqc_raw_multiqc = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.fastqc_zip - ch_fastqc_trim_multiqc = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_zip - ch_trim_log_multiqc = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_log - ch_trim_read_count = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_read_count - ch_versions = ch_versions.mix(FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.versions) - } - - // - // SUBWORKFLOW: Read QC, extract UMI and trim adapters with fastp - // - if (params.trimmer == 'fastp') { - FASTQ_FASTQC_UMITOOLS_FASTP ( - ch_cat_fastq, - params.skip_fastqc || params.skip_qc, - params.with_umi, - params.skip_umi_extract, - params.umi_discard_read, - params.skip_trimming, - [], - params.save_trimmed, - params.save_trimmed, - params.min_trimmed_reads - ) - ch_filtered_reads = FASTQ_FASTQC_UMITOOLS_FASTP.out.reads - ch_fastqc_raw_multiqc = FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_raw_zip - ch_fastqc_trim_multiqc = FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_trim_zip - ch_trim_log_multiqc = FASTQ_FASTQC_UMITOOLS_FASTP.out.trim_json - ch_trim_read_count = FASTQ_FASTQC_UMITOOLS_FASTP.out.trim_read_count - ch_versions = ch_versions.mix(FASTQ_FASTQC_UMITOOLS_FASTP.out.versions) - } - - // - // Get list of samples that failed trimming threshold for MultiQC report - // - ch_trim_read_count - .map { - meta, num_reads -> - pass_trimmed_reads[meta.id] = true - if (num_reads <= params.min_trimmed_reads.toFloat()) { - pass_trimmed_reads[meta.id] = false - return [ "$meta.id\t$num_reads" ] - } - } - .collect() - .map { - tsv_data -> - def header = ["Sample", "Reads after trimming"] - WorkflowRnaseq.multiqcTsvFromList(tsv_data, header) - } - .set { ch_fail_trimming_multiqc } - - // - // MODULE: Remove genome contaminant reads - // - if (!params.skip_bbsplit) { - BBMAP_BBSPLIT ( - ch_filtered_reads, - PREPARE_GENOME.out.bbsplit_index, - [], - [ [], [] ], - false - ) - .primary_fastq - .set { ch_filtered_reads } - ch_versions = ch_versions.mix(BBMAP_BBSPLIT.out.versions.first()) - } - - // - // MODULE: Remove ribosomal RNA reads - // - ch_sortmerna_multiqc = Channel.empty() - if (params.remove_ribo_rna) { - ch_sortmerna_fastas = Channel.from(ch_ribo_db.readLines()).map { row -> file(row, checkIfExists: true) }.collect() - - SORTMERNA ( - ch_filtered_reads, - ch_sortmerna_fastas - ) - .reads - .set { ch_filtered_reads } - - ch_sortmerna_multiqc = SORTMERNA.out.log - ch_versions = ch_versions.mix(SORTMERNA.out.versions.first()) - } - - // - // SUBWORKFLOW: Sub-sample FastQ files and pseudoalign with Salmon to auto-infer strandedness - // - - // Branch FastQ channels if 'auto' specified to infer strandedness - ch_filtered_reads - .branch { - meta, fastq -> - auto_strand : meta.strandedness == 'auto' - return [ meta, fastq ] - known_strand: meta.strandedness != 'auto' - return [ meta, fastq ] - } - .set { ch_strand_fastq } - - // Return empty channel if ch_strand_fastq.auto_strand is empty so salmon index isn't created - PREPARE_GENOME - .out - .fasta - .combine(ch_strand_fastq.auto_strand) - .map { it.first() } - .first() - .set { ch_genome_fasta } - - FASTQ_SUBSAMPLE_FQ_SALMON ( - ch_strand_fastq.auto_strand, - ch_genome_fasta, - PREPARE_GENOME.out.transcript_fasta, - PREPARE_GENOME.out.gtf, - PREPARE_GENOME.out.salmon_index, - !params.salmon_index && !('salmon' in prepareToolIndices) - ) - ch_versions = ch_versions.mix(FASTQ_SUBSAMPLE_FQ_SALMON.out.versions) - - FASTQ_SUBSAMPLE_FQ_SALMON - .out - .json_info - .join(ch_strand_fastq.auto_strand) - .map { meta, json, reads -> - return [ meta + [ strandedness: WorkflowRnaseq.getSalmonInferredStrandedness(json) ], reads ] - } - .mix(ch_strand_fastq.known_strand) - .set { ch_strand_inferred_filtered_fastq } - - // - // SUBWORKFLOW: Alignment with STAR and gene/transcript quantification with Salmon - // - ch_genome_bam = Channel.empty() - ch_genome_bam_index = Channel.empty() - ch_samtools_stats = Channel.empty() - ch_samtools_flagstat = Channel.empty() - ch_samtools_idxstats = Channel.empty() - ch_star_multiqc = Channel.empty() - ch_aligner_pca_multiqc = Channel.empty() - ch_aligner_clustering_multiqc = Channel.empty() - if (!params.skip_alignment && params.aligner == 'star_salmon') { - ALIGN_STAR ( - ch_strand_inferred_filtered_fastq, - PREPARE_GENOME.out.star_index.map { [ [:], it ] }, - PREPARE_GENOME.out.gtf.map { [ [:], it ] }, - params.star_ignore_sjdbgtf, - '', - params.seq_center ?: '', - is_aws_igenome, - PREPARE_GENOME.out.fasta.map { [ [:], it ] } - ) - ch_genome_bam = ALIGN_STAR.out.bam - ch_genome_bam_index = ALIGN_STAR.out.bai - ch_transcriptome_bam = ALIGN_STAR.out.bam_transcript - ch_samtools_stats = ALIGN_STAR.out.stats - ch_samtools_flagstat = ALIGN_STAR.out.flagstat - ch_samtools_idxstats = ALIGN_STAR.out.idxstats - ch_star_multiqc = ALIGN_STAR.out.log_final - if (params.bam_csi_index) { - ch_genome_bam_index = ALIGN_STAR.out.csi - } - ch_versions = ch_versions.mix(ALIGN_STAR.out.versions) - - // - // SUBWORKFLOW: Remove duplicate reads from BAM file based on UMIs - // - if (params.with_umi) { - // Deduplicate genome BAM file before downstream analysis - BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME ( - ch_genome_bam.join(ch_genome_bam_index, by: [0]), - params.umitools_dedup_stats - ) - ch_genome_bam = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.bam - ch_genome_bam_index = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.bai - ch_samtools_stats = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.stats - ch_samtools_flagstat = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.flagstat - ch_samtools_idxstats = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.idxstats - if (params.bam_csi_index) { - ch_genome_bam_index = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.csi - } - ch_versions = ch_versions.mix(BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.versions) - - // Co-ordinate sort, index and run stats on transcriptome BAM - BAM_SORT_STATS_SAMTOOLS ( - ch_transcriptome_bam, - PREPARE_GENOME.out.fasta.map { [ [:], it ] } - ) - ch_transcriptome_sorted_bam = BAM_SORT_STATS_SAMTOOLS.out.bam - ch_transcriptome_sorted_bai = BAM_SORT_STATS_SAMTOOLS.out.bai - - // Deduplicate transcriptome BAM file before read counting with Salmon - BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_TRANSCRIPTOME ( - ch_transcriptome_sorted_bam.join(ch_transcriptome_sorted_bai, by: [0]), - params.umitools_dedup_stats - ) - - // Name sort BAM before passing to Salmon - SAMTOOLS_SORT ( - BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_TRANSCRIPTOME.out.bam - ) - - // Only run prepare_for_rsem.py on paired-end BAM files - SAMTOOLS_SORT - .out - .bam - .branch { - meta, bam -> - single_end: meta.single_end - return [ meta, bam ] - paired_end: !meta.single_end - return [ meta, bam ] - } - .set { ch_umitools_dedup_bam } - - // Fix paired-end reads in name sorted BAM file - // See: https://github.com/nf-core/rnaseq/issues/828 - UMITOOLS_PREPAREFORSALMON ( - ch_umitools_dedup_bam.paired_end - ) - ch_versions = ch_versions.mix(UMITOOLS_PREPAREFORSALMON.out.versions.first()) - - ch_umitools_dedup_bam - .single_end - .mix(UMITOOLS_PREPAREFORSALMON.out.bam) - .set { ch_transcriptome_bam } - } - - // - // SUBWORKFLOW: Count reads from BAM alignments using Salmon - // - QUANTIFY_STAR_SALMON ( - ch_transcriptome_bam, - ch_dummy_file, - PREPARE_GENOME.out.transcript_fasta, - PREPARE_GENOME.out.gtf, - 'salmon', - true, - params.salmon_quant_libtype ?: '', - params.kallisto_quant_fraglen, - params.kallisto_quant_fraglen_sd - ) - ch_versions = ch_versions.mix(QUANTIFY_STAR_SALMON.out.versions) - - if (!params.skip_qc & !params.skip_deseq2_qc) { - DESEQ2_QC_STAR_SALMON ( - QUANTIFY_STAR_SALMON.out.counts_gene_length_scaled, - ch_pca_header_multiqc, - ch_clustering_header_multiqc - ) - ch_aligner_pca_multiqc = DESEQ2_QC_STAR_SALMON.out.pca_multiqc - ch_aligner_clustering_multiqc = DESEQ2_QC_STAR_SALMON.out.dists_multiqc - ch_versions = ch_versions.mix(DESEQ2_QC_STAR_SALMON.out.versions) - } - } - - // - // SUBWORKFLOW: Alignment with STAR and gene/transcript quantification with RSEM - // - ch_rsem_multiqc = Channel.empty() - if (!params.skip_alignment && params.aligner == 'star_rsem') { - QUANTIFY_RSEM ( - ch_strand_inferred_filtered_fastq, - PREPARE_GENOME.out.rsem_index, - PREPARE_GENOME.out.fasta.map { [ [:], it ] } - ) - ch_genome_bam = QUANTIFY_RSEM.out.bam - ch_genome_bam_index = QUANTIFY_RSEM.out.bai - ch_samtools_stats = QUANTIFY_RSEM.out.stats - ch_samtools_flagstat = QUANTIFY_RSEM.out.flagstat - ch_samtools_idxstats = QUANTIFY_RSEM.out.idxstats - ch_star_multiqc = QUANTIFY_RSEM.out.logs - ch_rsem_multiqc = QUANTIFY_RSEM.out.stat - if (params.bam_csi_index) { - ch_genome_bam_index = QUANTIFY_RSEM.out.csi - } - ch_versions = ch_versions.mix(QUANTIFY_RSEM.out.versions) - - if (!params.skip_qc & !params.skip_deseq2_qc) { - DESEQ2_QC_RSEM ( - QUANTIFY_RSEM.out.merged_counts_gene, - ch_pca_header_multiqc, - ch_clustering_header_multiqc - ) - ch_aligner_pca_multiqc = DESEQ2_QC_RSEM.out.pca_multiqc - ch_aligner_clustering_multiqc = DESEQ2_QC_RSEM.out.dists_multiqc - ch_versions = ch_versions.mix(DESEQ2_QC_RSEM.out.versions) - } - } - - // - // SUBWORKFLOW: Alignment with HISAT2 - // - ch_hisat2_multiqc = Channel.empty() - if (!params.skip_alignment && params.aligner == 'hisat2') { - FASTQ_ALIGN_HISAT2 ( - ch_strand_inferred_filtered_fastq, - PREPARE_GENOME.out.hisat2_index.map { [ [:], it ] }, - PREPARE_GENOME.out.splicesites.map { [ [:], it ] }, - PREPARE_GENOME.out.fasta.map { [ [:], it ] } - ) - ch_genome_bam = FASTQ_ALIGN_HISAT2.out.bam - ch_genome_bam_index = FASTQ_ALIGN_HISAT2.out.bai - ch_samtools_stats = FASTQ_ALIGN_HISAT2.out.stats - ch_samtools_flagstat = FASTQ_ALIGN_HISAT2.out.flagstat - ch_samtools_idxstats = FASTQ_ALIGN_HISAT2.out.idxstats - ch_hisat2_multiqc = FASTQ_ALIGN_HISAT2.out.summary - if (params.bam_csi_index) { - ch_genome_bam_index = FASTQ_ALIGN_HISAT2.out.csi - } - ch_versions = ch_versions.mix(FASTQ_ALIGN_HISAT2.out.versions) - - // - // SUBWORKFLOW: Remove duplicate reads from BAM file based on UMIs - // - if (params.with_umi) { - BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME ( - ch_genome_bam.join(ch_genome_bam_index, by: [0]), - params.umitools_dedup_stats - ) - ch_genome_bam = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.bam - ch_genome_bam_index = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.bai - ch_samtools_stats = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.stats - ch_samtools_flagstat = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.flagstat - ch_samtools_idxstats = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.idxstats - if (params.bam_csi_index) { - ch_genome_bam_index = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.csi - } - ch_versions = ch_versions.mix(BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.versions) - } - } - - // - // Filter channels to get samples that passed STAR minimum mapping percentage - // - ch_fail_mapping_multiqc = Channel.empty() - if (!params.skip_alignment && params.aligner.contains('star')) { - ch_star_multiqc - .map { meta, align_log -> [ meta ] + WorkflowRnaseq.getStarPercentMapped(params, align_log) } - .set { ch_percent_mapped } - - ch_genome_bam - .join(ch_percent_mapped, by: [0]) - .map { meta, ofile, mapped, pass -> if (pass) [ meta, ofile ] } - .set { ch_genome_bam } - - ch_genome_bam_index - .join(ch_percent_mapped, by: [0]) - .map { meta, ofile, mapped, pass -> if (pass) [ meta, ofile ] } - .set { ch_genome_bam_index } - - ch_percent_mapped - .branch { meta, mapped, pass -> - pass: pass - pass_mapped_reads[meta.id] = true - return [ "$meta.id\t$mapped" ] - fail: !pass - pass_mapped_reads[meta.id] = false - return [ "$meta.id\t$mapped" ] - } - .set { ch_pass_fail_mapped } - - ch_pass_fail_mapped - .fail - .collect() - .map { - tsv_data -> - def header = ["Sample", "STAR uniquely mapped reads (%)"] - WorkflowRnaseq.multiqcTsvFromList(tsv_data, header) - } - .set { ch_fail_mapping_multiqc } - } - - // - // MODULE: Run Preseq - // - ch_preseq_multiqc = Channel.empty() - if (!params.skip_alignment && !params.skip_qc && !params.skip_preseq) { - PRESEQ_LCEXTRAP ( - ch_genome_bam - ) - ch_preseq_multiqc = PRESEQ_LCEXTRAP.out.lc_extrap - ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions.first()) - } - - // - // SUBWORKFLOW: Mark duplicate reads - // - ch_markduplicates_multiqc = Channel.empty() - if (!params.skip_alignment && !params.skip_markduplicates && !params.with_umi) { - BAM_MARKDUPLICATES_PICARD ( - ch_genome_bam, - PREPARE_GENOME.out.fasta.map { [ [:], it ] }, - PREPARE_GENOME.out.fai.map { [ [:], it ] } - ) - ch_genome_bam = BAM_MARKDUPLICATES_PICARD.out.bam - ch_genome_bam_index = BAM_MARKDUPLICATES_PICARD.out.bai - ch_samtools_stats = BAM_MARKDUPLICATES_PICARD.out.stats - ch_samtools_flagstat = BAM_MARKDUPLICATES_PICARD.out.flagstat - ch_samtools_idxstats = BAM_MARKDUPLICATES_PICARD.out.idxstats - ch_markduplicates_multiqc = BAM_MARKDUPLICATES_PICARD.out.metrics - if (params.bam_csi_index) { - ch_genome_bam_index = BAM_MARKDUPLICATES_PICARD.out.csi - } - ch_versions = ch_versions.mix(BAM_MARKDUPLICATES_PICARD.out.versions) - } - - // - // MODULE: STRINGTIE - // - if (!params.skip_alignment && !params.skip_stringtie) { - STRINGTIE_STRINGTIE ( - ch_genome_bam, - PREPARE_GENOME.out.gtf - ) - ch_versions = ch_versions.mix(STRINGTIE_STRINGTIE.out.versions.first()) - } - - // - // MODULE: Feature biotype QC using featureCounts - // - ch_featurecounts_multiqc = Channel.empty() - if (!params.skip_alignment && !params.skip_qc && !params.skip_biotype_qc && biotype) { - - PREPARE_GENOME - .out - .gtf - .map { WorkflowRnaseq.biotypeInGtf(it, biotype, log) } - .set { biotype_in_gtf } - - // Prevent any samples from running if GTF file doesn't have a valid biotype - ch_genome_bam - .combine(PREPARE_GENOME.out.gtf) - .combine(biotype_in_gtf) - .filter { it[-1] } - .map { it[0.. 0) { - BAM_RSEQC ( - ch_genome_bam.join(ch_genome_bam_index, by: [0]), - PREPARE_GENOME.out.gene_bed, - rseqc_modules - ) - ch_bamstat_multiqc = BAM_RSEQC.out.bamstat_txt - ch_inferexperiment_multiqc = BAM_RSEQC.out.inferexperiment_txt - ch_innerdistance_multiqc = BAM_RSEQC.out.innerdistance_freq - ch_junctionannotation_multiqc = BAM_RSEQC.out.junctionannotation_log - ch_junctionsaturation_multiqc = BAM_RSEQC.out.junctionsaturation_rscript - ch_readdistribution_multiqc = BAM_RSEQC.out.readdistribution_txt - ch_readduplication_multiqc = BAM_RSEQC.out.readduplication_pos_xls - ch_tin_multiqc = BAM_RSEQC.out.tin_txt - ch_versions = ch_versions.mix(BAM_RSEQC.out.versions) - - ch_inferexperiment_multiqc - .map { - meta, strand_log -> - def inferred_strand = WorkflowRnaseq.getInferexperimentStrandedness(strand_log, 30) - pass_strand_check[meta.id] = true - if (meta.strandedness != inferred_strand[0]) { - pass_strand_check[meta.id] = false - return [ "$meta.id\t$meta.strandedness\t${inferred_strand.join('\t')}" ] - } - } - .collect() - .map { - tsv_data -> - def header = [ - "Sample", - "Provided strandedness", - "Inferred strandedness", - "Sense (%)", - "Antisense (%)", - "Undetermined (%)" - ] - WorkflowRnaseq.multiqcTsvFromList(tsv_data, header) - } - .set { ch_fail_strand_multiqc } - } - } - - // - // SUBWORKFLOW: Pseudoalignment and quantification with Salmon - // - ch_pseudo_multiqc = Channel.empty() - ch_pseudoaligner_pca_multiqc = Channel.empty() - ch_pseudoaligner_clustering_multiqc = Channel.empty() - if (!params.skip_pseudo_alignment && params.pseudo_aligner) { - - if (params.pseudo_aligner == 'salmon') { - ch_pseudo_index = PREPARE_GENOME.out.salmon_index - } else { - ch_pseudo_index = PREPARE_GENOME.out.kallisto_index - } - - QUANTIFY_PSEUDO_ALIGNMENT ( - ch_strand_inferred_filtered_fastq, - ch_pseudo_index, - ch_dummy_file, - PREPARE_GENOME.out.gtf, - params.pseudo_aligner, - false, - params.salmon_quant_libtype ?: '', - params.kallisto_quant_fraglen, - params.kallisto_quant_fraglen_sd - ) - ch_pseudo_multiqc = QUANTIFY_PSEUDO_ALIGNMENT.out.multiqc - ch_counts_gene_length_scaled = QUANTIFY_PSEUDO_ALIGNMENT.out.counts_gene_length_scaled - ch_versions = ch_versions.mix(QUANTIFY_PSEUDO_ALIGNMENT.out.versions) - - if (!params.skip_qc & !params.skip_deseq2_qc) { - DESEQ2_QC_PSEUDO ( - ch_counts_gene_length_scaled, - ch_pca_header_multiqc, - ch_clustering_header_multiqc - ) - ch_pseudoaligner_pca_multiqc = DESEQ2_QC_PSEUDO.out.pca_multiqc - ch_pseudoaligner_clustering_multiqc = DESEQ2_QC_PSEUDO.out.dists_multiqc - ch_versions = ch_versions.mix(DESEQ2_QC_PSEUDO.out.versions) - } - } - - // - // MODULE: Pipeline reporting - // - CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_versions.unique().collectFile(name: 'collated_versions.yml') - ) - - // - // MODULE: MultiQC - // - if (!params.skip_multiqc) { - workflow_summary = WorkflowRnaseq.paramsSummaryMultiqc(workflow, summary_params) - ch_workflow_summary = Channel.value(workflow_summary) - - methods_description = WorkflowRnaseq.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description, params) - ch_methods_description = Channel.value(methods_description) - - 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_methods_description.collectFile(name: 'methods_description_mqc.yaml'), - ch_multiqc_logo.collect().ifEmpty([]), - ch_fail_trimming_multiqc.collectFile(name: 'fail_trimmed_samples_mqc.tsv').ifEmpty([]), - ch_fail_mapping_multiqc.collectFile(name: 'fail_mapped_samples_mqc.tsv').ifEmpty([]), - ch_fail_strand_multiqc.collectFile(name: 'fail_strand_check_mqc.tsv').ifEmpty([]), - ch_fastqc_raw_multiqc.collect{it[1]}.ifEmpty([]), - ch_fastqc_trim_multiqc.collect{it[1]}.ifEmpty([]), - ch_trim_log_multiqc.collect{it[1]}.ifEmpty([]), - ch_sortmerna_multiqc.collect{it[1]}.ifEmpty([]), - ch_star_multiqc.collect{it[1]}.ifEmpty([]), - ch_hisat2_multiqc.collect{it[1]}.ifEmpty([]), - ch_rsem_multiqc.collect{it[1]}.ifEmpty([]), - ch_pseudo_multiqc.collect{it[1]}.ifEmpty([]), - ch_samtools_stats.collect{it[1]}.ifEmpty([]), - ch_samtools_flagstat.collect{it[1]}.ifEmpty([]), - ch_samtools_idxstats.collect{it[1]}.ifEmpty([]), - ch_markduplicates_multiqc.collect{it[1]}.ifEmpty([]), - ch_featurecounts_multiqc.collect{it[1]}.ifEmpty([]), - ch_aligner_pca_multiqc.collect().ifEmpty([]), - ch_aligner_clustering_multiqc.collect().ifEmpty([]), - ch_pseudoaligner_pca_multiqc.collect().ifEmpty([]), - ch_pseudoaligner_clustering_multiqc.collect().ifEmpty([]), - ch_preseq_multiqc.collect{it[1]}.ifEmpty([]), - ch_qualimap_multiqc.collect{it[1]}.ifEmpty([]), - ch_dupradar_multiqc.collect{it[1]}.ifEmpty([]), - ch_bamstat_multiqc.collect{it[1]}.ifEmpty([]), - ch_inferexperiment_multiqc.collect{it[1]}.ifEmpty([]), - ch_innerdistance_multiqc.collect{it[1]}.ifEmpty([]), - ch_junctionannotation_multiqc.collect{it[1]}.ifEmpty([]), - ch_junctionsaturation_multiqc.collect{it[1]}.ifEmpty([]), - ch_readdistribution_multiqc.collect{it[1]}.ifEmpty([]), - ch_readduplication_multiqc.collect{it[1]}.ifEmpty([]), - ch_tin_multiqc.collect{it[1]}.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, pass_mapped_reads, pass_trimmed_reads, pass_strand_check) - } - - NfcoreTemplate.dump_parameters(workflow, params) - NfcoreTemplate.summary(workflow, params, log, pass_mapped_reads, pass_trimmed_reads, pass_strand_check) - - if (params.hook_url) { - NfcoreTemplate.IM_notification(workflow, params, summary_params, projectDir, log) - } -} - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - THE END -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ diff --git a/assets/multiqc/biotypes_header.txt b/workflows/rnaseq/assets/multiqc/biotypes_header.txt similarity index 100% rename from assets/multiqc/biotypes_header.txt rename to workflows/rnaseq/assets/multiqc/biotypes_header.txt diff --git a/assets/multiqc/deseq2_clustering_header.txt b/workflows/rnaseq/assets/multiqc/deseq2_clustering_header.txt similarity index 72% rename from assets/multiqc/deseq2_clustering_header.txt rename to workflows/rnaseq/assets/multiqc/deseq2_clustering_header.txt index 04e10efa5..f2f5dc852 100644 --- a/assets/multiqc/deseq2_clustering_header.txt +++ b/workflows/rnaseq/assets/multiqc/deseq2_clustering_header.txt @@ -4,9 +4,12 @@ # DESeq2 # rlog values for each sample # in the deseq2_qc.r script." +#parent_id: 'sample-relationships' +#parent_name: 'Sample relationships' +#parent_description: 'Plots interrogating sample relationships, based on final count matrices' #plot_type: 'heatmap' #anchor: 'deseq2_clustering' #pconfig: # title: 'DESeq2: Heatmap of the sample-to-sample distances' -# xlab: True -# reverseColors: True +# xlog: True +# reverse_colors: True diff --git a/assets/multiqc/deseq2_pca_header.txt b/workflows/rnaseq/assets/multiqc/deseq2_pca_header.txt similarity index 75% rename from assets/multiqc/deseq2_pca_header.txt rename to workflows/rnaseq/assets/multiqc/deseq2_pca_header.txt index 636f9374d..cb20ce49b 100644 --- a/assets/multiqc/deseq2_pca_header.txt +++ b/workflows/rnaseq/assets/multiqc/deseq2_pca_header.txt @@ -3,6 +3,9 @@ #description: "PCA plot between samples in the experiment. # These values are calculated using DESeq2 # in the deseq2_qc.r script." +#parent_id: 'sample-relationships' +#parent_name: 'Sample relationships' +#parent_description: 'Plots interrogating sample relationships, based on final count matrices' #plot_type: 'scatter' #anchor: 'deseq2_pca' #pconfig: diff --git a/assets/methods_description_template.yml b/workflows/rnaseq/assets/multiqc/methods_description_template.yml similarity index 100% rename from assets/methods_description_template.yml rename to workflows/rnaseq/assets/multiqc/methods_description_template.yml diff --git a/assets/multiqc_config.yml b/workflows/rnaseq/assets/multiqc/multiqc_config.yml similarity index 51% rename from assets/multiqc_config.yml rename to workflows/rnaseq/assets/multiqc/multiqc_config.yml index e738f4854..136e03f1c 100644 --- a/assets/multiqc_config.yml +++ b/workflows/rnaseq/assets/multiqc/multiqc_config.yml @@ -1,15 +1,79 @@ report_comment: > - This report has been generated by the nf-core/rnaseq analysis pipeline. For information about how to interpret these results, please see the documentation. + This report has been generated by the nf-core/rnaseq analysis pipeline. For information about how to interpret these results, please see the documentation. report_section_order: - "nf-core-rnaseq-methods-description": + # Important checks and failures + sample-status: + order: 5004 + fail_trimmed_samples-module: + order: 5003 + fail_mapped_samples-module: + order: 5002 + fail_strand_check-module: + order: 5001 + # Preprocessing and pre-alignment QC + fastqc_raw: + order: 4004 + cutadapt: + order: 4003 + fastp: + order: 4003 + fastqc_trimmed: + order: 4002 + # Alignment + star: + order: 3000 + hisat2: + order: 3000 + # Post-alignment QC + samtools: + order: 3000 + dupradar-module: + order: 3000 + featurecounts_biotype: + order: 3000 + picard: + order: 3000 + preseq: + order: 3000 + qualimap: + order: 3000 + rseqc: + order: 3000 + umitools: + order: 3000 + # Quantification + rsem: + order: 2000 + salmon: + order: 2000 + kallisto: + order: 2000 + # Post-quantification QC + sample-relationships: + order: 1006 + star_salmon_deseq2_pca: + order: 1005 + star_salmon_deseq2_clustering: + order: 1004 + salmon_deseq2_pca: + order: 1003 + salmon_deseq2_clustering: + order: 1002 + star_rsem_deseq2_pca: + order: 1001 + star_rsem_deseq2_clustering: + order: 1000 + # Summaries + "nf-core-rnaseq-methods-description-module": order: -1000 - software_versions: + "software_versions-module": order: -1001 - "nf-core-rnaseq-summary": + "nf-core-rnaseq-summary-module": order: -1002 export_plots: true disable_version_detection: true +sample_names_replace_exact: true # Run only these modules run_modules: @@ -21,6 +85,7 @@ run_modules: - star - hisat2 - rsem + - umitools - salmon - kallisto - samtools @@ -30,36 +95,28 @@ run_modules: - qualimap # Order of modules -top_modules: - - "fail_trimmed_samples" - - "fail_mapped_samples" - - "fail_strand_check" - - "star_rsem_deseq2_pca" - - "star_rsem_deseq2_clustering" - - "star_salmon_deseq2_pca" - - "star_salmon_deseq2_clustering" - - "salmon_deseq2_pca" - - "salmon_deseq2_clustering" - - "biotype_counts" - - "dupradar" module_order: - fastqc: + anchor: "fastqc_raw" name: "FastQC (raw)" info: "This section of the report shows FastQC results before adapter trimming." path_filters: - - "./fastqc/raw/*.zip" + - "*_raw*fastqc.zip" - cutadapt - fastp - fastqc: + anchor: "fastqc_trimmed" name: "FastQC (trimmed)" info: "This section of the report shows FastQC results after adapter trimming." path_filters: - - "./fastqc/trim/*.zip" + - "*_trimmed*fastqc.zip" # Don't show % Dups in the General Stats table (we have this from Picard) table_columns_visible: - fastqc: + "FastQC (raw)": + percent_duplicates: False + "FastQC (trimmed)": percent_duplicates: False extra_fn_clean_exts: @@ -155,24 +212,56 @@ custom_data: plot_type: "table" pconfig: id: "fail_trimmed_samples_table" - table_title: "Samples failed trimming threshold" + title: "Samples failed trimming threshold" namespace: "Samples failed trimming threshold" - format: "{:.0f}" fail_mapped_samples: section_name: "WARNING: Fail Alignment Check" description: "List of samples that failed the STAR minimum mapped reads threshold specified via the '--min_mapped_reads' parameter, and hence were ignored for the downstream processing steps." plot_type: "table" pconfig: id: "fail_mapped_samples_table" - table_title: "Samples failed mapping threshold" + title: "Samples failed mapping threshold" namespace: "Samples failed mapping threshold" - format: "{:.2f}" fail_strand_check: - section_name: "WARNING: Fail Strand Check" - description: "List of samples that failed the strandedness check between that provided in the samplesheet and calculated by the RSeQC infer_experiment.py tool." + section_name: "Strandedness Checks" + description: "

    The strandedness used for analysis in this workflow can either be provided by the user or automatically inferred by Salmon using a sample of reads. In both cases, strandedness is verified at the end of the workflow using RSeQC's infer_experiment.py on genomic alignments. In this table, a pass indicates a match between the supplied strandedness (or that inferred by Salmon) and RSeQC results. A fail indicates a mismatch or 'undetermined' strandedness. 'Undetermined' strandedness can signal QC issues, including potential genomic DNA contamination.

    Note: Rows are duplicated for an 'auto' setting to allow comparison of statistics between inference methods.

    " plot_type: "table" pconfig: id: "fail_strand_check_table" - table_title: "Samples failed strandedness check" - namespace: "Samples failed strandedness check" - format: "{:.2f}" + title: "Samples strandedness check" + namespace: "Samples strandedness check" + headers: + Status: + description: Pass if the strandedness inferred by RSeQC matches that provided by the user or predicted by Salmon. Fail otherwise. + Strand inference method: + description: Tool used to detect strandedness + Provided strandedness: + description: User-provided strandedness + cond_formatting_rules: + blue: + - s_eq: "auto" + black: + - s_eq: "forward" + grey: + - s_eq: "reverse" + cond_formatting_colours: + - grey: "#AAB7B8" + - black: "#17202A" + Inferred strandedness: + description: Interred strandedness + cond_formatting_rules: + blue: + - s_eq: "auto" + black: + - s_eq: "forward" + grey: + - s_eq: "reverse" + cond_formatting_colours: + - grey: "#AAB7B8" + - black: "#17202A" + Sense (%): + max: 100 + Antisense (%): + max: 100 + Unstranded (%): + max: 100 diff --git a/workflows/rnaseq/assets/multiqc/sample_status_header.txt b/workflows/rnaseq/assets/multiqc/sample_status_header.txt new file mode 100644 index 000000000..0a76ff8b9 --- /dev/null +++ b/workflows/rnaseq/assets/multiqc/sample_status_header.txt @@ -0,0 +1,3 @@ +#parent_id: 'sample-status' +#parent_name: 'Sample status checks' +#parent_description: 'Reports on sample strandedness status, and any failures in trimming or mapping' diff --git a/assets/rrna-db-defaults.txt b/workflows/rnaseq/assets/rrna-db-defaults.txt similarity index 100% rename from assets/rrna-db-defaults.txt rename to workflows/rnaseq/assets/rrna-db-defaults.txt diff --git a/workflows/rnaseq/main.nf b/workflows/rnaseq/main.nf new file mode 100755 index 000000000..0b702e641 --- /dev/null +++ b/workflows/rnaseq/main.nf @@ -0,0 +1,796 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + IMPORT LOCAL MODULES/SUBWORKFLOWS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +// +// MODULE: Loaded from modules/local/ +// +include { DESEQ2_QC as DESEQ2_QC_STAR_SALMON } from '../../modules/local/deseq2_qc' +include { DESEQ2_QC as DESEQ2_QC_RSEM } from '../../modules/local/deseq2_qc' +include { DESEQ2_QC as DESEQ2_QC_PSEUDO } from '../../modules/local/deseq2_qc' +include { MULTIQC_CUSTOM_BIOTYPE } from '../../modules/local/multiqc_custom_biotype' + +// +// SUBWORKFLOW: Consisting of a mix of local and nf-core/modules +// +include { ALIGN_STAR } from '../../subworkflows/local/align_star' +include { QUANTIFY_RSEM } from '../../subworkflows/local/quantify_rsem' +include { checkSamplesAfterGrouping } from '../../subworkflows/local/utils_nfcore_rnaseq_pipeline' +include { multiqcTsvFromList } from '../../subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness' +include { getStarPercentMapped } from '../../subworkflows/local/utils_nfcore_rnaseq_pipeline' +include { biotypeInGtf } from '../../subworkflows/local/utils_nfcore_rnaseq_pipeline' +include { getInferexperimentStrandedness } from '../../subworkflows/local/utils_nfcore_rnaseq_pipeline' +include { methodsDescriptionText } from '../../subworkflows/local/utils_nfcore_rnaseq_pipeline' + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + IMPORT NF-CORE MODULES/SUBWORKFLOWS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +// +// MODULE: Installed directly from nf-core/modules +// +include { DUPRADAR } from '../../modules/nf-core/dupradar' +include { SAMTOOLS_SORT } from '../../modules/nf-core/samtools/sort' +include { PRESEQ_LCEXTRAP } from '../../modules/nf-core/preseq/lcextrap' +include { QUALIMAP_RNASEQ } from '../../modules/nf-core/qualimap/rnaseq' +include { STRINGTIE_STRINGTIE } from '../../modules/nf-core/stringtie/stringtie' +include { SUBREAD_FEATURECOUNTS } from '../../modules/nf-core/subread/featurecounts' +include { MULTIQC } from '../../modules/nf-core/multiqc' +include { UMITOOLS_PREPAREFORRSEM as UMITOOLS_PREPAREFORSALMON } from '../../modules/nf-core/umitools/prepareforrsem' +include { BEDTOOLS_GENOMECOV as BEDTOOLS_GENOMECOV_FW } from '../../modules/nf-core/bedtools/genomecov' +include { BEDTOOLS_GENOMECOV as BEDTOOLS_GENOMECOV_REV } from '../../modules/nf-core/bedtools/genomecov' + +// +// SUBWORKFLOW: Consisting entirely of nf-core/modules +// +include { paramsSummaryMap } from 'plugin/nf-validation' +include { fromSamplesheet } from 'plugin/nf-validation' +include { paramsSummaryMultiqc } from '../../subworkflows/nf-core/utils_nfcore_pipeline' +include { softwareVersionsToYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' +include { FASTQ_ALIGN_HISAT2 } from '../../subworkflows/nf-core/fastq_align_hisat2' +include { BAM_SORT_STATS_SAMTOOLS } from '../../subworkflows/nf-core/bam_sort_stats_samtools' +include { BAM_MARKDUPLICATES_PICARD } from '../../subworkflows/nf-core/bam_markduplicates_picard' +include { BAM_RSEQC } from '../../subworkflows/nf-core/bam_rseqc' +include { BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS as BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME } from '../../subworkflows/nf-core/bam_dedup_stats_samtools_umitools' +include { BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS as BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_TRANSCRIPTOME } from '../../subworkflows/nf-core/bam_dedup_stats_samtools_umitools' +include { BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG as BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_FORWARD } from '../../subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig' +include { BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG as BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_REVERSE } from '../../subworkflows/nf-core/bedgraph_bedclip_bedgraphtobigwig' +include { QUANTIFY_PSEUDO_ALIGNMENT as QUANTIFY_STAR_SALMON } from '../../subworkflows/nf-core/quantify_pseudo_alignment' +include { QUANTIFY_PSEUDO_ALIGNMENT } from '../../subworkflows/nf-core/quantify_pseudo_alignment' +include { FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS } from '../../subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness' + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + RUN MAIN WORKFLOW +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +// Header files for MultiQC +ch_pca_header_multiqc = file("$projectDir/workflows/rnaseq/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) +sample_status_header_multiqc = file("$projectDir/workflows/rnaseq/assets/multiqc/sample_status_header.txt", checkIfExists: true) +ch_clustering_header_multiqc = file("$projectDir/workflows/rnaseq/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) +ch_biotypes_header_multiqc = file("$projectDir/workflows/rnaseq/assets/multiqc/biotypes_header.txt", checkIfExists: true) +ch_dummy_file = ch_pca_header_multiqc + +workflow RNASEQ { + + take: + ch_samplesheet // channel: path(sample_sheet.csv) + ch_versions // channel: [ path(versions.yml) ] + ch_fasta // channel: path(genome.fasta) + ch_gtf // channel: path(genome.gtf) + ch_fai // channel: path(genome.fai) + ch_chrom_sizes // channel: path(genome.sizes) + ch_gene_bed // channel: path(gene.bed) + ch_transcript_fasta // channel: path(transcript.fasta) + ch_star_index // channel: path(star/index/) + ch_rsem_index // channel: path(rsem/index/) + ch_hisat2_index // channel: path(hisat2/index/) + ch_salmon_index // channel: path(salmon/index/) + ch_kallisto_index // channel: [ meta, path(kallisto/index/) ] + ch_bbsplit_index // channel: path(bbsplit/index/) + ch_ribo_db // channel: path(sortmerna_fasta_list) + ch_sortmerna_index // channel: path(sortmerna/index/) + ch_splicesites // channel: path(genome.splicesites.txt) + make_sortmerna_index // boolean: Whether to create an index before running sortmerna + + main: + + ch_multiqc_files = Channel.empty() + ch_trim_status = Channel.empty() + ch_map_status = Channel.empty() + ch_strand_status = Channel.empty() + + // + // Create channel from input file provided through params.input + // + Channel + .fromSamplesheet("input") + .map { + meta, fastq_1, fastq_2 -> + if (!fastq_2) { + return [ meta.id, meta + [ single_end:true ], [ fastq_1 ] ] + } else { + return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2 ] ] + } + } + .groupTuple() + .map { + checkSamplesAfterGrouping(it) + } + .set{ ch_fastq } + + // + // Run RNA-seq FASTQ preprocessing subworkflow + // + + // The subworkflow only has to do Salmon indexing if it discovers 'auto' + // samples, and if we haven't already made one elsewhere + salmon_index_available = params.salmon_index || (!params.skip_pseudo_alignment && params.pseudo_aligner == 'salmon') + + FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS ( + ch_fastq, + ch_fasta, + ch_transcript_fasta, + ch_gtf, + ch_salmon_index, + ch_sortmerna_index, + ch_bbsplit_index, + ch_ribo_db, + params.skip_bbsplit, + params.skip_fastqc || params.skip_qc, + params.skip_trimming, + params.skip_umi_extract, + !salmon_index_available, + !params.sortmerna_index && params.remove_ribo_rna, + params.trimmer, + params.min_trimmed_reads, + params.save_trimmed, + params.remove_ribo_rna, + params.with_umi, + params.umi_discard_read, + params.stranded_threshold, + params.unstranded_threshold + ) + + ch_multiqc_files = ch_multiqc_files.mix(FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS.out.multiqc_files) + ch_versions = ch_versions.mix(FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS.out.versions) + ch_strand_inferred_filtered_fastq = FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS.out.reads + ch_trim_read_count = FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS.out.trim_read_count + + ch_trim_status = ch_trim_read_count + .map { + meta, num_reads -> + return [ meta.id, num_reads > params.min_trimmed_reads.toFloat() ] + } + // + // Get list of samples that failed trimming threshold for MultiQC report + // + ch_trim_read_count + .map { + meta, num_reads -> + if (num_reads <= params.min_trimmed_reads.toFloat()) { + return [ "$meta.id\t$num_reads" ] + } + } + .collect() + .map { + tsv_data -> + def header = ["Sample", "Reads after trimming"] + sample_status_header_multiqc.text + multiqcTsvFromList(tsv_data, header) + } + .set { ch_fail_trimming_multiqc } + + ch_multiqc_files = ch_multiqc_files.mix(ch_fail_trimming_multiqc.collectFile(name: 'fail_trimmed_samples_mqc.tsv')) + + // + // SUBWORKFLOW: Alignment with STAR and gene/transcript quantification with Salmon + // + ch_genome_bam = Channel.empty() + ch_genome_bam_index = Channel.empty() + ch_star_log = Channel.empty() + if (!params.skip_alignment && params.aligner == 'star_salmon') { + // Check if an AWS iGenome has been provided to use the appropriate version of STAR + def is_aws_igenome = false + if (params.fasta && params.gtf) { + if ((file(params.fasta).getName() - '.gz' == 'genome.fa') && (file(params.gtf).getName() - '.gz' == 'genes.gtf')) { + is_aws_igenome = true + } + } + + ALIGN_STAR ( + ch_strand_inferred_filtered_fastq, + ch_star_index.map { [ [:], it ] }, + ch_gtf.map { [ [:], it ] }, + params.star_ignore_sjdbgtf, + '', + params.seq_center ?: '', + is_aws_igenome, + ch_fasta.map { [ [:], it ] } + ) + ch_genome_bam = ALIGN_STAR.out.bam + ch_genome_bam_index = ALIGN_STAR.out.bai + ch_transcriptome_bam = ALIGN_STAR.out.bam_transcript + ch_star_log = ALIGN_STAR.out.log_final + ch_multiqc_files = ch_multiqc_files.mix(ALIGN_STAR.out.stats.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(ALIGN_STAR.out.flagstat.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(ALIGN_STAR.out.idxstats.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(ch_star_log.collect{it[1]}) + + if (params.bam_csi_index) { + ch_genome_bam_index = ALIGN_STAR.out.csi + } + ch_versions = ch_versions.mix(ALIGN_STAR.out.versions) + + // + // SUBWORKFLOW: Remove duplicate reads from BAM file based on UMIs + // + if (params.with_umi) { + // Deduplicate genome BAM file before downstream analysis + BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME ( + ch_genome_bam.join(ch_genome_bam_index, by: [0]), + params.umitools_dedup_stats + ) + ch_genome_bam = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.bam + ch_genome_bam_index = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.bai + ch_multiqc_files = ch_multiqc_files.mix(BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.deduplog.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.stats.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.flagstat.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.idxstats.collect{it[1]}) + + if (params.bam_csi_index) { + ch_genome_bam_index = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.csi + } + ch_versions = ch_versions.mix(BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.versions) + + // Co-ordinate sort, index and run stats on transcriptome BAM + BAM_SORT_STATS_SAMTOOLS ( + ch_transcriptome_bam, + ch_transcript_fasta.map { [ [:], it ] } + ) + ch_transcriptome_sorted_bam = BAM_SORT_STATS_SAMTOOLS.out.bam + ch_transcriptome_sorted_bai = BAM_SORT_STATS_SAMTOOLS.out.bai + + // Deduplicate transcriptome BAM file before read counting with Salmon + BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_TRANSCRIPTOME ( + ch_transcriptome_sorted_bam.join(ch_transcriptome_sorted_bai, by: [0]), + params.umitools_dedup_stats + ) + + // Name sort BAM before passing to Salmon + SAMTOOLS_SORT ( + BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_TRANSCRIPTOME.out.bam, + ch_fasta.map { [ [:], it ] } + ) + + // Only run prepare_for_rsem.py on paired-end BAM files + SAMTOOLS_SORT + .out + .bam + .branch { + meta, bam -> + single_end: meta.single_end + return [ meta, bam ] + paired_end: !meta.single_end + return [ meta, bam ] + } + .set { ch_umitools_dedup_bam } + + // Fix paired-end reads in name sorted BAM file + // See: https://github.com/nf-core/rnaseq/issues/828 + UMITOOLS_PREPAREFORSALMON ( + ch_umitools_dedup_bam.paired_end.map { meta, bam -> [ meta, bam, [] ] } + ) + ch_versions = ch_versions.mix(UMITOOLS_PREPAREFORSALMON.out.versions.first()) + + ch_umitools_dedup_bam + .single_end + .mix(UMITOOLS_PREPAREFORSALMON.out.bam) + .set { ch_transcriptome_bam } + } + + // + // SUBWORKFLOW: Count reads from BAM alignments using Salmon + // + QUANTIFY_STAR_SALMON ( + ch_samplesheet.map { [ [:], it ] }, + ch_transcriptome_bam, + ch_dummy_file, + ch_transcript_fasta, + ch_gtf, + params.gtf_group_features, + params.gtf_extra_attributes, + 'salmon', + true, + params.salmon_quant_libtype ?: '', + params.kallisto_quant_fraglen, + params.kallisto_quant_fraglen_sd + ) + ch_versions = ch_versions.mix(QUANTIFY_STAR_SALMON.out.versions) + + if (!params.skip_qc & !params.skip_deseq2_qc) { + DESEQ2_QC_STAR_SALMON ( + QUANTIFY_STAR_SALMON.out.counts_gene_length_scaled.map { it[1] }, + ch_pca_header_multiqc, + ch_clustering_header_multiqc + ) + ch_multiqc_files = ch_multiqc_files.mix(DESEQ2_QC_STAR_SALMON.out.pca_multiqc.collect()) + ch_multiqc_files = ch_multiqc_files.mix(DESEQ2_QC_STAR_SALMON.out.dists_multiqc.collect()) + ch_versions = ch_versions.mix(DESEQ2_QC_STAR_SALMON.out.versions) + } + } + + // + // SUBWORKFLOW: Alignment with STAR and gene/transcript quantification with RSEM + // + if (!params.skip_alignment && params.aligner == 'star_rsem') { + QUANTIFY_RSEM ( + ch_strand_inferred_filtered_fastq, + ch_rsem_index, + ch_fasta.map { [ [:], it ] } + ) + ch_genome_bam = QUANTIFY_RSEM.out.bam + ch_genome_bam_index = QUANTIFY_RSEM.out.bai + ch_star_log = QUANTIFY_RSEM.out.logs + ch_multiqc_files = ch_multiqc_files.mix(QUANTIFY_RSEM.out.stats.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(QUANTIFY_RSEM.out.flagstat.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(QUANTIFY_RSEM.out.idxstats.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(ch_star_log.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(QUANTIFY_RSEM.out.stat.collect{it[1]}) + + if (params.bam_csi_index) { + ch_genome_bam_index = QUANTIFY_RSEM.out.csi + } + ch_versions = ch_versions.mix(QUANTIFY_RSEM.out.versions) + + if (!params.skip_qc & !params.skip_deseq2_qc) { + DESEQ2_QC_RSEM ( + QUANTIFY_RSEM.out.merged_counts_gene, + ch_pca_header_multiqc, + ch_clustering_header_multiqc + ) + ch_multiqc_files = ch_multiqc_files.mix(DESEQ2_QC_RSEM.out.pca_multiqc.collect()) + ch_multiqc_files = ch_multiqc_files.mix(DESEQ2_QC_RSEM.out.dists_multiqc.collect()) + ch_versions = ch_versions.mix(DESEQ2_QC_RSEM.out.versions) + } + } + + // + // SUBWORKFLOW: Alignment with HISAT2 + // + if (!params.skip_alignment && params.aligner == 'hisat2') { + FASTQ_ALIGN_HISAT2 ( + ch_strand_inferred_filtered_fastq, + ch_hisat2_index.map { [ [:], it ] }, + ch_splicesites.map { [ [:], it ] }, + ch_fasta.map { [ [:], it ] } + ) + ch_genome_bam = FASTQ_ALIGN_HISAT2.out.bam + ch_genome_bam_index = FASTQ_ALIGN_HISAT2.out.bai + ch_multiqc_files = ch_multiqc_files.mix(FASTQ_ALIGN_HISAT2.out.stats.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(FASTQ_ALIGN_HISAT2.out.flagstat.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(FASTQ_ALIGN_HISAT2.out.idxstats.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(FASTQ_ALIGN_HISAT2.out.summary.collect{it[1]}) + + if (params.bam_csi_index) { + ch_genome_bam_index = FASTQ_ALIGN_HISAT2.out.csi + } + ch_versions = ch_versions.mix(FASTQ_ALIGN_HISAT2.out.versions) + + // + // SUBWORKFLOW: Remove duplicate reads from BAM file based on UMIs + // + if (params.with_umi) { + BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME ( + ch_genome_bam.join(ch_genome_bam_index, by: [0]), + params.umitools_dedup_stats + ) + ch_genome_bam = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.bam + ch_genome_bam_index = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.bai + ch_multiqc_files = ch_multiqc_files.mix(BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.deduplog.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.stats.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.flagstat.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.idxstats.collect{it[1]}) + if (params.bam_csi_index) { + ch_genome_bam_index = BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.csi + } + ch_versions = ch_versions.mix(BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME.out.versions) + } + } + + // + // Filter channels to get samples that passed STAR minimum mapping percentage + // + if (!params.skip_alignment && params.aligner.contains('star')) { + ch_star_log + .map { meta, align_log -> [ meta ] + getStarPercentMapped(params, align_log) } + .set { ch_percent_mapped } + + // Save status for workflow summary + ch_map_status = ch_percent_mapped + .map { + meta, mapped, pass -> + return [ meta.id, pass ] + } + + ch_genome_bam + .join(ch_percent_mapped, by: [0]) + .map { meta, ofile, mapped, pass -> if (pass) [ meta, ofile ] } + .set { ch_genome_bam } + + ch_genome_bam_index + .join(ch_percent_mapped, by: [0]) + .map { meta, ofile, mapped, pass -> if (pass) [ meta, ofile ] } + .set { ch_genome_bam_index } + + ch_percent_mapped + .branch { meta, mapped, pass -> + pass: pass + return [ "$meta.id\t$mapped" ] + fail: !pass + return [ "$meta.id\t$mapped" ] + } + .set { ch_pass_fail_mapped } + + ch_pass_fail_mapped + .fail + .collect() + .map { + tsv_data -> + def header = ["Sample", "STAR uniquely mapped reads (%)"] + sample_status_header_multiqc.text + multiqcTsvFromList(tsv_data, header) + } + .set { ch_fail_mapping_multiqc } + ch_multiqc_files = ch_multiqc_files.mix(ch_fail_mapping_multiqc.collectFile(name: 'fail_mapped_samples_mqc.tsv')) + } + + // + // MODULE: Run Preseq + // + if (!params.skip_alignment && !params.skip_qc && !params.skip_preseq) { + PRESEQ_LCEXTRAP ( + ch_genome_bam + ) + ch_multiqc_files = ch_multiqc_files.mix(PRESEQ_LCEXTRAP.out.lc_extrap.collect{it[1]}) + ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions.first()) + } + + // + // SUBWORKFLOW: Mark duplicate reads + // + if (!params.skip_alignment && !params.skip_markduplicates && !params.with_umi) { + BAM_MARKDUPLICATES_PICARD ( + ch_genome_bam, + ch_fasta.map { [ [:], it ] }, + ch_fai.map { [ [:], it ] } + ) + ch_genome_bam = BAM_MARKDUPLICATES_PICARD.out.bam + ch_genome_bam_index = BAM_MARKDUPLICATES_PICARD.out.bai + ch_multiqc_files = ch_multiqc_files.mix(BAM_MARKDUPLICATES_PICARD.out.stats.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_MARKDUPLICATES_PICARD.out.flagstat.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_MARKDUPLICATES_PICARD.out.idxstats.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_MARKDUPLICATES_PICARD.out.metrics.collect{it[1]}) + + if (params.bam_csi_index) { + ch_genome_bam_index = BAM_MARKDUPLICATES_PICARD.out.csi + } + ch_versions = ch_versions.mix(BAM_MARKDUPLICATES_PICARD.out.versions) + } + + // + // MODULE: STRINGTIE + // + if (!params.skip_alignment && !params.skip_stringtie) { + STRINGTIE_STRINGTIE ( + ch_genome_bam, + ch_gtf + ) + ch_versions = ch_versions.mix(STRINGTIE_STRINGTIE.out.versions.first()) + } + + // + // MODULE: Feature biotype QC using featureCounts + // + def biotype = params.gencode ? "gene_type" : params.featurecounts_group_type + if (!params.skip_alignment && !params.skip_qc && !params.skip_biotype_qc && biotype) { + + ch_gtf + .map { biotypeInGtf(it, biotype) } + .set { biotype_in_gtf } + + // Prevent any samples from running if GTF file doesn't have a valid biotype + ch_genome_bam + .combine(ch_gtf) + .combine(biotype_in_gtf) + .filter { it[-1] } + .map { it[0.. [ meta, bam, 1 ] } + + BEDTOOLS_GENOMECOV_FW ( + ch_genomecov_input, + [], + 'bedGraph', + true + ) + BEDTOOLS_GENOMECOV_REV ( + ch_genomecov_input, + [], + 'bedGraph', + true + ) + + ch_versions = ch_versions.mix(BEDTOOLS_GENOMECOV_FW.out.versions.first()) + + // + // SUBWORKFLOW: Convert bedGraph to bigWig + // + BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_FORWARD ( + BEDTOOLS_GENOMECOV_FW.out.genomecov, + ch_chrom_sizes + ) + ch_versions = ch_versions.mix(BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_FORWARD.out.versions) + + BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_REVERSE ( + BEDTOOLS_GENOMECOV_REV.out.genomecov, + ch_chrom_sizes + ) + } + + // + // MODULE: Downstream QC steps + // + if (!params.skip_alignment && !params.skip_qc) { + if (!params.skip_qualimap) { + QUALIMAP_RNASEQ ( + ch_genome_bam, + ch_gtf.map { [ [:], it ] } + ) + ch_multiqc_files = ch_multiqc_files.mix(QUALIMAP_RNASEQ.out.results.collect{it[1]}) + ch_versions = ch_versions.mix(QUALIMAP_RNASEQ.out.versions.first()) + } + + if (!params.skip_dupradar) { + DUPRADAR ( + ch_genome_bam, + ch_gtf.map { [ [:], it ] } + ) + ch_multiqc_files = ch_multiqc_files.mix(DUPRADAR.out.multiqc.collect{it[1]}) + ch_versions = ch_versions.mix(DUPRADAR.out.versions.first()) + } + + // Get RSeqC modules to run + def rseqc_modules = params.rseqc_modules ? params.rseqc_modules.split(',').collect{ it.trim().toLowerCase() } : [] + if (params.bam_csi_index) { + for (rseqc_module in ['read_distribution', 'inner_distance', 'tin']) { + if (rseqc_modules.contains(rseqc_module)) { + rseqc_modules.remove(rseqc_module) + } + } + } + if (!params.skip_rseqc && rseqc_modules.size() > 0) { + BAM_RSEQC ( + ch_genome_bam.join(ch_genome_bam_index, by: [0]), + ch_gene_bed, + rseqc_modules + ) + ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.bamstat_txt.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.inferexperiment_txt.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.innerdistance_freq.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.junctionannotation_log.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.junctionsaturation_rscript.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.readdistribution_txt.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.readduplication_pos_xls.collect{it[1]}) + ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.tin_txt.collect{it[1]}) + ch_versions = ch_versions.mix(BAM_RSEQC.out.versions) + + // Compare predicted supplied or Salmon-predicted strand with what we get from RSeQC + ch_strand_comparison = BAM_RSEQC.out.inferexperiment_txt + .map { + meta, strand_log -> + def rseqc_inferred_strand = getInferexperimentStrandedness(strand_log, stranded_threshold = params.stranded_threshold, unstranded_threshold = params.unstranded_threshold) + rseqc_strandedness = rseqc_inferred_strand.inferred_strandedness + + def status = 'fail' + def multiqc_lines = [] + if (meta.salmon_strand_analysis) { + salmon_strandedness = meta.salmon_strand_analysis.inferred_strandedness + + if (salmon_strandedness == rseqc_strandedness && rseqc_strandedness != 'undetermined') { + status = 'pass' + } + multiqc_lines = [ + "$meta.id \tSalmon\t$status\tauto\t${meta.salmon_strand_analysis.values().join('\t')}", + "$meta.id\tRSeQC\t$status\tauto\t${rseqc_inferred_strand.values().join('\t')}" + ] + } + else { + if (meta.strandedness == rseqc_strandedness) { + status = 'pass' + } + multiqc_lines = [ "$meta.id\tRSeQC\t$status\t$meta.strandedness\t${rseqc_inferred_strand.values().join('\t')}" ] + } + return [ meta, status, multiqc_lines ] + } + .multiMap { + meta, status, multiqc_lines -> + status: [ meta.id, status == 'pass' ] + multiqc_lines: multiqc_lines + } + + // Store the statuses for output + ch_strand_status = ch_strand_comparison.status + + // Take the lines formatted for MultiQC and output + ch_strand_comparison.multiqc_lines + .flatten() + .collect() + .map { + tsv_data -> + def header = [ + "Sample", + "Strand inference method", + "Status", + "Provided strandedness", + "Inferred strandedness", + "Sense (%)", + "Antisense (%)", + "Unstranded (%)" + ] + sample_status_header_multiqc.text + multiqcTsvFromList(tsv_data, header) + } + .set { ch_fail_strand_multiqc } + + ch_multiqc_files = ch_multiqc_files.mix(ch_fail_strand_multiqc.collectFile(name: 'fail_strand_check_mqc.tsv')) + } + } + + // + // SUBWORKFLOW: Pseudoalignment and quantification with Salmon + // + if (!params.skip_pseudo_alignment && params.pseudo_aligner) { + + if (params.pseudo_aligner == 'salmon') { + ch_pseudo_index = ch_salmon_index + } else { + ch_pseudo_index = ch_kallisto_index + } + + QUANTIFY_PSEUDO_ALIGNMENT ( + ch_samplesheet.map { [ [:], it ] }, + ch_strand_inferred_filtered_fastq, + ch_pseudo_index, + ch_dummy_file, + ch_gtf, + params.gtf_group_features, + params.gtf_extra_attributes, + params.pseudo_aligner, + false, + params.salmon_quant_libtype ?: '', + params.kallisto_quant_fraglen, + params.kallisto_quant_fraglen_sd + ) + ch_counts_gene_length_scaled = QUANTIFY_PSEUDO_ALIGNMENT.out.counts_gene_length_scaled + ch_multiqc_files = ch_multiqc_files.mix(QUANTIFY_PSEUDO_ALIGNMENT.out.multiqc.collect{it[1]}) + ch_versions = ch_versions.mix(QUANTIFY_PSEUDO_ALIGNMENT.out.versions) + + if (!params.skip_qc & !params.skip_deseq2_qc) { + DESEQ2_QC_PSEUDO ( + ch_counts_gene_length_scaled.map { it[1] }, + ch_pca_header_multiqc, + ch_clustering_header_multiqc + ) + ch_multiqc_files = ch_multiqc_files.mix(DESEQ2_QC_PSEUDO.out.pca_multiqc.collect()) + ch_multiqc_files = ch_multiqc_files.mix(DESEQ2_QC_PSEUDO.out.dists_multiqc.collect()) + ch_versions = ch_versions.mix(DESEQ2_QC_PSEUDO.out.versions) + } + } + + // + // Collate and save software versions + // + softwareVersionsToYAML(ch_versions) + .collectFile(storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_rnaseq_software_mqc_versions.yml', sort: true, newLine: true) + .set { ch_collated_versions } + + // + // MODULE: MultiQC + // + ch_multiqc_report = Channel.empty() + + if (!params.skip_multiqc) { + + // Load MultiQC configuration files + ch_multiqc_config = Channel.fromPath("$projectDir/workflows/rnaseq/assets/multiqc/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() + + // Prepare the workflow summary + ch_workflow_summary = Channel.value( + paramsSummaryMultiqc( + paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") + ) + ).collectFile(name: 'workflow_summary_mqc.yaml') + + // Prepare the methods section + ch_methods_description = Channel.value( + methodsDescriptionText( + params.multiqc_methods_description + ? file(params.multiqc_methods_description) + : file("$projectDir/workflows/rnaseq/assets/multiqc/methods_description_template.yml", checkIfExists: true) + ) + ).collectFile(name: 'methods_description_mqc.yaml') + + // Add summary, versions, and methods to the MultiQC input file list + ch_multiqc_files = ch_multiqc_files + .mix(ch_workflow_summary) + .mix(ch_collated_versions) + .mix(ch_methods_description) + + // Provide MultiQC with rename patterns to ensure it uses sample names + // for single-techrep samples not processed by CAT_FASTQ, and trims out + // _raw or _trimmed + + ch_name_replacements = ch_fastq + .map{ meta, reads -> + def name1 = file(reads[0][0]).simpleName + "\t" + meta.id + '_1' + def fastqcnames = meta.id + "_raw\t" + meta.id + "\n" + meta.id + "_trimmed\t" + meta.id + if (reads[0][1] ){ + def name2 = file(reads[0][1]).simpleName + "\t" + meta.id + '_2' + def fastqcnames1 = meta.id + "_raw_1\t" + meta.id + "_1\n" + meta.id + "_trimmed_1\t" + meta.id + "_1" + def fastqcnames2 = meta.id + "_raw_2\t" + meta.id + "_2\n" + meta.id + "_trimmed_2\t" + meta.id + "_2" + return [ name1, name2, fastqcnames1, fastqcnames2 ] + } else{ + return [ name1, fastqcnames ] + } + } + .flatten() + .collectFile(name: 'name_replacement.txt', newLine: true) + + MULTIQC ( + ch_multiqc_files.collect(), + ch_multiqc_config.toList(), + ch_multiqc_custom_config.toList(), + ch_multiqc_logo.toList(), + ch_name_replacements, + [] + ) + ch_multiqc_report = MULTIQC.out.report + } + + emit: + trim_status = ch_trim_status // channel: [id, boolean] + map_status = ch_map_status // channel: [id, boolean] + strand_status = ch_strand_status // channel: [id, boolean] + multiqc_report = ch_multiqc_report // channel: /path/to/multiqc_report.html + versions = ch_versions // channel: [ path(versions.yml) ] +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + THE END +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ diff --git a/workflows/rnaseq/nextflow.config b/workflows/rnaseq/nextflow.config new file mode 100644 index 000000000..c7eeac733 --- /dev/null +++ b/workflows/rnaseq/nextflow.config @@ -0,0 +1,442 @@ +includeConfig "../../modules/local/multiqc_custom_biotype/nextflow.config" +includeConfig "../../modules/nf-core/bbmap/bbsplit/nextflow.config" +includeConfig "../../modules/nf-core/cat/fastq/nextflow.config" +includeConfig "../../modules/nf-core/dupradar/nextflow.config" +includeConfig "../../modules/nf-core/multiqc/nextflow.config" +includeConfig "../../modules/nf-core/preseq/lcextrap/nextflow.config" +includeConfig "../../modules/nf-core/qualimap/rnaseq/nextflow.config" +includeConfig "../../modules/nf-core/sortmerna/nextflow.config" +includeConfig "../../modules/nf-core/stringtie/stringtie/nextflow.config" +includeConfig "../../modules/nf-core/subread/featurecounts/nextflow.config" +includeConfig "../../subworkflows/local/align_star/nextflow.config" +includeConfig "../../subworkflows/local/quantify_rsem/nextflow.config" +includeConfig "../../subworkflows/nf-core/quantify_pseudo_alignment/nextflow.config" +includeConfig "../../subworkflows/nf-core/bam_markduplicates_picard/nextflow.config" +includeConfig "../../subworkflows/nf-core/bam_rseqc/nextflow.config" +includeConfig "../../subworkflows/nf-core/fastq_align_hisat2/nextflow.config" +includeConfig "../../subworkflows/nf-core/fastq_fastqc_umitools_fastp/nextflow.config" +includeConfig "../../subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/nextflow.config" +includeConfig "../../subworkflows/nf-core/fastq_subsample_fq_salmon/nextflow.config" + +// +// STAR Salmon alignment options +// + +if (!params.skip_alignment && params.aligner == 'star_salmon') { + process { + withName: '.*:QUANTIFY_STAR_SALMON:SALMON_QUANT' { + ext.args = { params.extra_salmon_quant_args ?: '' } + publishDir = [ + path: { "${params.outdir}/${params.aligner}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') || filename.endsWith('_meta_info.json') || filename.endsWith('_format_counts.json') ? null : filename } + ] + } + + withName: '.*:QUANTIFY_STAR_SALMON:CUSTOM_TX2GENE' { + publishDir = [ + path: { "${params.outdir}/${params.aligner}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:QUANTIFY_STAR_SALMON:TXIMETA_TXIMPORT' { + ext.prefix = { "${quant_type}.merged" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:QUANTIFY_STAR_SALMON:SE_.*' { + ext.prefix = { "${params.pseudo_aligner}.merged" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') || filename.endsWith('.log') ? null : filename } + ] + } + withName: '.*:QUANTIFY_STAR_SALMON:SE_GENE' { + ext.prefix = { "${params.pseudo_aligner}.merged.gene_counts" } + } + withName: '.*:QUANTIFY_STAR_SALMON:SE_GENE_SCALED' { + ext.prefix = { "${params.pseudo_aligner}.merged.gene_counts_scaled" } + } + withName: '.*:QUANTIFY_STAR_SALMON:SE_GENE_LENGTH_SCALED' { + ext.prefix = { "${params.pseudo_aligner}.merged.gene_counts_length_scaled" } + } + withName: '.*:QUANTIFY_STAR_SALMON:SE_TRANSCRIPT' { + ext.prefix = { "${params.pseudo_aligner}.merged.transcript_counts" } + } + } + + if (params.with_umi) { + process { + withName: 'NFCORE_RNASEQ:RNASEQ:SAMTOOLS_SORT' { + ext.args = '-n' + ext.prefix = { "${meta.id}.umi_dedup.transcriptome" } + publishDir = [ + path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.bam', + saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } + ] + } + + withName: 'NFCORE_RNASEQ:RNASEQ:UMITOOLS_PREPAREFORSALMON' { + ext.prefix = { "${meta.id}.umi_dedup.transcriptome.filtered" } + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}/umitools/prepare_for_salmon_log" }, + mode: params.publish_dir_mode, + pattern: '*.log' + ], + [ + path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.bam', + saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } + ] + ] + } + + withName: 'NFCORE_RNASEQ:RNASEQ:BAM_SORT_STATS_SAMTOOLS:SAMTOOLS_SORT' { + ext.prefix = { "${meta.id}.transcriptome.sorted" } + publishDir = [ + path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.bam', + saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } + ] + } + + withName: 'NFCORE_RNASEQ:RNASEQ:BAM_SORT_STATS_SAMTOOLS:SAMTOOLS_INDEX' { + publishDir = [ + path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.bai', + saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } + ] + } + + withName: 'NFCORE_RNASEQ:RNASEQ:BAM_SORT_STATS_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}.transcriptome.sorted.bam" } + publishDir = [ + path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}/samtools_stats" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.{stats,flagstat,idxstats}', + saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } + ] + } + + withName: '.*:BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_TRANSCRIPTOME:UMITOOLS_DEDUP' { + ext.args = { [ + meta.single_end ? '' : '--unpaired-reads=discard --chimeric-pairs=discard', + params.umitools_grouping_method ? "--method='${params.umitools_grouping_method}'" : '', + params.umitools_umi_separator ? "--umi-separator='${params.umitools_umi_separator}'" : '' + ].join(' ').trim() } + ext.prefix = { "${meta.id}.umi_dedup.transcriptome.sorted" } + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}/umitools" }, + mode: params.publish_dir_mode, + pattern: '*.tsv' + ], + [ + path: { "${params.outdir}/${params.aligner}/umitools/transcriptomic_dedup_log" }, + mode: params.publish_dir_mode, + pattern: '*.log' + ], + [ + path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.bam', + saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } + ] + ] + } + + withName: '.*:BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_TRANSCRIPTOME:SAMTOOLS_INDEX' { + publishDir = [ + path: { params.save_align_intermeds || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.bai', + saveAs: { params.save_align_intermeds || params.save_umi_intermeds ? it : null } + ] + } + + withName: '.*:BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_TRANSCRIPTOME:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}.umi_dedup.transcriptome.sorted.bam" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}/samtools_stats" }, + mode: params.publish_dir_mode, + pattern: '*.{stats,flagstat,idxstats}' + ] + } + } + } +} + +// +// General alignment options +// + +if (!params.skip_alignment) { + process { + withName: 'NFCORE_RNASEQ:RNASEQ:.*:BAM_SORT_STATS_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}.sorted.bam" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}/samtools_stats" }, + mode: params.publish_dir_mode, + pattern: "*.{stats,flagstat,idxstats}" + ] + } + + withName: 'NFCORE_RNASEQ:RNASEQ:.*:BAM_SORT_STATS_SAMTOOLS:SAMTOOLS_SORT' { + ext.prefix = { "${meta.id}.sorted" } + publishDir = [ + path: { ( ['star_salmon','hisat2'].contains(params.aligner) && + ( params.save_align_intermeds || ( !params.with_umi && params.skip_markduplicates ) ) + ) || params.save_align_intermeds || params.skip_markduplicates ? "${params.outdir}/${params.aligner}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: "*.bam", + saveAs: { ( ['star_salmon','hisat2'].contains(params.aligner) && + ( params.save_align_intermeds || ( !params.with_umi && params.skip_markduplicates ) ) + ) || params.save_align_intermeds || params.skip_markduplicates ? it : null } + ] + } + + withName: 'NFCORE_RNASEQ:RNASEQ:.*:BAM_SORT_STATS_SAMTOOLS:SAMTOOLS_INDEX' { + ext.args = { params.bam_csi_index ? '-c' : '' } + publishDir = [ + path: { ( ['star_salmon','hisat2'].contains(params.aligner) && + ( params.save_align_intermeds || ( !params.with_umi && params.skip_markduplicates ) ) + ) || params.save_align_intermeds || params.skip_markduplicates ? "${params.outdir}/${params.aligner}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: "*.{bai,csi}", + saveAs: { ( ['star_salmon','hisat2'].contains(params.aligner) && + ( params.save_align_intermeds || ( !params.with_umi && params.skip_markduplicates ) ) + ) || params.save_align_intermeds || params.skip_markduplicates ? it : null } + ] + } + } + + if (params.with_umi && ['star_salmon','hisat2'].contains(params.aligner)) { + process { + withName: '.*:BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME:UMITOOLS_DEDUP' { + ext.args = { [ + meta.single_end ? '' : '--unpaired-reads=discard --chimeric-pairs=discard', + params.umitools_grouping_method ? "--method='${params.umitools_grouping_method}'" : '', + params.umitools_umi_separator ? "--umi-separator='${params.umitools_umi_separator}'" : '' + ].join(' ').trim() } + ext.prefix = { "${meta.id}.umi_dedup.sorted" } + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}/umitools" }, + mode: params.publish_dir_mode, + pattern: '*.tsv' + ], + [ + path: { "${params.outdir}/${params.aligner}/umitools/genomic_dedup_log" }, + mode: params.publish_dir_mode, + pattern: '*.log' + ], + [ + path: { params.save_align_intermeds || params.with_umi || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.bam', + saveAs: { params.save_align_intermeds || params.with_umi || params.save_umi_intermeds ? it : null } + ] + ] + } + + withName: '.*:BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME:SAMTOOLS_INDEX' { + ext.args = { params.bam_csi_index ? '-c' : '' } + ext.prefix = { "${meta.id}.umi_dedup.sorted" } + publishDir = [ + path: { params.save_align_intermeds || params.with_umi || params.save_umi_intermeds ? "${params.outdir}/${params.aligner}" : params.outdir }, + mode: params.publish_dir_mode, + pattern: '*.{bai,csi}', + saveAs: { params.save_align_intermeds || params.with_umi || params.save_umi_intermeds ? it : null } + ] + } + + withName: '.*:BAM_DEDUP_STATS_SAMTOOLS_UMITOOLS_GENOME:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}.umi_dedup.sorted.bam" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}/samtools_stats" }, + mode: params.publish_dir_mode, + pattern: '*.{stats,flagstat,idxstats}' + ] + } + } + } +} + +// +// bigWig coverage options +// +if (!params.skip_alignment && !params.skip_bigwig) { + process { + withName: 'BEDTOOLS_GENOMECOV_FW' { + ext.prefix = { meta.strandedness == 'reverse' ? meta.id + '.reverse' : meta.id + '.forward' } + ext.args = '-split -du -strand + -bg' + publishDir = [ + enabled: false + ] + } + + withName: 'BEDTOOLS_GENOMECOV_REV' { + ext.prefix = { meta.strandedness == 'reverse' ? meta.id + '.forward' : meta.id + '.reverse' } + ext.args = '-split -du -strand - -bg' + publishDir = [ + enabled: false + ] + } + + withName: '.*:BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_FORWARD:UCSC_BEDCLIP' { + ext.prefix = { "${meta.id}.clip.forward" } + publishDir = [ + enabled: false + ] + } + + withName: '.*:BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_FORWARD:UCSC_BEDGRAPHTOBIGWIG' { + ext.prefix = { "${meta.id}.forward" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}/bigwig" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_REVERSE:UCSC_BEDCLIP' { + ext.prefix = { "${meta.id}.clip.reverse" } + publishDir = [ + enabled: false + ] + } + + withName: '.*:BEDGRAPH_BEDCLIP_BEDGRAPHTOBIGWIG_REVERSE:UCSC_BEDGRAPHTOBIGWIG' { + ext.prefix = { "${meta.id}.reverse" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}/bigwig" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } +} + +// +// DESeq2 QC options +// + +if (!params.skip_alignment && params.aligner == 'star_salmon') { + if (!params.skip_qc & !params.skip_deseq2_qc) { + process { + withName: 'DESEQ2_QC_STAR_SALMON' { + ext.args = { [ + "--id_col 1", + "--sample_suffix ''", + "--count_col 3", + params.deseq2_vst ? '--vst TRUE' : '' + ].join(' ').trim() } + ext.args2 = 'star_salmon' + publishDir = [ + path: { "${params.outdir}/${params.aligner}/deseq2_qc" }, + mode: params.publish_dir_mode, + pattern: "*{RData,pca.vals.txt,plots.pdf,sample.dists.txt,size_factors,log}" + ] + } + } + } +} + +if (!params.skip_alignment && params.aligner == 'star_rsem') { + if (!params.skip_qc & !params.skip_deseq2_qc) { + process { + withName: 'DESEQ2_QC_RSEM' { + ext.args = { [ + "--id_col 1", + "--sample_suffix ''", + "--count_col 3", + params.deseq2_vst ? '--vst TRUE' : '' + ].join(' ').trim() } + ext.args2 = 'star_rsem' + publishDir = [ + path: { "${params.outdir}/${params.aligner}/deseq2_qc" }, + mode: params.publish_dir_mode, + pattern: "*{RData,pca.vals.txt,plots.pdf,sample.dists.txt,size_factors,log}" + ] + } + } + } +} + +// +// Pseudo-alignment options +// + +if (!params.skip_pseudo_alignment && params.pseudo_aligner) { + process { + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:CUSTOM_TX2GENE' { + publishDir = [ + path: { "${params.outdir}/${params.pseudo_aligner}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:TXIMETA_TXIMPORT' { + ext.prefix = { "${quant_type}.merged" } + publishDir = [ + path: { "${params.outdir}/${params.pseudo_aligner}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:SE_.*' { + ext.args = '--assay_names counts,abundance' + publishDir = [ + path: { "${params.outdir}/${params.pseudo_aligner}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') || filename.endsWith('.log') ? null : filename } + ] + } + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:SE_GENE' { + ext.prefix = { "${params.pseudo_aligner}.merged.gene_counts" } + } + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:SE_GENE_SCALED' { + ext.prefix = { "${params.pseudo_aligner}.merged.gene_counts_scaled" } + } + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:SE_GENE_LENGTH_SCALED' { + ext.prefix = { "${params.pseudo_aligner}.merged.gene_counts_length_scaled" } + } + withName: '.*:QUANTIFY_PSEUDO_ALIGNMENT:SE_TRANSCRIPT' { + ext.prefix = { "${params.pseudo_aligner}.merged.transcript_counts" } + } + } + + if (!params.skip_qc & !params.skip_deseq2_qc) { + process { + withName: 'DESEQ2_QC_PSEUDO' { + ext.args = { [ + "--id_col 1", + "--sample_suffix ''", + "--count_col 3", + params.deseq2_vst ? '--vst TRUE' : '' + ].join(' ').trim() } + ext.args2 = { params.pseudo_aligner } + publishDir = [ + path: { "${params.outdir}/${params.pseudo_aligner}/deseq2_qc" }, + mode: params.publish_dir_mode, + pattern: "*{RData,pca.vals.txt,plots.pdf,sample.dists.txt,size_factors,log}" + ] + } + } + } +}