From b2fce632cf0bb6a3ea542eb28247c5b24c0ab5c0 Mon Sep 17 00:00:00 2001 From: Pritom Mitchell Rodrigues Date: Mon, 4 May 2026 13:43:45 +0200 Subject: [PATCH 1/9] chore: scaffold nf-core pipeline with nf-core create - Generated with nf-core tools v4.0.2 - Includes CI workflows, linting config, base/test profiles - Adds community boilerplate (LICENSE, CODE_OF_CONDUCT, CITATIONS) - Includes nf-core shared subworkflows and modules --- .devcontainer/devcontainer.json | 21 + .devcontainer/setup.sh | 13 + .gitattributes | 4 + .github/.dockstore.yml | 6 + .github/ISSUE_TEMPLATE/bug_report.yml | 49 + .github/ISSUE_TEMPLATE/config.yml | 7 + .github/ISSUE_TEMPLATE/feature_request.yml | 11 + .github/PULL_REQUEST_TEMPLATE.md | 26 + .github/actions/get-shards/action.yml | 69 + .github/actions/nf-test/action.yml | 111 ++ .github/workflows/awsfulltest.yml | 67 + .github/workflows/awstest.yml | 33 + .github/workflows/branch.yml | 46 + .github/workflows/clean-up.yml | 24 + .github/workflows/download_pipeline.yml | 142 ++ .github/workflows/fix_linting.yml | 85 + .github/workflows/linting.yml | 76 + .github/workflows/linting_comment.yml | 28 + .github/workflows/nf-test.yml | 144 ++ .github/workflows/release-announcements.yml | 46 + .../workflows/template-version-comment.yml | 46 + .gitignore | 28 + .nf-core.yml | 15 + .pre-commit-config.yaml | 33 + .prettierignore | 14 + .prettierrc.yml | 6 + CHANGELOG.md | 16 + CITATIONS.md | 41 + CODE_OF_CONDUCT.md | 182 ++ LICENSE | 21 + conf/base.config | 66 + conf/containers_conda_lock_files_amd64.config | 2 + conf/containers_conda_lock_files_arm64.config | 2 + conf/containers_docker_amd64.config | 2 + conf/containers_docker_arm64.config | 2 + .../containers_singularity_https_amd64.config | 2 + .../containers_singularity_https_arm64.config | 2 + conf/containers_singularity_oras_amd64.config | 2 + conf/containers_singularity_oras_arm64.config | 2 + conf/igenomes.config | 440 +++++ conf/igenomes_ignored.config | 9 + conf/modules.config | 77 + conf/test.config | 22 + conf/test_full.config | 24 + docs/CONTRIBUTING.md | 185 ++ docs/README.md | 10 + .../nf-core-biodivpipeline_logo_dark.png | Bin 0 -> 26383 bytes .../nf-core-biodivpipeline_logo_light.png | Bin 0 -> 22148 bytes docs/output.md | 61 + docs/usage.md | 214 +++ modules.json | 41 + .../linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt | 822 +++++++++ .../linux_arm64-bd-e455e32f745abe68_1.txt | 769 ++++++++ modules/nf-core/fastqc/environment.yml | 7 + modules/nf-core/fastqc/main.nf | 57 + modules/nf-core/fastqc/meta.yml | 111 ++ modules/nf-core/fastqc/tests/main.nf.test | 309 ++++ .../nf-core/fastqc/tests/main.nf.test.snap | 476 +++++ .../linux_amd64-bd-c1f4a7982b743963_1.txt | 1552 +++++++++++++++++ .../linux_amd64-bd-db7c73dae76bc9e6_1.txt | 126 ++ .../linux_arm64-bd-40bf3b435e89dc22_1.txt | 1502 ++++++++++++++++ .../linux_arm64-bd-d167b8012595a136_1.txt | 125 ++ modules/nf-core/multiqc/environment.yml | 7 + modules/nf-core/multiqc/main.nf | 50 + modules/nf-core/multiqc/meta.yml | 133 ++ .../multiqc/tests/custom_prefix.config | 5 + modules/nf-core/multiqc/tests/main.nf.test | 211 +++ .../nf-core/multiqc/tests/main.nf.test.snap | 422 +++++ modules/nf-core/multiqc/tests/nextflow.config | 6 + nf-test.config | 38 + ro-crate-metadata.json | 305 ++++ .../main.nf | 241 +++ .../nf-core/utils_nextflow_pipeline/main.nf | 126 ++ .../nf-core/utils_nextflow_pipeline/meta.yml | 38 + .../tests/main.function.nf.test | 54 + .../tests/main.function.nf.test.snap | 20 + .../tests/main.workflow.nf.test | 113 ++ .../tests/nextflow.config | 9 + .../nf-core/utils_nfcore_pipeline/main.nf | 355 ++++ .../nf-core/utils_nfcore_pipeline/meta.yml | 24 + .../tests/main.function.nf.test | 126 ++ .../tests/main.function.nf.test.snap | 136 ++ .../utils_nfcore_pipeline/tests/main.nf.test | 29 + .../tests/main.nf.test.snap | 19 + .../tests/main.workflow.nf.test | 29 + .../tests/main.workflow.nf.test.snap | 19 + .../tests/nextflow.config | 9 + .../nf-core/utils_nfschema_plugin/main.nf | 73 + .../nf-core/utils_nfschema_plugin/meta.yml | 35 + .../utils_nfschema_plugin/tests/main.nf.test | 173 ++ .../tests/nextflow.config | 8 + .../tests/nextflow_schema.json | 96 + tests/.nftignore | 12 + tests/default.nf.test | 33 + tests/nextflow.config | 14 + tower.yml | 5 + 96 files changed, 11404 insertions(+) create mode 100644 .devcontainer/devcontainer.json create mode 100755 .devcontainer/setup.sh create mode 100644 .gitattributes create mode 100644 .github/.dockstore.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/actions/get-shards/action.yml create mode 100644 .github/actions/nf-test/action.yml create mode 100644 .github/workflows/awsfulltest.yml create mode 100644 .github/workflows/awstest.yml create mode 100644 .github/workflows/branch.yml create mode 100644 .github/workflows/clean-up.yml create mode 100644 .github/workflows/download_pipeline.yml create mode 100644 .github/workflows/fix_linting.yml create mode 100644 .github/workflows/linting.yml create mode 100644 .github/workflows/linting_comment.yml create mode 100644 .github/workflows/nf-test.yml create mode 100644 .github/workflows/release-announcements.yml create mode 100644 .github/workflows/template-version-comment.yml create mode 100644 .gitignore create mode 100644 .nf-core.yml create mode 100644 .pre-commit-config.yaml create mode 100644 .prettierignore create mode 100644 .prettierrc.yml create mode 100644 CHANGELOG.md create mode 100644 CITATIONS.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 LICENSE create mode 100644 conf/base.config create mode 100644 conf/containers_conda_lock_files_amd64.config create mode 100644 conf/containers_conda_lock_files_arm64.config create mode 100644 conf/containers_docker_amd64.config create mode 100644 conf/containers_docker_arm64.config create mode 100644 conf/containers_singularity_https_amd64.config create mode 100644 conf/containers_singularity_https_arm64.config create mode 100644 conf/containers_singularity_oras_amd64.config create mode 100644 conf/containers_singularity_oras_arm64.config create mode 100644 conf/igenomes.config create mode 100644 conf/igenomes_ignored.config create mode 100644 conf/modules.config create mode 100644 conf/test.config create mode 100644 conf/test_full.config create mode 100644 docs/CONTRIBUTING.md create mode 100644 docs/README.md create mode 100644 docs/images/nf-core-biodivpipeline_logo_dark.png create mode 100644 docs/images/nf-core-biodivpipeline_logo_light.png create mode 100644 docs/output.md create mode 100644 docs/usage.md create mode 100644 modules.json create mode 100644 modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt create mode 100644 modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt create mode 100644 modules/nf-core/fastqc/environment.yml create mode 100644 modules/nf-core/fastqc/main.nf create mode 100644 modules/nf-core/fastqc/meta.yml create mode 100644 modules/nf-core/fastqc/tests/main.nf.test create mode 100644 modules/nf-core/fastqc/tests/main.nf.test.snap create mode 100644 modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt create mode 100644 modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt create mode 100644 modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt create mode 100644 modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt create mode 100644 modules/nf-core/multiqc/environment.yml create mode 100644 modules/nf-core/multiqc/main.nf create mode 100644 modules/nf-core/multiqc/meta.yml create mode 100644 modules/nf-core/multiqc/tests/custom_prefix.config create mode 100644 modules/nf-core/multiqc/tests/main.nf.test create mode 100644 modules/nf-core/multiqc/tests/main.nf.test.snap create mode 100644 modules/nf-core/multiqc/tests/nextflow.config create mode 100644 nf-test.config create mode 100644 ro-crate-metadata.json create mode 100644 subworkflows/local/utils_nfcore_biodivpipeline_pipeline/main.nf create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/main.nf create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/meta.yml create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/main.nf create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/meta.yml create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test.snap create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config create mode 100644 subworkflows/nf-core/utils_nfschema_plugin/main.nf create mode 100644 subworkflows/nf-core/utils_nfschema_plugin/meta.yml create mode 100644 subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test create mode 100644 subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config create mode 100644 subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json create mode 100644 tests/.nftignore create mode 100644 tests/default.nf.test create mode 100644 tests/nextflow.config create mode 100644 tower.yml diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..237c9ed --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.schema.json", + "name": "nfcore", + "image": "nfcore/devcontainer:latest", + + "remoteUser": "root", + "privileged": true, + + "remoteEnv": { + // Workspace path on the host for mounting with docker-outside-of-docker + "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}" + }, + + "onCreateCommand": "./.devcontainer/setup.sh", + + "hostRequirements": { + "cpus": 4, + "memory": "16gb", + "storage": "32gb" + } +} diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh new file mode 100755 index 0000000..da79319 --- /dev/null +++ b/.devcontainer/setup.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +# Customise the terminal command prompt +echo "export PROMPT_DIRTRIM=2" >> $HOME/.bashrc +echo "export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] '" >> $HOME/.bashrc +export PROMPT_DIRTRIM=2 +export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] ' + +# Update Nextflow +nextflow self-update + +# Update welcome message +echo "Welcome to the nf-core/biodivpipeline devcontainer!" > /usr/local/etc/vscode-dev-containers/first-run-notice.txt diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..7a2dabc --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +*.config linguist-language=nextflow +*.nf.test linguist-language=nextflow +modules/nf-core/** linguist-generated +subworkflows/nf-core/** linguist-generated diff --git a/.github/.dockstore.yml b/.github/.dockstore.yml new file mode 100644 index 0000000..191fabd --- /dev/null +++ b/.github/.dockstore.yml @@ -0,0 +1,6 @@ +# Dockstore config version, not pipeline version +version: 1.2 +workflows: + - subclass: nfl + primaryDescriptorPath: /nextflow.config + publish: True diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..68f01d2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,49 @@ +name: Bug report +description: Report something that is broken or incorrect +labels: bug +body: + - type: markdown + attributes: + value: | + Before you post this issue, please check the documentation: + + - [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) + - [nf-core/biodivpipeline pipeline documentation](https://nf-co.re/biodivpipeline/usage) + - type: textarea + id: description + attributes: + label: Description of the bug + description: A clear and concise description of what the bug is. + validations: + required: true + + - type: textarea + id: command_used + attributes: + label: Command used and terminal output + description: Steps to reproduce the behaviour. Please paste the command you used to launch the pipeline and the output from your terminal. + render: console + placeholder: | + $ nextflow run ... + + Some output where something broke + + - type: textarea + id: files + attributes: + label: Relevant files + description: | + Please drag and drop the relevant files here. Create a `.zip` archive if the extension is not allowed. + Your verbose log file `.nextflow.log` is often useful _(this is a hidden file in the directory where you launched the pipeline)_ as well as custom Nextflow configuration files. + + - type: textarea + id: system + attributes: + label: System information + description: | + * Nextflow version _(eg. 23.04.0)_ + * Hardware _(eg. HPC, Desktop, Cloud)_ + * Executor _(eg. slurm, local, awsbatch)_ + * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter, Charliecloud, or Apptainer)_ + * OS _(eg. CentOS Linux, macOS, Linux Mint)_ + * Version of nf-core/biodivpipeline _(eg. 1.1, 1.5, 1.8.2)_ diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..bed11b0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,7 @@ +contact_links: + - name: Join nf-core + url: https://nf-co.re/join + about: Please join the nf-core community here + - name: "Slack #biodivpipeline channel" + url: https://nfcore.slack.com/channels/biodivpipeline + about: Discussion about the nf-core/biodivpipeline pipeline diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..b417a10 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,11 @@ +name: Feature request +description: Suggest an idea for the nf-core/biodivpipeline pipeline +labels: enhancement +body: + - type: textarea + id: description + attributes: + label: Description of feature + description: Please describe your suggestion for a new feature. It might help to describe a problem or use case, plus any alternatives that you have considered. + validations: + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..101f103 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ + + +## PR checklist + +- [ ] This comment contains a description of changes (with reason). +- [ ] If you've fixed a bug or added code that should be tested, add tests! +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/biodivpipeline/tree/master/docs/CONTRIBUTING.md) +- [ ] If necessary, also make a PR on the nf-core/biodivpipeline _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. +- [ ] Make sure your code lints (`nf-core pipelines lint`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). +- [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). +- [ ] Usage Documentation in `docs/usage.md` is updated. +- [ ] Output Documentation in `docs/output.md` is updated. +- [ ] `CHANGELOG.md` is updated. +- [ ] `README.md` is updated (including new tool citations and authors/contributors). diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml new file mode 100644 index 0000000..e2833ee --- /dev/null +++ b/.github/actions/get-shards/action.yml @@ -0,0 +1,69 @@ +name: "Get number of shards" +description: "Get the number of nf-test shards for the current CI job" +inputs: + max_shards: + description: "Maximum number of shards allowed" + required: true + paths: + description: "Component paths to test" + required: false + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +outputs: + shard: + description: "Array of shard numbers" + value: ${{ steps.shards.outputs.shard }} + total_shards: + description: "Total number of shards" + value: ${{ steps.shards.outputs.total_shards }} +runs: + using: "composite" + steps: + - name: Install nf-test + uses: nf-core/setup-nf-test@4069fbbaabe94c08faba4ad261bfa88225ba133f # v2 + with: + version: ${{ env.NFT_VER }} + - name: Get number of shards + id: shards + shell: bash + run: | + # Run nf-test with dynamic parameter + nftest_output=$(nf-test test \ + --profile +docker \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --dry-run \ + --ci \ + --changed-since HEAD^) || { + echo "nf-test command failed with exit code $?" + echo "Full output: $nftest_output" + exit 1 + } + echo "nf-test dry-run output: $nftest_output" + + # Default values for shard and total_shards + shard="[]" + total_shards=0 + + # Check if there are related tests + if echo "$nftest_output" | grep -q 'No tests to execute'; then + echo "No related tests found." + else + # Extract the number of related tests + number_of_shards=$(echo "$nftest_output" | sed -n 's|.*Executed \([0-9]*\) tests.*|\1|p') + if [[ -n "$number_of_shards" && "$number_of_shards" -gt 0 ]]; then + shards_to_run=$(( $number_of_shards < ${{ inputs.max_shards }} ? $number_of_shards : ${{ inputs.max_shards }} )) + shard=$(seq 1 "$shards_to_run" | jq -R . | jq -c -s .) + total_shards="$shards_to_run" + else + echo "Unexpected output format. Falling back to default values." + fi + fi + + # Write to GitHub Actions outputs + echo "shard=$shard" >> $GITHUB_OUTPUT + echo "total_shards=$total_shards" >> $GITHUB_OUTPUT + + # Debugging output + echo "Final shard array: $shard" + echo "Total number of shards: $total_shards" diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml new file mode 100644 index 0000000..ad686e8 --- /dev/null +++ b/.github/actions/nf-test/action.yml @@ -0,0 +1,111 @@ +name: "nf-test Action" +description: "Runs nf-test with common setup steps" +inputs: + profile: + description: "Profile to use" + required: true + shard: + description: "Shard number for this CI job" + required: true + total_shards: + description: "Total number of test shards(NOT the total number of matrix jobs)" + required: true + paths: + description: "Test paths" + required: true + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +runs: + using: "composite" + steps: + - name: Setup Nextflow + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 + with: + version: "${{ env.NXF_VERSION }}" + + - name: Set up Python + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 + with: + python-version: "3.14" + + - name: Install nf-test + uses: nf-core/setup-nf-test@4069fbbaabe94c08faba4ad261bfa88225ba133f # v2 + with: + version: "${{ env.NFT_VER }}" + install-pdiff: true + + - name: Setup apptainer + if: contains(inputs.profile, 'singularity') + uses: eWaterCycle/setup-apptainer@3f706d898c9db585b1d741b4692e66755f3a1b40 # v2 + + - name: Set up Singularity + if: contains(inputs.profile, 'singularity') + shell: bash + run: | + mkdir -p $NXF_SINGULARITY_CACHEDIR + mkdir -p $NXF_SINGULARITY_LIBRARYDIR + + - name: Conda setup + if: contains(inputs.profile, 'conda') + uses: conda-incubator/setup-miniconda@8ee1f361103df19b6f8c8655fd3967a8ecb162d5 # v4 + with: + auto-update-conda: true + conda-solver: libmamba + channels: conda-forge + channel-priority: strict + conda-remove-defaults: true + + - name: Run nf-test + shell: bash + env: + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + run: | + nf-test test \ + --profile=+${{ inputs.profile }} \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --ci \ + --changed-since HEAD^ \ + --verbose \ + --tap=test.tap \ + --shard ${{ inputs.shard }}/${{ inputs.total_shards }} + + # Save the absolute path of the test.tap file to the output + echo "tap_file_path=$(realpath test.tap)" >> $GITHUB_OUTPUT + + - name: Generate test summary + if: always() + shell: bash + run: | + # Add header if it doesn't exist (using a token file to track this) + if [ ! -f ".summary_header" ]; then + echo "# πŸš€ nf-test results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Status | Test Name | Profile | Shard |" >> $GITHUB_STEP_SUMMARY + echo "|:------:|-----------|---------|-------|" >> $GITHUB_STEP_SUMMARY + touch .summary_header + fi + + if [ -f test.tap ]; then + while IFS= read -r line; do + if [[ $line =~ ^ok ]]; then + test_name="${line#ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| βœ… | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + elif [[ $line =~ ^not\ ok ]]; then + test_name="${line#not ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ❌ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + done < test.tap + else + echo "| ⚠️ | No test results found | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + + - name: Clean up + if: always() + shell: bash + run: | + sudo rm -rf /home/ubuntu/tests/ diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml new file mode 100644 index 0000000..df7d5fc --- /dev/null +++ b/.github/workflows/awsfulltest.yml @@ -0,0 +1,67 @@ +name: nf-core AWS full size tests +# This workflow is triggered on PRs opened against the main/master branch. +# It can be additionally triggered manually with GitHub actions workflow dispatch button. +# It runs the -profile 'test_full' on AWS batch + +on: + workflow_dispatch: + pull_request_review: + types: [submitted] + release: + types: [published] + +jobs: + run-platform: + name: Run AWS full tests + # run only if the PR is approved by at least 2 reviewers and against the master/main branch or manually triggered + if: github.repository == 'nf-core/biodivpipeline' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' || github.event_name == 'release' + runs-on: ubuntu-latest + steps: + - name: Set revision variable + id: revision + run: | + echo "revision=${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'release') && github.sha || 'dev' }}" >> "$GITHUB_OUTPUT" + + - name: Launch workflow via Seqera Platform + uses: seqeralabs/action-tower-launch@51565b514bff1827cf34620de25d0055759f1fc9 # v2 + # TODO nf-core: You can customise AWS full pipeline tests as required + # Add full size test data (but still relatively small datasets for few samples) + # on the `test_full.config` test runs with only one set of parameters + with: + workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} + compute_env: ${{ vars.TOWER_COMPUTE_ENV }} + revision: ${{ steps.revision.outputs.revision }} + workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/biodivpipeline/work-${{ steps.revision.outputs.revision }} + nextflow_config: | + plugins { + id 'nf-slack@0.5.0' + } + slack { + enabled = true + bot { + token = '${{ secrets.NFSLACK_BOT_TOKEN }}' + channel = 'biodivpipeline' + } + onStart { + enabled = false + } + onComplete { + message = ':white_check_mark: *biodivpipeline/test_full* completed successfully! :tada:' + } + onError { + message = ':x: *biodivpipeline/test_full* failed :crying_cat_face:' + } + } + parameters: | + { + "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/biodivpipeline/results-${{ steps.revision.outputs.revision }}" + } + profiles: test_full + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: Seqera Platform debug log file + path: | + tower_action_*.log + tower_action_*.json diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml new file mode 100644 index 0000000..6e45920 --- /dev/null +++ b/.github/workflows/awstest.yml @@ -0,0 +1,33 @@ +name: nf-core AWS test +# This workflow can be triggered manually with the GitHub actions workflow dispatch button. +# It runs the -profile 'test' on AWS batch + +on: + workflow_dispatch: +jobs: + run-platform: + name: Run AWS tests + if: github.repository == 'nf-core/biodivpipeline' + runs-on: ubuntu-latest + steps: + # Launch workflow using Seqera Platform CLI tool action + - name: Launch workflow via Seqera Platform + uses: seqeralabs/action-tower-launch@51565b514bff1827cf34620de25d0055759f1fc9 # v2 + with: + workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} + compute_env: ${{ vars.TOWER_COMPUTE_ENV }} + revision: ${{ github.sha }} + workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/biodivpipeline/work-${{ github.sha }} + parameters: | + { + "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/biodivpipeline/results-test-${{ github.sha }}" + } + profiles: test + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: Seqera Platform debug log file + path: | + tower_action_*.log + tower_action_*.json diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml new file mode 100644 index 0000000..77431ef --- /dev/null +++ b/.github/workflows/branch.yml @@ -0,0 +1,46 @@ +name: nf-core branch protection +# This workflow is triggered on PRs to `main`/`master` branch on the repository +# It fails when someone tries to make a PR against the nf-core `main`/`master` branch instead of `dev` +on: + pull_request_target: + branches: + - main + - master + +jobs: + test: + runs-on: ubuntu-latest + steps: + # PRs to the nf-core repo main/master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches + - name: Check PRs + if: github.repository == 'nf-core/biodivpipeline' + run: | + { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/biodivpipeline ]] && [[ $GITHUB_HEAD_REF == "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + + # If the above check failed, post a comment on the PR explaining the failure + # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets + - name: Post PR comment + if: failure() + uses: mshick/add-pr-comment@8e4927817251f1ff60c001f04568532b38e0b4a0 # v3 + with: + message: | + ## This PR is against the `${{github.event.pull_request.base.ref}}` branch :x: + + * Do not close this PR + * Click _Edit_ and change the `base` to `dev` + * This CI test will remain failed until you push a new commit + + --- + + Hi @${{ github.event.pull_request.user.login }}, + + It looks like this pull-request is has been made against the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) ${{github.event.pull_request.base.ref}} branch. + The ${{github.event.pull_request.base.ref}} branch on nf-core repositories should always contain code from the latest release. + Because of this, PRs to ${{github.event.pull_request.base.ref}} are only allowed if they come from the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `dev` branch. + + You do not need to close this PR, you can change the target branch to `dev` by clicking the _"Edit"_ button at the top of this page. + Note that even after this, the test will continue to show as failing until you push a new commit. + + Thanks again for your contribution! + repo-token: ${{ secrets.GITHUB_TOKEN }} + allow-repeats: false diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml new file mode 100644 index 0000000..172de6f --- /dev/null +++ b/.github/workflows/clean-up.yml @@ -0,0 +1,24 @@ +name: "Close user-tagged issues and PRs" +on: + schedule: + - cron: "0 0 * * 0" # Once a week + +jobs: + clean-up: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10 + with: + stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." + stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." + close-issue-message: "This issue was closed because it has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor and then staled for 20 days with no activity." + days-before-stale: 30 + days-before-close: 20 + days-before-pr-close: -1 + any-of-labels: "awaiting-changes,awaiting-feedback" + exempt-issue-labels: "WIP" + exempt-pr-labels: "WIP" + repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml new file mode 100644 index 0000000..a7bf4fc --- /dev/null +++ b/.github/workflows/download_pipeline.yml @@ -0,0 +1,142 @@ +name: Test successful pipeline download with 'nf-core pipelines download' + +# Run the workflow when: +# - dispatched manually +# - when a PR is opened or reopened to main/master branch +# - the head branch of the pull request is updated, i.e. if fixes for a release are pushed last minute to dev. +on: + workflow_dispatch: + inputs: + testbranch: + description: "The specific branch you wish to utilize for the test execution of nf-core pipelines download." + required: true + default: "dev" + pull_request: + branches: + - main + - master + +env: + NXF_ANSI_LOG: false + +jobs: + configure: + runs-on: ubuntu-latest + outputs: + REPO_LOWERCASE: ${{ steps.get_repo_properties.outputs.REPO_LOWERCASE }} + REPOTITLE_LOWERCASE: ${{ steps.get_repo_properties.outputs.REPOTITLE_LOWERCASE }} + REPO_BRANCH: ${{ steps.get_repo_properties.outputs.REPO_BRANCH }} + steps: + - name: Get the repository name and current branch + id: get_repo_properties + run: | + echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT" + echo "REPOTITLE_LOWERCASE=$(basename ${GITHUB_REPOSITORY,,})" >> "$GITHUB_OUTPUT" + echo "REPO_BRANCH=${{ github.event.inputs.testbranch || 'dev' }}" >> "$GITHUB_OUTPUT" + + download: + runs-on: ubuntu-latest + needs: configure + steps: + - name: Check out pipeline code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + + - name: Install Nextflow + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 + + - name: Disk space cleanup + uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 + + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 + with: + python-version: "3.14" + architecture: "x64" + + - name: Setup Apptainer + uses: eWaterCycle/setup-apptainer@4bb22c52d4f63406c49e94c804632975787312b3 # v2.0.0 + with: + apptainer-version: 1.3.4 + + - name: Read .nf-core.yml + id: read_yml + run: | + echo "nf_core_version=$(yq '.nf_core_version' ${{ github.workspace }}/.nf-core.yml)" >> "$GITHUB_OUTPUT" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} + + - name: Make a cache directory for the container images + run: | + mkdir -p ./singularity_container_images + + - name: Download the pipeline + env: + NXF_SINGULARITY_CACHEDIR: ./singularity_container_images + run: | + nf-core pipelines download ${{ needs.configure.outputs.REPO_LOWERCASE }} \ + --revision ${{ needs.configure.outputs.REPO_BRANCH }} \ + --outdir ./${{ needs.configure.outputs.REPOTITLE_LOWERCASE }} \ + --compress "none" \ + --container-system 'singularity' \ + --container-library "quay.io" -l "docker.io" -l "community.wave.seqera.io/library/" \ + --container-cache-utilisation 'amend' \ + --download-configuration 'yes' + + - name: Inspect download + run: tree ./${{ needs.configure.outputs.REPOTITLE_LOWERCASE }} + + - name: Inspect container images + run: tree ./singularity_container_images | tee ./container_initial + + - name: Count the downloaded number of container images + id: count_initial + run: | + image_count=$(ls -1 ./singularity_container_images | wc -l | xargs) + echo "Initial container image count: $image_count" + echo "IMAGE_COUNT_INITIAL=$image_count" >> "$GITHUB_OUTPUT" + + - name: Run the downloaded pipeline (stub) + id: stub_run_pipeline + continue-on-error: true + env: + NXF_SINGULARITY_CACHEDIR: ./singularity_container_images + NXF_SINGULARITY_HOME_MOUNT: true + run: nextflow run ./${{needs.configure.outputs.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ needs.configure.outputs.REPO_BRANCH }}) -stub -profile test,singularity --outdir ./results + - name: Run the downloaded pipeline (stub run not supported) + id: run_pipeline + if: ${{ steps.stub_run_pipeline.outcome == 'failure' }} + env: + NXF_SINGULARITY_CACHEDIR: ./singularity_container_images + NXF_SINGULARITY_HOME_MOUNT: true + run: nextflow run ./${{ needs.configure.outputs.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ needs.configure.outputs.REPO_BRANCH }}) -profile test,singularity --outdir ./results + + - name: Count the downloaded number of container images + id: count_afterwards + run: | + image_count=$(ls -1 ./singularity_container_images | wc -l | xargs) + echo "Post-pipeline run container image count: $image_count" + echo "IMAGE_COUNT_AFTER=$image_count" >> "$GITHUB_OUTPUT" + + - name: Compare container image counts + id: count_comparison + run: | + if [ "${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }}" -ne "${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }}" ]; then + initial_count=${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }} + final_count=${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }} + difference=$((final_count - initial_count)) + echo "$difference additional container images were \n downloaded at runtime . The pipeline has no support for offline runs!" + tree ./singularity_container_images > ./container_afterwards + diff ./container_initial ./container_afterwards + exit 1 + else + echo "The pipeline can be downloaded successfully!" + fi + + - name: Upload Nextflow logfile for debugging purposes + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: nextflow_logfile.txt + path: .nextflow.log* + include-hidden-files: true diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml new file mode 100644 index 0000000..810a672 --- /dev/null +++ b/.github/workflows/fix_linting.yml @@ -0,0 +1,85 @@ +name: Fix linting from a comment +on: + issue_comment: + types: [created] + +jobs: + fix-linting: + # Only run if comment is on a PR with the main repo, and if it contains the magic keywords + if: > + contains(github.event.comment.html_url, '/pull/') && + contains(github.event.comment.body, '@nf-core-bot fix linting') && + github.repository == 'nf-core/biodivpipeline' + runs-on: ubuntu-latest + steps: + # Use the @nf-core-bot token to check out so we can push later + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + token: ${{ secrets.nf_core_bot_auth_token }} + + # indication that the linting is being fixed + - name: React on comment + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + with: + comment-id: ${{ github.event.comment.id }} + reactions: eyes + + # Action runs on the issue comment, so we don't get the PR by default + # Use the gh cli to check out the PR + - name: Checkout Pull Request + run: gh pr checkout ${{ github.event.issue.number }} + env: + GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} + + - name: Install Nextflow + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 + + # Install and run prek + - name: Run prek + id: prek + uses: j178/prek-action@6ad80277337ad479fe43bd70701c3f7f8aa74db3 # v2 + continue-on-error: true + + # indication that the linting has finished + - name: react if linting finished succesfully + if: steps.prek.outcome == 'success' + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + with: + comment-id: ${{ github.event.comment.id }} + reactions: "+1" + + - name: Commit & push changes + id: commit-and-push + if: steps.prek.outcome == 'failure' + run: | + git config user.email "core@nf-co.re" + git config user.name "nf-core-bot" + git config push.default upstream + git add . + git status + git commit -m "[automated] Fix code linting" + git push + + - name: react if linting errors were fixed + id: react-if-fixed + if: steps.commit-and-push.outcome == 'success' + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + with: + comment-id: ${{ github.event.comment.id }} + reactions: hooray + + - name: react if linting errors were not fixed + if: steps.commit-and-push.outcome == 'failure' + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + with: + comment-id: ${{ github.event.comment.id }} + reactions: confused + + - name: react if linting errors were not fixed + if: steps.commit-and-push.outcome == 'failure' + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + with: + issue-number: ${{ github.event.issue.number }} + body: | + @${{ github.actor }} I tried to fix the linting errors, but it didn't work. Please fix them manually. + See [CI log](https://github.com/nf-core/biodivpipeline/actions/runs/${{ github.run_id }}) for more details. diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml new file mode 100644 index 0000000..8738ffc --- /dev/null +++ b/.github/workflows/linting.yml @@ -0,0 +1,76 @@ +name: nf-core linting +# This workflow is triggered on pushes and PRs to the repository. +# It runs the `nf-core pipelines lint` and markdown lint tests to ensure +# that the code meets the nf-core guidelines. +on: + pull_request: + release: + types: [published] + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + + - name: Install Nextflow + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 + + - name: Run prek + uses: j178/prek-action@6ad80277337ad479fe43bd70701c3f7f8aa74db3 # v2 + + nf-core: + runs-on: ubuntu-latest + steps: + - name: Check out pipeline code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + + - name: Install Nextflow + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 + + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 + with: + python-version: "3.14" + architecture: "x64" + + - name: Setup uv + uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + + - name: read .nf-core.yml + uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 + id: read_yml + with: + config: ${{ github.workspace }}/.nf-core.yml + + - name: Install dependencies + run: uv tool install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} + + - name: Run nf-core pipelines lint + if: ${{ github.base_ref != 'master' || github.base_ref != 'main' }} + env: + GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} + run: nf-core -l lint_log.txt pipelines lint --dir ${GITHUB_WORKSPACE} --markdown lint_results.md + + - name: Run nf-core pipelines lint --release + if: ${{ github.base_ref == 'master' || github.base_ref == 'main' }} + env: + GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} + run: nf-core -l lint_log.txt pipelines lint --release --dir ${GITHUB_WORKSPACE} --markdown lint_results.md + + - name: Save PR number + if: ${{ always() }} + run: echo ${{ github.event.pull_request.number }} > PR_number.txt + + - name: Upload linting log file artifact + if: ${{ always() }} + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: linting-logs + path: | + lint_log.txt + lint_results.md + PR_number.txt diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml new file mode 100644 index 0000000..5b0c24f --- /dev/null +++ b/.github/workflows/linting_comment.yml @@ -0,0 +1,28 @@ +name: nf-core linting comment +# This workflow is triggered after the linting action is complete +# It posts an automated comment to the PR, even if the PR is coming from a fork + +on: + workflow_run: + workflows: ["nf-core linting"] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Download lint results + uses: dawidd6/action-download-artifact@b6e2e70617bc3265edd6dab6c906732b2f1ae151 # v21 + with: + workflow: linting.yml + workflow_conclusion: completed + + - name: Get PR number + id: pr_number + run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT + + - name: Post PR comment + uses: marocchino/sticky-pull-request-comment@70d2764d1a7d5d9560b100cbea0077fc8f633987 # v3 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + number: ${{ steps.pr_number.outputs.pr_number }} + path: linting-logs/lint_results.md diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml new file mode 100644 index 0000000..efd72d6 --- /dev/null +++ b/.github/workflows/nf-test.yml @@ -0,0 +1,144 @@ +name: Run nf-test +on: + pull_request: + paths-ignore: + - "docs/**" + - "**/meta.yml" + - "**/*.md" + - "**/*.png" + - "**/*.svg" + release: + types: [published] + workflow_dispatch: + +# Cancel if a newer run is started +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NFT_VER: "0.9.4" + NFT_WORKDIR: "~" + NXF_ANSI_LOG: false + NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity + NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity + +jobs: + nf-test-changes: + name: nf-test-changes + runs-on: # use self-hosted runners + - runs-on=${{ github.run_id }}-nf-test-changes + - runner=4cpu-linux-x64 + outputs: + shard: ${{ steps.set-shards.outputs.shard }} + total_shards: ${{ steps.set-shards.outputs.total_shards }} + steps: + - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner + run: | + ls -la ./ + rm -rf ./* || true + rm -rf ./.??* || true + ls -la ./ + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + fetch-depth: 0 + + - name: get number of shards + id: set-shards + uses: ./.github/actions/get-shards + env: + NFT_VER: ${{ env.NFT_VER }} + with: + max_shards: 7 + + - name: debug + run: | + echo ${{ steps.set-shards.outputs.shard }} + echo ${{ steps.set-shards.outputs.total_shards }} + + nf-test: + name: "${{ matrix.profile }} | ${{ matrix.NXF_VER }} | ${{ matrix.shard }}/${{ needs.nf-test-changes.outputs.total_shards }}" + needs: [nf-test-changes] + if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} + runs-on: # use self-hosted runners + - runs-on=${{ github.run_id }}-nf-test + - runner=4cpu-linux-x64 + strategy: + fail-fast: false + matrix: + shard: ${{ fromJson(needs.nf-test-changes.outputs.shard) }} + profile: [conda, docker, singularity] + isMain: + - ${{ github.base_ref == 'master' || github.base_ref == 'main' }} + # Exclude conda and singularity on dev + exclude: + - isMain: false + profile: "conda" + - isMain: false + profile: "singularity" + NXF_VER: + - "25.10.4" + - "latest-everything" + env: + NXF_ANSI_LOG: false + TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + fetch-depth: 0 + + - name: Run nf-test + id: run_nf_test + uses: ./.github/actions/nf-test + continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} + env: + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + NXF_VERSION: ${{ matrix.NXF_VER }} + with: + profile: ${{ matrix.profile }} + shard: ${{ matrix.shard }} + total_shards: ${{ env.TOTAL_SHARDS }} + + - name: Report test status + if: ${{ always() }} + run: | + if [[ "${{ steps.run_nf_test.outcome }}" == "failure" ]]; then + echo "::error::Test with ${{ matrix.NXF_VER }} failed" + # Add to workflow summary + echo "## ❌ Test failed: ${{ matrix.profile }} | ${{ matrix.NXF_VER }} | Shard ${{ matrix.shard }}/${{ env.TOTAL_SHARDS }}" >> $GITHUB_STEP_SUMMARY + if [[ "${{ matrix.NXF_VER }}" == "latest-everything" ]]; then + echo "::warning::Test with latest-everything failed but will not cause workflow failure. Please check if the error is expected or if it needs fixing." + fi + if [[ "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + exit 1 + fi + fi + + confirm-pass: + needs: [nf-test] + if: always() + runs-on: # use self-hosted runners + - runs-on=${{ github.run_id }}-confirm-pass + - runner=2cpu-linux-x64 + steps: + - name: One or more tests failed (excluding latest-everything) + if: ${{ contains(needs.*.result, 'failure') }} + run: exit 1 + + - name: One or more tests cancelled + if: ${{ contains(needs.*.result, 'cancelled') }} + run: exit 1 + + - name: All tests ok + if: ${{ contains(needs.*.result, 'success') }} + run: exit 0 + + - name: debug-print + if: always() + run: | + echo "::group::DEBUG: `needs` Contents" + echo "DEBUG: toJSON(needs) = ${{ toJSON(needs) }}" + echo "DEBUG: toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" + echo "::endgroup::" diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml new file mode 100644 index 0000000..78d5dbe --- /dev/null +++ b/.github/workflows/release-announcements.yml @@ -0,0 +1,46 @@ +name: release-announcements +# Automatic release toot and tweet anouncements +on: + release: + types: [published] + workflow_dispatch: + +jobs: + toot: + runs-on: ubuntu-latest + steps: + - name: get topics and convert to hashtags + id: get_topics + run: | + echo "topics=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ')" | sed 's/-//g' >> $GITHUB_OUTPUT + + - name: get description + id: get_description + run: | + echo "description=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .description')" >> $GITHUB_OUTPUT + - uses: rzr/fediverse-action@563159eb8d45f70ab6aaba36ed55cd037e51f441 # master + with: + access-token: ${{ secrets.MASTODON_ACCESS_TOKEN }} + host: "mstdn.science" # custom host if not "mastodon.social" (default) + # GitHub event payload + # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#release + message: | + Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! + ${{ steps.get_description.outputs.description }} + Please see the changelog: ${{ github.event.release.html_url }} + + ${{ steps.get_topics.outputs.topics }} #nfcore #openscience #nextflow #bioinformatics + + bsky-post: + runs-on: ubuntu-latest + steps: + - uses: zentered/bluesky-post-action@5a91cc2ad10a304a4e96c16182dbe4918710bcf6 # v0.4.0 + with: + post: | + Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! + + Please see the changelog: ${{ github.event.release.html_url }} + env: + BSKY_IDENTIFIER: ${{ secrets.BSKY_IDENTIFIER }} + BSKY_PASSWORD: ${{ secrets.BSKY_PASSWORD }} + # diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml new file mode 100644 index 0000000..ea30827 --- /dev/null +++ b/.github/workflows/template-version-comment.yml @@ -0,0 +1,46 @@ +name: nf-core template version comment +# This workflow is triggered on PRs to check if the pipeline template version matches the latest nf-core version. +# It posts a comment to the PR, even if it comes from a fork. + +on: pull_request_target + +jobs: + template_version: + runs-on: ubuntu-latest + steps: + - name: Check out pipeline code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Read template version from .nf-core.yml + uses: nichmor/minimal-read-yaml@1f7205277e25e156e1f63815781db80a6d490b8f # v0.0.2 + id: read_yml + with: + config: ${{ github.workspace }}/.nf-core.yml + + - name: Install nf-core + run: | + python -m pip install --upgrade pip + pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} + + - name: Check nf-core outdated + id: nf_core_outdated + run: echo "OUTPUT=$(pip list --outdated | grep nf-core)" >> ${GITHUB_ENV} + + - name: Post nf-core template version comment + uses: mshick/add-pr-comment@8e4927817251f1ff60c001f04568532b38e0b4a0 # v3 + if: | + contains(env.OUTPUT, 'nf-core') + with: + repo-token: ${{ secrets.NF_CORE_BOT_AUTH_TOKEN }} + allow-repeats: false + message: | + > [!WARNING] + > Newer version of the nf-core template is available. + > + > Your pipeline is using an old version of the nf-core template: ${{ steps.read_yml.outputs['nf_core_version'] }}. + > Please update your pipeline to the latest version. + > + > For more documentation on how to update your pipeline, please see the [Synchronisation documentation](https://nf-co.re/docs/developing/template-syncs/overview). + # diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f562229 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# Nextflow +.nextflow* +work/ +results/ +.lineage/ +null/ + +# Data (too large for git β€” download separately) +Belege_aus_D.csv + +# OS +.DS_Store + +# Python +*.pyc +__pycache__/ +.venv/ +*.egg-info/ + +# Testing +testing/ +testing* + +# IDE +.vscode/ + +# Docker +*.tar diff --git a/.nf-core.yml b/.nf-core.yml new file mode 100644 index 0000000..6863dc4 --- /dev/null +++ b/.nf-core.yml @@ -0,0 +1,15 @@ +repository_type: pipeline + +nf_core_version: 4.0.2 + +lint: {} + +template: + org: nf-core + name: biodivpipeline + description: Modular nf-core workflow for FAIR biodiversity data processing + author: SPST Team + version: 1.0.0dev + force: true + outdir: nf-core-biodivpipeline + is_nfcore: true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..f51e1a2 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,33 @@ +repos: + - repo: https://github.com/pre-commit/mirrors-prettier + rev: "v3.1.0" + hooks: + - id: prettier + additional_dependencies: + - prettier@3.8.3 + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.0.0 + hooks: + - id: trailing-whitespace + args: [--markdown-linebreak-ext=md] + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/(?!local/).*| + subworkflows/(?!local/).*| + .*\.snap$ + )$ + - id: end-of-file-fixer + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/(?!local/).*| + subworkflows/(?!local/).*| + .*\.snap$ + )$ + - repo: https://github.com/seqeralabs/nf-lint-pre-commit + rev: v0.3.0 + hooks: + - id: nextflow-lint + files: '\.nf$|nextflow\.config$' + args: ["-output", "json"] diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..63cde50 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,14 @@ +email_template.html +.nextflow* +work/ +data/ +results/ +.DS_Store +testing/ +testing* +*.pyc +bin/ +.nf-test/ +ro-crate-metadata.json +modules/nf-core/ +subworkflows/nf-core/ diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 0000000..07dbd8b --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1,6 @@ +printWidth: 120 +tabWidth: 4 +overrides: + - files: "*.{md,yml,yaml,html,css,scss,js,cff}" + options: + tabWidth: 2 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..34afdbc --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,16 @@ +# nf-core/biodivpipeline: Changelog + +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). + +## v1.0.0dev - [date] + +Initial release of nf-core/biodivpipeline, created with the [nf-core](https://nf-co.re/) template. + +### `Added` + +### `Fixed` + +### `Dependencies` + +### `Deprecated` diff --git a/CITATIONS.md b/CITATIONS.md new file mode 100644 index 0000000..31e7149 --- /dev/null +++ b/CITATIONS.md @@ -0,0 +1,41 @@ +# nf-core/biodivpipeline: Citations + +## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/) + +> Ewels PA, Peltzer A, Fillinger S, Patel H, Alneberg J, Wilm A, Garcia MU, Di Tommaso P, Nahnsen S. The nf-core framework for community-curated bioinformatics pipelines. Nat Biotechnol. 2020 Mar;38(3):276-278. doi: 10.1038/s41587-020-0439-x. PubMed PMID: 32055031. + +## [Nextflow](https://pubmed.ncbi.nlm.nih.gov/28398311/) + +> Di Tommaso P, Chatzou M, Floden EW, Barja PP, Palumbo E, Notredame C. Nextflow enables reproducible computational workflows. Nat Biotechnol. 2017 Apr 11;35(4):316-319. doi: 10.1038/nbt.3820. PubMed PMID: 28398311. + +## Pipeline tools + +- [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) + +> Andrews, S. (2010). FastQC: A Quality Control Tool for High Throughput Sequence Data [Online]. + +- [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) + +> Ewels P, Magnusson M, Lundin S, KΓ€ller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. + +## Software packaging/containerisation tools + +- [Anaconda](https://anaconda.com) + + > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web. + +- [Bioconda](https://pubmed.ncbi.nlm.nih.gov/29967506/) + + > GrΓΌning B, Dale R, SjΓΆdin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, KΓΆster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506. + +- [BioContainers](https://pubmed.ncbi.nlm.nih.gov/28379341/) + + > da Veiga Leprevost F, GrΓΌning B, Aflitos SA, RΓΆst HL, Uszkoreit J, Barsnes H, Vaudel M, Moreno P, Gatto L, Weber J, Bai M, Jimenez RC, Sachsenberg T, Pfeuffer J, Alvarez RV, Griss J, Nesvizhskii AI, Perez-Riverol Y. BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics. 2017 Aug 15;33(16):2580-2582. doi: 10.1093/bioinformatics/btx192. PubMed PMID: 28379341; PubMed Central PMCID: PMC5870671. + +- [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241) + + > Merkel, D. (2014). Docker: lightweight linux containers for consistent development and deployment. Linux Journal, 2014(239), 2. doi: 10.5555/2600239.2600241. + +- [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/) + + > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..c089ec7 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,182 @@ +# Code of Conduct at nf-core (v1.4) + +## Our Pledge + +In the interest of fostering an open, collaborative, and welcoming environment, we as contributors and maintainers of nf-core pledge to making participation in our projects and community a harassment-free experience for everyone, regardless of: + +- Age +- Ability +- Body size +- Caste +- Familial status +- Gender identity and expression +- Geographical location +- Level of experience +- Nationality and national origins +- Native language +- Neurodiversity +- Race or ethnicity +- Religion +- Sexual identity and orientation +- Socioeconomic status + +Please note that the list above is alphabetised and is therefore not ranked in any order of preference or importance. + +## Preamble + +:::note +This Code of Conduct (CoC) has been drafted by Renuka Kudva, Cris TuΓ±Γ­, and Michael Heuer, with input from the nf-core Core Team and Susanna Marquez from the nf-core community. "We", in this document, refers to the Safety Officers and members of the nf-core Core Team, both of whom are deemed to be members of the nf-core community and are therefore required to abide by this Code of Conduct. This document will be amended periodically to keep it up-to-date. In case of any dispute, the most current version will apply. +::: + +An up-to-date list of members of the nf-core core team can be found [here](https://nf-co.re/about). + +Our Safety Officers are Saba Nafees, Cris TuΓ±Γ­, and Michael Heuer. + +nf-core is a young and growing community that welcomes contributions from anyone with a shared vision for [Open Science Policies](https://www.fosteropenscience.eu/taxonomy/term/8). Open science policies encompass inclusive behaviours and we strive to build and maintain a safe and inclusive environment for all individuals. + +We have therefore adopted this CoC, which we require all members of our community and attendees of nf-core events to adhere to in all our workspaces at all times. Workspaces include, but are not limited to, Slack, meetings on Zoom, gather.town, YouTube live etc. + +Our CoC will be strictly enforced and the nf-core team reserves the right to exclude participants who do not comply with our guidelines from our workspaces and future nf-core activities. + +We ask all members of our community to help maintain supportive and productive workspaces and to avoid behaviours that can make individuals feel unsafe or unwelcome. Please help us maintain and uphold this CoC. + +Questions, concerns, or ideas on what we can include? Contact members of the Safety Team on Slack or email safety [at] nf-co [dot] re. + +## Our Responsibilities + +Members of the Safety Team (the Safety Officers) are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour. + +The Safety Team, in consultation with the nf-core core team, have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this CoC, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +Members of the core team or the Safety Team who violate the CoC will be required to recuse themselves pending investigation. They will not have access to any reports of the violations and will be subject to the same actions as others in violation of the CoC. + +## When and where does this Code of Conduct apply? + +Participation in the nf-core community is contingent on following these guidelines in all our workspaces and events, such as hackathons, workshops, bytesize, and collaborative workspaces on gather.town. These guidelines include, but are not limited to, the following (listed alphabetically and therefore in no order of preference): + +- Communicating with an official project email address. +- Communicating with community members within the nf-core Slack channel. +- Participating in hackathons organised by nf-core (both online and in-person events). +- Participating in collaborative work on GitHub, Google Suite, community calls, mentorship meetings, email correspondence, and on the nf-core gather.town workspace. +- Participating in workshops, training, and seminar series organised by nf-core (both online and in-person events). This applies to events hosted on web-based platforms such as Zoom, gather.town, Jitsi, YouTube live etc. +- Representing nf-core on social media. This includes both official and personal accounts. + +## nf-core cares 😊 + +nf-core's CoC and expectations of respectful behaviours for all participants (including organisers and the nf-core team) include, but are not limited to, the following (listed in alphabetical order): + +- Ask for consent before sharing another community member’s personal information (including photographs) on social media. +- Be respectful of differing viewpoints and experiences. We are all here to learn from one another and a difference in opinion can present a good learning opportunity. +- Celebrate your accomplishments! (Get creative with your use of emojis πŸŽ‰ πŸ₯³ πŸ’― πŸ™Œ !) +- Demonstrate empathy towards other community members. (We don’t all have the same amount of time to dedicate to nf-core. If tasks are pending, don’t hesitate to gently remind members of your team. If you are leading a task, ask for help if you feel overwhelmed.) +- Engage with and enquire after others. (This is especially important given the geographically remote nature of the nf-core community, so let’s do this the best we can) +- Focus on what is best for the team and the community. (When in doubt, ask) +- Accept feedback, yet be unafraid to question, deliberate, and learn. +- Introduce yourself to members of the community. (We’ve all been outsiders and we know that talking to strangers can be hard for some, but remember we’re interested in getting to know you and your visions for open science!) +- Show appreciation and **provide clear feedback**. (This is especially important because we don’t see each other in person and it can be harder to interpret subtleties. Also remember that not everyone understands a certain language to the same extent as you do, so **be clear in your communication to be kind.**) +- Take breaks when you feel like you need them. +- Use welcoming and inclusive language. (Participants are encouraged to display their chosen pronouns on Zoom or in communication on Slack) + +## nf-core frowns on πŸ˜• + +The following behaviours from any participants within the nf-core community (including the organisers) will be considered unacceptable under this CoC. Engaging or advocating for any of the following could result in expulsion from nf-core workspaces: + +- Deliberate intimidation, stalking or following and sustained disruption of communication among participants of the community. This includes hijacking shared screens through actions such as using the annotate tool in conferencing software such as Zoom. +- β€œDoxing” i.e. posting (or threatening to post) another person’s personal identifying information online. +- Spamming or trolling of individuals on social media. +- Use of sexual or discriminatory imagery, comments, jokes, or unwelcome sexual attention. +- Verbal and text comments that reinforce social structures of domination related to gender, gender identity and expression, sexual orientation, ability, physical appearance, body size, race, age, religion, or work experience. + +### Online Trolling + +The majority of nf-core interactions and events are held online. Unfortunately, holding events online comes with the risk of online trolling. This is unacceptable β€” reports of such behaviour will be taken very seriously and perpetrators will be excluded from activities immediately. + +All community members are **required** to ask members of the group they are working with for explicit consent prior to taking screenshots of individuals during video calls. + +## Procedures for reporting CoC violations + +If someone makes you feel uncomfortable through their behaviours or actions, report it as soon as possible. + +You can reach out to members of the Safety Team (Saba Nafees, Cris TuΓ±Γ­, and Michael Heuer) on Slack. Alternatively, contact a member of the nf-core core team [nf-core core team](https://nf-co.re/about), and they will forward your concerns to the Safety Team. + +Issues directly concerning members of the Core Team or the Safety Team will be dealt with by other members of the core team and the safety manager β€” possible conflicts of interest will be taken into account. nf-core is also in discussions about having an ombudsperson and details will be shared in due course. + +All reports will be handled with the utmost discretion and confidentiality. + +You can also report any CoC violations to safety [at] nf-co [dot] re. In your email report, please do your best to include: + +- Your contact information. +- Identifying information (e.g. names, nicknames, pseudonyms) of the participant who has violated the Code of Conduct. +- The behaviour that was in violation and the circumstances surrounding the incident. +- The approximate time of the behaviour (if different than the time the report was made). +- Other people involved in the incident, if applicable. +- If you believe the incident is ongoing. +- If there is a publicly available record (e.g. mailing list record, a screenshot). +- Any additional information. + +After you file a report, one or more members of our Safety Team will contact you to follow up on your report. + +## Who will read and handle reports + +All reports will be read and handled by the members of the Safety Team at nf-core. + +If members of the Safety Team are deemed to have a conflict of interest with a report, they will be required to recuse themselves as per our Code of Conduct and will not have access to any follow-ups. + +To keep this first report confidential from any of the Safety Team members, please submit your first report by direct messaging on Slack/direct email to any of the nf-core members you are comfortable disclosing the information to, and be explicit about which member(s) you do not consent to sharing the information with. + +## Reviewing reports + +After receiving the report, members of the Safety Team will review the incident report to determine whether immediate action is required, for example, whether there is immediate threat to participants’ safety. + +The Safety Team, in consultation with members of the nf-core core team, will assess the information to determine whether the report constitutes a Code of Conduct violation, for them to decide on a course of action. + +In the case of insufficient information, one or more members of the Safety Team may contact the reporter, the reportee, or any other attendees to obtain more information. + +Once additional information is gathered, the Safety Team will collectively review and decide on the best course of action to take, if any. The Safety Team reserves the right to not act on a report. + +## Confidentiality + +All reports, and any additional information included, are only shared with the team of safety officers (and possibly members of the core team, in case the safety officer is in violation of the CoC). We will respect confidentiality requests for the purpose of protecting victims of abuse. + +We will not name harassment victims, beyond discussions between the safety officer and members of the nf-core team, without the explicit consent of the individuals involved. + +## Enforcement + +Actions taken by the nf-core’s Safety Team may include, but are not limited to: + +- Asking anyone to stop a behaviour. +- Asking anyone to leave the event and online spaces either temporarily, for the remainder of the event, or permanently. +- Removing access to the gather.town and Slack, either temporarily or permanently. +- Communicating to all participants to reinforce our expectations for conduct and remind what is unacceptable behaviour; this may be public for practical reasons. +- Communicating to all participants that an incident has taken place and how we will act or have acted β€” this may be for the purpose of letting event participants know we are aware of and dealing with the incident. +- Banning anyone from participating in nf-core-managed spaces, future events, and activities, either temporarily or permanently. +- No action. + +## Attribution and Acknowledgements + +- The [Contributor Covenant, version 1.4](http://contributor-covenant.org/version/1/4) +- The [OpenCon 2017 Code of Conduct](http://www.opencon2017.org/code_of_conduct) (CC BY 4.0 OpenCon organisers, SPARC and Right to Research Coalition) +- The [eLife innovation sprint 2020 Code of Conduct](https://sprint.elifesciences.org/code-of-conduct/) +- The [Mozilla Community Participation Guidelines v3.1](https://www.mozilla.org/en-US/about/governance/policies/participation/) (version 3.1, CC BY-SA 3.0 Mozilla) + +## Changelog + +### v1.4 - February 8th, 2022 + +- Included a new member of the Safety Team. Corrected a typographical error in the text. + +### v1.3 - December 10th, 2021 + +- Added a statement that the CoC applies to nf-core gather.town workspaces. Corrected typographical errors in the text. + +### v1.2 - November 12th, 2021 + +- Removed information specific to reporting CoC violations at the Hackathon in October 2021. + +### v1.1 - October 14th, 2021 + +- Updated with names of new Safety Officers and specific information for the hackathon in October 2021. + +### v1.0 - March 15th, 2021 + +- Complete rewrite from original [Contributor Covenant](http://contributor-covenant.org/) CoC. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0f0c660 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) The nf-core/biodivpipeline team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/conf/base.config b/conf/base.config new file mode 100644 index 0000000..ae6a179 --- /dev/null +++ b/conf/base.config @@ -0,0 +1,66 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + nf-core/biodivpipeline Nextflow base config file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + A 'blank slate' config file, appropriate for general use on most high performance + compute environments. Assumes that all software is installed and available on + the PATH. Runs in `local` mode - all jobs will be run on the logged in environment. +---------------------------------------------------------------------------------------- +*/ + +process { + + // TODO nf-core: Check the defaults for all processes + cpus = { 1 * task.attempt } + memory = { 6.GB * task.attempt } + time = { 4.h * task.attempt } + + errorStrategy = { task.exitStatus in ((130..145) + 104 + (175..177)) ? 'retry' : 'finish' } + maxRetries = 1 + maxErrors = '-1' + + // Process-specific resource requirements + // NOTE - Please try and reuse the labels below as much as possible. + // These labels are used and recognised by default in DSL2 files hosted on nf-core/modules. + // If possible, it would be nice to keep the same label naming convention when + // adding in your local modules too. + // TODO nf-core: Customise requirements for specific processes. + // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors + withLabel:process_single { + cpus = { 1 } + memory = { 6.GB * task.attempt } + time = { 4.h * task.attempt } + } + withLabel:process_low { + cpus = { 2 * task.attempt } + memory = { 12.GB * task.attempt } + time = { 4.h * task.attempt } + } + withLabel:process_medium { + cpus = { 6 * task.attempt } + memory = { 36.GB * task.attempt } + time = { 8.h * task.attempt } + } + withLabel:process_high { + cpus = { 12 * task.attempt } + memory = { 72.GB * task.attempt } + time = { 16.h * task.attempt } + } + withLabel:process_long { + time = { 20.h * task.attempt } + } + withLabel:process_high_memory { + memory = { 200.GB * task.attempt } + } + withLabel:error_ignore { + errorStrategy = 'ignore' + } + withLabel:error_retry { + errorStrategy = 'retry' + maxRetries = 2 + } + withLabel: process_gpu { + ext.use_gpu = { workflow.profile.contains('gpu') } + accelerator = { workflow.profile.contains('gpu') ? 1 : null } + } +} diff --git a/conf/containers_conda_lock_files_amd64.config b/conf/containers_conda_lock_files_amd64.config new file mode 100644 index 0000000..d3ee1b4 --- /dev/null +++ b/conf/containers_conda_lock_files_amd64.config @@ -0,0 +1,2 @@ +process { withName: 'FASTQC' { container = 'modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt' } } +process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt' } } diff --git a/conf/containers_conda_lock_files_arm64.config b/conf/containers_conda_lock_files_arm64.config new file mode 100644 index 0000000..2b90ac4 --- /dev/null +++ b/conf/containers_conda_lock_files_arm64.config @@ -0,0 +1,2 @@ +process { withName: 'FASTQC' { container = 'modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt' } } +process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt' } } diff --git a/conf/containers_docker_amd64.config b/conf/containers_docker_amd64.config new file mode 100644 index 0000000..65f1814 --- /dev/null +++ b/conf/containers_docker_amd64.config @@ -0,0 +1,2 @@ +process { withName: 'FASTQC' { container = 'community.wave.seqera.io/library/fastqc:0.12.1--5cb1a2fa2f18c7c2' } } +process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.34--db7c73dae76bc9e6' } } diff --git a/conf/containers_docker_arm64.config b/conf/containers_docker_arm64.config new file mode 100644 index 0000000..6c845ba --- /dev/null +++ b/conf/containers_docker_arm64.config @@ -0,0 +1,2 @@ +process { withName: 'FASTQC' { container = 'community.wave.seqera.io/library/fastqc:0.12.1--e455e32f745abe68' } } +process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.34--d167b8012595a136' } } diff --git a/conf/containers_singularity_https_amd64.config b/conf/containers_singularity_https_amd64.config new file mode 100644 index 0000000..838f248 --- /dev/null +++ b/conf/containers_singularity_https_amd64.config @@ -0,0 +1,2 @@ +process { withName: 'FASTQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f2/f20b021476d1d87658820f971ebecc1e8cdbde0f338eb0d9cea2b0a8fc54a54b/data' } } +process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/1b/1bef8af6be88c5733461959c46ac8ef73d18f65277f62a1695d0e1633054f9c2/data' } } diff --git a/conf/containers_singularity_https_arm64.config b/conf/containers_singularity_https_arm64.config new file mode 100644 index 0000000..090173b --- /dev/null +++ b/conf/containers_singularity_https_arm64.config @@ -0,0 +1,2 @@ +process { withName: 'FASTQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/46/46daf2dad0169afd2ae047c3e50ed3776259f664bf07e5e06b045dc23449e994/data' } } +process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9a/9a1fec9662a152683e6fcae440d0ce20920b3b89dc62d1e3a52e73f92eba0969/data' } } diff --git a/conf/containers_singularity_oras_amd64.config b/conf/containers_singularity_oras_amd64.config new file mode 100644 index 0000000..773f369 --- /dev/null +++ b/conf/containers_singularity_oras_amd64.config @@ -0,0 +1,2 @@ +process { withName: 'FASTQC' { container = 'oras://community.wave.seqera.io/library/fastqc:0.12.1--5c4bd442468d75dd' } } +process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.34--4fc8657c816047c0' } } diff --git a/conf/containers_singularity_oras_arm64.config b/conf/containers_singularity_oras_arm64.config new file mode 100644 index 0000000..798cc63 --- /dev/null +++ b/conf/containers_singularity_oras_arm64.config @@ -0,0 +1,2 @@ +process { withName: 'FASTQC' { container = 'oras://community.wave.seqera.io/library/fastqc:0.12.1--127a87fc06499035' } } +process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.34--7fbd82d945c06726' } } diff --git a/conf/igenomes.config b/conf/igenomes.config new file mode 100644 index 0000000..3f11437 --- /dev/null +++ b/conf/igenomes.config @@ -0,0 +1,440 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for iGenomes paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Defines reference genomes using iGenome paths. + Can be used by any config that customises the base path using: + $params.igenomes_base / --igenomes_base +---------------------------------------------------------------------------------------- +*/ + +params { + // illumina iGenomes reference file paths + genomes { + 'GRCh37' { + fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "2.7e9" + blacklist = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed" + } + 'GRCh38' { + fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" + } + 'CHM13' { + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAIndex/" + bwamem2 = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAmem2Index/" + gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/CHM13/Annotation/Genes/genes.gtf" + gff = "ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/009/914/755/GCF_009914755.1_T2T-CHM13v2.0/GCF_009914755.1_T2T-CHM13v2.0_genomic.gff.gz" + mito_name = "chrM" + } + 'GRCm38' { + fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "1.87e9" + blacklist = "${projectDir}/assets/blacklists/GRCm38-blacklist.bed" + } + 'TAIR10' { + fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt" + mito_name = "Mt" + } + 'EB2' { + fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt" + } + 'UMD3.1' { + fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt" + mito_name = "MT" + } + 'WBcel235' { + fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" + mito_name = "MtDNA" + macs_gsize = "9e7" + } + 'CanFam3.1' { + fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt" + mito_name = "MT" + } + 'GRCz10' { + fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'BDGP6' { + fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" + mito_name = "M" + macs_gsize = "1.2e8" + } + 'EquCab2' { + fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt" + mito_name = "MT" + } + 'EB1' { + fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt" + } + 'Galgal4' { + fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'Gm01' { + fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt" + } + 'Mmul_1' { + fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt" + mito_name = "MT" + } + 'IRGSP-1.0' { + fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" + mito_name = "Mt" + } + 'CHIMP2.1.4' { + fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt" + mito_name = "MT" + } + 'Rnor_5.0' { + fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'Rnor_6.0' { + fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'R64-1-1' { + fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" + mito_name = "MT" + macs_gsize = "1.2e7" + } + 'EF2' { + fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "1.21e7" + } + 'Sbi1' { + fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt" + } + 'Sscrofa10.2' { + fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt" + mito_name = "MT" + } + 'AGPv3' { + fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" + mito_name = "Mt" + } + 'hg38' { + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" + } + 'hg19' { + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${projectDir}/assets/blacklists/hg19-blacklist.bed" + } + 'mm10' { + fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "1.87e9" + blacklist = "${projectDir}/assets/blacklists/mm10-blacklist.bed" + } + 'bosTau8' { + fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed" + mito_name = "chrM" + } + 'ce10' { + fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "9e7" + } + 'canFam3' { + fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt" + mito_name = "chrM" + } + 'danRer10' { + fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "1.37e9" + } + 'dm6' { + fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "1.2e8" + } + 'equCab2' { + fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt" + mito_name = "chrM" + } + 'galGal4' { + fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt" + mito_name = "chrM" + } + 'panTro4' { + fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt" + mito_name = "chrM" + } + 'rn6' { + fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed" + mito_name = "chrM" + } + 'sacCer3' { + fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" + readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "1.2e7" + } + 'susScr3' { + fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/version0.6.0/" + bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt" + mito_name = "chrM" + } + } +} diff --git a/conf/igenomes_ignored.config b/conf/igenomes_ignored.config new file mode 100644 index 0000000..b4034d8 --- /dev/null +++ b/conf/igenomes_ignored.config @@ -0,0 +1,9 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for iGenomes paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Empty genomes dictionary to use when igenomes is ignored. +---------------------------------------------------------------------------------------- +*/ + +params.genomes = [:] diff --git a/conf/modules.config b/conf/modules.config new file mode 100644 index 0000000..f87b312 --- /dev/null +++ b/conf/modules.config @@ -0,0 +1,77 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 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. +---------------------------------------------------------------------------------------- +*/ + +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: COLUMN_STANDARDISE { + publishDir = [ + path: { "${params.outdir}/column_standardisation" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: BIODIV_ANNOTATE { + publishDir = [ + path: { "${params.outdir}/annotation" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: TAXONOMY_CLASSIFY { + publishDir = [ + path: { "${params.outdir}/taxonomy" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: OUTLIER_DETECT { + publishDir = [ + path: { "${params.outdir}/quality" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: PROVISIONAL_CONCEPTS { + publishDir = [ + path: { "${params.outdir}/provisional_concepts" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: RDF_TRANSFORM { + publishDir = [ + path: { "${params.outdir}/rdf" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: COLLECT_REPORTS { + publishDir = [ + path: { "${params.outdir}/reports" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + +} diff --git a/conf/test.config b/conf/test.config new file mode 100644 index 0000000..be323f1 --- /dev/null +++ b/conf/test.config @@ -0,0 +1,22 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for running minimal tests +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Use as: nextflow run main.nf -profile test,docker --outdir results +---------------------------------------------------------------------------------------- +*/ + +params { + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' + + // Limit resources for CI + max_cpus = 2 + max_memory = '6.GB' + max_time = '6.h' + + // Input data + input = "${projectDir}/test_data/sample.csv" + mapping_schema = "${projectDir}/assets/default_mapping.jsonld" + outdir = "${projectDir}/results" +} diff --git a/conf/test_full.config b/conf/test_full.config new file mode 100644 index 0000000..eb6bb25 --- /dev/null +++ b/conf/test_full.config @@ -0,0 +1,24 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for running full-size tests +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Defines input files and everything required to run a full size pipeline test. + + Use as follows: + nextflow run nf-core/biodivpipeline -profile test_full, --outdir + +---------------------------------------------------------------------------------------- +*/ + +params { + config_profile_name = 'Full test profile' + config_profile_description = 'Full test dataset to check pipeline function' + + // Input data for full size test + // TODO nf-core: Specify the paths to your full test data ( on nf-core/test-datasets or directly in repositories, e.g. SRA) + // TODO nf-core: Give any required params for the test so that command line flags are not needed + input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' + + // Genome references + genome = 'R64-1-1' +} diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 0000000..ffaa827 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,185 @@ +--- +title: Contributing +markdownPlugin: checklist +--- + +# `nf-core/biodivpipeline`: Contributing guidelines + +Hi there! +Thanks for taking an interest in improving nf-core/biodivpipeline. + +This page describes the recommended nf-core way to contribute to both nf-core/biodivpipeline and nf-core pipelines in general, including: + +- [General contribution guidelines](#general-contribution-guidelines): common procedures or guides across all nf-core pipelines. +- [Pipeline-specific contribution guidelines](#pipeline-specific-contribution-guidelines): procedures or guides specific to the development conventions of nf-core/biodivpipeline. + +> [!NOTE] +> If you need help using or modifying nf-core/biodivpipeline, ask on the nf-core Slack [#biodivpipeline](https://nfcore.slack.com/channels/biodivpipeline) channel ([join our Slack here](https://nf-co.re/join/slack)). + +## General contribution guidelines + +### Contribution quick start + +To contribute code to any nf-core pipeline: + +- [ ] Ensure you have Nextflow, nf-core tools, and nf-test installed. See the [nf-core/tools repository](https://github.com/nf-core/tools) for instructions. +- [ ] Check whether a GitHub [issue](https://github.com/nf-core/biodivpipeline/issues) about your idea already exists. If an issue does not exist, create one so that others are aware you are working on it. +- [ ] [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/biodivpipeline repository](https://github.com/nf-core/biodivpipeline) to your GitHub account. +- [ ] Create a branch on your forked repository and make your changes following [pipeline conventions](#pipeline-contribution-conventions) (if applicable). +- [ ] To fix major bugs, name your branch `patch` and follow the [patch release](#patch-release) process. +- [ ] Update relevant documentation within the `docs/` folder, use nf-core/tools to update `nextflow_schema.json`, and update `CITATIONS.md`. +- [ ] Run and/or update tests. See [Testing](#testing) for more information. +- [ ] [Lint](#lint-tests) your code with nf-core/tools. +- [ ] Submit a pull request (PR) against the `dev` branch and request a review. + +If you are not used to this workflow with Git, see the [GitHub documentation](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or [Git resources](https://try.github.io/) for more information. + +## Use of AI and LLMs + +The nf-core stance on the use of AI and LLMs is that humans are still ultimately responsible for their submitted code, regardless of the tools they use. + +If you’re using AI tools, try to stick by these guidelines: + +- Keep PRs as small and focussed as possible +- Avoid any unnecessary changes, such as moving or refactoring code (unless that is the explicit intention of the PR) +- Review all generated code yourself before opening a PR, and ensure that you understand it +- Engage with the community review process and expect to make revisions + +For more detail, see the the [blog post](https://nf-co.re/blog/2026/statement-on-ai) for a statement from the nf-core/core team. + +### Getting help + +For further information and help, see the [nf-core/biodivpipeline documentation](https://nf-co.re/biodivpipeline/usage) or ask on the nf-core [#biodivpipeline](https://nfcore.slack.com/channels/biodivpipeline) Slack channel ([join our Slack here](https://nf-co.re/join/slack)). + +### GitHub Codespaces + +You can contribute to nf-core/biodivpipeline without installing a local development environment on your machine by using [GitHub Codespaces](https://github.com/codespaces). + +[GitHub Codespaces](https://github.com/codespaces) is an online developer environment that runs in your browser, complete with VS Code and a terminal. +Most nf-core repositories include a devcontainer configuration, which creates a GitHub Codespaces environment specifically for Nextflow development. +The environment includes pre-installed nf-core tools, Nextflow, and a few other helpful utilities via a Docker container. + +To get started, open the repository in [Codespaces](https://github.com/nf-core/biodivpipeline/codespaces). + +### Testing + +Once you have made your changes, run the pipeline with nf-test to test them locally. +For additional information, use the `--verbose` flag to view the Nextflow console log output. + +```bash +nf-test test --tag test --profile +docker --verbose +``` + +If you have added new functionality, ensure you update the test assertions in the `.nf.test` files in the `tests/` directory. +Update the snapshots with the following command: + +```bash +nf-test test --tag test --profile +docker --verbose --update-snapshots +``` + +When you create a pull request with changes, GitHub Actions will run automatic tests. +Pull requests are typically reviewed when these tests are passing. + +Two types of tests are typically run: + +#### Lint tests + +nf-core has a [set of guidelines](https://nf-co.re/docs/specifications/overview) which all pipelines must follow. +To enforce these, run linting with nf-core/tools: + +```bash +nf-core pipelines lint +``` + +If you encounter failures or warnings, follow the linked documentation printed to screen. +For more information about linting tests, see [nf-core/tools API documentation](https://nf-co.re/docs/nf-core-tools/api_reference/latest/pipeline_lint_tests/actions_awsfulltest). + +#### Pipeline tests + +Each nf-core pipeline should be set up with a minimal set of test data. +GitHub Actions runs the pipeline on this data to ensure it runs through and exits successfully. +If there are any failures then the automated tests fail. +These tests are run with the latest available version of Nextflow and the minimum required version specified in the pipeline code. + +### Patch release + +> [!WARNING] +> Only in the unlikely event of a release that contains a critical bug. + +- [ ] Create a new branch `patch` on your fork based on `upstream/main` or `upstream/master`. +- [ ] Fix the bug and use nf-core/tools to bump the version to the next semantic version, for example, `1.2.3` β†’ `1.2.4`. +- [ ] Open a Pull Request from `patch` directly to `main`/`master` with the changes. + +### Pipeline contribution conventions + +nf-core semi-standardises how you write code and other contributions to make the nf-core/biodivpipeline code and processing logic more understandable for new contributors and to ensure quality. + +#### Add a new pipeline step + +To contribute a new step to the pipeline, follow the general nf-core coding procedure. +Please also refer to the [pipeline-specific contribution guidelines](#pipeline-specific-contribution-guidelines): + +- [ ] Define the corresponding [input channel](#channel-naming-schemes) into your new process from the expected previous process channel. +- [ ] Install a module with nf-core/tools, or write a local module (see [default processes resource requirements](#default-processes-resource-requirements)), and add it to the target `.nf`. +- [ ] Define the output channel if needed. Mix the version output channel into `ch_versions` and relevant files into `ch_multiqc`. +- [ ] Add new or updated parameters to `nextflow.config` with a [default value](#default-parameter-values). +- [ ] Add new or updated parameters and relevant help text to `nextflow_schema.json` with [nf-core/tools](#default-parameter-values). +- [ ] Add validation for relevant parameters to the pipeline utilisation section of `utils_nfcore_\_pipeline/main.nf` subworkflow. +- [ ] Perform local tests to validate that the new code works as expected. + - [ ] If applicable, add a new test in the `tests` directory. +- [ ] Update `usage.md`, `output.md`, and `citation.md` as appropriate. +- [ ] [Lint](lint) the code with nf-core/tools. +- [ ] Update any diagrams or pipeline images as necessary. +- [ ] Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name cleanup, and module plots are in the appropriate order. +- [ ] If applicable, create a [MultiQC](https://seqera.io/multiqc/) module. +- [ ] Add a description of the output files and, if relevant, images from the MultiQC report to `docs/output.md`. + +To update the minimum required Nextflow version, see the [Nextflow version bumping](#nextflow-version-bumping) section below. For more information about pipeline contributions, see [pipeline-specific contribution guidelines](#pipeline-specific-contribution-guidelines). + +#### Channel naming schemes + +Use the following naming schemes for channels to make the channel flow easier to understand: + +- Initial process channel: `ch_output_from_` +- Intermediate and terminal channels: `ch__for_` + +#### Default parameter values + +Parameters should be initialised and defined with default values within the `params` scope in `nextflow.config`. +They should also be documented in the pipeline JSON schema. + +To update `nextflow_schema.json`, run: + +```bash +nf-core pipelines schema build +``` + +The schema builder interface that loads in your browser should automatically update the defaults in the parameter documentation. + +#### Default processes resource requirements + +If you write a local module, specify a default set of resource requirements for the process. + +Sensible defaults for process resource requirements (CPUs, memory, time) should be defined in `conf/base.config`. +Specify these with generic `withLabel:` selectors, so they can be shared across multiple processes and steps of the pipeline. + +nf-core provides a set of standard labels that you should follow where possible, as seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/main/nf_core/pipeline-template/conf/base.config). +These labels define resource defaults for single-core processes, modules that require a GPU, and different levels of multi-core configurations with increasing memory requirements. + +Values assigned within these labels can be dynamically passed to a tool using the the `${task.cpus}` and `${task.memory}` Nextflow variables in the `script:` block of a module (see an example in the [modules repository](https://github.com/nf-core/modules/blob/bd1b6a40f55933d94b8c9ca94ec8c1ea0eaf4b82/modules/nf-core/samtools/bam2fq/main.nf#L30)). + +#### Nextflow version bumping + +If you use a new feature from core Nextflow, bump the minimum required Nextflow version in the pipeline with: + +```bash +nf-core pipelines bump-version --nextflow . +``` + +#### Images and figures guidelines + +If you update images or graphics, follow the nf-core [style guidelines](https://nf-co.re/docs/community/brand/workflow-schematics). + +## Pipeline specific contribution guidelines + + diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..eba9a68 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,10 @@ +# nf-core/biodivpipeline: Documentation + +The nf-core/biodivpipeline documentation is split into the following pages: + +- [Usage](usage.md) + - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. +- [Output](output.md) + - An overview of the different results produced by the pipeline and how to interpret them. + +You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) diff --git a/docs/images/nf-core-biodivpipeline_logo_dark.png b/docs/images/nf-core-biodivpipeline_logo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8d547e4e270cbc1f367ca988bac91e01f10d42fe GIT binary patch literal 26383 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 literal 0 HcmV?d00001 diff --git a/docs/images/nf-core-biodivpipeline_logo_light.png b/docs/images/nf-core-biodivpipeline_logo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..cdc519630a020a0ab63f612127bfbae823964898 GIT binary patch literal 22148 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 + +## Pipeline overview + +The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: + +- [FastQC](#fastqc) - Raw read QC +- [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline +- [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution + +### FastQC + +
+Output files + +- `fastqc/` + - `*_fastqc.html`: FastQC report containing quality metrics. + - `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. + +
+ +[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). + +### MultiQC + +
+Output files + +- `multiqc/` + - `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. + - `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. + - `multiqc_plots/`: directory containing static images from the report in various formats. + +
+ +[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. + +Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . + +### Pipeline information + +
+Output files + +- `pipeline_info/` + - Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. + - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. + - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. + - Parameters used by the pipeline run: `params.json`. + +
+ +[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 0000000..2f42f3f --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,214 @@ +# nf-core/biodivpipeline: Usage + +## :warning: Please read this documentation on the nf-core website: [https://nf-co.re/biodivpipeline/usage](https://nf-co.re/biodivpipeline/usage) + +> _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ + +## Introduction + + + +## Samplesheet input + +You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. + +```bash +--input '[path to samplesheet file]' +``` + +### 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: + +```csv title="samplesheet.csv" +sample,fastq_1,fastq_2 +CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz +CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz +CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz +``` + +### 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 3 columns to match those defined in the table below. + +A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. + +```csv title="samplesheet.csv" +sample,fastq_1,fastq_2 +CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz +CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz +CONTROL_REP3,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz +TREATMENT_REP1,AEG588A4_S4_L003_R1_001.fastq.gz, +TREATMENT_REP2,AEG588A5_S5_L003_R1_001.fastq.gz, +TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, +TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, +``` + +| Column | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | +| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | + +An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. + +## Running the pipeline + +The typical command for running the pipeline is as follows: + +```bash +nextflow run nf-core/biodivpipeline --input ./samplesheet.csv --outdir ./results --genome GRCh37 -profile docker +``` + +This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. + +Note that the pipeline will create the following files in your working directory: + +```bash +work # Directory containing the nextflow working files + # Finished results in specified location (defined with --outdir) +.nextflow_log # Log file from Nextflow +# Other nextflow hidden files, eg. history of pipeline runs and old logs. +``` + +If you wish to repeatedly use the same parameters for multiple runs, rather than specifying each flag in the command, you can specify these in a params file. + +Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. + +> [!WARNING] +> Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/running/run-pipelines#configuring-pipelines), other infrastructural tweaks (such as output directories), or module arguments (args). + +The above pipeline run specified with a params file in yaml format: + +```bash +nextflow run nf-core/biodivpipeline -profile docker -params-file params.yaml +``` + +with: + +```yaml title="params.yaml" +input: './samplesheet.csv' +outdir: './results/' +genome: 'GRCh37' +<...> +``` + +You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). + +### Updating the pipeline + +When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: + +```bash +nextflow pull nf-core/biodivpipeline +``` + +### Reproducibility + +It is a good idea to specify the pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. + +First, go to the [nf-core/biodivpipeline releases page](https://github.com/nf-core/biodivpipeline/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. + +This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. + +To further assist in reproducibility, you can use share and reuse [parameter files](#running-the-pipeline) to repeat pipeline runs with the same settings without having to write out a command with every single parameter. + +> [!TIP] +> If you wish to share such profile (such as upload as supplementary material for academic publications), make sure to NOT include cluster specific paths to files, nor institutional specific profiles. + +## Core Nextflow arguments + +> [!NOTE] +> These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen) + +### `-profile` + +Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. + +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Apptainer, Conda) - see below. + +> [!IMPORTANT] +> We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. + +The pipeline also dynamically loads configurations from [https://github.com/nf-core/configs](https://github.com/nf-core/configs) when it runs, making multiple config profiles for various institutional clusters available at run time. For more information and to check if your system is supported, please see the [nf-core/configs documentation](https://github.com/nf-core/configs#documentation). + +Note that multiple profiles can be loaded, for example: `-profile test,docker` - the order of arguments is important! +They are loaded in sequence, so later profiles can overwrite earlier profiles. + +If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended, since it can lead to different results on different machines dependent on the computer environment. + +- `test` + - A profile with a complete configuration for automated testing + - Includes links to test data so needs no other parameters +- `docker` + - A generic configuration profile to be used with [Docker](https://docker.com/) +- `singularity` + - A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) +- `podman` + - A generic configuration profile to be used with [Podman](https://podman.io/) +- `shifter` + - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) +- `charliecloud` + - A generic configuration profile to be used with [Charliecloud](https://charliecloud.io/) +- `apptainer` + - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) +- `wave` + - A generic configuration profile to enable [Wave](https://seqera.io/wave/) containers. Use together with one of the above (requires Nextflow ` 24.03.0-edge` or later). +- `conda` + - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter, Charliecloud, or Apptainer. + +### `-resume` + +Specify this when restarting a pipeline. Nextflow will use cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. For input to be considered the same, not only the names must be identical but the files' contents as well. For more info about this parameter, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). + +You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. + +### `-c` + +Specify the path to a specific config file (this is a core Nextflow command). See the [nf-core website documentation](https://nf-co.re/usage/configuration) for more information. + +## Custom configuration + +### Resource requests + +Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the pipeline steps, if the job exits with any of the error codes specified [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L18) it will automatically be resubmitted with higher resources request (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. + +To change the resource requests, please see the [max resources](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#set-max-resources) and [customise process resources](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#customize-process-resources) section of the nf-core website. + +### Custom Containers + +In some cases, you may wish to change the container or conda environment used by a pipeline steps for a particular tool. By default, nf-core pipelines use containers and software from the [biocontainers](https://biocontainers.pro/) or [bioconda](https://bioconda.github.io/) projects. However, in some cases the pipeline specified version maybe out of date. + +To use a different container from the default container or conda environment specified in a pipeline, please see the [updating tool versions](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#update-tool-versions) section of the nf-core website. + +### Custom Tool Arguments + +A pipeline might not always support every possible argument or option of a particular tool used in pipeline. Fortunately, nf-core pipelines provide some freedom to users to insert additional parameters that the pipeline does not include by default. + +To learn how to provide additional arguments to a particular tool of the pipeline, please see the [customising tool arguments](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#modifying-tool-arguments) section of the nf-core website. + +### nf-core/configs + +In most cases, you will only need to create a custom config as a one-off but if you and others within your organisation are likely to be running nf-core pipelines regularly and need to use the same settings regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter. You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. + +See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more information about creating your own configuration files. + +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). + +## Running in the background + +Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. + +The Nextflow `-bg` flag launches Nextflow in the background, detached from your terminal so that the workflow does not stop if you log out of your session. The logs are saved to a file. + +Alternatively, you can use `screen` / `tmux` or similar tool to create a detached session which you can log back into at a later time. +Some HPC setups also allow you to run nextflow within a cluster job submitted your job scheduler (from where it submits more jobs). + +## Nextflow memory requirements + +In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. +We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): + +```bash +NXF_OPTS='-Xms1g -Xmx4g' +``` diff --git a/modules.json b/modules.json new file mode 100644 index 0000000..5365116 --- /dev/null +++ b/modules.json @@ -0,0 +1,41 @@ +{ + "name": "nf-core/biodivpipeline", + "homePage": "https://github.com/nf-core/biodivpipeline", + "repos": { + "https://github.com/nf-core/modules.git": { + "modules": { + "nf-core": { + "fastqc": { + "branch": "master", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", + "installed_by": ["modules"] + }, + "multiqc": { + "branch": "master", + "git_sha": "008f9d3e61209bf995edac3ba531f54e269e1215", + "installed_by": ["modules"] + } + } + }, + "subworkflows": { + "nf-core": { + "utils_nextflow_pipeline": { + "branch": "master", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "installed_by": ["subworkflows"] + }, + "utils_nfcore_pipeline": { + "branch": "master", + "git_sha": "a3fb7351b1fdb2b1de282b765816bbea190e86a8", + "installed_by": ["subworkflows"] + }, + "utils_nfschema_plugin": { + "branch": "master", + "git_sha": "fdc08b8b1ae74f56686ce21f7ea11ad11990ce57", + "installed_by": ["subworkflows"] + } + } + } + } + } +} diff --git a/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt b/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt new file mode 100644 index 0000000..7770ccd --- /dev/null +++ b/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt @@ -0,0 +1,822 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-64: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.2-ha668962_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 +md5: a9f577daf3de00bca7c3c76c0ecbd1de +depends: +- __glibc >=2.17,<3.0.a0 +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28948 +timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda +sha256: d88aa7ae766cf584e180996e92fef2aa7d8e0a0a5ab1d4d49c32390c1b5fff31 +md5: dcdc58c15961dbf17a0621312b01f5cb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: LGPL-2.1-or-later +license_family: GPL +size: 584660 +timestamp: 1768327524772 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 +md5: d2ffd7602c02f2b316fd921d39876885 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 260182 +timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc +md5: 4492fd26db29495f0ba23f146cd5638d +depends: +- __unix +license: ISC +size: 147413 +timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda +sha256: 06525fa0c4e4f56e771a3b986d0fdf0f0fc5a3270830ee47e127a5105bde1b9a +md5: bb6c4808bfa69d6f7f6b07e5846ced37 +depends: +- __glibc >=2.17,<3.0.a0 +- fontconfig >=2.15.0,<3.0a0 +- fonts-conda-ecosystem +- icu >=78.1,<79.0a0 +- libexpat >=2.7.3,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libglib >=2.86.3,<3.0a0 +- libpng >=1.6.53,<1.7.0a0 +- libstdcxx >=14 +- libxcb >=1.17.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pixman >=0.46.4,<1.0a0 +- xorg-libice >=1.1.2,<2.0a0 +- xorg-libsm >=1.2.6,<2.0a0 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: LGPL-2.1-only or MPL-1.1 +size: 989514 +timestamp: 1766415934926 +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +sha256: 7cc26225d590540ae95cd24940ff42f2da7479dd4cd22ae9ab9298665d06790c +md5: c9f6a4b12229f7331f79c9a00dd6e240 +depends: +- font-ttf-dejavu-sans-mono +- fontconfig +- openjdk >=8.0.144 +- perl +license: GPL >=3 +size: 11664291 +timestamp: 1677946722445 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c +md5: 867127763fbe935bab59815b6e0b7b5c +depends: +- __glibc >=2.17,<3.0.a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +license: MIT +license_family: MIT +size: 270705 +timestamp: 1771382710863 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 +md5: fee5683a3f04bd15cbd8318b096a27ab +depends: +- fonts-conda-forge +license: BSD-3-Clause +license_family: BSD +size: 3667 +timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda +sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff +md5: 3bf7b9fd5a7136126e0234db4b87c8b6 +depends: +- libgcc-ng >=12 +license: MIT +license_family: MIT +size: 77248 +timestamp: 1712692454246 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda +sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c +md5: 2cd94587f3a401ae05e03a6caf09539d +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: LGPL-2.0-or-later +license_family: LGPL +size: 99596 +timestamp: 1755102025473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda +sha256: 477f2c553f72165020d3c56740ba354be916c2f0b76fd9f535e83d698277d5ec +md5: 14470902326beee192e33719a2e8bb7f +depends: +- __glibc >=2.17,<3.0.a0 +- cairo >=1.18.4,<2.0a0 +- graphite2 >=1.3.14,<2.0a0 +- icu >=78.3,<79.0a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.2 +- libfreetype6 >=2.14.2 +- libgcc >=14 +- libglib >=2.86.4,<3.0a0 +- libstdcxx >=14 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +size: 2384060 +timestamp: 1774276284520 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda +sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a +md5: c80d8a3b84358cb967fa81e7075fbc8a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: MIT +license_family: MIT +size: 12723451 +timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda +sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 +md5: b38117a3c920364aff79f870c984b4a3 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: LGPL-2.1-or-later +size: 134088 +timestamp: 1754905959823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda +sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 +md5: fb53fb07ce46a575c5d004bbc96032c2 +depends: +- __glibc >=2.17,<3.0.a0 +- keyutils >=1.6.3,<2.0a0 +- libedit >=3.1.20250104,<3.2.0a0 +- libedit >=3.1.20250104,<4.0a0 +- libgcc >=14 +- libstdcxx >=14 +- openssl >=3.5.5,<4.0a0 +license: MIT +license_family: MIT +size: 1386730 +timestamp: 1769769569681 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda +sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a +md5: 6f2e2c8f58160147c4d1c6f4c14cbac4 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 249959 +timestamp: 1768184673131 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 +md5: a752488c68f2e7c456bcbd8f16eec275 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 261513 +timestamp: 1773113328888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda +sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c +md5: 49c553b47ff679a6a1e9fc80b9c5a2d4 +depends: +- __glibc >=2.17,<3.0.a0 +- krb5 >=1.22.2,<1.23.0a0 +- libgcc >=14 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +license: Apache-2.0 +license_family: Apache +size: 4518030 +timestamp: 1770902209173 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 +md5: 6c77a605a7a689d17d4819c0f8ac9a00 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 73490 +timestamp: 1761979956660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda +sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 +md5: c277e0a4d549b03ac1e9d6cbbe3d017b +depends: +- ncurses +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- ncurses >=6.5,<7.0a0 +license: BSD-2-Clause +license_family: BSD +size: 134676 +timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda +sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 +md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- expat 2.7.4.* +license: MIT +license_family: MIT +size: 76798 +timestamp: 1771259418166 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 +md5: a360c33a5abe61c07959e449fa1453eb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 58592 +timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 +md5: e289f3d17880e44b633ba911d57a321b +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8049 +timestamp: 1774298163029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d +md5: fb16b4b69e3f1dcfe79d80db8fd0c55d +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 384575 +timestamp: 1774298162622 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda +sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 +md5: 0aa00f03f9e39fb9876085dee11a85d4 +depends: +- __glibc >=2.17,<3.0.a0 +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_18 +- libgomp 15.2.0 he0feb66_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 1041788 +timestamp: 1771378212382 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda +sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 +md5: d5e96b1ed75ca01906b3d2469b4ce493 +depends: +- libgcc 15.2.0 he0feb66_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27526 +timestamp: 1771378224552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda +sha256: a27e44168a1240b15659888ce0d9b938ed4bdb49e9ea68a7c1ff27bcea8b55ce +md5: bb26456332b07f68bf3b7622ed71c0da +depends: +- __glibc >=2.17,<3.0.a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- libiconv >=1.18,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pcre2 >=10.47,<10.48.0a0 +constrains: +- glib 2.86.4 *_1 +license: LGPL-2.1-or-later +size: 4398701 +timestamp: 1771863239578 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda +sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 +md5: 239c5e9546c38a1e884d69effcf4c882 +depends: +- __glibc >=2.17,<3.0.a0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 603262 +timestamp: 1771378117851 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda +sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f +md5: 915f5995e94f60e9a4826e0b0920ee88 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: LGPL-2.1-only +size: 790176 +timestamp: 1754908768807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda +sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 +md5: 8397539e3a0bbd1695584fb4f927485a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 633710 +timestamp: 1762094827865 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda +sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb +md5: c7c83eecbb72d88b940c249af56c8b17 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- xz 5.8.2.* +license: 0BSD +size: 113207 +timestamp: 1768752626120 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda +sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c +md5: 5f13ffc7d30ffec87864e678df9957b4 +depends: +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libzlib >=1.3.1,<2.0a0 +license: zlib-acknowledgement +size: 317669 +timestamp: 1770691470744 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda +sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e +md5: 1b08cd684f34175e4514474793d44bcb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc 15.2.0 he0feb66_18 +constrains: +- libstdcxx-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5852330 +timestamp: 1771378262446 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 +md5: cd5a90476766d53e901500df9215e927 +depends: +- __glibc >=2.17,<3.0.a0 +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 435273 +timestamp: 1762022005702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda +sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee +md5: db409b7c1720428638e7c0d509d3e1b5 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 40311 +timestamp: 1766271528534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b +md5: aea31d2e5b1091feca96fcfe945c3cf9 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 429011 +timestamp: 1752159441324 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa +md5: 92ed62436b625154323d40d5f2f11dd7 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 395888 +timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda +sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c +md5: 5aa797f8787fe7a17d1b0821485b5adc +depends: +- libgcc-ng >=12 +license: LGPL-2.1-or-later +size: 100393 +timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 +md5: d87ff7921124eccd67248aa483c23fec +depends: +- __glibc >=2.17,<3.0.a0 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 63629 +timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda +sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 +md5: 47e340acb35de30501a76c7c799c41d7 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: X11 AND BSD-3-Clause +size: 891641 +timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.2-ha668962_0.conda +sha256: 3825a4c84676a8a5cc23b397a2911e4efa4a805daf2af764153bd904e142ec41 +md5: a41092b0177362dbe5eb2a18501e86c0 +depends: +- xorg-libx11 +- xorg-libxext +- xorg-libxi +- xorg-libxrender +- xorg-libxtst +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- xorg-libxrender >=0.9.12,<0.10.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- giflib >=5.2.2,<5.3.0a0 +- xorg-libxrandr >=1.5.5,<2.0a0 +- harfbuzz >=12.3.2 +- fontconfig >=2.17.1,<3.0a0 +- fonts-conda-ecosystem +- xorg-libxtst >=1.2.5,<2.0a0 +- xorg-libxi >=1.8.2,<2.0a0 +- lcms2 >=2.18,<3.0a0 +- alsa-lib >=1.2.15.3,<1.3.0a0 +- libpng >=1.6.55,<1.7.0a0 +- xorg-libxt >=1.3.1,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- xorg-libxext >=1.3.7,<2.0a0 +- xorg-libx11 >=1.8.13,<2.0a0 +- libcups >=2.3.3,<2.4.0a0 +license: GPL-2.0-or-later WITH Classpath-exception-2.0 +license_family: GPL +size: 122465031 +timestamp: 1771443671180 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda +sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c +md5: f61eb8cd60ff9057122a3d338b99c00f +depends: +- __glibc >=2.17,<3.0.a0 +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3164551 +timestamp: 1769555830639 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda +sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff +md5: 7a3bff861a6583f1889021facefc08b1 +depends: +- __glibc >=2.17,<3.0.a0 +- bzip2 >=1.0.8,<2.0a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 1222481 +timestamp: 1763655398280 +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda +build_number: 7 +sha256: 9ec32b6936b0e37bcb0ed34f22ec3116e75b3c0964f9f50ecea5f58734ed6ce9 +md5: f2cfec9406850991f4e3d960cc9e3321 +depends: +- libgcc-ng >=12 +- libxcrypt >=4.4.36 +license: GPL-1.0-or-later OR Artistic-1.0-Perl +size: 13344463 +timestamp: 1703310653947 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda +sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a +md5: c01af13bdc553d1a8fbfff6e8db075f0 +depends: +- libgcc >=14 +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +license: MIT +license_family: MIT +size: 450960 +timestamp: 1754665235234 +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +sha256: 4ce2e1ee31a6217998f78c31ce7dc0a3e0557d9238b51d49dd20c52d467a126d +md5: f2c23a77b25efcad57d377b34bd84941 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 593603 +timestamp: 1769710381284 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 +md5: b3c17d95b5a10c6e64a21fa17573e70e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: MIT +license_family: MIT +size: 8252 +timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda +sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b +md5: fb901ff28063514abb6046c9ec2c4a45 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: MIT +license_family: MIT +size: 58628 +timestamp: 1734227592886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda +sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250 +md5: 1c74ff8c35dcadf952a16f752ca5aa49 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- libuuid >=2.38.1,<3.0a0 +- xorg-libice >=1.1.2,<2.0a0 +license: MIT +license_family: MIT +size: 27590 +timestamp: 1741896361728 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda +sha256: 516d4060139dbb4de49a4dcdc6317a9353fb39ebd47789c14e6fe52de0deee42 +md5: 861fb6ccbc677bb9a9fb2468430b9c6a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libxcb >=1.17.0,<2.0a0 +license: MIT +license_family: MIT +size: 839652 +timestamp: 1770819209719 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b +md5: b2895afaf55bf96a8c8282a2e47a5de0 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 15321 +timestamp: 1762976464266 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 +md5: 1dafce8548e38671bea82e3f5c6ce22f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 20591 +timestamp: 1762976546182 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda +sha256: 79c60fc6acfd3d713d6340d3b4e296836a0f8c51602327b32794625826bd052f +md5: 34e54f03dfea3e7a2dcf1453a85f1085 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 50326 +timestamp: 1769445253162 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda +sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 +md5: ba231da7fccf9ea1e768caf5c7099b84 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 20071 +timestamp: 1759282564045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda +sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a +md5: 17dcc85db3c7886650b8908b183d6876 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxfixes >=6.0.1,<7.0a0 +license: MIT +license_family: MIT +size: 47179 +timestamp: 1727799254088 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda +sha256: 80ed047a5cb30632c3dc5804c7716131d767089f65877813d4ae855ee5c9d343 +md5: e192019153591938acf7322b6459d36e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: MIT +license_family: MIT +size: 30456 +timestamp: 1769445263457 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda +sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 +md5: 96d57aba173e878a2089d5638016dc5e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +license: MIT +license_family: MIT +size: 33005 +timestamp: 1734229037766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda +sha256: a8afba4a55b7b530eb5c8ad89737d60d60bc151a03fbef7a2182461256953f0e +md5: 279b0de5f6ba95457190a1c459a64e31 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libice >=1.1.1,<2.0a0 +- xorg-libsm >=1.2.4,<2.0a0 +- xorg-libx11 >=1.8.10,<2.0a0 +license: MIT +license_family: MIT +size: 379686 +timestamp: 1731860547604 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda +sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a +md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxi >=1.7.10,<2.0a0 +license: MIT +license_family: MIT +size: 32808 +timestamp: 1727964811275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 +md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 +depends: +- __glibc >=2.17,<3.0.a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 601375 +timestamp: 1764777111296 diff --git a/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt b/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt new file mode 100644 index 0000000..cdc434c --- /dev/null +++ b/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt @@ -0,0 +1,769 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-aarch64: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.2.1-h1134a53_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.2-h488f50d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.5-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxt-1.3.1-h57736b2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 +md5: 468fd3bb9e1f671d36c2cbc677e56f1d +depends: +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28926 +timestamp: 1770939656741 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda +sha256: ea2233e2db9908c2e5f29d3ca420a546b4583253f4f70abb5494cdd676866d42 +md5: 4a98cbc4ade694520227402ff8880630 +depends: +- libgcc >=14 +license: LGPL-2.1-or-later +license_family: GPL +size: 615729 +timestamp: 1768327548407 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c +md5: 840d8fc0d7b3209be93080bc20e07f2d +depends: +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 192412 +timestamp: 1771350241232 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc +md5: 4492fd26db29495f0ba23f146cd5638d +depends: +- __unix +license: ISC +size: 147413 +timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda +sha256: 675db823f3d6fb6bf747fab3b0170ba99b269a07cf6df1e49fff2f9972be9cd1 +md5: 043c13ed3a18396994be9b4fab6572ad +depends: +- fontconfig >=2.15.0,<3.0a0 +- fonts-conda-ecosystem +- icu >=78.1,<79.0a0 +- libexpat >=2.7.3,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libglib >=2.86.3,<3.0a0 +- libpng >=1.6.53,<1.7.0a0 +- libstdcxx >=14 +- libxcb >=1.17.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pixman >=0.46.4,<1.0a0 +- xorg-libice >=1.1.2,<2.0a0 +- xorg-libsm >=1.2.6,<2.0a0 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: LGPL-2.1-only or MPL-1.1 +size: 927045 +timestamp: 1766416003626 +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +sha256: 7cc26225d590540ae95cd24940ff42f2da7479dd4cd22ae9ab9298665d06790c +md5: c9f6a4b12229f7331f79c9a00dd6e240 +depends: +- font-ttf-dejavu-sans-mono +- fontconfig +- openjdk >=8.0.144 +- perl +license: GPL >=3 +size: 11664291 +timestamp: 1677946722445 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +sha256: 835aff8615dd8d8fff377679710ce81b8a2c47b6404e21a92fb349fda193a15c +md5: 0fed1ff55f4938a65907f3ecf62609db +depends: +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +license: MIT +license_family: MIT +size: 279044 +timestamp: 1771382728182 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 +md5: fee5683a3f04bd15cbd8318b096a27ab +depends: +- fonts-conda-forge +license: BSD-3-Clause +license_family: BSD +size: 3667 +timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda +sha256: a79dc3bd54c4fb1f249942ee2d5b601a76ecf9614774a4cff9af49adfa458db2 +md5: 2f809afaf0ba1ea4135dce158169efac +depends: +- libgcc-ng >=12 +license: MIT +license_family: MIT +size: 82124 +timestamp: 1712692444545 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda +sha256: c9b1781fe329e0b77c5addd741e58600f50bef39321cae75eba72f2f381374b7 +md5: 4aa540e9541cc9d6581ab23ff2043f13 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: LGPL-2.0-or-later +license_family: LGPL +size: 102400 +timestamp: 1755102000043 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.2.1-h1134a53_0.conda +sha256: e22f485fddaaea3ff4b6cae98e0197b9dccd2ed2770337ad6ff38a92afe04e59 +md5: 05d65a2cf410adc331c9ea61f59f1013 +depends: +- cairo >=1.18.4,<2.0a0 +- graphite2 >=1.3.14,<2.0a0 +- icu >=78.3,<79.0a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.2 +- libfreetype6 >=2.14.2 +- libgcc >=14 +- libglib >=2.86.4,<3.0a0 +- libstdcxx >=14 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +size: 2345732 +timestamp: 1774281448329 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda +sha256: 49ba6aed2c6b482bb0ba41078057555d29764299bc947b990708617712ef6406 +md5: 546da38c2fa9efacf203e2ad3f987c59 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: MIT +license_family: MIT +size: 12837286 +timestamp: 1773822650615 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda +sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 +md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 +depends: +- libgcc >=13 +license: LGPL-2.1-or-later +size: 129048 +timestamp: 1754906002667 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda +sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba +md5: d9ca108bd680ea86a963104b6b3e95ca +depends: +- keyutils >=1.6.3,<2.0a0 +- libedit >=3.1.20250104,<3.2.0a0 +- libedit >=3.1.20250104,<4.0a0 +- libgcc >=14 +- libstdcxx >=14 +- openssl >=3.5.5,<4.0a0 +license: MIT +license_family: MIT +size: 1517436 +timestamp: 1769773395215 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda +sha256: 379ef5e91a587137391a6149755d0e929f1a007d2dcb211318ac670a46c8596f +md5: bb960f01525b5e001608afef9d47b79c +depends: +- libgcc >=14 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 293039 +timestamp: 1768184778398 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +sha256: 8957fd460c1c132c8031f65fd5f56ec3807fd71b7cab2c5e2b0937b13404ab36 +md5: d13423b06447113a90b5b1366d4da171 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 240444 +timestamp: 1773114901155 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda +sha256: 41b04f995c9f63af8c4065a35931e46cbc2fdd6b9bf7e4c19f90d53cbb2bc8e5 +md5: 67828c963b17db7dc989fe5d509ef04a +depends: +- krb5 >=1.22.2,<1.23.0a0 +- libgcc >=14 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +license: Apache-2.0 +license_family: Apache +size: 4553739 +timestamp: 1770903929794 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +sha256: 48814b73bd462da6eed2e697e30c060ae16af21e9fbed30d64feaf0aad9da392 +md5: a9138815598fe6b91a1d6782ca657b0c +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 71117 +timestamp: 1761979776756 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda +sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 +md5: fb640d776fc92b682a14e001980825b1 +depends: +- ncurses +- libgcc >=13 +- ncurses >=6.5,<7.0a0 +license: BSD-2-Clause +license_family: BSD +size: 148125 +timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda +sha256: 995ce3ad96d0f4b5ed6296b051a0d7b6377718f325bc0e792fbb96b0e369dad7 +md5: 57f3b3da02a50a1be2a6fe847515417d +depends: +- libgcc >=14 +constrains: +- expat 2.7.4.* +license: MIT +license_family: MIT +size: 76564 +timestamp: 1771259530958 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 +md5: 2f364feefb6a7c00423e80dcb12db62a +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 55952 +timestamp: 1769456078358 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +sha256: 752e4f66283d7deb4c6fd47d88df644d8daa2aaa825a54f3bf350a625190192a +md5: a229e22d4d8814a07702b0919d8e6701 +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8125 +timestamp: 1774301094057 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +sha256: 8e6b27fe4eec4c2fa7b7769a21973734c8dba1de80086fb0213e58375ac09f4c +md5: b99ed99e42dafb27889483b3098cace7 +depends: +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 422941 +timestamp: 1774301093473 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda +sha256: 43df385bedc1cab11993c4369e1f3b04b4ca5d0ea16cba6a0e7f18dbc129fcc9 +md5: 552567ea2b61e3a3035759b2fdb3f9a6 +depends: +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_18 +- libgomp 15.2.0 h8acb6b2_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 622900 +timestamp: 1771378128706 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda +sha256: 83bb0415f59634dccfa8335d4163d1f6db00a27b36666736f9842b650b92cf2f +md5: 4feebd0fbf61075a1a9c2e9b3936c257 +depends: +- libgcc 15.2.0 h8acb6b2_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27568 +timestamp: 1771378136019 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda +sha256: afc503dbd04a5bf2709aa9d8318a03a8c4edb389f661ff280c3494bfef4341ec +md5: 4ac4372fc4d7f20630a91314cdac8afd +depends: +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- libiconv >=1.18,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pcre2 >=10.47,<10.48.0a0 +constrains: +- glib 2.86.4 *_1 +license: LGPL-2.1-or-later +size: 4512186 +timestamp: 1771863220969 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda +sha256: fc716f11a6a8525e27a5d332ef6a689210b0d2a4dd1133edc0f530659aa9faa6 +md5: 4faa39bf919939602e594253bd673958 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 588060 +timestamp: 1771378040807 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda +sha256: 1473451cd282b48d24515795a595801c9b65b567fe399d7e12d50b2d6cdb04d9 +md5: 5a86bf847b9b926f3a4f203339748d78 +depends: +- libgcc >=14 +license: LGPL-2.1-only +size: 791226 +timestamp: 1754910975665 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda +sha256: 84064c7c53a64291a585d7215fe95ec42df74203a5bf7615d33d49a3b0f08bb6 +md5: 5109d7f837a3dfdf5c60f60e311b041f +depends: +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 691818 +timestamp: 1762094728337 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda +sha256: 843c46e20519651a3e357a8928352b16c5b94f4cd3d5481acc48be2e93e8f6a3 +md5: 96944e3c92386a12755b94619bae0b35 +depends: +- libgcc >=14 +constrains: +- xz 5.8.2.* +license: 0BSD +size: 125916 +timestamp: 1768754941722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda +sha256: c7378c6b79de4d571d00ad1caf0a4c19d43c9c94077a761abb6ead44d891f907 +md5: be4088903b94ea297975689b3c3aeb27 +depends: +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: zlib-acknowledgement +size: 340156 +timestamp: 1770691477245 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda +sha256: 31fdb9ffafad106a213192d8319b9f810e05abca9c5436b60e507afb35a6bc40 +md5: f56573d05e3b735cb03efeb64a15f388 +depends: +- libgcc 15.2.0 h8acb6b2_18 +constrains: +- libstdcxx-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5541411 +timestamp: 1771378162499 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +sha256: 7ff79470db39e803e21b8185bc8f19c460666d5557b1378d1b1e857d929c6b39 +md5: 8c6fd84f9c87ac00636007c6131e457d +depends: +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 488407 +timestamp: 1762022048105 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda +sha256: c37a8e89b700646f3252608f8368e7eb8e2a44886b92776e57ad7601fc402a11 +md5: cf2861212053d05f27ec49c3784ff8bb +depends: +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 43453 +timestamp: 1766271546875 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +sha256: b03700a1f741554e8e5712f9b06dd67e76f5301292958cd3cb1ac8c6fdd9ed25 +md5: 24e92d0942c799db387f5c9d7b81f1af +depends: +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 359496 +timestamp: 1752160685488 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b +md5: cd14ee5cca2464a425b1dbfc24d90db2 +depends: +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 397493 +timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda +sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f +md5: b4df5d7d4b63579d081fd3a4cf99740e +depends: +- libgcc-ng >=12 +license: LGPL-2.1-or-later +size: 114269 +timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f +md5: 502006882cf5461adced436e410046d1 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 69833 +timestamp: 1774072605429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda +sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 +md5: 182afabe009dc78d8b73100255ee6868 +depends: +- libgcc >=13 +license: X11 AND BSD-3-Clause +size: 926034 +timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.2-h488f50d_0.conda +sha256: 6fd2c872b275fa5d42a61a4b6dc28a819cde29f9048adb547363597432e0720e +md5: 27fdd5d67e235c20d23b2d66406497d3 +depends: +- xorg-libx11 +- xorg-libxext +- xorg-libxi +- xorg-libxrender +- xorg-libxtst +- libstdcxx >=14 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +- xorg-libxtst >=1.2.5,<2.0a0 +- libpng >=1.6.55,<1.7.0a0 +- alsa-lib >=1.2.15.3,<1.3.0a0 +- xorg-libx11 >=1.8.13,<2.0a0 +- xorg-libxi >=1.8.2,<2.0a0 +- xorg-libxrandr >=1.5.5,<2.0a0 +- lcms2 >=2.18,<3.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +- libcups >=2.3.3,<2.4.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- harfbuzz >=12.3.2 +- xorg-libxext >=1.3.7,<2.0a0 +- giflib >=5.2.2,<5.3.0a0 +- xorg-libxt >=1.3.1,<2.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- fontconfig >=2.17.1,<3.0a0 +- fonts-conda-ecosystem +license: GPL-2.0-or-later WITH Classpath-exception-2.0 +license_family: GPL +size: 106988620 +timestamp: 1771443741031 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda +sha256: 7f8048c0e75b2620254218d72b4ae7f14136f1981c5eb555ef61645a9344505f +md5: 25f5885f11e8b1f075bccf4a2da91c60 +depends: +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3692030 +timestamp: 1769557678657 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda +sha256: 04df2cee95feba440387f33f878e9f655521e69f4be33a0cd637f07d3d81f0f9 +md5: 1a30c42e32ca0ea216bd0bfe6f842f0b +depends: +- bzip2 >=1.0.8,<2.0a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 1166552 +timestamp: 1763655534263 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda +build_number: 7 +sha256: d78296134263b5bf476cad838ded65451e7162db756f9997c5d06b08122572ed +md5: 17d019cb2a6c72073c344e98e40dfd61 +depends: +- libgcc-ng >=12 +- libxcrypt >=4.4.36 +license: GPL-1.0-or-later OR Artistic-1.0-Perl +size: 13338804 +timestamp: 1703310557094 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda +sha256: e6b0846a998f2263629cfeac7bca73565c35af13251969f45d385db537a514e4 +md5: 1587081d537bd4ae77d1c0635d465ba5 +depends: +- libgcc >=14 +- libstdcxx >=14 +- libgcc >=14 +license: MIT +license_family: MIT +size: 357913 +timestamp: 1754665583353 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +sha256: e9cbcbc94e151ada3d6dc365380aaaf591f65012c16d9a2abaea4b9b90adc402 +md5: ab7288cc39545556d1bc5e71ab2df9a9 +depends: +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 636733 +timestamp: 1769712412683 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba +md5: bb5a90c93e3bac3d5690acf76b4a6386 +depends: +- libgcc >=13 +license: MIT +license_family: MIT +size: 8342 +timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda +sha256: a2ba1864403c7eb4194dacbfe2777acf3d596feae43aada8d1b478617ce45031 +md5: c8d8ec3e00cd0fd8a231789b91a7c5b7 +depends: +- libgcc >=13 +license: MIT +license_family: MIT +size: 60433 +timestamp: 1734229908988 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda +sha256: b86a819cd16f90c01d9d81892155126d01555a20dabd5f3091da59d6309afd0a +md5: 2d1409c50882819cb1af2de82e2b7208 +depends: +- libgcc >=13 +- libuuid >=2.38.1,<3.0a0 +- xorg-libice >=1.1.2,<2.0a0 +license: MIT +license_family: MIT +size: 28701 +timestamp: 1741897678254 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda +sha256: cf886160e2ff580d77f7eb8ec1a77c41c2c5b05343e329bc35f0ddf40b8d92ab +md5: 22dd10425ef181e80e130db50675d615 +depends: +- libgcc >=14 +- libxcb >=1.17.0,<2.0a0 +license: MIT +license_family: MIT +size: 869058 +timestamp: 1770819244991 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +sha256: e9f6e931feeb2f40e1fdbafe41d3b665f1ab6cb39c5880a1fcf9f79a3f3c84a5 +md5: 1c246e1105000c3660558459e2fd6d43 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 16317 +timestamp: 1762977521691 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +sha256: 128d72f36bcc8d2b4cdbec07507542e437c7d67f677b7d77b71ed9eeac7d6df1 +md5: bff06dcde4a707339d66d45d96ceb2e2 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 21039 +timestamp: 1762979038025 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-he30d5cf_0.conda +sha256: db2188bc0d844d4e9747bac7f6c1d067e390bd769c5ad897c93f1df759dc5dba +md5: fb42b683034619915863d68dd9df03a3 +depends: +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 52409 +timestamp: 1769446753771 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda +sha256: 8cb9c88e25c57e47419e98f04f9ef3154ad96b9f858c88c570c7b91216a64d0e +md5: e8b4056544341daf1d415eaeae7a040c +depends: +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 20704 +timestamp: 1759284028146 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda +sha256: 7b587407ecb9ccd2bbaf0fb94c5dbdde4d015346df063e9502dc0ce2b682fb5e +md5: eeee3bdb31c6acde2b81ad1b8c287087 +depends: +- libgcc >=13 +- xorg-libx11 >=1.8.9,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxfixes >=6.0.1,<7.0a0 +license: MIT +license_family: MIT +size: 48197 +timestamp: 1727801059062 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.5-he30d5cf_0.conda +sha256: 9f5196665a8d72f4f119c40dcc4bafeb0b540b102cc7b8b299c2abf599e7919f +md5: 1f64c613f0b8d67e9fb0e165d898fb6b +depends: +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: MIT +license_family: MIT +size: 31122 +timestamp: 1769445286951 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda +sha256: ffd77ee860c9635a28cfda46163dcfe9224dc6248c62404c544ae6b564a0be1f +md5: ae2c2dd0e2d38d249887727db2af960e +depends: +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +license: MIT +license_family: MIT +size: 33649 +timestamp: 1734229123157 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxt-1.3.1-h57736b2_0.conda +sha256: 7c109792b60720809a580612aba7f8eb2a0bd425b9fc078748a9d6ffc97cbfa8 +md5: a9e4852c8e0b68ee783e7240030b696f +depends: +- libgcc >=13 +- xorg-libice >=1.1.1,<2.0a0 +- xorg-libsm >=1.2.4,<2.0a0 +- xorg-libx11 >=1.8.9,<2.0a0 +license: MIT +license_family: MIT +size: 384752 +timestamp: 1731860572314 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda +sha256: 6eaffce5a34fc0a16a21ddeaefb597e792a263b1b0c387c1ce46b0a967d558e1 +md5: c05698071b5c8e0da82a282085845860 +depends: +- libgcc >=13 +- xorg-libx11 >=1.8.9,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxi >=1.7.10,<2.0a0 +license: MIT +license_family: MIT +size: 33786 +timestamp: 1727964907993 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 +md5: c3655f82dcea2aa179b291e7099c1fcc +depends: +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 614429 +timestamp: 1764777145593 diff --git a/modules/nf-core/fastqc/environment.yml b/modules/nf-core/fastqc/environment.yml new file mode 100644 index 0000000..f9f54ee --- /dev/null +++ b/modules/nf-core/fastqc/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::fastqc=0.12.1 diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf new file mode 100644 index 0000000..1085126 --- /dev/null +++ b/modules/nf-core/fastqc/main.nf @@ -0,0 +1,57 @@ +process FASTQC { + tag "${meta.id}" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' + : 'quay.io/biocontainers/fastqc:0.12.1--hdfd78af_0'}" + + input: + tuple val(meta), path(reads, stageAs: '?/*') + + output: + tuple val(meta), path("*.html"), emit: html + tuple val(meta), path("*.zip"), emit: zip + tuple val("${task.process}"), val('fastqc'), eval('fastqc --version | sed "/FastQC v/!d; s/.*v//"'), emit: versions_fastqc, topic: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // Make list of old name and new name pairs to use for renaming in the bash while loop + def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[reads, "${prefix}.${reads.extension}"]] : reads.withIndex().collect { entry, index -> [entry, "${prefix}_${index + 1}.${entry.extension}"] } + def rename_to = old_new_pairs*.join(' ').join(' ') + def renamed_files = old_new_pairs.collect { _old_name, new_name -> new_name }.join(' ') + + // The total amount of allocated RAM by FastQC is equal to the number of threads defined (--threads) time the amount of RAM defined (--memory) + // https://github.com/s-andrews/FastQC/blob/1faeea0412093224d7f6a07f777fad60a5650795/fastqc#L211-L222 + // Dividing the task.memory by task.cpus allows to stick to requested amount of RAM in the label + def memory_in_mb = task.memory + ? (task.memory.toUnit('MB') / task.cpus).intValue() + : null + // FastQC memory value allowed range (100 - 10000) + def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) + def fastqc_memory_arg = fastqc_memory ? "--memory ${fastqc_memory}" : '' + + """ + printf "%s %s\\n" ${rename_to} | while read old_name new_name; do + [ -f "\${new_name}" ] || ln -s \$old_name \$new_name + done + + fastqc \\ + ${args} \\ + --threads ${task.cpus} \\ + ${fastqc_memory_arg} \\ + ${renamed_files} + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.html + touch ${prefix}.zip + """ +} diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml new file mode 100644 index 0000000..2f6cfef --- /dev/null +++ b/modules/nf-core/fastqc/meta.yml @@ -0,0 +1,111 @@ +name: fastqc +description: Run FastQC on sequenced reads +keywords: + - quality control + - qc + - adapters + - fastq +tools: + - fastqc: + description: | + FastQC gives general quality metrics about your reads. + It provides information about the quality score distribution + across your reads, the per base sequence content (%A/C/G/T). + + You get information about adapter contamination and other + overrepresented sequences. + homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ + documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ["GPL-2.0-only"] + identifier: biotools:fastqc +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + ontologies: [] +output: + html: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.html": + type: file + description: FastQC report + pattern: "*_{fastqc.html}" + ontologies: [] + zip: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.zip": + type: file + description: FastQC report archive + pattern: "*_{fastqc.zip}" + ontologies: [] + versions_fastqc: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + type: eval + description: The expression to obtain the version of the tool +authors: + - "@drpatelh" + - "@grst" + - "@ewels" + - "@FelixKrueger" +maintainers: + - "@drpatelh" + - "@grst" + - "@ewels" + - "@FelixKrueger" +containers: + docker: + linux/arm64: + name: community.wave.seqera.io/library/fastqc:0.12.1--e455e32f745abe68 + build_id: bd-e455e32f745abe68_1 + scan_id: sc-f102f736465af88c_1 + linux/amd64: + name: community.wave.seqera.io/library/fastqc:0.12.1--5cb1a2fa2f18c7c2 + build_id: bd-5cb1a2fa2f18c7c2_1 + scan_id: sc-0c0466326b6b77d2_1 + singularity: + linux/amd64: + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--5c4bd442468d75dd + build_id: bd-5c4bd442468d75dd_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f2/f20b021476d1d87658820f971ebecc1e8cdbde0f338eb0d9cea2b0a8fc54a54b/data + linux/arm64: + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--127a87fc06499035 + build_id: bd-127a87fc06499035_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/46/46daf2dad0169afd2ae047c3e50ed3776259f664bf07e5e06b045dc23449e994/data + conda: + linux/amd64: + lock_file: modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt + linux/arm64: + lock_file: modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test new file mode 100644 index 0000000..66c44da --- /dev/null +++ b/modules/nf-core/fastqc/tests/main.nf.test @@ -0,0 +1,309 @@ +nextflow_process { + + name "Test Process FASTQC" + script "../main.nf" + process "FASTQC" + + tag "modules" + tag "modules_nfcore" + tag "fastqc" + + test("sarscov2 single-end [fastq]") { + + when { + process { + """ + input[0] = Channel.of([ + [ id: 'test', single_end:true ], + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + // NOTE The report contains the date inside it, which means that the md5sum is stable per day, but not longer than that. So you can't md5sum it. + // looks like this:
Mon 2 Oct 2023
test.gz
+ // https://github.com/nf-core/modules/pull/3903#issuecomment-1743620039 + { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, + { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, + { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + ) + } + } + + test("sarscov2 paired-end [fastq]") { + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, + { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, + { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, + { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, + { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + ) + } + } + + test("sarscov2 interleaved [fastq]") { + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, + { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, + { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + ) + } + } + + test("sarscov2 paired-end [bam]") { + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, + { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, + { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + ) + } + } + + test("sarscov2 multiple [fastq]") { + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_2.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, + { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, + { assert process.out.html[0][1][2] ==~ ".*/test_3_fastqc.html" }, + { assert process.out.html[0][1][3] ==~ ".*/test_4_fastqc.html" }, + { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, + { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, + { assert process.out.zip[0][1][2] ==~ ".*/test_3_fastqc.zip" }, + { assert process.out.zip[0][1][3] ==~ ".*/test_4_fastqc.zip" }, + { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][1][2]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][1][3]).text.contains("File typeConventional base calls") }, + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + ) + } + } + + test("sarscov2 custom_prefix") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'mysample', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert process.out.html[0][1] ==~ ".*/mysample_fastqc.html" }, + { assert process.out.zip[0][1] ==~ ".*/mysample_fastqc.zip" }, + { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + ) + } + } + + test("sarscov2 single-end [fastq] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id: 'test', single_end:true ], + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 paired-end [fastq] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 interleaved [fastq] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 paired-end [bam] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 multiple [fastq] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_2.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 custom_prefix - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'mysample', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/fastqc/tests/main.nf.test.snap b/modules/nf-core/fastqc/tests/main.nf.test.snap new file mode 100644 index 0000000..c8ee120 --- /dev/null +++ b/modules/nf-core/fastqc/tests/main.nf.test.snap @@ -0,0 +1,476 @@ +{ + "sarscov2 custom_prefix": { + "content": [ + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:14.518503" + }, + "sarscov2 single-end [fastq] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "html": [ + [ + { + "id": "test", + "single_end": true + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "zip": [ + [ + { + "id": "test", + "single_end": true + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:19.309008" + }, + "sarscov2 custom_prefix - stub": { + "content": [ + { + "0": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "html": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "zip": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:44.94888" + }, + "sarscov2 interleaved [fastq]": { + "content": [ + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:38:45.168496" + }, + "sarscov2 paired-end [bam]": { + "content": [ + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:38:53.268919" + }, + "sarscov2 multiple [fastq]": { + "content": [ + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:05.050305" + }, + "sarscov2 paired-end [fastq]": { + "content": [ + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:38:37.2373" + }, + "sarscov2 paired-end [fastq] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:24.450398" + }, + "sarscov2 multiple [fastq] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:39.758762" + }, + "sarscov2 single-end [fastq]": { + "content": [ + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:38:29.555068" + }, + "sarscov2 interleaved [fastq] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:29.193136" + }, + "sarscov2 paired-end [bam] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-28T16:39:34.144919" + } +} \ No newline at end of file diff --git a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt new file mode 100644 index 0000000..7619030 --- /dev/null +++ b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt @@ -0,0 +1,1552 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-64: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.4-hecca717_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.39.3-pyh58ad624_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.39.3-py310hffdcd12_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.39.3-py310hbcd5346_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.2.28-py314h5bd0f2a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 +md5: a9f577daf3de00bca7c3c76c0ecbd1de +depends: +- __glibc >=2.17,<3.0.a0 +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28948 +timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 +md5: aaa2a381ccc56eac91d63b6c1240312f +depends: +- cpython +- python-gil +license: MIT +license_family: MIT +size: 8191 +timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 +md5: 2934f256a8acfe48f6ebb4fce6cde29c +depends: +- python >=3.9 +- typing-extensions >=4.0.0 +license: MIT +license_family: MIT +size: 18074 +timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab +md5: c6b0543676ecb1fb2d7643941fe375f2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 64927 +timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda +noarch: generic +sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 +md5: a2ac7763a9ac75055b68f325d3255265 +depends: +- python >=3.14 +license: BSD-3-Clause AND MIT AND EPL-2.0 +size: 7514 +timestamp: 1767044983590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda +sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 +md5: 8910d2c46f7e7b519129f486e0fe927a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- libbrotlicommon 1.2.0 hb03c661_1 +license: MIT +license_family: MIT +size: 367376 +timestamp: 1764017265553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 +md5: d2ffd7602c02f2b316fd921d39876885 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 260182 +timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc +md5: 4492fd26db29495f0ba23f146cd5638d +depends: +- __unix +license: ISC +size: 147413 +timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda +sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 +md5: 765c4d97e877cdbbb88ff33152b86125 +depends: +- python >=3.10 +license: ISC +size: 151445 +timestamp: 1772001170301 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda +sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 +md5: 49ee13eb9b8f44d63879c69b8a40a74b +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 58510 +timestamp: 1773660086450 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda +sha256: 38cfe1ee75b21a8361c8824f5544c3866f303af1762693a178266d7f198e8715 +md5: ea8a6c3256897cc31263de9f455e25d9 +depends: +- python >=3.10 +- __unix +- python +license: BSD-3-Clause +license_family: BSD +size: 97676 +timestamp: 1764518652276 +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 +md5: b866ff7007b934d564961066c8195983 +depends: +- humanfriendly >=9.1 +- python >=3.9 +license: MIT +license_family: MIT +size: 43758 +timestamp: 1733928076798 +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +sha256: 59c9e29800b483b390467f90e82b0da3a4fbf0612efe1c90813fca232780e160 +md5: 071cf7b0ce333c81718b054066c15102 +depends: +- networkx >=2.0 +- numpy +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 39326 +timestamp: 1735759976140 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda +noarch: generic +sha256: 91b06300879df746214f7363d6c27c2489c80732e46a369eb2afc234bcafb44c +md5: 3bb89e4f795e5414addaa531d6b1500a +depends: +- python >=3.14,<3.15.0a0 +- python_abi * *_cp314 +license: Python-2.0 +size: 50078 +timestamp: 1770674447292 +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.4-hecca717_0.conda +sha256: 0cc345e4dead417996ce9a1f088b28d858f03d113d43c1963d29194366dcce27 +md5: a0535741a4934b3e386051065c58761a +depends: +- __glibc >=2.17,<3.0.a0 +- libexpat 2.7.4 hecca717_0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 145274 +timestamp: 1771259434699 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c +md5: 867127763fbe935bab59815b6e0b7b5c +depends: +- __glibc >=2.17,<3.0.a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +license: MIT +license_family: MIT +size: 270705 +timestamp: 1771382710863 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 +md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 +depends: +- python >=3.10 +- hyperframe >=6.1,<7 +- hpack >=4.1,<5 +- python +license: MIT +license_family: MIT +size: 95967 +timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba +md5: 0a802cb9888dd14eeefc611f05c40b6e +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 30731 +timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d +md5: 7fe569c10905402ed47024fc481bb371 +depends: +- __unix +- python >=3.9 +license: MIT +license_family: MIT +size: 73563 +timestamp: 1733928021866 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +sha256: 6c4343b376d0b12a4c75ab992640970d36c933cad1fd924f6a1181fa91710e80 +md5: daddf757c3ecd6067b9af1df1f25d89e +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 67994 +timestamp: 1766267728652 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 +md5: 8e6923fc12f1fe8f8c4e5c9f343256ac +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 17397 +timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda +sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a +md5: c80d8a3b84358cb967fa81e7075fbc8a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: MIT +license_family: MIT +size: 12723451 +timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda +sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 +md5: 53abe63df7e10a6ba605dc5f9f961d36 +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 50721 +timestamp: 1760286526795 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda +sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 +md5: 080594bf4493e6bae2607e65390c520a +depends: +- python >=3.10 +- zipp >=3.20 +- python +license: Apache-2.0 +license_family: APACHE +size: 34387 +timestamp: 1773931568510 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b +md5: 04558c96691bed63104678757beb4f8d +depends: +- markupsafe >=2.0 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 120685 +timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 +md5: ada41c863af263cc4c5fcbaff7c3e4dc +depends: +- attrs >=22.2.0 +- jsonschema-specifications >=2023.3.6 +- python >=3.10 +- referencing >=0.28.4 +- rpds-py >=0.25.0 +- python +license: MIT +license_family: MIT +size: 82356 +timestamp: 1767839954256 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 +md5: 439cd0f567d697b20a8f45cb70a1005a +depends: +- python >=3.10 +- referencing >=0.31.0 +- python +license: MIT +license_family: MIT +size: 19236 +timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2 +sha256: 7f243680ca03eba7457b7a48f93a9440ba8181a8eac20a3eb5ef165ab6c96664 +md5: b3723b235b0758abaae8c82ce4d80146 +depends: +- __glibc >=2.17,<3.0.a0 +- expat >=2.2.10,<3.0.0a0 +- fontconfig +- fonts-conda-forge +- libgcc-ng >=9.3.0 +- mathjax 2.7.* +- nspr >=4.29,<5.0a0 +- nss >=3.62,<4.0a0 +- sqlite >=3.34.0,<4.0a0 +license: MIT +license_family: MIT +size: 62099926 +timestamp: 1615199463039 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda +sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a +md5: 6f2e2c8f58160147c4d1c6f4c14cbac4 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 249959 +timestamp: 1768184673131 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda +sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c +md5: 18335a698559cdbcd86150a48bf54ba6 +depends: +- __glibc >=2.17,<3.0.a0 +- zstd >=1.5.7,<1.6.0a0 +constrains: +- binutils_impl_linux-64 2.45.1 +license: GPL-3.0-only +license_family: GPL +size: 728002 +timestamp: 1774197446916 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 +md5: a752488c68f2e7c456bcbd8f16eec275 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 261513 +timestamp: 1773113328888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda +build_number: 5 +sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c +md5: c160954f7418d7b6e87eaf05a8913fa9 +depends: +- libopenblas >=0.3.30,<0.3.31.0a0 +- libopenblas >=0.3.30,<1.0a0 +constrains: +- mkl <2026 +- liblapack 3.11.0 5*_openblas +- libcblas 3.11.0 5*_openblas +- blas 2.305 openblas +- liblapacke 3.11.0 5*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18213 +timestamp: 1765818813880 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda +build_number: 5 +sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8 +md5: 6636a2b6f1a87572df2970d3ebc87cc0 +depends: +- libblas 3.11.0 5_h4a7cf45_openblas +constrains: +- liblapacke 3.11.0 5*_openblas +- blas 2.305 openblas +- liblapack 3.11.0 5*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18194 +timestamp: 1765818837135 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 +md5: 6c77a605a7a689d17d4819c0f8ac9a00 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 73490 +timestamp: 1761979956660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda +sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 +md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- expat 2.7.4.* +license: MIT +license_family: MIT +size: 76798 +timestamp: 1771259418166 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 +md5: a360c33a5abe61c07959e449fa1453eb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 58592 +timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 +md5: e289f3d17880e44b633ba911d57a321b +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8049 +timestamp: 1774298163029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d +md5: fb16b4b69e3f1dcfe79d80db8fd0c55d +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 384575 +timestamp: 1774298162622 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda +sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 +md5: 0aa00f03f9e39fb9876085dee11a85d4 +depends: +- __glibc >=2.17,<3.0.a0 +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_18 +- libgomp 15.2.0 he0feb66_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 1041788 +timestamp: 1771378212382 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda +sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 +md5: d5e96b1ed75ca01906b3d2469b4ce493 +depends: +- libgcc 15.2.0 he0feb66_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27526 +timestamp: 1771378224552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda +sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee +md5: 9063115da5bc35fdc3e1002e69b9ef6e +depends: +- libgfortran5 15.2.0 h68bc16d_18 +constrains: +- libgfortran-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27523 +timestamp: 1771378269450 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda +sha256: 539b57cf50ec85509a94ba9949b7e30717839e4d694bc94f30d41c9d34de2d12 +md5: 646855f357199a12f02a87382d429b75 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=15.2.0 +constrains: +- libgfortran 15.2.0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 2482475 +timestamp: 1771378241063 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda +sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 +md5: 239c5e9546c38a1e884d69effcf4c882 +depends: +- __glibc >=2.17,<3.0.a0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 603262 +timestamp: 1771378117851 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda +sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 +md5: 8397539e3a0bbd1695584fb4f927485a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 633710 +timestamp: 1762094827865 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda +build_number: 5 +sha256: c723b6599fcd4c6c75dee728359ef418307280fa3e2ee376e14e85e5bbdda053 +md5: b38076eb5c8e40d0106beda6f95d7609 +depends: +- libblas 3.11.0 5_h4a7cf45_openblas +constrains: +- blas 2.305 openblas +- liblapacke 3.11.0 5*_openblas +- libcblas 3.11.0 5*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18200 +timestamp: 1765818857876 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda +sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb +md5: c7c83eecbb72d88b940c249af56c8b17 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- xz 5.8.2.* +license: 0BSD +size: 113207 +timestamp: 1768752626120 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda +sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 +md5: 2c21e66f50753a083cbe6b80f38268fa +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: BSD-2-Clause +license_family: BSD +size: 92400 +timestamp: 1769482286018 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda +sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5 +md5: be43915efc66345cccb3c310b6ed0374 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libgfortran +- libgfortran5 >=14.3.0 +constrains: +- openblas >=0.3.30,<0.3.31.0a0 +license: BSD-3-Clause +license_family: BSD +size: 5927939 +timestamp: 1763114673331 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda +sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c +md5: 5f13ffc7d30ffec87864e678df9957b4 +depends: +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libzlib >=1.3.1,<2.0a0 +license: zlib-acknowledgement +size: 317669 +timestamp: 1770691470744 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda +sha256: d716847b7deca293d2e49ed1c8ab9e4b9e04b9d780aea49a97c26925b28a7993 +md5: fd893f6a3002a635b5e50ceb9dd2c0f4 +depends: +- __glibc >=2.17,<3.0.a0 +- icu >=78.2,<79.0a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: blessing +size: 951405 +timestamp: 1772818874251 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda +sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e +md5: 1b08cd684f34175e4514474793d44bcb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc 15.2.0 he0feb66_18 +constrains: +- libstdcxx-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5852330 +timestamp: 1771378262446 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 +md5: cd5a90476766d53e901500df9215e927 +depends: +- __glibc >=2.17,<3.0.a0 +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 435273 +timestamp: 1762022005702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda +sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee +md5: db409b7c1720428638e7c0d509d3e1b5 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 40311 +timestamp: 1766271528534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b +md5: aea31d2e5b1091feca96fcfe945c3cf9 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 429011 +timestamp: 1752159441324 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa +md5: 92ed62436b625154323d40d5f2f11dd7 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 395888 +timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 +md5: d87ff7921124eccd67248aa483c23fec +depends: +- __glibc >=2.17,<3.0.a0 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 63629 +timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b +md5: ba0a9221ce1063f31692c07370d062f3 +depends: +- importlib-metadata >=4.4 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 85893 +timestamp: 1770694658918 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda +sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e +md5: 5b5203189eb668f042ac2b0826244964 +depends: +- mdurl >=0.1,<1 +- python >=3.10 +license: MIT +license_family: MIT +size: 64736 +timestamp: 1754951288511 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda +sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf +md5: 9a17c4307d23318476d7fbf0fedc0cde +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- jinja2 >=3.0.0 +license: BSD-3-Clause +license_family: BSD +size: 27424 +timestamp: 1772445227915 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2 +sha256: 02fef69bde69db264a12f21386612262f545b6e3e68d8f1ccec19f3eaae58edf +md5: 86e69bd82c2a2c6fd29f5ab7e02b3691 +license: Apache-2.0 +license_family: Apache +size: 22281629 +timestamp: 1662784498331 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 +md5: 592132998493b3ff25fd7479396e8351 +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 14465 +timestamp: 1733255681319 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda +sha256: f005760b13093362fc9c997d603dd487de32ab2e821a3cbce52a42bcb8136517 +md5: 698a8a27c2b9d8a542c70cb47099a75e +depends: +- click +- coloredlogs +- humanize +- importlib-metadata +- jinja2 >=3.0.0 +- jsonschema +- markdown +- natsort +- numpy +- packaging +- pillow >=10.2.0 +- plotly >=5.18 +- polars-lts-cpu +- pyaml-env +- pydantic >=2.7.1 +- python >=3.8,!=3.14.1 +- python-dotenv +- python-kaleido 0.2.1 +- pyyaml >=4 +- requests +- rich >=10 +- rich-click +- spectra >=0.0.10 +- tiktoken +- tqdm +- typeguard +license: GPL-3.0-or-later +license_family: GPL3 +size: 4198799 +timestamp: 1765300743879 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda +sha256: 541fd4390a0687228b8578247f1536a821d9261389a65585af9d1a6f2a14e1e0 +md5: 30bec5e8f4c3969e2b1bd407c5e52afb +depends: +- python >=3.10 +- python +license: MIT +size: 280459 +timestamp: 1774380620329 +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 +md5: e941e85e273121222580723010bd4fa2 +depends: +- python >=3.9 +- python +license: MIT +license_family: MIT +size: 39262 +timestamp: 1770905275632 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda +sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 +md5: 47e340acb35de30501a76c7c799c41d7 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: X11 AND BSD-3-Clause +size: 891641 +timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 +md5: a2c1eeadae7a309daed9d62c96012a2b +depends: +- python >=3.11 +- python +constrains: +- numpy >=1.25 +- scipy >=1.11.2 +- matplotlib-base >=3.8 +- pandas >=2.0 +license: BSD-3-Clause +license_family: BSD +size: 1587439 +timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda +sha256: e3664264bd936c357523b55c71ed5a30263c6ba278d726a75b1eb112e6fb0b64 +md5: e235d5566c9cc8970eb2798dd4ecf62f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: MPL-2.0 +license_family: MOZILLA +size: 228588 +timestamp: 1762348634537 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda +sha256: 44dd98ffeac859d84a6dcba79a2096193a42fc10b29b28a5115687a680dd6aea +md5: 567fbeed956c200c1db5782a424e58ee +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libsqlite >=3.51.0,<4.0a0 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +- nspr >=4.38,<5.0a0 +license: MPL-2.0 +license_family: MOZILLA +size: 2057773 +timestamp: 1763485556350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda +sha256: f2ba8cb0d86a6461a6bcf0d315c80c7076083f72c6733c9290086640723f79ec +md5: 36f5b7eb328bdc204954a2225cf908e2 +depends: +- python +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- python_abi 3.14.* *_cp314 +- libcblas >=3.9.0,<4.0a0 +- liblapack >=3.9.0,<4.0a0 +- libblas >=3.9.0,<4.0a0 +constrains: +- numpy-base <0a0 +license: BSD-3-Clause +license_family: BSD +size: 8927860 +timestamp: 1773839233468 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda +sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d +md5: 11b3379b191f63139e29c0d19dee24cd +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libpng >=1.6.50,<1.7.0a0 +- libstdcxx >=14 +- libtiff >=4.7.1,<4.8.0a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-2-Clause +license_family: BSD +size: 355400 +timestamp: 1758489294972 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda +sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c +md5: f61eb8cd60ff9057122a3d338b99c00f +depends: +- __glibc >=2.17,<3.0.a0 +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3164551 +timestamp: 1769555830639 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda +sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 +md5: b76541e68fea4d511b1ac46a28dcd2c6 +depends: +- python >=3.8 +- python +license: Apache-2.0 +license_family: APACHE +size: 72010 +timestamp: 1769093650580 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda +sha256: 9e6ec8f3213e8b7d64b0ad45f84c51a2c9eba4398efda31e196c9a56186133ee +md5: 79678378ae235e24b3aa83cee1b38207 +depends: +- python +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libwebp-base >=1.6.0,<2.0a0 +- zlib-ng >=2.3.3,<2.4.0a0 +- python_abi 3.14.* *_cp314 +- tk >=8.6.13,<8.7.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libxcb >=1.17.0,<2.0a0 +- openjpeg >=2.5.4,<3.0a0 +- lcms2 >=2.18,<3.0a0 +- libtiff >=4.7.1,<4.8.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +license: HPND +size: 1073026 +timestamp: 1770794002408 +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 +md5: 3e9427ee186846052e81fadde8ebe96a +depends: +- narwhals >=1.15.1 +- packaging +- python >=3.10 +constrains: +- ipywidgets >=7.6 +license: MIT +license_family: MIT +size: 5251872 +timestamp: 1772628857717 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.39.3-pyh58ad624_1.conda +sha256: d332c2d5002fc440ae37ed9679ffc21b552f18d20232390005d1dd3bce0888d3 +md5: d5a4e013a30dd8dfde9ab39f45aaf9c1 +depends: +- polars-runtime-32 ==1.39.3 +- python >=3.10 +- python +constrains: +- numpy >=1.16.0 +- pyarrow >=7.0.0 +- fastexcel >=0.9 +- openpyxl >=3.0.0 +- xlsx2csv >=0.8.0 +- connectorx >=0.3.2 +- deltalake >=1.0.0 +- pyiceberg >=0.7.1 +- altair >=5.4.0 +- great_tables >=0.8.0 +- polars-runtime-32 ==1.39.3 +- polars-runtime-64 ==1.39.3 +- polars-runtime-compat ==1.39.3 +license: MIT +license_family: MIT +size: 533495 +timestamp: 1774207987966 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda +sha256: e466fb31f67ba9bde18deafeb34263ca5eb25807f39ead0e9d753a8e82c4c4f4 +md5: ef0340e75068ac8ff96462749b5c98e7 +depends: +- polars >=1.34.0 +- polars-runtime-compat >=1.34.0 +license: MIT +license_family: MIT +size: 3902 +timestamp: 1760206808444 +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.39.3-py310hffdcd12_1.conda +noarch: python +sha256: 9744f8086bb0832998f5b01076f57ddc9efbe460e493b14303c3567dc4f401e7 +md5: f9327f9f2cfc4215f55b613e64afd3ba +depends: +- python +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 37570276 +timestamp: 1774207987966 +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.39.3-py310hbcd5346_1.conda +noarch: python +sha256: bf0b932713f0f27924f42159c98426e0073bb6145ed796eaa4cec79ca05363c7 +md5: 4b9b312453eebd6fbdbbe2a88fa1b5c4 +depends: +- python +- libgcc >=14 +- libstdcxx >=14 +- __glibc >=2.17,<3.0.a0 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 37224264 +timestamp: 1774207985377 +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +sha256: 4ce2e1ee31a6217998f78c31ce7dc0a3e0557d9238b51d49dd20c52d467a126d +md5: f2c23a77b25efcad57d377b34bd84941 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 593603 +timestamp: 1769710381284 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 +md5: b3c17d95b5a10c6e64a21fa17573e70e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: MIT +license_family: MIT +size: 8252 +timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +sha256: 58994e0d2ea8584cb399546e6f6896d771995e6121d1a7b6a2c9948388358932 +md5: e17be1016bcc3516827b836cd3e4d9dc +depends: +- python >=3.9 +- pyyaml >=5.0,<=7.0 +license: MIT +license_family: MIT +size: 14645 +timestamp: 1736766960536 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda +sha256: 868569d9505b7fe246c880c11e2c44924d7613a8cdcc1f6ef85d5375e892f13d +md5: c3946ed24acdb28db1b5d63321dbca7d +depends: +- typing-inspection >=0.4.2 +- typing_extensions >=4.14.1 +- python >=3.10 +- typing-extensions >=4.6.1 +- annotated-types >=0.6.0 +- pydantic-core ==2.41.5 +- python +license: MIT +license_family: MIT +size: 340482 +timestamp: 1764434463101 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda +sha256: 7e0ae379796e28a429f8e48f2fe22a0f232979d65ec455e91f8dac689247d39f +md5: 432b0716a1dfac69b86aa38fdd59b7e6 +depends: +- python +- typing-extensions >=4.6.0,!=4.7.0 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 1943088 +timestamp: 1762988995556 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda +sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a +md5: 6b6ece66ebcae2d5f326c77ef2c5a066 +depends: +- python >=3.9 +license: BSD-2-Clause +license_family: BSD +size: 889287 +timestamp: 1750615908735 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 +md5: 461219d1a5bd61342293efa2c0c90eac +depends: +- __unix +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 21085 +timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda +build_number: 101 +sha256: cb0628c5f1732f889f53a877484da98f5a0e0f47326622671396fb4f2b0cd6bd +md5: c014ad06e60441661737121d3eae8a60 +depends: +- __glibc >=2.17,<3.0.a0 +- bzip2 >=1.0.8,<2.0a0 +- ld_impl_linux-64 >=2.36.1 +- libexpat >=2.7.3,<3.0a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- liblzma >=5.8.2,<6.0a0 +- libmpdec >=4.0.0,<5.0a0 +- libsqlite >=3.51.2,<4.0a0 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +- ncurses >=6.5,<7.0a0 +- openssl >=3.5.5,<4.0a0 +- python_abi 3.14.* *_cp314 +- readline >=8.3,<9.0a0 +- tk >=8.6.13,<8.7.0a0 +- tzdata +- zstd >=1.5.7,<1.6.0a0 +license: Python-2.0 +size: 36702440 +timestamp: 1770675584356 +python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 +md5: 130584ad9f3a513cdd71b1fdc1244e9c +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 27848 +timestamp: 1772388605021 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda +sha256: 233aebd94c704ac112afefbb29cf4170b7bc606e22958906f2672081bc50638a +md5: 235765e4ea0d0301c75965985163b5a1 +depends: +- cpython 3.14.3.* +- python_abi * *_cp314 +license: Python-2.0 +size: 50062 +timestamp: 1770674497152 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 +sha256: e17bf63a30aec33432f1ead86e15e9febde9fc40a7f869c0e766be8d2db44170 +md5: 310259a5b03ff02289d7705f39e2b1d2 +depends: +- kaleido-core 0.2.1.* +- python >=3.5 +license: MIT +license_family: MIT +size: 18320 +timestamp: 1615204747600 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +build_number: 8 +sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 +md5: 0539938c55b6b1a59b560e843ad864a4 +constrains: +- python 3.14.* *_cp314 +license: BSD-3-Clause +license_family: BSD +size: 6989 +timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda +sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d +md5: 2035f68f96be30dc60a5dfd7452c7941 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- yaml >=0.2.5,<0.3.0a0 +license: MIT +license_family: MIT +size: 202391 +timestamp: 1770223462836 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda +sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 +md5: d7d95fc8287ea7bf33e0e7116d2b95ec +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-3.0-only +license_family: GPL +size: 345073 +timestamp: 1765813471974 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 +md5: 870293df500ca7e18bedefa5838a22ab +depends: +- attrs >=22.2.0 +- python >=3.10 +- rpds-py >=0.7.0 +- typing_extensions >=4.4.0 +- python +license: MIT +license_family: MIT +size: 51788 +timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.2.28-py314h5bd0f2a_0.conda +sha256: e085e336f1446f5263a3ec9747df8c719b6996753901181add50dc4fdd8bb2e8 +md5: 3c8b6a8c4d0ff5a264e9831eac4941f4 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +license: Apache-2.0 AND CNRI-Python +license_family: PSF +size: 411924 +timestamp: 1772255161535 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda +sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 +md5: c65df89a0b2e321045a9e01d1337b182 +depends: +- python >=3.10 +- certifi >=2017.4.17 +- charset-normalizer >=2,<4 +- idna >=2.5,<4 +- urllib3 >=1.21.1,<3 +- python +constrains: +- chardet >=3.0.2,<6 +license: Apache-2.0 +license_family: APACHE +size: 63602 +timestamp: 1766926974520 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda +sha256: b06ce84d6a10c266811a7d3adbfa1c11f13393b91cc6f8a5b468277d90be9590 +md5: 7a6289c50631d620652f5045a63eb573 +depends: +- markdown-it-py >=2.2.0 +- pygments >=2.13.0,<3.0.0 +- python >=3.10 +- typing_extensions >=4.0.0,<5.0.0 +- python +license: MIT +license_family: MIT +size: 208472 +timestamp: 1771572730357 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 +md5: 0c20a8ebcddb24a45da89d5e917e6cb9 +depends: +- python >=3.10 +- rich >=12 +- click >=8 +- typing-extensions >=4 +- __unix +- python +license: MIT +license_family: MIT +size: 64356 +timestamp: 1769850479089 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda +sha256: e53b0cbf3b324eaa03ca1fe1a688fdf4ab42cea9c25270b0a7307d8aaaa4f446 +md5: c1c368b5437b0d1a68f372ccf01cb133 +depends: +- python +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 376121 +timestamp: 1764543122774 +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +sha256: 7c65782d2511738e62c70462e89d65da4fa54d5a7e47c46667bcd27a59f81876 +md5: 472239e4eb7b5a84bb96b3ed7e3a596a +depends: +- colormath >=3.0.0 +- python >=3.9 +license: MIT +license_family: MIT +size: 22284 +timestamp: 1735770589188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda +sha256: c9af81e7830d9c4b67a7f48e512d060df2676b29cac59e3b31f09dbfcee29c58 +md5: 7d9d7efe9541d4bb71b5934e8ee348ea +depends: +- __glibc >=2.17,<3.0.a0 +- icu >=78.2,<79.0a0 +- libgcc >=14 +- libsqlite 3.52.0 hf4e2dac_0 +- libzlib >=1.3.1,<2.0a0 +- ncurses >=6.5,<7.0a0 +- readline >=8.3,<9.0a0 +license: blessing +size: 203641 +timestamp: 1772818888368 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda +sha256: 7e395d67fd249d901beb1ae269057763c0d8c3ee5f7a348694bdb16d158a37d9 +md5: d705f9d8a1185a2b01cced191177a028 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- regex >=2022.1.18 +- requests >=2.26.0 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 939648 +timestamp: 1764028306357 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda +sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac +md5: cffd3bdd58090148f4cfcd831f4b26ab +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +constrains: +- xorg-libx11 >=1.8.12,<2.0a0 +license: TCL +license_family: BSD +size: 3301196 +timestamp: 1769460227866 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 +md5: e5ce43272193b38c2e9037446c1d9206 +depends: +- python >=3.10 +- __unix +- python +license: MPL-2.0 and MIT +size: 94132 +timestamp: 1770153424136 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda +sha256: 39d8ae33c43cdb8f771373e149b0b4fae5a08960ac58dcca95b2f1642bb17448 +md5: 260af1b0a94f719de76b4e14094e9a3b +depends: +- importlib-metadata >=3.6 +- python >=3.10 +- typing-extensions >=4.10.0 +- typing_extensions >=4.14.0 +constrains: +- pytest >=7 +license: MIT +license_family: MIT +size: 36838 +timestamp: 1771532971545 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c +md5: edd329d7d3a4ab45dcf905899a7a6115 +depends: +- typing_extensions ==4.15.0 pyhcf101f3_0 +license: PSF-2.0 +license_family: PSF +size: 91383 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda +sha256: 70db27de58a97aeb7ba7448366c9853f91b21137492e0b4430251a1870aa8ff4 +md5: a0a4a3035667fc34f29bfbd5c190baa6 +depends: +- python >=3.10 +- typing_extensions >=4.12.0 +license: MIT +license_family: MIT +size: 18923 +timestamp: 1764158430324 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 +md5: 0caa1af407ecff61170c9437a808404d +depends: +- python >=3.10 +- python +license: PSF-2.0 +license_family: PSF +size: 51692 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c +md5: ad659d0a2b3e47e38d829aa8cad2d610 +license: LicenseRef-Public-Domain +size: 119135 +timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda +sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a +md5: 9272daa869e03efe68833e3dc7a02130 +depends: +- backports.zstd >=1.0.0 +- brotli-python >=1.2.0 +- h2 >=4,<5 +- pysocks >=1.5.6,<2.0,!=1.5.7 +- python >=3.10 +license: MIT +license_family: MIT +size: 103172 +timestamp: 1767817860341 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b +md5: b2895afaf55bf96a8c8282a2e47a5de0 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 15321 +timestamp: 1762976464266 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 +md5: 1dafce8548e38671bea82e3f5c6ce22f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 20591 +timestamp: 1762976546182 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda +sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad +md5: a77f85f77be52ff59391544bfe73390a +depends: +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +license: MIT +license_family: MIT +size: 85189 +timestamp: 1753484064210 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda +sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae +md5: 30cd29cb87d819caead4d55184c1d115 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 24194 +timestamp: 1764460141901 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda +sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f +md5: 2aadb0d17215603a82a2a6b0afd9a4cb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: Zlib +license_family: Other +size: 122618 +timestamp: 1770167931827 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 +md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 +depends: +- __glibc >=2.17,<3.0.a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 601375 +timestamp: 1764777111296 diff --git a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt new file mode 100644 index 0000000..a55a4d4 --- /dev/null +++ b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt @@ -0,0 +1,126 @@ + +# This file may be used to create an environment using: +# $ conda create --name --file +# platform: linux-64 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda#49f570f3bc4c874a06ea69b7225753af +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb +https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb +https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda#a443f87920815d41bfe611296e507995 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda#f111d4cfaf1fe9496f386bc98ae94452 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 +https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda#8910d2c46f7e7b519129f486e0fe927a +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c +https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda#7fe569c10905402ed47024fc481bb371 +https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda#b866ff7007b934d564961066c8195983 +https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda#a2c1eeadae7a309daed9d62c96012a2b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda#36f5b7eb328bdc204954a2225cf908e2 +https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda#071cf7b0ce333c81718b054066c15102 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.5-hecca717_0.conda#7de50d165039df32d38be74c1b34a910 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda#fb16b4b69e3f1dcfe79d80db8fd0c55d +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda#e289f3d17880e44b633ba911d57a321b +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda#867127763fbe935bab59815b6e0b7b5c +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda#a7970cd949a077b7cb9696379d338681 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 +https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e +https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda#9a17c4307d23318476d7fbf0fedc0cde +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda#c1c368b5437b0d1a68f372ccf01cb133 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda#ada41c863af263cc4c5fcbaff7c3e4dc +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 +https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2#86e69bd82c2a2c6fd29f5ab7e02b3691 +https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda#e235d5566c9cc8970eb2798dd4ecf62f +https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda#567fbeed956c200c1db5782a424e58ee +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 +https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2#b3723b235b0758abaae8c82ce4d80146 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda#6178c6f2fb254558238ef4e6c56fb782 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 +https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda#ba0a9221ce1063f31692c07370d062f3 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 +https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda#e941e85e273121222580723010bd4fa2 +https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda#76c4757c0ec9d11f969e8eb44899307b +https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda#6cac1a50359219d786453c6fef819f98 +https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda#3e9427ee186846052e81fadde8ebe96a +https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.40.0-py310hffdcd12_0.conda#8eacf9ff4d4e1ca1b52f8f3ba3e0c993 +https://conda.anaconda.org/conda-forge/noarch/polars-1.40.0-pyh58ad624_0.conda#fd16be490f5403adfbf27dd4901bbe34 +https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.40.0-py310hbcd5346_0.conda#03a6899e17bb731c8e21b08212f1a64c +https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda#ef0340e75068ac8ff96462749b5c98e7 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda#2035f68f96be30dc60a5dfd7452c7941 +https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda#e17be1016bcc3516827b836cd3e4d9dc +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.3-py314h2e6c369_0.conda#1f3fd537f929b8d3236f9f0f0e7f7a32 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda#a0a4a3035667fc34f29bfbd5c190baa6 +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda#f690e6f204efd2e5c06b57518a383d98 +https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda#130584ad9f3a513cdd71b1fdc1244e9c +https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2#310259a5b03ff02289d7705f39e2b1d2 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 +https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 +https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda#0242025a3c804966bf71aa04eee82f66 +https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda#0c20a8ebcddb24a45da89d5e917e6cb9 +https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda#472239e4eb7b5a84bb96b3ed7e3a596a +https://conda.anaconda.org/conda-forge/linux-64/regex-2026.4.4-py314h5bd0f2a_0.conda#4ffb42385183c854564f1f9adcf80a63 +https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda#d705f9d8a1185a2b01cced191177a028 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda#e5ce43272193b38c2e9037446c1d9206 +https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda#260af1b0a94f719de76b4e14094e9a3b +https://conda.anaconda.org/bioconda/noarch/multiqc-1.34-pyhdfd78af_0.conda#a7111ab9a6a6146b40cbce16655ac873 +https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f +https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda#f2c23a77b25efcad57d377b34bd84941 diff --git a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt new file mode 100644 index 0000000..a58231a --- /dev/null +++ b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt @@ -0,0 +1,1502 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-aarch64: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.4-hfae3067_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py314haac167e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.1.1-py314hac3e5ec_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.39.3-pyh58ad624_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.39.3-py310hff09b76_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.39.3-py310hf00a4a2_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.5-py314h451b6cc_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.3-hb06a95a_101_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.2.28-py314h51f160d_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.52.0-hf1c7be2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 +md5: 468fd3bb9e1f671d36c2cbc677e56f1d +depends: +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28926 +timestamp: 1770939656741 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 +md5: aaa2a381ccc56eac91d63b6c1240312f +depends: +- cpython +- python-gil +license: MIT +license_family: MIT +size: 8191 +timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 +md5: 2934f256a8acfe48f6ebb4fce6cde29c +depends: +- python >=3.9 +- typing-extensions >=4.0.0 +license: MIT +license_family: MIT +size: 18074 +timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab +md5: c6b0543676ecb1fb2d7643941fe375f2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 64927 +timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda +noarch: generic +sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 +md5: a2ac7763a9ac75055b68f325d3255265 +depends: +- python >=3.14 +license: BSD-3-Clause AND MIT AND EPL-2.0 +size: 7514 +timestamp: 1767044983590 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda +sha256: 5a5b0cdcd7ed89c6a8fb830924967f6314a2b71944bc1ebc2c105781ba97aa75 +md5: a1b5c571a0923a205d663d8678df4792 +depends: +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python >=3.14,<3.15.0a0 *_cp314 +- python_abi 3.14.* *_cp314 +constrains: +- libbrotlicommon 1.2.0 he30d5cf_1 +license: MIT +license_family: MIT +size: 373193 +timestamp: 1764017486851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c +md5: 840d8fc0d7b3209be93080bc20e07f2d +depends: +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 192412 +timestamp: 1771350241232 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc +md5: 4492fd26db29495f0ba23f146cd5638d +depends: +- __unix +license: ISC +size: 147413 +timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda +sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 +md5: 765c4d97e877cdbbb88ff33152b86125 +depends: +- python >=3.10 +license: ISC +size: 151445 +timestamp: 1772001170301 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda +sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 +md5: 49ee13eb9b8f44d63879c69b8a40a74b +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 58510 +timestamp: 1773660086450 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda +sha256: 38cfe1ee75b21a8361c8824f5544c3866f303af1762693a178266d7f198e8715 +md5: ea8a6c3256897cc31263de9f455e25d9 +depends: +- python >=3.10 +- __unix +- python +license: BSD-3-Clause +license_family: BSD +size: 97676 +timestamp: 1764518652276 +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 +md5: b866ff7007b934d564961066c8195983 +depends: +- humanfriendly >=9.1 +- python >=3.9 +license: MIT +license_family: MIT +size: 43758 +timestamp: 1733928076798 +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +sha256: 59c9e29800b483b390467f90e82b0da3a4fbf0612efe1c90813fca232780e160 +md5: 071cf7b0ce333c81718b054066c15102 +depends: +- networkx >=2.0 +- numpy +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 39326 +timestamp: 1735759976140 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda +noarch: generic +sha256: 91b06300879df746214f7363d6c27c2489c80732e46a369eb2afc234bcafb44c +md5: 3bb89e4f795e5414addaa531d6b1500a +depends: +- python >=3.14,<3.15.0a0 +- python_abi * *_cp314 +license: Python-2.0 +size: 50078 +timestamp: 1770674447292 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.4-hfae3067_0.conda +sha256: 5f087bef054c681edcaae84a8c2230585b938691e371ff92957a30707b7fcdf7 +md5: b304307db639831ad7caabd2eac6fca6 +depends: +- libexpat 2.7.4 hfae3067_0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 137701 +timestamp: 1771259543650 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +sha256: 835aff8615dd8d8fff377679710ce81b8a2c47b6404e21a92fb349fda193a15c +md5: 0fed1ff55f4938a65907f3ecf62609db +depends: +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +license: MIT +license_family: MIT +size: 279044 +timestamp: 1771382728182 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 +md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 +depends: +- python >=3.10 +- hyperframe >=6.1,<7 +- hpack >=4.1,<5 +- python +license: MIT +license_family: MIT +size: 95967 +timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba +md5: 0a802cb9888dd14eeefc611f05c40b6e +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 30731 +timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d +md5: 7fe569c10905402ed47024fc481bb371 +depends: +- __unix +- python >=3.9 +license: MIT +license_family: MIT +size: 73563 +timestamp: 1733928021866 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +sha256: 6c4343b376d0b12a4c75ab992640970d36c933cad1fd924f6a1181fa91710e80 +md5: daddf757c3ecd6067b9af1df1f25d89e +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 67994 +timestamp: 1766267728652 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 +md5: 8e6923fc12f1fe8f8c4e5c9f343256ac +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 17397 +timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda +sha256: 49ba6aed2c6b482bb0ba41078057555d29764299bc947b990708617712ef6406 +md5: 546da38c2fa9efacf203e2ad3f987c59 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: MIT +license_family: MIT +size: 12837286 +timestamp: 1773822650615 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda +sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 +md5: 53abe63df7e10a6ba605dc5f9f961d36 +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 50721 +timestamp: 1760286526795 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda +sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 +md5: 080594bf4493e6bae2607e65390c520a +depends: +- python >=3.10 +- zipp >=3.20 +- python +license: Apache-2.0 +license_family: APACHE +size: 34387 +timestamp: 1773931568510 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b +md5: 04558c96691bed63104678757beb4f8d +depends: +- markupsafe >=2.0 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 120685 +timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 +md5: ada41c863af263cc4c5fcbaff7c3e4dc +depends: +- attrs >=22.2.0 +- jsonschema-specifications >=2023.3.6 +- python >=3.10 +- referencing >=0.28.4 +- rpds-py >=0.25.0 +- python +license: MIT +license_family: MIT +size: 82356 +timestamp: 1767839954256 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 +md5: 439cd0f567d697b20a8f45cb70a1005a +depends: +- python >=3.10 +- referencing >=0.31.0 +- python +license: MIT +license_family: MIT +size: 19236 +timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2 +sha256: d3c7f4797566e6f983d16c2a87063a18e4b2d819a66230190a21584d70042755 +md5: 4f0d284f5d11e04277b552eb1c172c7f +depends: +- __glibc >=2.17,<3.0.a0 +- expat >=2.2.10,<3.0.0a0 +- fontconfig +- fonts-conda-forge +- libgcc-ng >=9.3.0 +- mathjax 2.7.* +- nspr >=4.29,<5.0a0 +- nss >=3.62,<4.0a0 +- sqlite >=3.34.0,<4.0a0 +license: MIT +license_family: MIT +size: 65750397 +timestamp: 1615199465742 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda +sha256: 379ef5e91a587137391a6149755d0e929f1a007d2dcb211318ac670a46c8596f +md5: bb960f01525b5e001608afef9d47b79c +depends: +- libgcc >=14 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 293039 +timestamp: 1768184778398 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda +sha256: 7abd913d81a9bf00abb699e8987966baa2065f5132e37e815f92d90fc6bba530 +md5: a21644fc4a83da26452a718dc9468d5f +depends: +- zstd >=1.5.7,<1.6.0a0 +constrains: +- binutils_impl_linux-aarch64 2.45.1 +license: GPL-3.0-only +license_family: GPL +size: 875596 +timestamp: 1774197520746 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +sha256: 8957fd460c1c132c8031f65fd5f56ec3807fd71b7cab2c5e2b0937b13404ab36 +md5: d13423b06447113a90b5b1366d4da171 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 240444 +timestamp: 1773114901155 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda +build_number: 5 +sha256: 700f3c03d0fba8e687a345404a45fbabe781c1cf92242382f62cef2948745ec4 +md5: 5afcea37a46f76ec1322943b3c4dfdc0 +depends: +- libopenblas >=0.3.30,<0.3.31.0a0 +- libopenblas >=0.3.30,<1.0a0 +constrains: +- mkl <2026 +- libcblas 3.11.0 5*_openblas +- liblapack 3.11.0 5*_openblas +- liblapacke 3.11.0 5*_openblas +- blas 2.305 openblas +license: BSD-3-Clause +license_family: BSD +size: 18369 +timestamp: 1765818610617 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda +build_number: 5 +sha256: 3fad5c9de161dccb4e42c8b1ae8eccb33f4ed56bccbcced9cbb0956ae7869e61 +md5: 0b2f1143ae2d0aa4c991959d0daaf256 +depends: +- libblas 3.11.0 5_haddc8a3_openblas +constrains: +- liblapack 3.11.0 5*_openblas +- liblapacke 3.11.0 5*_openblas +- blas 2.305 openblas +license: BSD-3-Clause +license_family: BSD +size: 18371 +timestamp: 1765818618899 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +sha256: 48814b73bd462da6eed2e697e30c060ae16af21e9fbed30d64feaf0aad9da392 +md5: a9138815598fe6b91a1d6782ca657b0c +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 71117 +timestamp: 1761979776756 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda +sha256: 995ce3ad96d0f4b5ed6296b051a0d7b6377718f325bc0e792fbb96b0e369dad7 +md5: 57f3b3da02a50a1be2a6fe847515417d +depends: +- libgcc >=14 +constrains: +- expat 2.7.4.* +license: MIT +license_family: MIT +size: 76564 +timestamp: 1771259530958 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 +md5: 2f364feefb6a7c00423e80dcb12db62a +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 55952 +timestamp: 1769456078358 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +sha256: 752e4f66283d7deb4c6fd47d88df644d8daa2aaa825a54f3bf350a625190192a +md5: a229e22d4d8814a07702b0919d8e6701 +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8125 +timestamp: 1774301094057 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +sha256: 8e6b27fe4eec4c2fa7b7769a21973734c8dba1de80086fb0213e58375ac09f4c +md5: b99ed99e42dafb27889483b3098cace7 +depends: +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 422941 +timestamp: 1774301093473 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda +sha256: 43df385bedc1cab11993c4369e1f3b04b4ca5d0ea16cba6a0e7f18dbc129fcc9 +md5: 552567ea2b61e3a3035759b2fdb3f9a6 +depends: +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_18 +- libgomp 15.2.0 h8acb6b2_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 622900 +timestamp: 1771378128706 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda +sha256: 83bb0415f59634dccfa8335d4163d1f6db00a27b36666736f9842b650b92cf2f +md5: 4feebd0fbf61075a1a9c2e9b3936c257 +depends: +- libgcc 15.2.0 h8acb6b2_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27568 +timestamp: 1771378136019 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda +sha256: 7dcd7dff2505d56fd5272a6e712ec912f50a46bf07dc6873a7e853694304e6e4 +md5: 41f261f5e4e2e8cbd236c2f1f15dae1b +depends: +- libgfortran5 15.2.0 h1b7bec0_18 +constrains: +- libgfortran-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27587 +timestamp: 1771378169244 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda +sha256: 85347670dfb4a8d4c13cd7cae54138dcf2b1606b6bede42eef5507bf5f9660c6 +md5: 574d88ce3348331e962cfa5ed451b247 +depends: +- libgcc >=15.2.0 +constrains: +- libgfortran 15.2.0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 1486341 +timestamp: 1771378148102 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda +sha256: fc716f11a6a8525e27a5d332ef6a689210b0d2a4dd1133edc0f530659aa9faa6 +md5: 4faa39bf919939602e594253bd673958 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 588060 +timestamp: 1771378040807 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda +sha256: 84064c7c53a64291a585d7215fe95ec42df74203a5bf7615d33d49a3b0f08bb6 +md5: 5109d7f837a3dfdf5c60f60e311b041f +depends: +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 691818 +timestamp: 1762094728337 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda +build_number: 5 +sha256: 692222d186d3ffbc99eaf04b5b20181fd26aee1edec1106435a0a755c57cce86 +md5: 88d1e4133d1182522b403e9ba7435f04 +depends: +- libblas 3.11.0 5_haddc8a3_openblas +constrains: +- liblapacke 3.11.0 5*_openblas +- blas 2.305 openblas +- libcblas 3.11.0 5*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18392 +timestamp: 1765818627104 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda +sha256: 843c46e20519651a3e357a8928352b16c5b94f4cd3d5481acc48be2e93e8f6a3 +md5: 96944e3c92386a12755b94619bae0b35 +depends: +- libgcc >=14 +constrains: +- xz 5.8.2.* +license: 0BSD +size: 125916 +timestamp: 1768754941722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda +sha256: 57c0dd12d506e84541c4e877898bd2a59cca141df493d34036f18b2751e0a453 +md5: 7b9813e885482e3ccb1fa212b86d7fd0 +depends: +- libgcc >=14 +license: BSD-2-Clause +license_family: BSD +size: 114056 +timestamp: 1769482343003 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda +sha256: 794a7270ea049ec931537874cd8d2de0ef4b3cef71c055cfd8b4be6d2f4228b0 +md5: 11d7d57b7bdd01da745bbf2b67020b2e +depends: +- libgcc >=14 +- libgfortran +- libgfortran5 >=14.3.0 +constrains: +- openblas >=0.3.30,<0.3.31.0a0 +license: BSD-3-Clause +license_family: BSD +size: 4959359 +timestamp: 1763114173544 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda +sha256: c7378c6b79de4d571d00ad1caf0a4c19d43c9c94077a761abb6ead44d891f907 +md5: be4088903b94ea297975689b3c3aeb27 +depends: +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: zlib-acknowledgement +size: 340156 +timestamp: 1770691477245 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda +sha256: 1ddaf91b44fae83856276f4cb7ce544ffe41d4b55c1e346b504c6b45f19098d6 +md5: 77891484f18eca74b8ad83694da9815e +depends: +- icu >=78.2,<79.0a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: blessing +size: 952296 +timestamp: 1772818881550 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda +sha256: 31fdb9ffafad106a213192d8319b9f810e05abca9c5436b60e507afb35a6bc40 +md5: f56573d05e3b735cb03efeb64a15f388 +depends: +- libgcc 15.2.0 h8acb6b2_18 +constrains: +- libstdcxx-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5541411 +timestamp: 1771378162499 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +sha256: 7ff79470db39e803e21b8185bc8f19c460666d5557b1378d1b1e857d929c6b39 +md5: 8c6fd84f9c87ac00636007c6131e457d +depends: +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 488407 +timestamp: 1762022048105 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda +sha256: c37a8e89b700646f3252608f8368e7eb8e2a44886b92776e57ad7601fc402a11 +md5: cf2861212053d05f27ec49c3784ff8bb +depends: +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 43453 +timestamp: 1766271546875 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +sha256: b03700a1f741554e8e5712f9b06dd67e76f5301292958cd3cb1ac8c6fdd9ed25 +md5: 24e92d0942c799db387f5c9d7b81f1af +depends: +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 359496 +timestamp: 1752160685488 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b +md5: cd14ee5cca2464a425b1dbfc24d90db2 +depends: +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 397493 +timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f +md5: 502006882cf5461adced436e410046d1 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 69833 +timestamp: 1774072605429 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b +md5: ba0a9221ce1063f31692c07370d062f3 +depends: +- importlib-metadata >=4.4 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 85893 +timestamp: 1770694658918 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda +sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e +md5: 5b5203189eb668f042ac2b0826244964 +depends: +- mdurl >=0.1,<1 +- python >=3.10 +license: MIT +license_family: MIT +size: 64736 +timestamp: 1754951288511 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda +sha256: 383c188496d13a55658c06e61e7d4cdff2c9f9d5a0648769fca8250bece7e0ef +md5: e5de3c36dd548b35ff2a8aa49208dcb3 +depends: +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- jinja2 >=3.0.0 +license: BSD-3-Clause +license_family: BSD +size: 27913 +timestamp: 1772446407659 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2 +sha256: 8fd4c79d6eda3d4cba73783114305a53a154ada4d1e334d4e02cb3521429599b +md5: 7b08314a6867a9d5648a1c3265e9eb8e +license: Apache-2.0 +license_family: Apache +size: 22257008 +timestamp: 1662784555011 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 +md5: 592132998493b3ff25fd7479396e8351 +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 14465 +timestamp: 1733255681319 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda +sha256: f005760b13093362fc9c997d603dd487de32ab2e821a3cbce52a42bcb8136517 +md5: 698a8a27c2b9d8a542c70cb47099a75e +depends: +- click +- coloredlogs +- humanize +- importlib-metadata +- jinja2 >=3.0.0 +- jsonschema +- markdown +- natsort +- numpy +- packaging +- pillow >=10.2.0 +- plotly >=5.18 +- polars-lts-cpu +- pyaml-env +- pydantic >=2.7.1 +- python >=3.8,!=3.14.1 +- python-dotenv +- python-kaleido 0.2.1 +- pyyaml >=4 +- requests +- rich >=10 +- rich-click +- spectra >=0.0.10 +- tiktoken +- tqdm +- typeguard +license: GPL-3.0-or-later +license_family: GPL3 +size: 4198799 +timestamp: 1765300743879 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda +sha256: 541fd4390a0687228b8578247f1536a821d9261389a65585af9d1a6f2a14e1e0 +md5: 30bec5e8f4c3969e2b1bd407c5e52afb +depends: +- python >=3.10 +- python +license: MIT +size: 280459 +timestamp: 1774380620329 +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 +md5: e941e85e273121222580723010bd4fa2 +depends: +- python >=3.9 +- python +license: MIT +license_family: MIT +size: 39262 +timestamp: 1770905275632 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda +sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 +md5: 182afabe009dc78d8b73100255ee6868 +depends: +- libgcc >=13 +license: X11 AND BSD-3-Clause +size: 926034 +timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 +md5: a2c1eeadae7a309daed9d62c96012a2b +depends: +- python >=3.11 +- python +constrains: +- numpy >=1.25 +- scipy >=1.11.2 +- matplotlib-base >=3.8 +- pandas >=2.0 +license: BSD-3-Clause +license_family: BSD +size: 1587439 +timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda +sha256: 78a06e89285fef242e272998b292c1e621e3ee3dd4fba62ec014e503c7ec118f +md5: 6dd4f07147774bf720075a210f8026b9 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: MPL-2.0 +license_family: MOZILLA +size: 235140 +timestamp: 1762350120355 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda +sha256: 48942696889367ffd448f8dccfc080fb7e130b9938a4a3b6b20ef8e6af856463 +md5: 4540f9570d12db2150f42ba036154552 +depends: +- libgcc >=14 +- libsqlite >=3.51.0,<4.0a0 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +- nspr >=4.38,<5.0a0 +license: MPL-2.0 +license_family: MOZILLA +size: 2061869 +timestamp: 1763490303490 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py314haac167e_0.conda +sha256: a6d42fd88afc57c3b0a57b21a12eff7492dfc419bb61ee3f74e9ba6261dabc88 +md5: 25d896c331481145720a21e5145fad65 +depends: +- python +- libgcc >=14 +- python 3.14.* *_cp314 +- libstdcxx >=14 +- libcblas >=3.9.0,<4.0a0 +- liblapack >=3.9.0,<4.0a0 +- python_abi 3.14.* *_cp314 +- libblas >=3.9.0,<4.0a0 +constrains: +- numpy-base <0a0 +license: BSD-3-Clause +license_family: BSD +size: 8008045 +timestamp: 1773839355275 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda +sha256: bd1bc8bdde5e6c5cbac42d462b939694e40b59be6d0698f668515908640c77b8 +md5: cea962410e327262346d48d01f05936c +depends: +- libgcc >=14 +- libpng >=1.6.50,<1.7.0a0 +- libstdcxx >=14 +- libtiff >=4.7.1,<4.8.0a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-2-Clause +license_family: BSD +size: 392636 +timestamp: 1758489353577 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda +sha256: 7f8048c0e75b2620254218d72b4ae7f14136f1981c5eb555ef61645a9344505f +md5: 25f5885f11e8b1f075bccf4a2da91c60 +depends: +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3692030 +timestamp: 1769557678657 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda +sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 +md5: b76541e68fea4d511b1ac46a28dcd2c6 +depends: +- python >=3.8 +- python +license: Apache-2.0 +license_family: APACHE +size: 72010 +timestamp: 1769093650580 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.1.1-py314hac3e5ec_0.conda +sha256: 1ca2d1616baad9bccb7ebc425ef2dcd6cebe742fbe91edf226fb606ad371ca0f +md5: d3c959c7efe560b2d7da459d69121fe9 +depends: +- python +- python 3.14.* *_cp314 +- libgcc >=14 +- zlib-ng >=2.3.3,<2.4.0a0 +- libwebp-base >=1.6.0,<2.0a0 +- tk >=8.6.13,<8.7.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libtiff >=4.7.1,<4.8.0a0 +- lcms2 >=2.18,<3.0a0 +- python_abi 3.14.* *_cp314 +- openjpeg >=2.5.4,<3.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libxcb >=1.17.0,<2.0a0 +license: HPND +size: 1051828 +timestamp: 1770794010335 +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 +md5: 3e9427ee186846052e81fadde8ebe96a +depends: +- narwhals >=1.15.1 +- packaging +- python >=3.10 +constrains: +- ipywidgets >=7.6 +license: MIT +license_family: MIT +size: 5251872 +timestamp: 1772628857717 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.39.3-pyh58ad624_1.conda +sha256: d332c2d5002fc440ae37ed9679ffc21b552f18d20232390005d1dd3bce0888d3 +md5: d5a4e013a30dd8dfde9ab39f45aaf9c1 +depends: +- polars-runtime-32 ==1.39.3 +- python >=3.10 +- python +constrains: +- numpy >=1.16.0 +- pyarrow >=7.0.0 +- fastexcel >=0.9 +- openpyxl >=3.0.0 +- xlsx2csv >=0.8.0 +- connectorx >=0.3.2 +- deltalake >=1.0.0 +- pyiceberg >=0.7.1 +- altair >=5.4.0 +- great_tables >=0.8.0 +- polars-runtime-32 ==1.39.3 +- polars-runtime-64 ==1.39.3 +- polars-runtime-compat ==1.39.3 +license: MIT +license_family: MIT +size: 533495 +timestamp: 1774207987966 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda +sha256: e466fb31f67ba9bde18deafeb34263ca5eb25807f39ead0e9d753a8e82c4c4f4 +md5: ef0340e75068ac8ff96462749b5c98e7 +depends: +- polars >=1.34.0 +- polars-runtime-compat >=1.34.0 +license: MIT +license_family: MIT +size: 3902 +timestamp: 1760206808444 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.39.3-py310hff09b76_1.conda +noarch: python +sha256: c070be507c5a90df397a47ae0299660be437d5546d68f1bc0fa4402c9f07d59e +md5: 3c1a7c6b4ba8b9fb773ace9723f8a5db +depends: +- python +- libgcc >=14 +- libstdcxx >=14 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 34785466 +timestamp: 1774207998285 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.39.3-py310hf00a4a2_1.conda +noarch: python +sha256: 683315f1a49e47ce72bf9462419733b40b588b2b3106552d95fd4cd994e174de +md5: dd3464e2132dc3a783e76e5078870c76 +depends: +- python +- libgcc >=14 +- libstdcxx >=14 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 34652491 +timestamp: 1774207996879 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +sha256: e9cbcbc94e151ada3d6dc365380aaaf591f65012c16d9a2abaea4b9b90adc402 +md5: ab7288cc39545556d1bc5e71ab2df9a9 +depends: +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 636733 +timestamp: 1769712412683 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba +md5: bb5a90c93e3bac3d5690acf76b4a6386 +depends: +- libgcc >=13 +license: MIT +license_family: MIT +size: 8342 +timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +sha256: 58994e0d2ea8584cb399546e6f6896d771995e6121d1a7b6a2c9948388358932 +md5: e17be1016bcc3516827b836cd3e4d9dc +depends: +- python >=3.9 +- pyyaml >=5.0,<=7.0 +license: MIT +license_family: MIT +size: 14645 +timestamp: 1736766960536 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda +sha256: 868569d9505b7fe246c880c11e2c44924d7613a8cdcc1f6ef85d5375e892f13d +md5: c3946ed24acdb28db1b5d63321dbca7d +depends: +- typing-inspection >=0.4.2 +- typing_extensions >=4.14.1 +- python >=3.10 +- typing-extensions >=4.6.1 +- annotated-types >=0.6.0 +- pydantic-core ==2.41.5 +- python +license: MIT +license_family: MIT +size: 340482 +timestamp: 1764434463101 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.5-py314h451b6cc_1.conda +sha256: f8acb2d03ebe80fed0032b9a989fc9acfb6735e3cd3f8c704b72728cb31868f6 +md5: 28f5027a1e04d67aa13fac1c5ba79693 +depends: +- python +- typing-extensions >=4.6.0,!=4.7.0 +- libgcc >=14 +- python 3.14.* *_cp314 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 1828339 +timestamp: 1762989038561 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda +sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a +md5: 6b6ece66ebcae2d5f326c77ef2c5a066 +depends: +- python >=3.9 +license: BSD-2-Clause +license_family: BSD +size: 889287 +timestamp: 1750615908735 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 +md5: 461219d1a5bd61342293efa2c0c90eac +depends: +- __unix +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 21085 +timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.3-hb06a95a_101_cp314.conda +build_number: 101 +sha256: 87e9dff5646aba87cecfbc08789634c855871a7325169299d749040b0923a356 +md5: 205011b36899ff0edf41b3db0eda5a44 +depends: +- bzip2 >=1.0.8,<2.0a0 +- ld_impl_linux-aarch64 >=2.36.1 +- libexpat >=2.7.3,<3.0a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- liblzma >=5.8.2,<6.0a0 +- libmpdec >=4.0.0,<5.0a0 +- libsqlite >=3.51.2,<4.0a0 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +- ncurses >=6.5,<7.0a0 +- openssl >=3.5.5,<4.0a0 +- python_abi 3.14.* *_cp314 +- readline >=8.3,<9.0a0 +- tk >=8.6.13,<8.7.0a0 +- tzdata +- zstd >=1.5.7,<1.6.0a0 +license: Python-2.0 +size: 37305578 +timestamp: 1770674395875 +python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 +md5: 130584ad9f3a513cdd71b1fdc1244e9c +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 27848 +timestamp: 1772388605021 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda +sha256: 233aebd94c704ac112afefbb29cf4170b7bc606e22958906f2672081bc50638a +md5: 235765e4ea0d0301c75965985163b5a1 +depends: +- cpython 3.14.3.* +- python_abi * *_cp314 +license: Python-2.0 +size: 50062 +timestamp: 1770674497152 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 +sha256: e17bf63a30aec33432f1ead86e15e9febde9fc40a7f869c0e766be8d2db44170 +md5: 310259a5b03ff02289d7705f39e2b1d2 +depends: +- kaleido-core 0.2.1.* +- python >=3.5 +license: MIT +license_family: MIT +size: 18320 +timestamp: 1615204747600 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +build_number: 8 +sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 +md5: 0539938c55b6b1a59b560e843ad864a4 +constrains: +- python 3.14.* *_cp314 +license: BSD-3-Clause +license_family: BSD +size: 6989 +timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda +sha256: 496b5e65dfdd0aaaaa5de0dcaaf3bceea00fcb4398acf152f89e567c82ec1046 +md5: 9ae2c92975118058bd720e9ba2bb7c58 +depends: +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python >=3.14,<3.15.0a0 *_cp314 +- python_abi 3.14.* *_cp314 +- yaml >=0.2.5,<0.3.0a0 +license: MIT +license_family: MIT +size: 195678 +timestamp: 1770223441816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda +sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216 +md5: 3d49cad61f829f4f0e0611547a9cda12 +depends: +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-3.0-only +license_family: GPL +size: 357597 +timestamp: 1765815673644 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 +md5: 870293df500ca7e18bedefa5838a22ab +depends: +- attrs >=22.2.0 +- python >=3.10 +- rpds-py >=0.7.0 +- typing_extensions >=4.4.0 +- python +license: MIT +license_family: MIT +size: 51788 +timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.2.28-py314h51f160d_0.conda +sha256: 2080ecea825e1ef91a2422cc0bc63e85db9e38908ed17657fb8f41de7a6eee71 +md5: 818aa2c9f6b3c808da5e7be22a9a424c +depends: +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python >=3.14,<3.15.0a0 *_cp314 +- python_abi 3.14.* *_cp314 +license: Apache-2.0 AND CNRI-Python +license_family: PSF +size: 408097 +timestamp: 1772255205521 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda +sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 +md5: c65df89a0b2e321045a9e01d1337b182 +depends: +- python >=3.10 +- certifi >=2017.4.17 +- charset-normalizer >=2,<4 +- idna >=2.5,<4 +- urllib3 >=1.21.1,<3 +- python +constrains: +- chardet >=3.0.2,<6 +license: Apache-2.0 +license_family: APACHE +size: 63602 +timestamp: 1766926974520 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda +sha256: b06ce84d6a10c266811a7d3adbfa1c11f13393b91cc6f8a5b468277d90be9590 +md5: 7a6289c50631d620652f5045a63eb573 +depends: +- markdown-it-py >=2.2.0 +- pygments >=2.13.0,<3.0.0 +- python >=3.10 +- typing_extensions >=4.0.0,<5.0.0 +- python +license: MIT +license_family: MIT +size: 208472 +timestamp: 1771572730357 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 +md5: 0c20a8ebcddb24a45da89d5e917e6cb9 +depends: +- python >=3.10 +- rich >=12 +- click >=8 +- typing-extensions >=4 +- __unix +- python +license: MIT +license_family: MIT +size: 64356 +timestamp: 1769850479089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda +sha256: a587240f16eac7c6a80f9585cef679cd1cb9a287b8dfcdd36dcef1f7e7db15dc +md5: e7f6ed9e60043bb5cbcc527764897f0d +depends: +- python +- libgcc >=14 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 376332 +timestamp: 1764543345455 +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +sha256: 7c65782d2511738e62c70462e89d65da4fa54d5a7e47c46667bcd27a59f81876 +md5: 472239e4eb7b5a84bb96b3ed7e3a596a +depends: +- colormath >=3.0.0 +- python >=3.9 +license: MIT +license_family: MIT +size: 22284 +timestamp: 1735770589188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.52.0-hf1c7be2_0.conda +sha256: 4f8523f5341f0d9e1547085206c6c1f71f9fc7c277443ca363a8cf98add8fc01 +md5: d9634079df93a65ee045b3c75f35cae1 +depends: +- icu >=78.2,<79.0a0 +- libgcc >=14 +- libsqlite 3.52.0 h10b116e_0 +- libzlib >=1.3.1,<2.0a0 +- ncurses >=6.5,<7.0a0 +- readline >=8.3,<9.0a0 +license: blessing +size: 209416 +timestamp: 1772818891689 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda +sha256: c1da41c79262b27efa168407cfecc47b20270e5fc071a8307f95a2c85fb94170 +md5: 55bf7b559202236157b14323b40f19e6 +depends: +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- regex >=2022.1.18 +- requests >=2.26.0 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 914402 +timestamp: 1764030357702 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda +sha256: e25c314b52764219f842b41aea2c98a059f06437392268f09b03561e4f6e5309 +md5: 7fc6affb9b01e567d2ef1d05b84aa6ed +depends: +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +constrains: +- xorg-libx11 >=1.8.12,<2.0a0 +license: TCL +license_family: BSD +size: 3368666 +timestamp: 1769464148928 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 +md5: e5ce43272193b38c2e9037446c1d9206 +depends: +- python >=3.10 +- __unix +- python +license: MPL-2.0 and MIT +size: 94132 +timestamp: 1770153424136 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda +sha256: 39d8ae33c43cdb8f771373e149b0b4fae5a08960ac58dcca95b2f1642bb17448 +md5: 260af1b0a94f719de76b4e14094e9a3b +depends: +- importlib-metadata >=3.6 +- python >=3.10 +- typing-extensions >=4.10.0 +- typing_extensions >=4.14.0 +constrains: +- pytest >=7 +license: MIT +license_family: MIT +size: 36838 +timestamp: 1771532971545 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c +md5: edd329d7d3a4ab45dcf905899a7a6115 +depends: +- typing_extensions ==4.15.0 pyhcf101f3_0 +license: PSF-2.0 +license_family: PSF +size: 91383 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda +sha256: 70db27de58a97aeb7ba7448366c9853f91b21137492e0b4430251a1870aa8ff4 +md5: a0a4a3035667fc34f29bfbd5c190baa6 +depends: +- python >=3.10 +- typing_extensions >=4.12.0 +license: MIT +license_family: MIT +size: 18923 +timestamp: 1764158430324 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 +md5: 0caa1af407ecff61170c9437a808404d +depends: +- python >=3.10 +- python +license: PSF-2.0 +license_family: PSF +size: 51692 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c +md5: ad659d0a2b3e47e38d829aa8cad2d610 +license: LicenseRef-Public-Domain +size: 119135 +timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda +sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a +md5: 9272daa869e03efe68833e3dc7a02130 +depends: +- backports.zstd >=1.0.0 +- brotli-python >=1.2.0 +- h2 >=4,<5 +- pysocks >=1.5.6,<2.0,!=1.5.7 +- python >=3.10 +license: MIT +license_family: MIT +size: 103172 +timestamp: 1767817860341 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +sha256: e9f6e931feeb2f40e1fdbafe41d3b665f1ab6cb39c5880a1fcf9f79a3f3c84a5 +md5: 1c246e1105000c3660558459e2fd6d43 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 16317 +timestamp: 1762977521691 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +sha256: 128d72f36bcc8d2b4cdbec07507542e437c7d67f677b7d77b71ed9eeac7d6df1 +md5: bff06dcde4a707339d66d45d96ceb2e2 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 21039 +timestamp: 1762979038025 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda +sha256: 66265e943f32ce02396ad214e27cb35f5b0490b3bd4f064446390f9d67fa5d88 +md5: 032d8030e4a24fe1f72c74423a46fb88 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 88088 +timestamp: 1753484092643 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda +sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae +md5: 30cd29cb87d819caead4d55184c1d115 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 24194 +timestamp: 1764460141901 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda +sha256: 638a3a41a4fbfed52d3c60c8ef5a3693b3f12a5b1a3f58fa29f5698d0a0702e2 +md5: f731af71c723065d91b4c01bb822641b +depends: +- libgcc >=14 +- libstdcxx >=14 +license: Zlib +license_family: Other +size: 121046 +timestamp: 1770167944449 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 +md5: c3655f82dcea2aa179b291e7099c1fcc +depends: +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 614429 +timestamp: 1764777145593 diff --git a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt new file mode 100644 index 0000000..f787dbe --- /dev/null +++ b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt @@ -0,0 +1,125 @@ + +# This file may be used to create an environment using: +# $ conda create --name --file +# platform: linux-aarch64 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda#4faa39bf919939602e594253bd673958 +https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda#468fd3bb9e1f671d36c2cbc677e56f1d +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda#552567ea2b61e3a3035759b2fdb3f9a6 +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda#840d8fc0d7b3209be93080bc20e07f2d +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda#502006882cf5461adced436e410046d1 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda#c3655f82dcea2aa179b291e7099c1fcc +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda#a21644fc4a83da26452a718dc9468d5f +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda#05d1e0b30acd816a192c03dc6e164f4d +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda#2f364feefb6a7c00423e80dcb12db62a +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda#76298a9e6d71ee6e832a8d0d7373b261 +https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda#7b9813e885482e3ccb1fa212b86d7fd0 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.0-h022381a_0.conda#86db4036fd08bf34e991bf48a8af405d +https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda#a0b5de740d01c390bdbb46d7503c9fab +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda#3b129669089e4d6a5c6871dbb4669b99 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda#3d49cad61f829f4f0e0611547a9cda12 +https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda#7fc6affb9b01e567d2ef1d05b84aa6ed +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.4-hfd9ac0a_100_cp314.conda#3cfbe780f0f51cc8cba41db9f8a28bfe +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda#f111d4cfaf1fe9496f386bc98ae94452 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 +https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda#f56573d05e3b735cb03efeb64a15f388 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda#a1b5c571a0923a205d663d8678df4792 +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c +https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda#7fe569c10905402ed47024fc481bb371 +https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda#b866ff7007b934d564961066c8195983 +https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda#a2c1eeadae7a309daed9d62c96012a2b +https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda#574d88ce3348331e962cfa5ed451b247 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda#41f261f5e4e2e8cbd236c2f1f15dae1b +https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.32-pthreads_h9d3fd7e_0.conda#5d2ce5cf40443d055ec6d33840192265 +https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-6_haddc8a3_openblas.conda#652bb20bb4618cacd11e17ae070f47ce +https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-6_hd72aa62_openblas.conda#939e300b110db241a96a1bed438c315b +https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-6_h88aeb00_openblas.conda#e23a27b52fb320687239e2c5ae4d7540 +https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py314haac167e_0.conda#25d896c331481145720a21e5145fad65 +https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda#071cf7b0ce333c81718b054066c15102 +https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.5-hfae3067_0.conda#d2bb0c889d94f2fdc5856392c3002976 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda#f51503ac45a4888bce71af9027a2ecc9 +https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda#b99ed99e42dafb27889483b3098cace7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda#a229e22d4d8814a07702b0919d8e6701 +https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda#0fed1ff55f4938a65907f3ecf62609db +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda#a7970cd949a077b7cb9696379d338681 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 +https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e +https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda#e5de3c36dd548b35ff2a8aa49208dcb3 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda#e7f6ed9e60043bb5cbcc527764897f0d +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda#ada41c863af263cc4c5fcbaff7c3e4dc +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda#4feebd0fbf61075a1a9c2e9b3936c257 +https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2#7b08314a6867a9d5648a1c3265e9eb8e +https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda#6dd4f07147774bf720075a210f8026b9 +https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda#4540f9570d12db2150f42ba036154552 +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.0-he8854b5_0.conda#ad8164bdeece883b825c50639c0c4725 +https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2#4f0d284f5d11e04277b552eb1c172c7f +https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda#a85ba48648f6868016f2741fd9170250 +https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda#d13423b06447113a90b5b1366d4da171 +https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda#a9138815598fe6b91a1d6782ca657b0c +https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda#24e92d0942c799db387f5c9d7b81f1af +https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda#8c6fd84f9c87ac00636007c6131e457d +https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda#bb960f01525b5e001608afef9d47b79c +https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda#bb5a90c93e3bac3d5690acf76b4a6386 +https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda#1c246e1105000c3660558459e2fd6d43 +https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda#bff06dcde4a707339d66d45d96ceb2e2 +https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda#cd14ee5cca2464a425b1dbfc24d90db2 +https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda#ba0a9221ce1063f31692c07370d062f3 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 +https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda#e941e85e273121222580723010bd4fa2 +https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 +https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda#cea962410e327262346d48d01f05936c +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda#f731af71c723065d91b4c01bb822641b +https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.2.0-py314hac3e5ec_0.conda#87d58d103b47c4a8567b3d7666647684 +https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda#6cac1a50359219d786453c6fef819f98 +https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda#3e9427ee186846052e81fadde8ebe96a +https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.40.0-py310hff09b76_0.conda#d5628a33ce7652511e38fc98643dc910 +https://conda.anaconda.org/conda-forge/noarch/polars-1.40.0-pyh58ad624_0.conda#fd16be490f5403adfbf27dd4901bbe34 +https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.40.0-py310hf00a4a2_0.conda#a82af0fcbb72db253dc89a7a45279372 +https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda#ef0340e75068ac8ff96462749b5c98e7 +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda#9ae2c92975118058bd720e9ba2bb7c58 +https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda#e17be1016bcc3516827b836cd3e4d9dc +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.46.3-py314h451b6cc_0.conda#1a2cb55be9a153ad6203bff6b787c240 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda#a0a4a3035667fc34f29bfbd5c190baa6 +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda#f690e6f204efd2e5c06b57518a383d98 +https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda#130584ad9f3a513cdd71b1fdc1244e9c +https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2#310259a5b03ff02289d7705f39e2b1d2 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 +https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 +https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda#0242025a3c804966bf71aa04eee82f66 +https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda#0c20a8ebcddb24a45da89d5e917e6cb9 +https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda#472239e4eb7b5a84bb96b3ed7e3a596a +https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.4.4-py314h51f160d_0.conda#88a3dbd279e6b1faf0cddb8397866864 +https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda#55bf7b559202236157b14323b40f19e6 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda#e5ce43272193b38c2e9037446c1d9206 +https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda#260af1b0a94f719de76b4e14094e9a3b +https://conda.anaconda.org/bioconda/noarch/multiqc-1.34-pyhdfd78af_0.conda#a7111ab9a6a6146b40cbce16655ac873 +https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f +https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda#ab7288cc39545556d1bc5e71ab2df9a9 diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml new file mode 100644 index 0000000..37e7612 --- /dev/null +++ b/modules/nf-core/multiqc/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::multiqc=1.34 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf new file mode 100644 index 0000000..e80e8cd --- /dev/null +++ b/modules/nf-core/multiqc/main.nf @@ -0,0 +1,50 @@ +process MULTIQC { + tag "${meta.id}" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/1b/1bef8af6be88c5733461959c46ac8ef73d18f65277f62a1695d0e1633054f9c2/data' + : 'community.wave.seqera.io/library/multiqc:1.34--db7c73dae76bc9e6'}" + + input: + tuple val(meta), path(multiqc_files, stageAs: "?/*"), path(multiqc_config, stageAs: "?/*"), path(multiqc_logo), path(replace_names), path(sample_names) + + output: + tuple val(meta), path("*.html"), emit: report + tuple val(meta), path("*_data"), emit: data + tuple val(meta), path("*_plots"), emit: plots, optional: true + // MultiQC should not push its versions to the `versions` topic. Its input depends on the versions topic to be resolved thus outputting to the topic will let the pipeline hang forever + tuple val("${task.process}"), val('multiqc'), eval('multiqc --version | sed "s/.* //g"'), emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : '' + def config = multiqc_config ? multiqc_config instanceof List ? "--config ${multiqc_config.join(' --config ')}" : "--config ${multiqc_config}" : "" + def logo = multiqc_logo ? "--cl-config 'custom_logo: \"${multiqc_logo}\"'" : '' + def replace = replace_names ? "--replace-names ${replace_names}" : '' + def samples = sample_names ? "--sample-names ${sample_names}" : '' + """ + multiqc \\ + --force \\ + ${args} \\ + ${config} \\ + ${prefix} \\ + ${logo} \\ + ${replace} \\ + ${samples} \\ + . + """ + + stub: + """ + mkdir multiqc_data + touch multiqc_data/.stub + mkdir multiqc_plots + touch multiqc_plots/.stub + touch multiqc_report.html + """ +} diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml new file mode 100644 index 0000000..2facc62 --- /dev/null +++ b/modules/nf-core/multiqc/meta.yml @@ -0,0 +1,133 @@ +name: multiqc +description: Aggregate results from bioinformatics analyses across many samples + into a single report +keywords: + - QC + - bioinformatics tools + - Beautiful stand-alone HTML report +tools: + - multiqc: + description: | + MultiQC searches a given directory for analysis logs and compiles a HTML report. + It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. + homepage: https://multiqc.info/ + documentation: https://multiqc.info/docs/ + licence: + - "GPL-3.0-or-later" + identifier: biotools:multiqc +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + ontologies: [] + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + ontologies: [] + - replace_names: + type: file + description: | + Optional two-column sample renaming file. First column a set of + patterns, second column a set of corresponding replacements. Passed via + MultiQC's `--replace-names` option. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 + - sample_names: + type: file + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 +output: + report: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - "*.html": + type: file + description: MultiQC report file + pattern: ".html" + ontologies: [] + data: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + plots: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - "*_plots": + type: file + description: Plots created by MultiQC + pattern: "*_plots" + ontologies: [] + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - multiqc: + type: string + description: The tool name + - multiqc --version | sed "s/.* //g": + type: eval + description: The expression to obtain the version of the tool +authors: + - "@abhi18av" + - "@bunop" + - "@drpatelh" + - "@jfy133" +maintainers: + - "@abhi18av" + - "@bunop" + - "@drpatelh" + - "@jfy133" +containers: + conda: + linux/amd64: + lock_file: modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt + linux/arm64: + lock_file: modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt + docker: + linux/amd64: + name: community.wave.seqera.io/library/multiqc:1.34--db7c73dae76bc9e6 + build_id: bd-db7c73dae76bc9e6_1 + scan_id: sc-66fc7138dbf1cf48_1 + linux/arm64: + name: community.wave.seqera.io/library/multiqc:1.34--d167b8012595a136 + build_id: bd-d167b8012595a136_1 + scan_id: sc-ac701dfa631a2af9_1 + singularity: + linux/amd64: + name: oras://community.wave.seqera.io/library/multiqc:1.34--4fc8657c816047c0 + build_id: bd-4fc8657c816047c0_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/1b/1bef8af6be88c5733461959c46ac8ef73d18f65277f62a1695d0e1633054f9c2/data + linux/arm64: + name: oras://community.wave.seqera.io/library/multiqc:1.34--7fbd82d945c06726 + build_id: bd-7fbd82d945c06726_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9a/9a1fec9662a152683e6fcae440d0ce20920b3b89dc62d1e3a52e73f92eba0969/data diff --git a/modules/nf-core/multiqc/tests/custom_prefix.config b/modules/nf-core/multiqc/tests/custom_prefix.config new file mode 100644 index 0000000..b30b135 --- /dev/null +++ b/modules/nf-core/multiqc/tests/custom_prefix.config @@ -0,0 +1,5 @@ +process { + withName: 'MULTIQC' { + ext.prefix = "custom_prefix" + } +} diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test new file mode 100644 index 0000000..4cbdb95 --- /dev/null +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -0,0 +1,211 @@ +nextflow_process { + + name "Test Process MULTIQC" + script "../main.nf" + process "MULTIQC" + + tag "modules" + tag "modules_nfcore" + tag "multiqc" + + config "./nextflow.config" + + test("sarscov2 single-end [fastqc]") { + + when { + process { + """ + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [], + [], + [], + [] + ]) + """ + } + } + + then { + assert process.success + assert snapshot( + sanitizeOutput(process.out).collectEntries { key, val -> + if (key == "data") { + return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] + } + else if (key == "plots") { + return [key, val.collect { [ + "pdf", + path("${it[1]}/pdf").list().collect { file(it.toString()).name }, + "png", + path("${it[1]}/png").list().collect { file(it.toString()).name }, + "svg", + path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] + } + else if (key == "report") { + return [key, file(val[0][1].toString()).name] + } + return [key, val] + } + ).match() + } + } + + test("sarscov2 single-end [fastqc] - custom prefix") { + config "./custom_prefix.config" + + when { + process { + """ + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [], + [], + [], + [] + ]) + """ + } + } + + then { + assert process.success + assert snapshot( + sanitizeOutput(process.out).collectEntries { key, val -> + if (key == "data") { + return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] + } + else if (key == "plots") { + return [key, val.collect { [ + "pdf", + path("${it[1]}/pdf").list().collect { file(it.toString()).name }, + "png", + path("${it[1]}/png").list().collect { file(it.toString()).name }, + "svg", + path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] + } + else if (key == "report") { + return [key, file(val[0][1].toString()).name] + } + return [key, val] + } + ).match() + } + } + + test("sarscov2 single-end [fastqc] [config]") { + + when { + process { + """ + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + file("https://raw.githubusercontent.com/nf-core/seqinspector/1.0.0/assets/multiqc_config.yml", checkIfExists: true), + [], + [], + [] + ]) + """ + } + } + + then { + assert process.success + assert snapshot( + sanitizeOutput(process.out).collectEntries { key, val -> + if (key == "data") { + return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] + } + else if (key == "plots") { + return [key, val.collect { [ + "pdf", + path("${it[1]}/pdf").list().collect { file(it.toString()).name }, + "png", + path("${it[1]}/png").list().collect { file(it.toString()).name }, + "svg", + path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] + } + else if (key == "report") { + return [key, file(val[0][1].toString()).name] + } + return [key, val] + } + ).match() + } + } + + test("sarscov2 single-end [fastqc] [multiple configs]") { + + when { + process { + """ + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [ + file("https://raw.githubusercontent.com/nf-core/seqinspector/1.0.0/assets/multiqc_config.yml", checkIfExists: true), + file("https://raw.githubusercontent.com/nf-core/seqinspector/1.0.0/assets/multiqc_config.yml", checkIfExists: true) + ], + [], + [], + [] + ]) + """ + } + } + + then { + assert process.success + assert snapshot( + sanitizeOutput(process.out).collectEntries { key, val -> + if (key == "data") { + return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] + } + else if (key == "plots") { + return [key, val.collect { [ + "pdf", + path("${it[1]}/pdf").list().collect { file(it.toString()).name }, + "png", + path("${it[1]}/png").list().collect { file(it.toString()).name }, + "svg", + path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] + } + else if (key == "report") { + return [key, file(val[0][1].toString()).name] + } + return [key, val] + } + ).match() + } + } + + test("sarscov2 single-end [fastqc] - stub") { + + options "-stub" + + when { + process { + """ + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [], + [], + [], + [] + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + } +} diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap new file mode 100644 index 0000000..7c2f370 --- /dev/null +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -0,0 +1,422 @@ +{ + "sarscov2 single-end [fastqc] [multiple configs]": { + "content": [ + { + "data": [ + [ + [ + "fastqc-status-check-heatmap.txt", + "fastqc_overrepresented_sequences_plot.txt", + "fastqc_per_base_n_content_plot.txt", + "fastqc_per_base_sequence_quality_plot.txt", + "fastqc_per_sequence_gc_content_plot_Counts.txt", + "fastqc_per_sequence_gc_content_plot_Percentages.txt", + "fastqc_per_sequence_quality_scores_plot.txt", + "fastqc_sequence_counts_plot.txt", + "fastqc_sequence_duplication_levels_plot.txt", + "fastqc_sequence_length_distribution_plot.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "llms-full.txt", + "multiqc.log", + "multiqc.parquet", + "multiqc_citations.txt", + "multiqc_data.json", + "multiqc_fastqc.txt", + "multiqc_general_stats.txt", + "multiqc_sources.txt" + ] + ] + ], + "plots": [ + [ + "pdf", + [ + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf" + ], + "png", + [ + "fastqc-status-check-heatmap.png", + "fastqc_overrepresented_sequences_plot.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_per_sequence_gc_content_plot_Counts.png", + "fastqc_per_sequence_gc_content_plot_Percentages.png", + "fastqc_per_sequence_quality_scores_plot.png", + "fastqc_sequence_counts_plot-cnt.png", + "fastqc_sequence_counts_plot-pct.png", + "fastqc_sequence_duplication_levels_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png" + ], + "svg", + [ + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg" + ] + ] + ], + "report": "multiqc_report.html", + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.34" + ] + ] + } + ], + "timestamp": "2026-03-17T16:15:42.577775492", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 single-end [fastqc]": { + "content": [ + { + "data": [ + [ + [ + "fastqc-status-check-heatmap.txt", + "fastqc_overrepresented_sequences_plot.txt", + "fastqc_per_base_n_content_plot.txt", + "fastqc_per_base_sequence_quality_plot.txt", + "fastqc_per_sequence_gc_content_plot_Counts.txt", + "fastqc_per_sequence_gc_content_plot_Percentages.txt", + "fastqc_per_sequence_quality_scores_plot.txt", + "fastqc_sequence_counts_plot.txt", + "fastqc_sequence_duplication_levels_plot.txt", + "fastqc_sequence_length_distribution_plot.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "llms-full.txt", + "multiqc.log", + "multiqc.parquet", + "multiqc_citations.txt", + "multiqc_data.json", + "multiqc_fastqc.txt", + "multiqc_general_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt" + ] + ] + ], + "plots": [ + [ + "pdf", + [ + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf" + ], + "png", + [ + "fastqc-status-check-heatmap.png", + "fastqc_overrepresented_sequences_plot.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_per_sequence_gc_content_plot_Counts.png", + "fastqc_per_sequence_gc_content_plot_Percentages.png", + "fastqc_per_sequence_quality_scores_plot.png", + "fastqc_sequence_counts_plot-cnt.png", + "fastqc_sequence_counts_plot-pct.png", + "fastqc_sequence_duplication_levels_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png" + ], + "svg", + [ + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg" + ] + ] + ], + "report": "multiqc_report.html", + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.34" + ] + ] + } + ], + "timestamp": "2026-03-17T16:21:17.072841555", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 single-end [fastqc] - stub": { + "content": [ + { + "data": [ + [ + { + "id": "FASTQC" + }, + [ + ".stub:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "plots": [ + [ + { + "id": "FASTQC" + }, + [ + ".stub:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "report": [ + [ + { + "id": "FASTQC" + }, + "multiqc_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.34" + ] + ] + } + ], + "timestamp": "2026-02-26T15:14:39.789193051", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 single-end [fastqc] [config]": { + "content": [ + { + "data": [ + [ + [ + "fastqc-status-check-heatmap.txt", + "fastqc_overrepresented_sequences_plot.txt", + "fastqc_per_base_n_content_plot.txt", + "fastqc_per_base_sequence_quality_plot.txt", + "fastqc_per_sequence_gc_content_plot_Counts.txt", + "fastqc_per_sequence_gc_content_plot_Percentages.txt", + "fastqc_per_sequence_quality_scores_plot.txt", + "fastqc_sequence_counts_plot.txt", + "fastqc_sequence_duplication_levels_plot.txt", + "fastqc_sequence_length_distribution_plot.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "llms-full.txt", + "multiqc.log", + "multiqc.parquet", + "multiqc_citations.txt", + "multiqc_data.json", + "multiqc_fastqc.txt", + "multiqc_general_stats.txt", + "multiqc_sources.txt" + ] + ] + ], + "plots": [ + [ + "pdf", + [ + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf" + ], + "png", + [ + "fastqc-status-check-heatmap.png", + "fastqc_overrepresented_sequences_plot.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_per_sequence_gc_content_plot_Counts.png", + "fastqc_per_sequence_gc_content_plot_Percentages.png", + "fastqc_per_sequence_quality_scores_plot.png", + "fastqc_sequence_counts_plot-cnt.png", + "fastqc_sequence_counts_plot-pct.png", + "fastqc_sequence_duplication_levels_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png" + ], + "svg", + [ + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg" + ] + ] + ], + "report": "multiqc_report.html", + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.34" + ] + ] + } + ], + "timestamp": "2026-03-17T16:15:30.372239611", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + }, + "sarscov2 single-end [fastqc] - custom prefix": { + "content": [ + { + "data": [ + [ + [ + "fastqc-status-check-heatmap.txt", + "fastqc_overrepresented_sequences_plot.txt", + "fastqc_per_base_n_content_plot.txt", + "fastqc_per_base_sequence_quality_plot.txt", + "fastqc_per_sequence_gc_content_plot_Counts.txt", + "fastqc_per_sequence_gc_content_plot_Percentages.txt", + "fastqc_per_sequence_quality_scores_plot.txt", + "fastqc_sequence_counts_plot.txt", + "fastqc_sequence_duplication_levels_plot.txt", + "fastqc_sequence_length_distribution_plot.txt", + "fastqc_top_overrepresented_sequences_table.txt", + "llms-full.txt", + "multiqc.log", + "multiqc.parquet", + "multiqc_citations.txt", + "multiqc_data.json", + "multiqc_fastqc.txt", + "multiqc_general_stats.txt", + "multiqc_software_versions.txt", + "multiqc_sources.txt" + ] + ] + ], + "plots": [ + [ + "pdf", + [ + "fastqc-status-check-heatmap.pdf", + "fastqc_overrepresented_sequences_plot.pdf", + "fastqc_per_base_n_content_plot.pdf", + "fastqc_per_base_sequence_quality_plot.pdf", + "fastqc_per_sequence_gc_content_plot_Counts.pdf", + "fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "fastqc_per_sequence_quality_scores_plot.pdf", + "fastqc_sequence_counts_plot-cnt.pdf", + "fastqc_sequence_counts_plot-pct.pdf", + "fastqc_sequence_duplication_levels_plot.pdf", + "fastqc_sequence_length_distribution_plot.pdf", + "fastqc_top_overrepresented_sequences_table.pdf" + ], + "png", + [ + "fastqc-status-check-heatmap.png", + "fastqc_overrepresented_sequences_plot.png", + "fastqc_per_base_n_content_plot.png", + "fastqc_per_base_sequence_quality_plot.png", + "fastqc_per_sequence_gc_content_plot_Counts.png", + "fastqc_per_sequence_gc_content_plot_Percentages.png", + "fastqc_per_sequence_quality_scores_plot.png", + "fastqc_sequence_counts_plot-cnt.png", + "fastqc_sequence_counts_plot-pct.png", + "fastqc_sequence_duplication_levels_plot.png", + "fastqc_sequence_length_distribution_plot.png", + "fastqc_top_overrepresented_sequences_table.png" + ], + "svg", + [ + "fastqc-status-check-heatmap.svg", + "fastqc_overrepresented_sequences_plot.svg", + "fastqc_per_base_n_content_plot.svg", + "fastqc_per_base_sequence_quality_plot.svg", + "fastqc_per_sequence_gc_content_plot_Counts.svg", + "fastqc_per_sequence_gc_content_plot_Percentages.svg", + "fastqc_per_sequence_quality_scores_plot.svg", + "fastqc_sequence_counts_plot-cnt.svg", + "fastqc_sequence_counts_plot-pct.svg", + "fastqc_sequence_duplication_levels_plot.svg", + "fastqc_sequence_length_distribution_plot.svg", + "fastqc_top_overrepresented_sequences_table.svg" + ] + ] + ], + "report": "custom_prefix.html", + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.34" + ] + ] + } + ], + "timestamp": "2026-03-17T16:15:18.189023981", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/multiqc/tests/nextflow.config b/modules/nf-core/multiqc/tests/nextflow.config new file mode 100644 index 0000000..374dfef --- /dev/null +++ b/modules/nf-core/multiqc/tests/nextflow.config @@ -0,0 +1,6 @@ +process { + withName: 'MULTIQC' { + ext.prefix = null + ext.args = '-p' + } +} diff --git a/nf-test.config b/nf-test.config new file mode 100644 index 0000000..f7aaeb4 --- /dev/null +++ b/nf-test.config @@ -0,0 +1,38 @@ +config { + // location for all nf-test tests + testsDir = "." + + // nf-test directory including temporary files for each test + workDir = System.getenv("NFT_WORKDIR") ?: ".nf-test" + + // location of an optional nextflow.config file specific for executing tests + configFile = "tests/nextflow.config" + + // ignore tests coming from the nf-core/modules repo + ignore = [ + 'modules/nf-core/**/tests/*', + 'subworkflows/nf-core/**/tests/*', + ] + + // run all test with defined profile(s) from the main nextflow.config + profile = "test" + + // list of filenames or patterns that should be trigger a full test run + triggers = [ + '.github/actions/nf-test/action.yml', + '.github/workflows/nf-test.yml', + 'assets/schema_input.json', + 'bin/*', + 'conf/test.config', + 'nextflow.config', + 'nextflow_schema.json', + 'nf-test.config', + 'tests/.nftignore', + 'tests/nextflow.config', + ] + + // load the necessary plugins + plugins { + load "nft-utils@0.0.3" + } +} diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json new file mode 100644 index 0000000..8bd5f55 --- /dev/null +++ b/ro-crate-metadata.json @@ -0,0 +1,305 @@ +{ + "@context": [ + "https://w3id.org/ro/crate/1.2/context", + { + "GithubService": "https://w3id.org/ro/terms/test#GithubService", + "JenkinsService": "https://w3id.org/ro/terms/test#JenkinsService", + "PlanemoEngine": "https://w3id.org/ro/terms/test#PlanemoEngine", + "TestDefinition": "https://w3id.org/ro/terms/test#TestDefinition", + "TestInstance": "https://w3id.org/ro/terms/test#TestInstance", + "TestService": "https://w3id.org/ro/terms/test#TestService", + "TestSuite": "https://w3id.org/ro/terms/test#TestSuite", + "TravisService": "https://w3id.org/ro/terms/test#TravisService", + "definition": "https://w3id.org/ro/terms/test#definition", + "engineVersion": "https://w3id.org/ro/terms/test#engineVersion", + "instance": "https://w3id.org/ro/terms/test#instance", + "resource": "https://w3id.org/ro/terms/test#resource", + "runsOn": "https://w3id.org/ro/terms/test#runsOn" + } + ], + "@graph": [ + { + "@id": "./", + "@type": "Dataset", + "creativeWorkStatus": "InProgress", + "datePublished": "2026-05-04T11:16:39+00:00", + "description": "

\n \n \n \"nf-core/biodivpipeline\"\n \n

\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/biodivpipeline)\n[![GitHub Actions CI Status](https://github.com/nf-core/biodivpipeline/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/biodivpipeline/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/biodivpipeline/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/biodivpipeline/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/biodivpipeline/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.10.4-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-4.0.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.0.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/biodivpipeline)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23biodivpipeline-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/biodivpipeline)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/biodivpipeline** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/get_started/environment_setup/overview) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/get_started/run-your-first-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/biodivpipeline \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/running/run-pipelines#using-parameter-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/biodivpipeline/usage) and the [parameter documentation](https://nf-co.re/biodivpipeline/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/biodivpipeline/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/biodivpipeline/output).\n\n## Credits\n\nnf-core/biodivpipeline was originally written by SPST Team.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](docs/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#biodivpipeline` channel](https://nfcore.slack.com/channels/biodivpipeline) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "hasPart": [ + { + "@id": "main.nf" + }, + { + "@id": "assets/" + }, + { + "@id": "conf/" + }, + { + "@id": "docs/" + }, + { + "@id": "docs/images/" + }, + { + "@id": "modules/" + }, + { + "@id": "modules/nf-core/" + }, + { + "@id": "workflows/" + }, + { + "@id": "subworkflows/" + }, + { + "@id": "nextflow.config" + }, + { + "@id": "README.md" + }, + { + "@id": "nextflow_schema.json" + }, + { + "@id": "CHANGELOG.md" + }, + { + "@id": "LICENSE" + }, + { + "@id": "CODE_OF_CONDUCT.md" + }, + { + "@id": "CITATIONS.md" + }, + { + "@id": "modules.json" + }, + { + "@id": "docs/usage.md" + }, + { + "@id": "docs/output.md" + }, + { + "@id": ".nf-core.yml" + }, + { + "@id": ".pre-commit-config.yaml" + }, + { + "@id": ".prettierignore" + } + ], + "isBasedOn": "https://github.com/nf-core/biodivpipeline", + "license": "MIT", + "mainEntity": { + "@id": "main.nf" + }, + "mentions": [ + { + "@id": "#e1ecee2f-6656-4386-bf4c-d3d5f9506a8b" + } + ], + "name": "nf-core/biodivpipeline" + }, + { + "@id": "ro-crate-metadata.json", + "@type": "CreativeWork", + "about": { + "@id": "./" + }, + "conformsTo": [ + { + "@id": "https://w3id.org/ro/crate/1.2" + }, + { + "@id": "https://w3id.org/workflowhub/workflow-ro-crate/1.0" + } + ] + }, + { + "@id": "main.nf", + "@type": ["File", "SoftwareSourceCode", "ComputationalWorkflow"], + "contributor": [ + { + "@id": "#3cbf1a8b-9e61-4452-8f2d-260901f8bbfa" + } + ], + "dateCreated": "", + "dateModified": "2026-05-04T13:16:39Z", + "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", + "keywords": ["nf-core", "nextflow"], + "license": ["MIT"], + "name": ["nf-core/biodivpipeline"], + "programmingLanguage": { + "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow" + }, + "sdPublisher": { + "@id": "https://nf-co.re/" + }, + "url": ["https://github.com/nf-core/biodivpipeline", "https://nf-co.re/biodivpipeline/dev/"], + "version": ["1.0.0dev"] + }, + { + "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow", + "@type": "ComputerLanguage", + "identifier": { + "@id": "https://www.nextflow.io/" + }, + "name": "Nextflow", + "url": { + "@id": "https://www.nextflow.io/" + }, + "version": "!>=25.10.4" + }, + { + "@id": "#e1ecee2f-6656-4386-bf4c-d3d5f9506a8b", + "@type": "TestSuite", + "instance": [ + { + "@id": "#24d9b5be-1301-419a-bdb3-79e20551d6c9" + } + ], + "mainEntity": { + "@id": "main.nf" + }, + "name": "Test suite for nf-core/biodivpipeline" + }, + { + "@id": "#24d9b5be-1301-419a-bdb3-79e20551d6c9", + "@type": "TestInstance", + "name": "GitHub Actions workflow for testing nf-core/biodivpipeline", + "resource": "repos/nf-core/biodivpipeline/actions/workflows/nf-test.yml", + "runsOn": { + "@id": "https://w3id.org/ro/terms/test#GithubService" + }, + "url": "https://api.github.com" + }, + { + "@id": "https://w3id.org/ro/terms/test#GithubService", + "@type": "TestService", + "name": "Github Actions", + "url": { + "@id": "https://github.com" + } + }, + { + "@id": "assets/", + "@type": "Dataset", + "description": "Additional files" + }, + { + "@id": "conf/", + "@type": "Dataset", + "description": "Configuration files" + }, + { + "@id": "docs/", + "@type": "Dataset", + "description": "Markdown files for documenting the pipeline" + }, + { + "@id": "docs/images/", + "@type": "Dataset", + "description": "Images for the documentation files" + }, + { + "@id": "modules/", + "@type": "Dataset", + "description": "Modules used by the pipeline" + }, + { + "@id": "modules/nf-core/", + "@type": "Dataset", + "description": "nf-core modules" + }, + { + "@id": "workflows/", + "@type": "Dataset", + "description": "Main pipeline workflows to be executed in main.nf" + }, + { + "@id": "subworkflows/", + "@type": "Dataset", + "description": "Smaller subworkflows" + }, + { + "@id": "nextflow.config", + "@type": "File", + "description": "Main Nextflow configuration file" + }, + { + "@id": "README.md", + "@type": "File", + "description": "Basic pipeline usage information" + }, + { + "@id": "nextflow_schema.json", + "@type": "File", + "description": "JSON schema for pipeline parameter specification" + }, + { + "@id": "CHANGELOG.md", + "@type": "File", + "description": "Information on changes made to the pipeline" + }, + { + "@id": "LICENSE", + "@type": "File", + "description": "The license - should be MIT" + }, + { + "@id": "CODE_OF_CONDUCT.md", + "@type": "File", + "description": "The nf-core code of conduct" + }, + { + "@id": "CITATIONS.md", + "@type": "File", + "description": "Citations needed when using the pipeline" + }, + { + "@id": "modules.json", + "@type": "File", + "description": "Version information for modules from nf-core/modules" + }, + { + "@id": "docs/usage.md", + "@type": "File", + "description": "Usage documentation" + }, + { + "@id": "docs/output.md", + "@type": "File", + "description": "Output documentation" + }, + { + "@id": ".nf-core.yml", + "@type": "File", + "description": "nf-core configuration file, configuring template features and linting rules" + }, + { + "@id": ".pre-commit-config.yaml", + "@type": "File", + "description": "Configuration file for pre-commit hooks" + }, + { + "@id": ".prettierignore", + "@type": "File", + "description": "Ignore file for prettier" + }, + { + "@id": "https://nf-co.re/", + "@type": "Organization", + "name": "nf-core", + "url": "https://nf-co.re/" + }, + { + "@id": "#3cbf1a8b-9e61-4452-8f2d-260901f8bbfa", + "@type": "Person", + "name": "SPST Team" + } + ] +} diff --git a/subworkflows/local/utils_nfcore_biodivpipeline_pipeline/main.nf b/subworkflows/local/utils_nfcore_biodivpipeline_pipeline/main.nf new file mode 100644 index 0000000..e56b827 --- /dev/null +++ b/subworkflows/local/utils_nfcore_biodivpipeline_pipeline/main.nf @@ -0,0 +1,241 @@ +// +// Subworkflow with functionality specific to the nf-core/biodivpipeline pipeline +// + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + IMPORT FUNCTIONS / MODULES / SUBWORKFLOWS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin' +include { paramsSummaryMap } from 'plugin/nf-schema' +include { samplesheetToList } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' +include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' +include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' +include { UTILS_NFCORE_PIPELINE } from '../../nf-core/utils_nfcore_pipeline' +include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipeline' + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + SUBWORKFLOW TO INITIALISE PIPELINE +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +workflow PIPELINE_INITIALISATION { + + take: + version // boolean: Display version and exit + validate_params // boolean: Boolean whether to validate parameters against the schema at runtime + monochrome_logs // boolean: Do not use coloured log outputs + nextflow_cli_args // array: List of positional nextflow CLI args + outdir // string: The output directory where the results will be saved + input // string: Path to input samplesheet + help // boolean: Display help message and exit + help_full // boolean: Show the full help message + show_hidden // boolean: Show hidden parameters in the help message + + main: + + ch_versions = channel.empty() + + // + // Print version and exit if required and dump pipeline parameters to JSON file + // + UTILS_NEXTFLOW_PIPELINE ( + version, + true, + outdir, + workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1 + ) + + // + // Validate parameters and generate parameter summary to stdout + // + + def before_text = "" + def after_text = "" + before_text = """ +-\033[2m----------------------------------------------------\033[0m- + \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m +\033[0;34m ___ __ __ __ ___ \033[0;32m/,-._.--~\'\033[0m +\033[0;34m |\\ | |__ __ / ` / \\ |__) |__ \033[0;33m} {\033[0m +\033[0;34m | \\| | \\__, \\__/ | \\ |___ \033[0;32m\\`-._,-`-,\033[0m + \033[0;32m`._,._,\'\033[0m +\033[0;35m nf-core/biodivpipeline ${workflow.manifest.version}\033[0m +-\033[2m----------------------------------------------------\033[0m- +""" + after_text = """${workflow.manifest.doi ? "\n* The pipeline\n" : ""}${workflow.manifest.doi.tokenize(",").collect { doi -> " https://doi.org/${doi.trim().replace('https://doi.org/','')}"}.join("\n")}${workflow.manifest.doi ? "\n" : ""} +* The nf-core framework + https://doi.org/10.1038/s41587-020-0439-x + +* Software dependencies + https://github.com/nf-core/biodivpipeline/blob/master/CITATIONS.md +""" + if (monochrome_logs) { + before_text = before_text.replaceAll(/\033\[[0-9;]*m/, '') + } + + command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " + + UTILS_NFSCHEMA_PLUGIN ( + workflow, + validate_params, + null, + help, + help_full, + show_hidden, + before_text, + after_text, + command + ) + + // + // Check config provided to the pipeline + // + UTILS_NFCORE_PIPELINE ( + nextflow_cli_args + ) + + // + // Custom validation for pipeline parameters + // + validateInputParameters() + + // + // Create channel from input CSV file + // Our input IS the data file itself, not a samplesheet pointing to files + // + channel + .fromPath(input, checkIfExists: true) + .set { ch_input } + + emit: + input = ch_input + versions = ch_versions +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + SUBWORKFLOW FOR PIPELINE COMPLETION +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +workflow PIPELINE_COMPLETION { + + take: + email // string: email address + email_on_fail // string: email address sent on pipeline failure + plaintext_email // boolean: Send plain-text email instead of HTML + outdir // path: Path to output directory where results will be published + monochrome_logs // boolean: Disable ANSI colour codes in log output + multiqc_report // string: Path to MultiQC report + + main: + summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") + def multiqc_reports = multiqc_report.toList() + + // + // Completion email and summary + // + workflow.onComplete { + if (email || email_on_fail) { + completionEmail( + summary_params, + email, + email_on_fail, + plaintext_email, + outdir, + monochrome_logs, + multiqc_reports.getVal(), + ) + } + + completionSummary(monochrome_logs) + + } + + workflow.onError { + log.error "Pipeline failed. Please refer to troubleshooting docs for common issues: https://nf-co.re/docs/running/troubleshooting" + } +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + FUNCTIONS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +// +// Check and validate pipeline parameters +// +def validateInputParameters() { + if (!params.input) { + error("Please provide an input CSV file using --input") + } +} +// +// Generate methods description for MultiQC +// +def toolCitationText() { + // TODO nf-core: Optionally add in-text citation tools to this list. + // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "Tool (Foo et al. 2023)" : "", + // Uncomment function in methodsDescriptionText to render in MultiQC report + def citation_text = [ + "Tools used in the workflow included:", + "FastQC (Andrews 2010),", + "MultiQC (Ewels et al. 2016)", + "." + ].join(' ').trim() + + return citation_text +} + +def toolBibliographyText() { + // TODO nf-core: Optionally add bibliographic entries to this list. + // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "
  • Author (2023) Pub name, Journal, DOI
  • " : "", + // Uncomment function in methodsDescriptionText to render in MultiQC report + def reference_text = [ + "
  • Andrews S, (2010) FastQC, URL: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/).
  • ", + "
  • Ewels, P., Magnusson, M., Lundin, S., & KΓ€ller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics , 32(19), 3047–3048. doi: /10.1093/bioinformatics/btw354
  • " + ].join(' ').trim() + + return reference_text +} + +def methodsDescriptionText(mqc_methods_yaml) { + // Convert to a named map so can be used as with familiar NXF ${workflow} variable syntax in the MultiQC YML file + def meta = [:] + meta.workflow = workflow.toMap() + meta["manifest_map"] = workflow.manifest.toMap() + + // Pipeline DOI + if (meta.manifest_map.doi) { + // Using a loop to handle multiple DOIs + // Removing `https://doi.org/` to handle pipelines using DOIs vs DOI resolvers + // Removing ` ` since the manifest.doi is a string and not a proper list + def temp_doi_ref = "" + def manifest_doi = meta.manifest_map.doi.tokenize(",") + manifest_doi.each { doi_ref -> + temp_doi_ref += "(doi:
    ${doi_ref.replace("https://doi.org/", "").replace(" ", "")}), " + } + meta["doi_text"] = temp_doi_ref.substring(0, temp_doi_ref.length() - 2) + } else meta["doi_text"] = "" + meta["nodoi_text"] = meta.manifest_map.doi ? "" : "
  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " + + // Tool references + meta["tool_citations"] = "" + meta["tool_bibliography"] = "" + + // TODO nf-core: Only uncomment below if logic in toolCitationText/toolBibliographyText has been filled! + // meta["tool_citations"] = toolCitationText().replaceAll(", \\.", ".").replaceAll("\\. \\.", ".").replaceAll(", \\.", ".") + // meta["tool_bibliography"] = toolBibliographyText() + + + def methods_text = mqc_methods_yaml.text + + def engine = new groovy.text.SimpleTemplateEngine() + def description_html = engine.createTemplate(methods_text).make(meta) + + return description_html.toString() +} 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 0000000..d6e593e --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf @@ -0,0 +1,126 @@ +// +// Subworkflow with functionality that may be useful for any Nextflow pipeline +// + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + SUBWORKFLOW DEFINITION +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +workflow UTILS_NEXTFLOW_PIPELINE { + take: + print_version // boolean: print version + dump_parameters // boolean: dump parameters + outdir // path: base directory used to publish pipeline results + check_conda_channels // boolean: check conda channels + + main: + + // + // Print workflow version and exit on --version + // + if (print_version) { + log.info("${workflow.manifest.name} ${getWorkflowVersion()}") + System.exit(0) + } + + // + // Dump pipeline parameters to a JSON file + // + if (dump_parameters && outdir) { + dumpParametersToJSON(outdir) + } + + // + // When running with Conda, warn if channels have not been set-up appropriately + // + if (check_conda_channels) { + checkCondaChannels() + } + + emit: + dummy_emit = true +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + FUNCTIONS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +// +// Generate version string +// +def getWorkflowVersion() { + def version_string = "" as String + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } + + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } + + return version_string +} + +// +// Dump pipeline parameters to a JSON file +// +def dumpParametersToJSON(outdir) { + def timestamp = new java.util.Date().format('yyyy-MM-dd_HH-mm-ss') + def filename = "params_${timestamp}.json" + def temp_pf = new File(workflow.launchDir.toString(), ".${filename}") + def jsonStr = groovy.json.JsonOutput.toJson(params) + temp_pf.text = groovy.json.JsonOutput.prettyPrint(jsonStr) + + nextflow.extension.FilesEx.copyTo(temp_pf.toPath(), "${outdir}/pipeline_info/params_${timestamp}.json") + temp_pf.delete() +} + +// +// When running with -profile conda, warn if channels have not been set-up appropriately +// +def checkCondaChannels() { + def parser = new org.yaml.snakeyaml.Yaml() + def channels = [] + try { + def config = parser.load("conda config --show channels".execute().text) + channels = config.channels + } + catch (NullPointerException e) { + log.debug(e) + log.warn("Could not verify conda channel configuration.") + return null + } + catch (IOException e) { + log.debug(e) + log.warn("Could not verify conda channel configuration.") + return null + } + + // Check that all channels are present + // This channel list is ordered by required channel priority. + def required_channels_in_order = ['conda-forge', 'bioconda'] + def channels_missing = ((required_channels_in_order as Set) - (channels as Set)) as Boolean + + // Check that they are in the right order + def channel_priority_violation = required_channels_in_order != channels.findAll { ch -> ch in required_channels_in_order } + + if (channels_missing | channel_priority_violation) { + log.warn """\ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + There is a problem with your Conda configuration! + You will need to set-up the conda-forge and bioconda channels correctly. + Please refer to https://bioconda.github.io/ + The observed channel order is + ${channels} + but the following channel order is required: + ${required_channels_in_order} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + """.stripIndent(true) + } +} diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/meta.yml b/subworkflows/nf-core/utils_nextflow_pipeline/meta.yml new file mode 100644 index 0000000..e5c3a0a --- /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 0000000..68718e4 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test @@ -0,0 +1,54 @@ + +nextflow_function { + + name "Test Functions" + script "subworkflows/nf-core/utils_nextflow_pipeline/main.nf" + config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" + tag 'subworkflows' + tag 'utils_nextflow_pipeline' + tag 'subworkflows/utils_nextflow_pipeline' + + test("Test Function getWorkflowVersion") { + + function "getWorkflowVersion" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Test Function dumpParametersToJSON") { + + function "dumpParametersToJSON" + + when { + function { + """ + // define inputs of the function here. Example: + input[0] = "$outputDir" + """.stripIndent() + } + } + + then { + assertAll( + { assert function.success } + ) + } + } + + test("Test Function checkCondaChannels") { + + function "checkCondaChannels" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap new file mode 100644 index 0000000..e3f0baf --- /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 0000000..02dbf09 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test @@ -0,0 +1,113 @@ +nextflow_workflow { + + name "Test Workflow UTILS_NEXTFLOW_PIPELINE" + script "../main.nf" + config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" + workflow "UTILS_NEXTFLOW_PIPELINE" + tag 'subworkflows' + tag 'utils_nextflow_pipeline' + tag 'subworkflows/utils_nextflow_pipeline' + + test("Should run no inputs") { + + when { + workflow { + """ + print_version = false + dump_parameters = false + outdir = null + check_conda_channels = false + + input[0] = print_version + input[1] = dump_parameters + input[2] = outdir + input[3] = check_conda_channels + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } + + test("Should print version") { + + when { + workflow { + """ + print_version = true + dump_parameters = false + outdir = null + check_conda_channels = false + + input[0] = print_version + input[1] = dump_parameters + input[2] = outdir + input[3] = check_conda_channels + """ + } + } + + then { + expect { + with(workflow) { + assert success + assert "nextflow_workflow v9.9.9" in stdout + } + } + } + } + + test("Should dump params") { + + when { + workflow { + """ + print_version = false + dump_parameters = true + outdir = 'results' + check_conda_channels = false + + input[0] = false + input[1] = true + input[2] = outdir + input[3] = false + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } + + test("Should not create params JSON if no output directory") { + + when { + workflow { + """ + print_version = false + dump_parameters = true + outdir = null + check_conda_channels = false + + input[0] = false + input[1] = true + input[2] = outdir + input[3] = false + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config b/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config new file mode 100644 index 0000000..a09572e --- /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 0000000..afca543 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -0,0 +1,355 @@ +// +// Subworkflow with utility functions specific to the nf-core pipeline template +// + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + SUBWORKFLOW DEFINITION +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +workflow UTILS_NFCORE_PIPELINE { + take: + nextflow_cli_args + + main: + valid_config = checkConfigProvided() + checkProfileProvided(nextflow_cli_args) + + emit: + valid_config = valid_config +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + FUNCTIONS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +// +// Warn if a -profile or Nextflow config has not been provided to run the pipeline +// +def checkConfigProvided() { + def valid_config = true as Boolean + if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { + log.warn( + "[${workflow.manifest.name}] You are attempting to run the pipeline without any custom configuration!\n\n" + "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + "Please refer to the quick start section and usage docs for the pipeline.\n " + ) + valid_config = false + } + return valid_config +} + +// +// Exit pipeline if --profile contains spaces +// +def checkProfileProvided(nextflow_cli_args) { + if (workflow.profile.endsWith(',')) { + error( + "The `-profile` option cannot end with a trailing comma, please remove it and re-run the pipeline!\n" + "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n" + ) + } + if (nextflow_cli_args[0]) { + log.warn( + "nf-core pipelines do not accept positional arguments. The positional argument `${nextflow_cli_args[0]}` has been detected.\n" + "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n" + ) + } +} + +// +// Generate workflow version string +// +def getWorkflowVersion() { + def version_string = "" as String + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } + + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } + + return version_string +} + +// +// Get software versions for pipeline +// +def processVersionsFromYAML(yaml_file) { + def yaml = new org.yaml.snakeyaml.Yaml() + def versions = yaml.load(yaml_file).collectEntries { k, v -> [k.tokenize(':')[-1], v] } + return yaml.dumpAsMap(versions).trim() +} + +// +// Get workflow version for pipeline +// +def workflowVersionToYAML() { + return """ + Workflow: + ${workflow.manifest.name}: ${getWorkflowVersion()} + Nextflow: ${workflow.nextflow.version} + """.stripIndent().trim() +} + +// +// Get channel of software versions used in pipeline in YAML format +// +def softwareVersionsToYAML(ch_versions) { + return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(channel.of(workflowVersionToYAML())) +} + +// +// Get workflow summary for MultiQC +// +def paramsSummaryMultiqc(summary_params) { + def summary_section = '' + summary_params + .keySet() + .each { group -> + def group_params = summary_params.get(group) + // This gets the parameters of that particular group + if (group_params) { + summary_section += "

    ${group}

    \n" + summary_section += "
    \n" + group_params + .keySet() + .sort() + .each { param -> + summary_section += "
    ${param}
    ${group_params.get(param) ?: 'N/A'}
    \n" + } + summary_section += "
    \n" + } + } + + def yaml_file_text = "id: '${workflow.manifest.name.replace('/', '-')}-summary'\n" as String + yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n" + yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n" + yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n" + yaml_file_text += "plot_type: 'html'\n" + yaml_file_text += "data: |\n" + yaml_file_text += "${summary_section}" + + return yaml_file_text +} + +// +// ANSII colours used for terminal logging +// +def logColours(monochrome_logs=true) { + def colorcodes = [:] as Map + + // Reset / Meta + colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" + colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" + colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" + colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" + colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" + colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" + colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" + + // Regular Colors + colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" + colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" + colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" + colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" + colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" + colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" + colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" + colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" + + // Bold + colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" + colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" + colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" + colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" + colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" + colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" + colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" + colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" + + // Underline + colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" + colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" + colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" + colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" + colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" + colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" + colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" + colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" + + // High Intensity + colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" + colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" + colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" + colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" + colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" + colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" + colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" + colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" + + // Bold High Intensity + colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" + colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" + colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" + colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" + colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" + colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" + colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" + colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" + + return colorcodes +} + +// Return a single report from an object that may be a Path or List +// +def getSingleReport(multiqc_reports) { + if (multiqc_reports instanceof Path) { + return multiqc_reports + } else if (multiqc_reports instanceof List) { + if (multiqc_reports.size() == 0) { + log.warn("[${workflow.manifest.name}] No reports found from process 'MULTIQC'") + return null + } else if (multiqc_reports.size() == 1) { + return multiqc_reports.first() + } else { + log.warn("[${workflow.manifest.name}] Found multiple reports from process 'MULTIQC', will use only one") + return multiqc_reports.first() + } + } else { + return null + } +} + +// +// Construct and send completion email +// +def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdir, monochrome_logs=true, multiqc_report=null) { + + // Set up the e-mail variables + def subject = "[${workflow.manifest.name}] Successful: ${workflow.runName}" + if (!workflow.success) { + subject = "[${workflow.manifest.name}] FAILED: ${workflow.runName}" + } + + def summary = [:] + summary_params + .keySet() + .sort() + .each { group -> + summary << summary_params[group] + } + + def misc_fields = [:] + misc_fields['Date Started'] = workflow.start + misc_fields['Date Completed'] = workflow.complete + misc_fields['Pipeline script file path'] = workflow.scriptFile + misc_fields['Pipeline script hash ID'] = workflow.scriptId + if (workflow.repository) { + misc_fields['Pipeline repository Git URL'] = workflow.repository + } + if (workflow.commitId) { + misc_fields['Pipeline repository Git Commit'] = workflow.commitId + } + if (workflow.revision) { + misc_fields['Pipeline Git branch/tag'] = workflow.revision + } + misc_fields['Nextflow Version'] = workflow.nextflow.version + misc_fields['Nextflow Build'] = workflow.nextflow.build + misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp + + def email_fields = [:] + email_fields['version'] = getWorkflowVersion() + email_fields['runName'] = workflow.runName + email_fields['success'] = workflow.success + email_fields['dateComplete'] = workflow.complete + email_fields['duration'] = workflow.duration + email_fields['exitStatus'] = workflow.exitStatus + email_fields['errorMessage'] = (workflow.errorMessage ?: 'None') + email_fields['errorReport'] = (workflow.errorReport ?: 'None') + email_fields['commandLine'] = workflow.commandLine + email_fields['projectDir'] = workflow.projectDir + email_fields['summary'] = summary << misc_fields + + // On success try attach the multiqc report + def mqc_report = getSingleReport(multiqc_report) + + // Check if we are only sending emails on failure + def email_address = email + if (!email && email_on_fail && !workflow.success) { + email_address = email_on_fail + } + + // Render the TXT template + def engine = new groovy.text.GStringTemplateEngine() + def tf = new File("${workflow.projectDir}/assets/email_template.txt") + def txt_template = engine.createTemplate(tf).make(email_fields) + def email_txt = txt_template.toString() + + // Render the HTML template + def hf = new File("${workflow.projectDir}/assets/email_template.html") + def html_template = engine.createTemplate(hf).make(email_fields) + def email_html = html_template.toString() + + // Render the sendmail template + def max_multiqc_email_size = (params.containsKey('max_multiqc_email_size') ? params.max_multiqc_email_size : 0) as MemoryUnit + def smail_fields = [email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "${workflow.projectDir}", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes()] + def sf = new File("${workflow.projectDir}/assets/sendmail_template.txt") + def sendmail_template = engine.createTemplate(sf).make(smail_fields) + def sendmail_html = sendmail_template.toString() + + // Send the HTML e-mail + def colors = logColours(monochrome_logs) as Map + if (email_address) { + try { + if (plaintext_email) { + new org.codehaus.groovy.GroovyException('Send plaintext e-mail, not HTML') + } + // Try to send HTML e-mail using sendmail + def sendmail_tf = new File(workflow.launchDir.toString(), ".sendmail_tmp.html") + sendmail_tf.withWriter { w -> w << sendmail_html } + ['sendmail', '-t'].execute() << sendmail_html + log.info("-${colors.purple}[${workflow.manifest.name}]${colors.green} Sent summary e-mail to ${email_address} (sendmail)-") + } + catch (Exception msg) { + log.debug(msg.toString()) + log.debug("Trying with mail instead of sendmail") + // Catch failures and try with plaintext + def mail_cmd = ['mail', '-s', subject, '--content-type=text/html', email_address] + mail_cmd.execute() << email_html + log.info("-${colors.purple}[${workflow.manifest.name}]${colors.green} Sent summary e-mail to ${email_address} (mail)-") + } + } + + // Write summary e-mail HTML to a file + def output_hf = new File(workflow.launchDir.toString(), ".pipeline_report.html") + output_hf.withWriter { w -> w << email_html } + nextflow.extension.FilesEx.copyTo(output_hf.toPath(), "${outdir}/pipeline_info/pipeline_report.html") + output_hf.delete() + + // Write summary e-mail TXT to a file + def output_tf = new File(workflow.launchDir.toString(), ".pipeline_report.txt") + output_tf.withWriter { w -> w << email_txt } + nextflow.extension.FilesEx.copyTo(output_tf.toPath(), "${outdir}/pipeline_info/pipeline_report.txt") + output_tf.delete() +} + +// +// Print pipeline summary on completion +// +def completionSummary(monochrome_logs=true) { + def colors = logColours(monochrome_logs) as Map + if (workflow.success) { + if (workflow.stats.ignoredCount == 0) { + log.info("-${colors.purple}[${workflow.manifest.name}]${colors.green} Pipeline completed successfully${colors.reset}-") + } + else { + log.info("-${colors.purple}[${workflow.manifest.name}]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-") + } + } + else { + log.info("-${colors.purple}[${workflow.manifest.name}]${colors.red} Pipeline completed with errors${colors.reset}-") + } +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml b/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml new file mode 100644 index 0000000..d08d243 --- /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 0000000..f117040 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test @@ -0,0 +1,126 @@ + +nextflow_function { + + name "Test Functions" + script "../main.nf" + config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "utils_nfcore_pipeline" + tag "subworkflows/utils_nfcore_pipeline" + + test("Test Function checkConfigProvided") { + + function "checkConfigProvided" + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Test Function checkProfileProvided") { + + function "checkProfileProvided" + + when { + function { + """ + input[0] = [] + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Test Function without logColours") { + + function "logColours" + + when { + function { + """ + input[0] = true + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Test Function with logColours") { + function "logColours" + + when { + function { + """ + input[0] = false + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Test Function getSingleReport with a single file") { + function "getSingleReport" + + when { + function { + """ + input[0] = file(params.modules_testdata_base_path + '/generic/tsv/test.tsv', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert function.result.contains("test.tsv") } + ) + } + } + + test("Test Function getSingleReport with multiple files") { + function "getSingleReport" + + when { + function { + """ + input[0] = [ + file(params.modules_testdata_base_path + '/generic/tsv/test.tsv', checkIfExists: true), + file(params.modules_testdata_base_path + '/generic/tsv/network.tsv', checkIfExists: true), + file(params.modules_testdata_base_path + '/generic/tsv/expression.tsv', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert function.result.contains("test.tsv") }, + { assert !function.result.contains("network.tsv") }, + { assert !function.result.contains("expression.tsv") } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap new file mode 100644 index 0000000..02c6701 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap @@ -0,0 +1,136 @@ +{ + "Test Function checkProfileProvided": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:03.360873" + }, + "Test Function checkConfigProvided": { + "content": [ + true + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:02:59.729647" + }, + "Test Function without logColours": { + "content": [ + { + "reset": "", + "bold": "", + "dim": "", + "underlined": "", + "blink": "", + "reverse": "", + "hidden": "", + "black": "", + "red": "", + "green": "", + "yellow": "", + "blue": "", + "purple": "", + "cyan": "", + "white": "", + "bblack": "", + "bred": "", + "bgreen": "", + "byellow": "", + "bblue": "", + "bpurple": "", + "bcyan": "", + "bwhite": "", + "ublack": "", + "ured": "", + "ugreen": "", + "uyellow": "", + "ublue": "", + "upurple": "", + "ucyan": "", + "uwhite": "", + "iblack": "", + "ired": "", + "igreen": "", + "iyellow": "", + "iblue": "", + "ipurple": "", + "icyan": "", + "iwhite": "", + "biblack": "", + "bired": "", + "bigreen": "", + "biyellow": "", + "biblue": "", + "bipurple": "", + "bicyan": "", + "biwhite": "" + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:17.969323" + }, + "Test Function with logColours": { + "content": [ + { + "reset": "\u001b[0m", + "bold": "\u001b[1m", + "dim": "\u001b[2m", + "underlined": "\u001b[4m", + "blink": "\u001b[5m", + "reverse": "\u001b[7m", + "hidden": "\u001b[8m", + "black": "\u001b[0;30m", + "red": "\u001b[0;31m", + "green": "\u001b[0;32m", + "yellow": "\u001b[0;33m", + "blue": "\u001b[0;34m", + "purple": "\u001b[0;35m", + "cyan": "\u001b[0;36m", + "white": "\u001b[0;37m", + "bblack": "\u001b[1;30m", + "bred": "\u001b[1;31m", + "bgreen": "\u001b[1;32m", + "byellow": "\u001b[1;33m", + "bblue": "\u001b[1;34m", + "bpurple": "\u001b[1;35m", + "bcyan": "\u001b[1;36m", + "bwhite": "\u001b[1;37m", + "ublack": "\u001b[4;30m", + "ured": "\u001b[4;31m", + "ugreen": "\u001b[4;32m", + "uyellow": "\u001b[4;33m", + "ublue": "\u001b[4;34m", + "upurple": "\u001b[4;35m", + "ucyan": "\u001b[4;36m", + "uwhite": "\u001b[4;37m", + "iblack": "\u001b[0;90m", + "ired": "\u001b[0;91m", + "igreen": "\u001b[0;92m", + "iyellow": "\u001b[0;93m", + "iblue": "\u001b[0;94m", + "ipurple": "\u001b[0;95m", + "icyan": "\u001b[0;96m", + "iwhite": "\u001b[0;97m", + "biblack": "\u001b[1;90m", + "bired": "\u001b[1;91m", + "bigreen": "\u001b[1;92m", + "biyellow": "\u001b[1;93m", + "biblue": "\u001b[1;94m", + "bipurple": "\u001b[1;95m", + "bicyan": "\u001b[1;96m", + "biwhite": "\u001b[1;97m" + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:21.714424" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test new file mode 100644 index 0000000..8940d32 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test @@ -0,0 +1,29 @@ +nextflow_workflow { + + name "Test Workflow UTILS_NFCORE_PIPELINE" + script "../main.nf" + config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" + workflow "UTILS_NFCORE_PIPELINE" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "utils_nfcore_pipeline" + tag "subworkflows/utils_nfcore_pipeline" + + test("Should run without failures") { + + when { + workflow { + """ + input[0] = [] + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test.snap new file mode 100644 index 0000000..859d103 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.nf.test.snap @@ -0,0 +1,19 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + true + ], + "valid_config": [ + true + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:25.726491" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test new file mode 100644 index 0000000..8940d32 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test @@ -0,0 +1,29 @@ +nextflow_workflow { + + name "Test Workflow UTILS_NFCORE_PIPELINE" + script "../main.nf" + config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" + workflow "UTILS_NFCORE_PIPELINE" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "utils_nfcore_pipeline" + tag "subworkflows/utils_nfcore_pipeline" + + test("Should run without failures") { + + when { + workflow { + """ + input[0] = [] + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap new file mode 100644 index 0000000..859d103 --- /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 0000000..d0a926b --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config @@ -0,0 +1,9 @@ +manifest { + name = 'nextflow_workflow' + author = """nf-core""" + homePage = 'https://127.0.0.1' + description = """Dummy pipeline""" + nextflowVersion = '!>=23.04.0' + version = '9.9.9' + doi = 'https://doi.org/10.5281/zenodo.5070524' +} diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf new file mode 100644 index 0000000..1df8b76 --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -0,0 +1,73 @@ +// +// Subworkflow that uses the nf-schema plugin to validate parameters and render the parameter summary +// + +include { paramsSummaryLog } from 'plugin/nf-schema' +include { validateParameters } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' + +workflow UTILS_NFSCHEMA_PLUGIN { + + take: + input_workflow // workflow: the workflow object used by nf-schema to get metadata from the workflow + validate_params // boolean: validate the parameters + parameters_schema // string: path to the parameters JSON schema. + // this has to be the same as the schema given to `validation.parametersSchema` + // when this input is empty it will automatically use the configured schema or + // "${projectDir}/nextflow_schema.json" as default. This input should not be empty + // for meta pipelines + help // boolean: show help message + help_full // boolean: show full help message + show_hidden // boolean: show hidden parameters in help message + before_text // string: text to show before the help message and parameters summary + after_text // string: text to show after the help message and parameters summary + command // string: an example command of the pipeline + + main: + + if(help || help_full) { + help_options = [ + beforeText: before_text, + afterText: after_text, + command: command, + showHidden: show_hidden, + fullHelp: help_full, + ] + if(parameters_schema) { + help_options << [parametersSchema: parameters_schema] + } + log.info paramsHelp( + help_options, + (params.help instanceof String && params.help != "true") ? params.help : "", + ) + exit 0 + } + + // + // Print parameter summary to stdout. This will display the parameters + // that differ from the default given in the JSON schema + // + + summary_options = [:] + if(parameters_schema) { + summary_options << [parametersSchema: parameters_schema] + } + log.info before_text + log.info paramsSummaryLog(summary_options, input_workflow) + log.info after_text + + // + // Validate the parameters using nextflow_schema.json or the schema + // given via the validation.parametersSchema configuration option + // + if(validate_params) { + validateOptions = [:] + if(parameters_schema) { + validateOptions << [parametersSchema: parameters_schema] + } + validateParameters(validateOptions) + } + + emit: + dummy_emit = true +} diff --git a/subworkflows/nf-core/utils_nfschema_plugin/meta.yml b/subworkflows/nf-core/utils_nfschema_plugin/meta.yml new file mode 100644 index 0000000..f7d9f02 --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/meta.yml @@ -0,0 +1,35 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "utils_nfschema_plugin" +description: Run nf-schema to validate parameters and create a summary of changed parameters +keywords: + - validation + - JSON schema + - plugin + - parameters + - summary +components: [] +input: + - input_workflow: + type: object + description: | + The workflow object of the used pipeline. + This object contains meta data used to create the params summary log + - validate_params: + type: boolean + description: Validate the parameters and error if invalid. + - parameters_schema: + type: string + description: | + Path to the parameters JSON schema. + This has to be the same as the schema given to the `validation.parametersSchema` config + option. When this input is empty it will automatically use the configured schema or + "${projectDir}/nextflow_schema.json" as default. The schema should not be given in this way + for meta pipelines. +output: + - dummy_emit: + type: boolean + description: Dummy emit to make nf-core subworkflows lint happy +authors: + - "@nvnieuwk" +maintainers: + - "@nvnieuwk" diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test new file mode 100644 index 0000000..c977917 --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test @@ -0,0 +1,173 @@ +nextflow_workflow { + + name "Test Subworkflow UTILS_NFSCHEMA_PLUGIN" + script "../main.nf" + workflow "UTILS_NFSCHEMA_PLUGIN" + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/utils_nfschema_plugin" + tag "plugin/nf-schema" + + config "./nextflow.config" + + test("Should run nothing") { + + when { + + params { + test_data = '' + } + + workflow { + """ + validate_params = false + input[0] = workflow + input[1] = validate_params + input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } + + test("Should validate params") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" + """ + } + } + + then { + assertAll( + { assert workflow.failed }, + { assert workflow.stdout.any { it.contains('ERROR ~ Validation of pipeline parameters failed!') } } + ) + } + } + + test("Should run nothing - custom schema") { + + when { + + params { + test_data = '' + } + + workflow { + """ + validate_params = false + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } + + test("Should validate params - custom schema") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" + """ + } + } + + then { + assertAll( + { assert workflow.failed }, + { assert workflow.stdout.any { it.contains('ERROR ~ Validation of pipeline parameters failed!') } } + ) + } + } + + test("Should create a help message") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = true + input[4] = false + input[5] = false + input[6] = "Before" + input[7] = "After" + input[8] = "nextflow run test/test" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config new file mode 100644 index 0000000..f6537cc --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -0,0 +1,8 @@ +plugins { + id "nf-schema@2.6.1" +} + +validation { + parametersSchema = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + monochromeLogs = true +} diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json new file mode 100644 index 0000000..331e0d2 --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json @@ -0,0 +1,96 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://raw.githubusercontent.com/./master/nextflow_schema.json", + "title": ". pipeline parameters", + "description": "", + "type": "object", + "$defs": { + "input_output_options": { + "title": "Input/output options", + "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Define where the pipeline should find input data and save output data.", + "required": ["outdir"], + "properties": { + "validate_params": { + "type": "boolean", + "description": "Validate parameters?", + "default": true, + "hidden": true + }, + "outdir": { + "type": "string", + "format": "directory-path", + "description": "The output directory where the results will be saved. You have to use absolute paths to storage on Cloud infrastructure.", + "fa_icon": "fas fa-folder-open" + }, + "test_data_base": { + "type": "string", + "default": "https://raw.githubusercontent.com/nf-core/test-datasets/modules", + "description": "Base for test data directory", + "hidden": true + }, + "test_data": { + "type": "string", + "description": "Fake test data param", + "hidden": true + } + } + }, + "generic_options": { + "title": "Generic options", + "type": "object", + "fa_icon": "fas fa-file-import", + "description": "Less common options for the pipeline, typically set in a config file.", + "help_text": "These options are common to all nf-core pipelines and allow you to customise some of the core preferences for how the pipeline runs.\n\nTypically these options would be set in a Nextflow config file loaded for all pipeline runs, such as `~/.nextflow/config`.", + "properties": { + "help": { + "type": "boolean", + "description": "Display help text.", + "fa_icon": "fas fa-question-circle", + "hidden": true + }, + "version": { + "type": "boolean", + "description": "Display version and exit.", + "fa_icon": "fas fa-question-circle", + "hidden": true + }, + "logo": { + "type": "boolean", + "default": true, + "description": "Display nf-core logo in console output.", + "fa_icon": "fas fa-image", + "hidden": true + }, + "singularity_pull_docker_container": { + "type": "boolean", + "description": "Pull Singularity container from Docker?", + "hidden": true + }, + "publish_dir_mode": { + "type": "string", + "default": "copy", + "description": "Method used to save pipeline results to output directory.", + "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", + "fa_icon": "fas fa-copy", + "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], + "hidden": true + }, + "monochrome_logs": { + "type": "boolean", + "description": "Use monochrome_logs", + "hidden": true + } + } + } + }, + "allOf": [ + { + "$ref": "#/$defs/input_output_options" + }, + { + "$ref": "#/$defs/generic_options" + } + ] +} diff --git a/tests/.nftignore b/tests/.nftignore new file mode 100644 index 0000000..e128a12 --- /dev/null +++ b/tests/.nftignore @@ -0,0 +1,12 @@ +.DS_Store +multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt +multiqc/multiqc_data/multiqc.parquet +multiqc/multiqc_data/multiqc.log +multiqc/multiqc_data/multiqc_data.json +multiqc/multiqc_data/multiqc_sources.txt +multiqc/multiqc_data/multiqc_software_versions.txt +multiqc/multiqc_data/llms-full.txt +multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} +multiqc/multiqc_report.html +fastqc/*_fastqc.{html,zip} +pipeline_info/*.{html,json,txt,yml} diff --git a/tests/default.nf.test b/tests/default.nf.test new file mode 100644 index 0000000..8c68fe4 --- /dev/null +++ b/tests/default.nf.test @@ -0,0 +1,33 @@ +nextflow_pipeline { + + name "Test pipeline" + script "../main.nf" + tag "pipeline" + + test("-profile test") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + // stable_path: All files + folders in ${params.outdir}/ with a stable path (including file name) + def stable_path = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_content: All files in ${params.outdir}/ with stable content + def stable_content = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assert workflow.success + assertAll( + { assert snapshot( + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_biodivpipeline_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_path, + // All files with stable contents + stable_content + ).match() } + ) + } + } +} diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 0000000..180dc90 --- /dev/null +++ b/tests/nextflow.config @@ -0,0 +1,14 @@ +/* +======================================================================================== + Nextflow config file for running nf-test tests +======================================================================================== +*/ + +// TODO nf-core: Specify any additional parameters here +// Or any resources requirements +params { + modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/biodivpipeline/' +} + +aws.client.anonymous = true // fixes S3 access issues on self-hosted runners diff --git a/tower.yml b/tower.yml new file mode 100644 index 0000000..787aedf --- /dev/null +++ b/tower.yml @@ -0,0 +1,5 @@ +reports: + multiqc_report.html: + display: "MultiQC HTML report" + samplesheet.csv: + display: "Auto-created samplesheet with collated metadata and FASTQ paths" From 73e9177409e904b9c5b57d6d2abaacfa8295e92a Mon Sep 17 00:00:00 2001 From: Pritom Mitchell Rodrigues Date: Mon, 4 May 2026 13:43:59 +0200 Subject: [PATCH 2/9] feat: add biodiversity pipeline modules (WP2-WP7) - column_standardise: map CSV headers to ABCD schema terms (WP6) - biodiv_annotate: wrap BiodivPortal Annotator REST API (WP2) - taxonomy_classify: resolve taxon names to GBIF/WFO IDs (WP3) - outlier_detect: statistical + LLM quality detection (WP4) - provisional_concepts: register unresolved terms (WP5) - rdf_transform: tabular data to RDF triples (WP7) - collect_reports: aggregate per-step quality reports All modules are stub implementations ready for WP teams to replace. --- modules/local/biodiv_annotate/main.nf | 38 +++++++++++++++ modules/local/collect_reports/main.nf | 35 +++++++++++++ modules/local/column_standardise/main.nf | 42 ++++++++++++++++ modules/local/outlier_detect/main.nf | 39 +++++++++++++++ modules/local/provisional_concepts/main.nf | 34 +++++++++++++ modules/local/rdf_transform/main.nf | 57 ++++++++++++++++++++++ modules/local/taxonomy_classify/main.nf | 27 ++++++++++ 7 files changed, 272 insertions(+) create mode 100644 modules/local/biodiv_annotate/main.nf create mode 100644 modules/local/collect_reports/main.nf create mode 100644 modules/local/column_standardise/main.nf create mode 100644 modules/local/outlier_detect/main.nf create mode 100644 modules/local/provisional_concepts/main.nf create mode 100644 modules/local/rdf_transform/main.nf create mode 100644 modules/local/taxonomy_classify/main.nf diff --git a/modules/local/biodiv_annotate/main.nf b/modules/local/biodiv_annotate/main.nf new file mode 100644 index 0000000..cb5f775 --- /dev/null +++ b/modules/local/biodiv_annotate/main.nf @@ -0,0 +1,38 @@ +process BIODIV_ANNOTATE { + tag "annotate" + label 'process_low' + + container 'biodiv/wp2-annotator:latest' + + input: + path csv + + output: + path "annotated.jsonld", emit: annotations + path "unresolved_terms.csv", emit: unresolved + path "versions.yml", emit: versions + + script: + """ + # WP2: Wrap BiodivPortal Annotator REST API + # Batch-submit records, parse JSON-LD, emit annotated + unresolved terms + # Stub: generate minimal output structure + + cat <<-JSONLD > annotated.jsonld + { + "@context": "https://biodivportal.gfbio.org/context.jsonld", + "total_records": \$(wc -l < ${csv}), + "annotated": [], + "status": "stub" + } + JSONLD + + # Extract terms that couldn't be resolved (stub: empty) + echo "term,field,record_id" > unresolved_terms.csv + + cat <<-VERSIONS > versions.yml + "${task.process}": + biodiv_annotator: 0.1.0 + VERSIONS + """ +} diff --git a/modules/local/collect_reports/main.nf b/modules/local/collect_reports/main.nf new file mode 100644 index 0000000..4b246a4 --- /dev/null +++ b/modules/local/collect_reports/main.nf @@ -0,0 +1,35 @@ +process COLLECT_REPORTS { + tag "reports" + label 'process_single' + + input: + path quality_report + path rdf_report + path column_mapping + path provisional_concepts + + output: + path "pipeline_summary.json", emit: summary + + script: + """ + # Collect all per-step reports into a single pipeline summary + cat <<-SUMMARY > pipeline_summary.json + { + "pipeline": "biodivpipeline", + "version": "0.1.0", + "reports": { + "quality": "\$(cat ${quality_report})", + "rdf": "\$(cat ${rdf_report})", + "column_mapping": "${column_mapping}", + "provisional_concepts": "${provisional_concepts}" + } + } + SUMMARY + + cat <<-VERSIONS > versions.yml + "${task.process}": + collect_reports: 0.1.0 + VERSIONS + """ +} diff --git a/modules/local/column_standardise/main.nf b/modules/local/column_standardise/main.nf new file mode 100644 index 0000000..f123484 --- /dev/null +++ b/modules/local/column_standardise/main.nf @@ -0,0 +1,42 @@ +process COLUMN_STANDARDISE { + tag "column_std" + label 'process_single' + + container 'biodiv/wp6-column-standardise:latest' + + input: + path csv + + output: + path "standardised.csv", emit: csv + path "column_mapping.json", emit: mapping + path "versions.yml", emit: versions + + script: + """ + # WP6: Map CSV column headers to ABCD schema terms + # In stub mode, pass through unchanged + generate a mapping file + cp ${csv} standardised.csv + + cat <<-MAPPING > column_mapping.json + { + "HerbariumID": {"abcd_term": "UnitID", "confidence": 0.95}, + "Family": {"abcd_term": "HigherTaxon", "confidence": 0.90}, + "FullNameCache": {"abcd_term": "FullScientificNameString", "confidence": 0.92}, + "Sammlerteam": {"abcd_term": "AgentText", "confidence": 0.85}, + "Sammelnummer": {"abcd_term": "CollectorsFieldNumber", "confidence": 0.88}, + "CollectionDateBegin": {"abcd_term": "ISODateTimeBegin", "confidence": 0.95}, + "Country": {"abcd_term": "Country", "confidence": 0.98}, + "Locality": {"abcd_term": "LocalityText", "confidence": 0.93}, + "Latitude": {"abcd_term": "LatitudeDecimal", "confidence": 0.97}, + "Longitude": {"abcd_term": "LongitudeDecimal", "confidence": 0.97}, + "Genus": {"abcd_term": "GenusOrMonomial", "confidence": 0.94} + } + MAPPING + + cat <<-VERSIONS > versions.yml + "${task.process}": + column_standardise: 0.1.0 + VERSIONS + """ +} diff --git a/modules/local/outlier_detect/main.nf b/modules/local/outlier_detect/main.nf new file mode 100644 index 0000000..56168f6 --- /dev/null +++ b/modules/local/outlier_detect/main.nf @@ -0,0 +1,39 @@ +process OUTLIER_DETECT { + tag "outlier" + label 'process_low' + + container 'biodiv/wp4-outlier-detection:latest' + + input: + path csv + + output: + path "quality_report.json", emit: report + path "flagged_records.csv", emit: flagged + path "versions.yml", emit: versions + + script: + """ + # WP4: Outlier & Data-Quality Detection + # Statistical (IQR, z-score, DBSCAN) + LLM-assisted checks + # Stub: generate empty quality report + + cat <<-REPORT > quality_report.json + { + "total_records": \$(tail -n +2 ${csv} | wc -l), + "outliers_detected": 0, + "methods": ["IQR", "z-score", "isolation_forest", "dbscan", "llm"], + "flags": [], + "status": "stub" + } + REPORT + + # Flagged records: header + severity column + head -1 ${csv} | sed 's/\$/ ,"outlier_flag","severity_score","explanation"/' > flagged_records.csv + + cat <<-VERSIONS > versions.yml + "${task.process}": + outlier_detection: 0.1.0 + VERSIONS + """ +} diff --git a/modules/local/provisional_concepts/main.nf b/modules/local/provisional_concepts/main.nf new file mode 100644 index 0000000..10e81ed --- /dev/null +++ b/modules/local/provisional_concepts/main.nf @@ -0,0 +1,34 @@ +process PROVISIONAL_CONCEPTS { + tag "concepts" + label 'process_single' + + container 'biodiv/wp5-provisional-concepts:latest' + + input: + path unresolved_csv + + output: + path "provisional_concepts.json", emit: concepts + path "versions.yml", emit: versions + + script: + """ + # WP5: Provisional Concept Identification & Registration + # Detect unresolved terms, register in BiodivPortal as provisional + # Stub: pass through with empty registrations + + cat <<-CONCEPTS > provisional_concepts.json + { + "unresolved_input": "${unresolved_csv}", + "registered": [], + "failed": [], + "status": "stub" + } + CONCEPTS + + cat <<-VERSIONS > versions.yml + "${task.process}": + provisional_concepts: 0.1.0 + VERSIONS + """ +} diff --git a/modules/local/rdf_transform/main.nf b/modules/local/rdf_transform/main.nf new file mode 100644 index 0000000..3e864e5 --- /dev/null +++ b/modules/local/rdf_transform/main.nf @@ -0,0 +1,57 @@ +process RDF_TRANSFORM { + tag "rdf" + label 'process_low' + + container 'biodiv/wp7-rdf-transform:latest' + + input: + path csv + path annotations + path taxonomy + path mapping_schema + + output: + path "output.ttl", emit: rdf_turtle + path "output.jsonld", emit: rdf_jsonld + path "rdf_report.json", emit: report + path "versions.yml", emit: versions + + script: + """ + # WP7: RDF Matching & Transformation + # Transform tabular records into RDF triples using expert mapping schema + # Stub: generate minimal valid Turtle + + cat <<-TTL > output.ttl + @prefix dwc: . + @prefix dcterms: . + + # Stub output β€” real transformation pending WP7 service + TTL + + cat <<-JSONLD > output.jsonld + { + "@context": { + "dwc": "http://rs.tdwg.org/dwc/terms/", + "dcterms": "http://purl.org/dc/terms/" + }, + "@graph": [], + "status": "stub" + } + JSONLD + + cat <<-REPORT > rdf_report.json + { + "input_records": \$(tail -n +2 ${csv} | wc -l), + "triples_generated": 0, + "mapping_schema": "${mapping_schema}", + "status": "stub" + } + REPORT + + cat <<-VERSIONS > versions.yml + "${task.process}": + rdf_transform: 0.1.0 + VERSIONS + """ +} diff --git a/modules/local/taxonomy_classify/main.nf b/modules/local/taxonomy_classify/main.nf new file mode 100644 index 0000000..f089d81 --- /dev/null +++ b/modules/local/taxonomy_classify/main.nf @@ -0,0 +1,27 @@ +process TAXONOMY_CLASSIFY { + tag "taxonomy" + label 'process_low' + + container 'biodiv/wp3-taxonomy-classifier:latest' + + input: + path csv + + output: + path "taxonomy_resolved.csv", emit: resolved + path "versions.yml", emit: versions + + script: + """ + # WP3: Land Taxonomy Classifier β€” resolve taxon names to GBIF/WFO IDs + # Stub: copy input and add placeholder resolved columns + + head -1 ${csv} | sed 's/\$/ ,"gbif_key","wfo_id","taxonomy_confidence"/' > taxonomy_resolved.csv + tail -n +2 ${csv} | sed 's/\$/ ,"","","0.0"/' >> taxonomy_resolved.csv + + cat <<-VERSIONS > versions.yml + "${task.process}": + taxonomy_classifier: 0.1.0 + VERSIONS + """ +} From c1942f2a71001febe377b4f80ac42a0c35719e65 Mon Sep 17 00:00:00 2001 From: Pritom Mitchell Rodrigues Date: Mon, 4 May 2026 13:44:09 +0200 Subject: [PATCH 3/9] feat: wire main workflow DAG and pipeline config - main.nf: entry point accepting --input CSV and --mapping_schema - workflows/biodivpipeline.nf: orchestrates all 7 modules - Step 1: Column standardisation (WP6) - Step 2: Parallel annotation (WP2) + taxonomy (WP3) + outlier detection (WP4) - Step 3: Provisional concept registration (WP5, after WP2) - Step 4: RDF transformation (WP7, combines all upstream outputs) - Step 5: Report collection - nextflow.config: add input/mapping_schema params - nextflow_schema.json: update input parameter validation for CSV data --- main.nf | 107 +++++++++++++++ nextflow.config | 260 ++++++++++++++++++++++++++++++++++++ nextflow_schema.json | 235 ++++++++++++++++++++++++++++++++ workflows/biodivpipeline.nf | 112 ++++++++++++++++ 4 files changed, 714 insertions(+) create mode 100644 main.nf create mode 100644 nextflow.config create mode 100644 nextflow_schema.json create mode 100644 workflows/biodivpipeline.nf diff --git a/main.nf b/main.nf new file mode 100644 index 0000000..8833950 --- /dev/null +++ b/main.nf @@ -0,0 +1,107 @@ +#!/usr/bin/env nextflow +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + nf-core/biodivpipeline +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + A modular nf-core workflow for FAIR biodiversity data processing. + Transforms raw CSV biodiversity records into quality-annotated, + taxonomically resolved RDF triples. +---------------------------------------------------------------------------------------- +*/ + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + IMPORT FUNCTIONS / MODULES / SUBWORKFLOWS / WORKFLOWS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +include { BIODIVPIPELINE } from './workflows/biodivpipeline' +include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_biodivpipeline_pipeline' +include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_biodivpipeline_pipeline' + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + NAMED WORKFLOWS FOR PIPELINE +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +// +// WORKFLOW: Run main analysis pipeline +// +workflow NFCORE_BIODIVPIPELINE { + + take: + ch_input // channel: path to input CSV + + main: + + // Resolve the mapping schema β€” use provided or fall back to default stub + def ch_schema = params.mapping_schema + ? channel.fromPath(params.mapping_schema, checkIfExists: true) + : channel.fromPath("${projectDir}/assets/default_mapping.jsonld", checkIfExists: true) + + // + // WORKFLOW: Run pipeline + // + BIODIVPIPELINE ( + ch_input, + ch_schema, + params.outdir, + ) + + emit: + rdf_turtle = BIODIVPIPELINE.out.rdf_turtle + summary = BIODIVPIPELINE.out.summary +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + RUN MAIN WORKFLOW +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +workflow { + + main: + // + // SUBWORKFLOW: Run initialisation tasks + // + PIPELINE_INITIALISATION ( + params.version, + params.validate_params, + params.monochrome_logs, + args, + params.outdir, + params.input, + params.help, + params.help_full, + params.show_hidden + ) + + // Input channel comes from the initialisation subworkflow + // (validates params and creates the channel from --input path) + def ch_input = PIPELINE_INITIALISATION.out.input + + // + // WORKFLOW: Run main workflow + // + NFCORE_BIODIVPIPELINE ( ch_input ) + + // + // SUBWORKFLOW: Run completion tasks + // + PIPELINE_COMPLETION ( + params.email, + params.email_on_fail, + params.plaintext_email, + params.outdir, + params.monochrome_logs, + channel.empty() // no multiqc report β€” we use our own reporting + ) +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + THE END +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ diff --git a/nextflow.config b/nextflow.config new file mode 100644 index 0000000..f73c18e --- /dev/null +++ b/nextflow.config @@ -0,0 +1,260 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + nf-core/biodivpipeline Nextflow config file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Default config options for all compute environments +---------------------------------------------------------------------------------------- +*/ + +// Global default params, used in configs +params { + + // Input options + input = null // Path to input CSV (biodiversity records) + mapping_schema = null // Path to RDF mapping schema (JSON-LD/Turtle). Falls back to assets/default_mapping.jsonld + + // Boilerplate options + outdir = null + publish_dir_mode = 'copy' + email = null + email_on_fail = null + plaintext_email = false + monochrome_logs = false + help = false + help_full = false + show_hidden = false + version = false + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' + trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') + + // Config options + config_profile_name = null + config_profile_description = null + + custom_config_version = 'master' + custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" + config_profile_contact = null + config_profile_url = null + + // Schema validation default options + validate_params = true +} + +// Backwards compatibility for publishDir syntax +outputDir = params.outdir +workflow.output.mode = params.publish_dir_mode + +// Load base.config by default for all pipelines +includeConfig 'conf/base.config' + +profiles { + debug { + 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 + conda.channels = ['conda-forge', 'bioconda'] + apptainer.enabled = false + } + mamba { + conda.enabled = true + conda.useMamba = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false + } + 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)' + } + arm64 { + process.arch = 'arm64' + // TODO https://github.com/nf-core/modules/issues/6694 + // For now if you're using arm64 you have to use wave for the sake of the maintainers + // wave profile + apptainer.ociAutoPull = true + singularity.ociAutoPull = true + wave.enabled = true + wave.freeze = true + wave.strategy = 'conda,container' + } + emulate_amd64 { + docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' + } + singularity { + singularity.enabled = true + singularity.autoMounts = true + conda.enabled = false + docker.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false + } + podman { + 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 + } + charliecloud { + 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 + } + wave { + apptainer.ociAutoPull = true + singularity.ociAutoPull = true + wave.enabled = true + wave.freeze = true + wave.strategy = 'conda,container' + } + gpu { + docker.runOptions = '-u $(id -u):$(id -g) --gpus all' + apptainer.runOptions = '--nv' + singularity.runOptions = '--nv' + } + test { includeConfig 'conf/test.config' } + test_full { includeConfig 'conf/test_full.config' } +} + +// Load nf-core custom profiles from different institutions + +// If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. +// Load nf-core/biodivpipeline custom profiles from different institutions. +includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" + + +// Load nf-core/biodivpipeline custom profiles from different institutions. +// TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs +// includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/biodivpipeline.config" : "/dev/null" + +// Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile +// Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled +// Set to your registry if you have a mirror of containers +apptainer.registry = 'quay.io' +docker.registry = 'quay.io' +podman.registry = 'quay.io' +singularity.registry = 'quay.io' +charliecloud.registry = 'quay.io' + +// Load igenomes.config if required +includeConfig !params.igenomes_ignore ? 'conf/igenomes.config' : 'conf/igenomes_ignored.config' + +// Export these variables to prevent local Python/R libraries from conflicting with those in the container +// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. +// See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. + +env { + PYTHONNOUSERSITE = 1 + R_PROFILE_USER = "/.Rprofile" + R_ENVIRON_USER = "/.Renviron" + JULIA_DEPOT_PATH = "/usr/local/share/julia" +} + +// Set bash options +process.shell = [ + "bash", + "-C", // No clobber - prevent output redirection from overwriting files. + "-e", // Exit if a tool returns a non-zero status/exit code + "-u", // Treat unset variables and parameters as an error + "-o", // Returns the status of the last command to exit.. + "pipefail" // ..with a non-zero status or zero if all successfully execute +] + +// Disable process selector warnings by default. Use debug profile to enable warnings. +nextflow.enable.configProcessNamesValidation = false + +timeline { + enabled = true + file = "${params.outdir}/pipeline_info/execution_timeline_${params.trace_report_suffix}.html" +} +report { + enabled = true + file = "${params.outdir}/pipeline_info/execution_report_${params.trace_report_suffix}.html" +} +trace { + enabled = true + file = "${params.outdir}/pipeline_info/execution_trace_${params.trace_report_suffix}.txt" +} +dag { + enabled = true + file = "${params.outdir}/pipeline_info/pipeline_dag_${params.trace_report_suffix}.html" +} + +manifest { + name = 'nf-core/biodivpipeline' + contributors = [ + // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 + [ + name: 'SPST Team', + affiliation: '', + email: '', + github: '', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: '' + ], + ] + homePage = 'https://github.com/nf-core/biodivpipeline' + description = """Modular nf-core workflow for FAIR biodiversity data processing""" + mainScript = 'main.nf' + defaultBranch = 'master' + nextflowVersion = '!>=25.10.4' + version = '1.0.0dev' + doi = '' +} + +// Nextflow plugins +plugins { + id 'nf-schema@2.5.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet +} + +validation { + defaultIgnoreParams = ["genomes"] + monochromeLogs = params.monochrome_logs +} +// Load modules.config for DSL2 module specific options +includeConfig 'conf/modules.config' diff --git a/nextflow_schema.json b/nextflow_schema.json new file mode 100644 index 0000000..c8dcee5 --- /dev/null +++ b/nextflow_schema.json @@ -0,0 +1,235 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://raw.githubusercontent.com/nf-core/biodivpipeline/master/nextflow_schema.json", + "title": "nf-core/biodivpipeline pipeline parameters", + "description": "Modular nf-core workflow for FAIR biodiversity data processing", + "type": "object", + "$defs": { + "input_output_options": { + "title": "Input/output options", + "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Define where the pipeline should find input data and save output data.", + "required": [ + "input", + "outdir" + ], + "properties": { + "input": { + "type": "string", + "format": "file-path", + "exists": true, + "mimetype": "text/csv", + "pattern": "^\\S+\\.csv$", + "description": "Path to input CSV file containing biodiversity records (e.g. BGBM herbarium specimens).", + "fa_icon": "fas fa-file-csv" + }, + "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" + }, + "email": { + "type": "string", + "description": "Email address for completion summary.", + "fa_icon": "fas fa-envelope", + "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.", + "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" + }, + "multiqc_title": { + "type": "string", + "description": "MultiQC report title. Printed as page header, used for filename if not otherwise specified.", + "fa_icon": "fas fa-file-signature" + }, + "mapping_schema": { + "type": "string", + "format": "file-path", + "description": "Path to RDF mapping schema file (JSON-LD or Turtle). If not provided, a default stub mapping is used.", + "fa_icon": "fas fa-project-diagram" + } + } + }, + "reference_genome_options": { + "title": "Reference genome options", + "type": "object", + "fa_icon": "fas fa-dna", + "description": "Reference genome related files and options required for the workflow.", + "properties": {} + }, + "institutional_config_options": { + "title": "Institutional config options", + "type": "object", + "fa_icon": "fas fa-university", + "description": "Parameters used to describe centralised config profiles. These should not be edited.", + "help_text": "The centralised nf-core configuration profiles use a handful of pipeline parameters to describe themselves. This information is then printed to the Nextflow log when you run a pipeline. You should not need to change these values when you run a pipeline.", + "properties": { + "custom_config_version": { + "type": "string", + "description": "Git commit id for Institutional configs.", + "default": "master", + "hidden": true, + "fa_icon": "fas fa-users-cog" + }, + "custom_config_base": { + "type": "string", + "description": "Base directory for Institutional configs.", + "default": "https://raw.githubusercontent.com/nf-core/configs/master", + "hidden": true, + "help_text": "If you're running offline, Nextflow will not be able to fetch the institutional config files from the internet. If you don't need them, then this is not a problem. If you do need them, you should download the files from the repo and tell Nextflow where to find them with this parameter.", + "fa_icon": "fas fa-users-cog" + }, + "config_profile_name": { + "type": "string", + "description": "Institutional config name.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + }, + "config_profile_description": { + "type": "string", + "description": "Institutional config description.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + }, + "config_profile_contact": { + "type": "string", + "description": "Institutional config contact information.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + }, + "config_profile_url": { + "type": "string", + "description": "Institutional config URL link.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + } + } + }, + "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": { + "version": { + "type": "boolean", + "description": "Display version and exit.", + "fa_icon": "fas fa-question-circle", + "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 + }, + "email_on_fail": { + "type": "string", + "description": "Email address for completion summary, only when pipeline fails.", + "fa_icon": "fas fa-exclamation-triangle", + "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$", + "help_text": "An email address to send a summary email to when the pipeline is completed - ONLY sent if the pipeline does not exit successfully.", + "hidden": true + }, + "plaintext_email": { + "type": "boolean", + "description": "Send plain-text email instead of HTML.", + "fa_icon": "fas fa-remove-format", + "hidden": true + }, + "max_multiqc_email_size": { + "type": "string", + "description": "File size limit when attaching MultiQC reports to summary emails.", + "pattern": "^\\d+(\\.\\d+)?\\.?\\s*(K|M|G|T)?B$", + "default": "25.MB", + "fa_icon": "fas fa-file-upload", + "hidden": true + }, + "monochrome_logs": { + "type": "boolean", + "description": "Do not use coloured log outputs.", + "fa_icon": "fas fa-palette", + "hidden": true + }, + "multiqc_config": { + "type": "string", + "format": "file-path", + "description": "Custom config file to supply to MultiQC.", + "fa_icon": "fas fa-cog", + "hidden": true + }, + "multiqc_logo": { + "type": "string", + "description": "Custom logo file to supply to MultiQC. File name must also be set in the MultiQC config file", + "fa_icon": "fas fa-image", + "hidden": true + }, + "multiqc_methods_description": { + "type": "string", + "description": "Custom MultiQC yaml file containing HTML including a methods description.", + "fa_icon": "fas fa-cog" + }, + "validate_params": { + "type": "boolean", + "description": "Boolean whether to validate parameters against the schema at runtime", + "default": true, + "fa_icon": "fas fa-check-square", + "hidden": true + }, + "pipelines_testdata_base_path": { + "type": "string", + "fa_icon": "far fa-check-circle", + "description": "Base URL or local path to location of pipeline test dataset files", + "default": "https://raw.githubusercontent.com/nf-core/test-datasets/", + "hidden": true + }, + "trace_report_suffix": { + "type": "string", + "fa_icon": "far calendar", + "description": "Suffix to add to the trace report filename. Default is the date and time in the format yyyy-MM-dd_HH-mm-ss.", + "hidden": true + }, + "help": { + "type": [ + "boolean", + "string" + ], + "description": "Display the help message." + }, + "help_full": { + "type": "boolean", + "description": "Display the full detailed help message." + }, + "show_hidden": { + "type": "boolean", + "description": "Display hidden parameters in the help message (only works when --help or --help_full are provided)." + } + } + } + }, + "allOf": [ + { + "$ref": "#/$defs/input_output_options" + }, + { + "$ref": "#/$defs/reference_genome_options" + }, + { + "$ref": "#/$defs/institutional_config_options" + }, + { + "$ref": "#/$defs/generic_options" + } + ] +} diff --git a/workflows/biodivpipeline.nf b/workflows/biodivpipeline.nf new file mode 100644 index 0000000..196a5bd --- /dev/null +++ b/workflows/biodivpipeline.nf @@ -0,0 +1,112 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + IMPORT MODULES / SUBWORKFLOWS / FUNCTIONS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +include { COLUMN_STANDARDISE } from '../modules/local/column_standardise/main' +include { BIODIV_ANNOTATE } from '../modules/local/biodiv_annotate/main' +include { TAXONOMY_CLASSIFY } from '../modules/local/taxonomy_classify/main' +include { OUTLIER_DETECT } from '../modules/local/outlier_detect/main' +include { PROVISIONAL_CONCEPTS } from '../modules/local/provisional_concepts/main' +include { RDF_TRANSFORM } from '../modules/local/rdf_transform/main' +include { COLLECT_REPORTS } from '../modules/local/collect_reports/main' +include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + RUN MAIN WORKFLOW +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +workflow BIODIVPIPELINE { + + take: + ch_input // channel: path to input CSV file + ch_schema // channel: path to RDF mapping schema (JSON-LD or Turtle) + outdir + + main: + + def ch_versions = channel.empty() + + // + // STEP 1: Column Standardisation (WP6) + // Map heterogeneous CSV headers to ABCD standard terms + // + COLUMN_STANDARDISE( ch_input ) + ch_versions = ch_versions.mix(COLUMN_STANDARDISE.out.versions) + + def ch_standardised = COLUMN_STANDARDISE.out.csv + + // + // STEP 2: Parallel processing β€” Annotation, Taxonomy, Outlier Detection + // These three modules run concurrently on the standardised data + // + + // WP2: BiodivPortal Annotator + BIODIV_ANNOTATE( ch_standardised ) + ch_versions = ch_versions.mix(BIODIV_ANNOTATE.out.versions) + + // WP3: Land Taxonomy Classifier + TAXONOMY_CLASSIFY( ch_standardised ) + ch_versions = ch_versions.mix(TAXONOMY_CLASSIFY.out.versions) + + // WP4: Outlier & Data-Quality Detection + OUTLIER_DETECT( ch_standardised ) + ch_versions = ch_versions.mix(OUTLIER_DETECT.out.versions) + + // + // STEP 3: Provisional Concept Registration (WP5) + // Runs after Annotator β€” picks up unresolved terms + // + PROVISIONAL_CONCEPTS( BIODIV_ANNOTATE.out.unresolved ) + ch_versions = ch_versions.mix(PROVISIONAL_CONCEPTS.out.versions) + + // + // STEP 4: RDF Transformation (WP7) + // Combines cleaned data + annotations + taxonomy + expert mapping schema + // + RDF_TRANSFORM( + ch_standardised, + BIODIV_ANNOTATE.out.annotations, + TAXONOMY_CLASSIFY.out.resolved, + ch_schema + ) + ch_versions = ch_versions.mix(RDF_TRANSFORM.out.versions) + + // + // STEP 5: Collect all reports into a pipeline summary + // + COLLECT_REPORTS( + OUTLIER_DETECT.out.report, + RDF_TRANSFORM.out.report, + COLUMN_STANDARDISE.out.mapping, + PROVISIONAL_CONCEPTS.out.concepts + ) + + // + // Collate software versions + // + softwareVersionsToYAML(ch_versions) + .collectFile( + storeDir: "${outdir}/pipeline_info", + name: 'biodivpipeline_software_versions.yml', + sort: true, + newLine: true + ) + + emit: + rdf_turtle = RDF_TRANSFORM.out.rdf_turtle // channel: path to Turtle RDF output + rdf_jsonld = RDF_TRANSFORM.out.rdf_jsonld // channel: path to JSON-LD RDF output + quality = OUTLIER_DETECT.out.report // channel: path to quality report + flagged = OUTLIER_DETECT.out.flagged // channel: path to flagged records + taxonomy = TAXONOMY_CLASSIFY.out.resolved // channel: path to resolved taxonomy + summary = COLLECT_REPORTS.out.summary // channel: path to pipeline summary + versions = ch_versions // channel: [ path(versions.yml) ] +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + THE END +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ From 957c6138193a01933bd4d0fb0089e65a44cdbb87 Mon Sep 17 00:00:00 2001 From: Pritom Mitchell Rodrigues Date: Mon, 4 May 2026 13:44:20 +0200 Subject: [PATCH 4/9] refactor: strip genomics defaults, adapt for biodiversity CSV input - Remove FASTQC/MultiQC module references from workflow - Replace samplesheet parsing with direct CSV file channel - Remove genome/igenomes/fasta parameter references - Update PIPELINE_INITIALISATION to validate CSV input - Replace validateInputSamplesheet with validateInputParameters - Update modules.config: per-module publishDir for our 7 modules - Update test.config: point to test_data/sample.csv --- README.md | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 044dda7..f8693d0 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,108 @@ -# BiodivPipeline -A Modular nf-core Workflow for FAIR Biodiversity Data Processing +

    + + + nf-core/biodivpipeline + +

    + +[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/biodivpipeline) +[![GitHub Actions CI Status](https://github.com/nf-core/biodivpipeline/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/biodivpipeline/actions/workflows/nf-test.yml) +[![GitHub Actions Linting Status](https://github.com/nf-core/biodivpipeline/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/biodivpipeline/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/biodivpipeline/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) +[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) + +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.10.4-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-4.0.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.0.2) +[![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 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/biodivpipeline) + +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23biodivpipeline-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/biodivpipeline)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) + +## Introduction + +**nf-core/biodivpipeline** is a bioinformatics pipeline that ... + + + + +1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) + +## Usage + +> [!NOTE] +> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/get_started/environment_setup/overview) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/get_started/run-your-first-pipeline) with `-profile test` before running the workflow on actual data. + + + +Now, you can run the pipeline using: + + + +```bash +nextflow run nf-core/biodivpipeline \ + -profile \ + --input samplesheet.csv \ + --outdir +``` + +> [!WARNING] +> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/running/run-pipelines#using-parameter-files). + +For more details and further functionality, please refer to the [usage documentation](https://nf-co.re/biodivpipeline/usage) and the [parameter documentation](https://nf-co.re/biodivpipeline/parameters). + +## Pipeline output + +To see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/biodivpipeline/results) tab on the nf-core website pipeline page. +For more details about the output files and reports, please refer to the +[output documentation](https://nf-co.re/biodivpipeline/output). + +## Credits + +nf-core/biodivpipeline was originally written by SPST Team. + +We thank the following people for their extensive assistance in the development of this pipeline: + + + +## Contributions and Support + +If you would like to contribute to this pipeline, please see the [contributing guidelines](docs/CONTRIBUTING.md). + +For further information or help, don't hesitate to get in touch on the [Slack `#biodivpipeline` channel](https://nfcore.slack.com/channels/biodivpipeline) (you can join with [this invite](https://nf-co.re/join/slack)). + +## Citations + + + + + + +An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. + +You can cite the `nf-core` publication as follows: + +> **The nf-core framework for community-curated bioinformatics pipelines.** +> +> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. +> +> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). From 437f75c30c81f849e318c289401dc212c3253649 Mon Sep 17 00:00:00 2001 From: Pritom Mitchell Rodrigues Date: Mon, 4 May 2026 13:44:31 +0200 Subject: [PATCH 5/9] test: add test dataset, stub service, and default mapping schema - test_data/sample.csv: 109 records sampled from BELEGE_aus_D (every 1000th row) - modules/stubs/: FastAPI mock service for end-to-end testing - Dockerfile + stub_service.py (POST /process, GET /health) - assets/default_mapping.jsonld: stub DwC RDF mapping schema - Maps BGBM CSV columns to Darwin Core terms Pipeline runs end-to-end with: nextflow run main.nf -profile test --- assets/default_mapping.jsonld | 24 ++++ assets/email_template.html | 113 +++++++++++++++++++ assets/email_template.txt | 39 +++++++ assets/methods_description_template.yml | 29 +++++ assets/multiqc_config.yml | 15 +++ assets/nf-core-biodivpipeline_logo_light.png | Bin 0 -> 97184 bytes assets/samplesheet.csv | 3 + assets/schema_input.json | 33 ++++++ assets/sendmail_template.txt | 53 +++++++++ modules/stubs/Dockerfile | 5 + modules/stubs/stub_service.py | 21 ++++ test_data/sample.csv | 110 ++++++++++++++++++ 12 files changed, 445 insertions(+) create mode 100644 assets/default_mapping.jsonld create mode 100644 assets/email_template.html create mode 100644 assets/email_template.txt create mode 100644 assets/methods_description_template.yml create mode 100644 assets/multiqc_config.yml create mode 100644 assets/nf-core-biodivpipeline_logo_light.png create mode 100644 assets/samplesheet.csv create mode 100644 assets/schema_input.json create mode 100644 assets/sendmail_template.txt create mode 100644 modules/stubs/Dockerfile create mode 100644 modules/stubs/stub_service.py create mode 100644 test_data/sample.csv diff --git a/assets/default_mapping.jsonld b/assets/default_mapping.jsonld new file mode 100644 index 0000000..563f042 --- /dev/null +++ b/assets/default_mapping.jsonld @@ -0,0 +1,24 @@ +{ + "@context": { + "dwc": "http://rs.tdwg.org/dwc/terms/", + "dcterms": "http://purl.org/dc/terms/", + "abcd": "http://www.tdwg.org/schemas/abcd/2.06/", + "schema": "http://schema.org/" + }, + "@type": "MappingSchema", + "name": "Default BiodivPipeline Mapping (Stub)", + "description": "Placeholder mapping schema. Replace with expert-crafted schema from WP8 Schema Editor UI.", + "mappings": [ + {"source": "HerbariumID", "target": "dwc:catalogNumber"}, + {"source": "Family", "target": "dwc:family"}, + {"source": "FullNameCache", "target": "dwc:scientificName"}, + {"source": "Genus", "target": "dwc:genus"}, + {"source": "Sammlerteam", "target": "dwc:recordedBy"}, + {"source": "Sammelnummer", "target": "dwc:recordNumber"}, + {"source": "CollectionDateBegin","target": "dwc:eventDate"}, + {"source": "Country", "target": "dwc:country"}, + {"source": "Locality", "target": "dwc:locality"}, + {"source": "Latitude", "target": "dwc:decimalLatitude"}, + {"source": "Longitude", "target": "dwc:decimalLongitude"} + ] +} diff --git a/assets/email_template.html b/assets/email_template.html new file mode 100644 index 0000000..9f7d7ee --- /dev/null +++ b/assets/email_template.html @@ -0,0 +1,113 @@ + + + + + + + + nf-core/biodivpipeline Pipeline Report + + +
    + + +

    nf-core/biodivpipeline ${version}

    +

    Run Name: $runName

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

    nf-core/biodivpipeline execution completed unsuccessfully!

    +

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

    +

    The full error message was:

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

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

    +

    The command used to launch the workflow was as follows:

    +
    +$commandLine
    + +

    Pipeline Configuration:

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

    nf-core/biodivpipeline

    +

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

    +
    + + diff --git a/assets/email_template.txt b/assets/email_template.txt new file mode 100644 index 0000000..13ba4c5 --- /dev/null +++ b/assets/email_template.txt @@ -0,0 +1,39 @@ +---------------------------------------------------- + ,--./,-. + ___ __ __ __ ___ /,-._.--~\\ + |\\ | |__ __ / ` / \\ |__) |__ } { + | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, + `._,._,' + nf-core/biodivpipeline ${version} +---------------------------------------------------- +Run Name: $runName + +<% if (success){ + out << "## nf-core/biodivpipeline execution completed successfully! ##" +} else { + out << """#################################################### +## nf-core/biodivpipeline execution completed unsuccessfully! ## +#################################################### +The exit status of the task that caused the workflow execution to fail was: $exitStatus. +The full error message was: + +${errorReport} +""" +} %> + + +The workflow was completed at $dateComplete (duration: $duration) + +The command used to launch the workflow was as follows: + + $commandLine + + + +Pipeline Configuration: +----------------------- +<% out << summary.collect{ k,v -> " - $k: $v" }.join("\n") %> + +-- +nf-core/biodivpipeline +https://github.com/nf-core/biodivpipeline diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml new file mode 100644 index 0000000..e186a11 --- /dev/null +++ b/assets/methods_description_template.yml @@ -0,0 +1,29 @@ +id: "nf-core-biodivpipeline-methods-description" +description: "Suggested text and references to use when describing pipeline usage within the methods section of a publication." +section_name: "nf-core/biodivpipeline Methods Description" +section_href: "https://github.com/nf-core/biodivpipeline" +plot_type: "html" +## TODO nf-core: Update the HTML below to your preferred methods description, e.g. add publication citation for this pipeline +## You inject any metadata in the Nextflow '${workflow}' object +data: | +

    Methods

    +

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

    +

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

    +
    ${workflow.commandLine}
    +

    ${tool_citations}

    +

    References

    +
      +
    • Di Tommaso, P., Chatzou, M., Floden, E. W., Barja, P. P., Palumbo, E., & Notredame, C. (2017). Nextflow enables reproducible computational workflows. Nature Biotechnology, 35(4), 316-319. doi: 10.1038/nbt.3820
    • +
    • Ewels, P. A., Peltzer, A., Fillinger, S., Patel, H., Alneberg, J., Wilm, A., Garcia, M. U., Di Tommaso, P., & Nahnsen, S. (2020). The nf-core framework for community-curated bioinformatics pipelines. Nature Biotechnology, 38(3), 276-278. doi: 10.1038/s41587-020-0439-x
    • +
    • GrΓΌning, B., Dale, R., SjΓΆdin, A., Chapman, B. A., Rowe, J., Tomkins-Tinch, C. H., Valieris, R., KΓΆster, J., & Bioconda Team. (2018). Bioconda: sustainable and comprehensive software distribution for the life sciences. Nature Methods, 15(7), 475–476. doi: 10.1038/s41592-018-0046-7
    • +
    • da Veiga Leprevost, F., GrΓΌning, B. A., Alves Aflitos, S., RΓΆst, H. L., Uszkoreit, J., Barsnes, H., Vaudel, M., Moreno, P., Gatto, L., Weber, J., Bai, M., Jimenez, R. C., Sachsenberg, T., Pfeuffer, J., Vera Alvarez, R., Griss, J., Nesvizhskii, A. I., & Perez-Riverol, Y. (2017). BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics (Oxford, England), 33(16), 2580–2582. doi: 10.1093/bioinformatics/btx192
    • + ${tool_bibliography} +
    +
    +
    Notes:
    +
      + ${nodoi_text} +
    • The command above does not include parameters contained in any configs or profiles that may have been used. Ensure the config file is also uploaded with your publication!
    • +
    • You should also cite all software used within this run. Check the "Software Versions" of this report to get version information.
    • +
    +
    diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml new file mode 100644 index 0000000..e8c0d03 --- /dev/null +++ b/assets/multiqc_config.yml @@ -0,0 +1,15 @@ +report_comment: > + This report has been generated by the nf-core/biodivpipeline + analysis pipeline. For information about how to interpret these results, please see the + documentation. +report_section_order: + "nf-core-biodivpipeline-methods-description": + order: -1000 + software_versions: + order: -1001 + "nf-core-biodivpipeline-summary": + order: -1002 + +export_plots: true + +disable_version_detection: true diff --git a/assets/nf-core-biodivpipeline_logo_light.png b/assets/nf-core-biodivpipeline_logo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..01e82e0399674d48eda13250e463d8d3943f894e GIT binary patch literal 97184 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ÊTaLsf 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

    Hs-ZL0ZSU1 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 +Content-Disposition: inline; filename="nf-core-biodivpipeline_logo_light.png" + +<% out << new File("$projectDir/assets/nf-core-biodivpipeline_logo_light.png"). + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' ) %> + +<% +if (mqcFile){ +def mqcFileObj = new File("$mqcFile") +if (mqcFileObj.length() < mqcMaxSize){ +out << """ +--nfcoremimeboundary +Content-Type: text/html; name=\"multiqc_report\" +Content-Transfer-Encoding: base64 +Content-ID: +Content-Disposition: attachment; filename=\"${mqcFileObj.getName()}\" + +${mqcFileObj. + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' )} +""" +}} +%> + +--nfcoremimeboundary-- diff --git a/modules/stubs/Dockerfile b/modules/stubs/Dockerfile new file mode 100644 index 0000000..617cfad --- /dev/null +++ b/modules/stubs/Dockerfile @@ -0,0 +1,5 @@ +FROM python:3.11-slim +RUN pip install fastapi uvicorn +COPY stub_service.py /app/stub_service.py +WORKDIR /app +CMD ["uvicorn", "stub_service:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/modules/stubs/stub_service.py b/modules/stubs/stub_service.py new file mode 100644 index 0000000..a8b0d34 --- /dev/null +++ b/modules/stubs/stub_service.py @@ -0,0 +1,21 @@ +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + +class ProcessRequest(BaseModel): + records: list[dict] + module: str = "generic" + +@app.post("/process") +async def process(req: ProcessRequest): + return { + "module": req.module, + "status": "stub", + "records_received": len(req.records), + "results": [{"id": r.get("HerbariumID", "unknown"), "processed": False} for r in req.records] + } + +@app.get("/health") +async def health(): + return {"status": "ok"} diff --git a/test_data/sample.csv b/test_data/sample.csv new file mode 100644 index 0000000..96c5459 --- /dev/null +++ b/test_data/sample.csv @@ -0,0 +1,110 @@ +ο»Ώ"HerbariumID","Bild","DB","Family","FullNameCache","Anmerkungen","Sammlerteam","Sammelnummer","CollectionDateBegin","CollectionDateEnd","Country","Locality","TitelEtikett","Expeditionsangabe","ShowOnMap","Latitude","Longitude","FundortUNdOeko","NameCache","Genus","Identifier","Barcode","StableURI" +"B100064379","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100064379/manifest.json","JACQ","BORAGINACEAE","Echium vulgare L.","MTB: 8434/1","Willing,R. & Willing,E.","15898 D","2001-08-07","","Germany","Lkr. Bad-TΓΆlz-Wolfratshausen, W Vorderriß","","","https://www.openstreetmap.org/?mlat=47.5428&mlon=11.3556#map=15/47.5428/11.3556",47.542781829833984,11.355560302734375,"","Echium vulgare","Echium","E.Willing","B 10 0064379","https://herbarium.bgbm.org/object/B100064379" +"B100094552","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100094552/manifest.json","JACQ","ASTERACEAE","Hieracium L.","","unclear","","","","Germany","","","","","","","","Hieracium","Hieracium","","B 10 0094552","https://herbarium.bgbm.org/object/B100094552" +"B100132913","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100132913/manifest.json","BGBM","CHENOPODIACEAE","Atriplex laciniata L.","GBOL, Blattmaterial entnommen; Georeferenzierung nachtrΓ€glich","Kuhbier,M.H.","s. n.","1995-08-21","","Germany","Germany: Niedersachsen, Memmert, auf dem Sandstrand westl. des Hauses. 21.08.1995, Leg.: M. H. Kuhbier s. n. ex herb. / ded. : ex Herbarium BREM.","","","https://www.openstreetmap.org/?mlat=53.6386&mlon=6.86639#map=15/53.6386/6.86639",53.63861083984375,6.866390228271484,"Germany: Niedersachsen, Memmert, auf dem Sandstrand westl. des Hauses.","Atriplex laciniata","Atriplex","R. Hand","B 10 0132913","https://herbarium.bgbm.org/object/B100132913" +"B100198478","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100198478/manifest.json","HERB","Cupressaceae","Juniperus communis","Label data transcribed during a Herbonauten mission","R. Gross","","1926-09-01","1926-09-30","Germany","Germany: Berlin. Karlshorst. im Walde. 1926-09-01 - 1926-09-30, Leg.: R. Gross.","","","https://www.openstreetmap.org/?mlat=52.4739&mlon=13.5136#map=15/52.4739/13.5136",52.47394561767578,13.513612747192383,"","Juniperus communis","Juniperus","","B 10 0198478","http://herbarium.bgbm.org/object/B100198478" +"B100263237","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100263237/manifest.json","BGBM","COMPOSITAE","Serratula tinctoria L.","","BornmΓΌller,J.F.N.","","1882-07","","Germany","Germany: Potsdam in sicris. 07.1882, Leg.: J. F. N. BornmΓΌller s.n.","e flora marihica","","","","","Germany: Potsdam in sicris.","Serratula tinctoria","Serratula","","B 10 0263237","https://herbarium.bgbm.org/object/B100263237" +"B100325691","","JACQ","SCROPHULARIACEAE","Veronica austriaca subsp. dentata (F. W. Schmidt) Watzl","cult. In horto Diersch","BornmΓΌller,J.","s.n.","1892-05-16","","Germany","Weimar.","","","","","","","Veronica austriaca subsp. dentata","Veronica","B. M. Rojas AndrΓ©s (SALA) 2016","B 10 0325691","https://herbarium.bgbm.org/object/B100325691" +"B100340892","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100340892/manifest.json","BGBM","ROSACEAE","Potentilla argentea L.","","Ristow,M.","476/08","2008-05-29","","Germany","Germany: Brandenburg. MΓ€rkische Schweiz, E nahe der Bahn ca 1 km N Bahnhof MΓΌncheberg, Mtb 3450/41. Ackerrand. Alt.: 50m. 29.05.2008, Leg.: M. Ristow 476/08.","","","https://www.openstreetmap.org/?mlat=52.5339&mlon=14.0944#map=15/52.5339/14.0944",52.53388977050781,14.094440460205078,"Germany: Brandenburg. MΓ€rkische Schweiz, E nahe der Bahn ca 1 km N Bahnhof MΓΌncheberg, Mtb 3450/41. Ackerrand.","Potentilla argentea","Potentilla","","B 10 0340892","https://herbarium.bgbm.org/object/B100340892" +"B100379250","","JACQ","POACEAE","Triticum monococcum subsp. monococcum L.","Herbar Roman Schulz acc.1945","Schulz,O. & Schulz,R.","s.n.","1897-08-11","","Germany","Berlin, kultiviert","","","","","","","","Triticum","M. W. van Slageren 2017-02-23","B 10 0379250","https://herbarium.bgbm.org/object/B100379250" +"B100463293","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100463293/manifest.json","JACQ","AMARANTHACEAE","Amaranthus powellii S. Watson","GBOL750, Silikaprobe genommen, nur 1 Exemplar beprobt","Ciongwa,P.","PC 67","2013-09-08","","Germany","Niedersachsen, Northeim, Ortslage Northeim, Alt.: 130 m.","","","https://www.openstreetmap.org/?mlat=51.7081&mlon=9.99556#map=15/51.7081/9.99556",51.70806121826172,9.995559692382812,"","Amaranthus powellii","Amaranthus","T. Raus, R. Hand & M. Ristow","B 10 0463293","https://herbarium.bgbm.org/object/B100463293" +"B100505084","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100505084/manifest.json","HERB","Potamogetonaceae","Potamogeton pusillus","Label data transcribed during a Herbonauten mission","Herrenkohl","863","","","Germany","Germany: Nordrhein-Westfalen. GrΓ€ben der Schottheide bei Cleve. Leg.: Herrenkohl 863.","","","https://www.openstreetmap.org/?mlat=51.7723&mlon=6.06548#map=15/51.7723/6.06548",51.77230453491211,6.065483093261719,"","Potamogeton pusillus","Potamogeton","","B 10 0505084","http://herbarium.bgbm.org/object/B100505084" +"B100535271","","JACQ","POACEAE","Triticum aestivum subsp. spelta (L.) Thell.","Sheet 1 of 2 B 10 0537542","Hohenacker","118","","","Germany","cult.","","","","","","Rother Sommerspelz. Rother Sommerdinkel.","Triticum aestivum subsp. spelta","Triticum","M. W. van Slageren 24.1.2017","B 10 0535271","https://herbarium.bgbm.org/object/B100535271" +"B100553784","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100553784/manifest.json","BGBM","CYPERACEAE","Carex divulsa Stokes","GBOL1146, Silikaprobe genommen, nur 1 Exemplar beprobt","Mause,R.","76","2013-07-02","","Germany","Germany: Nordrhein-Westfalen. Bonn, Nussallee. 02.07.2013, Leg.: R. Mause 76.","","","https://www.openstreetmap.org/?mlat=50.7258&mlon=7.09028#map=15/50.7258/7.09028",50.725830078125,7.090280055999756,"Germany: Nordrhein-Westfalen. Bonn, Nussallee.","Carex divulsa","Carex","R. Mause","B 10 0553784","https://herbarium.bgbm.org/object/B100553784" +"B100582909","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100582909/manifest.json","JACQ","CYPERACEAE","Carex praecox Schreb.","MTB: 4239/2/1/4","Willing,R. & Willing,E.","28469 D","2014-04-29","","Germany","Sachsen-Anhalt, SO TΓΆrten","","","https://www.openstreetmap.org/?mlat=51.7847&mlon=12.2744#map=15/51.7847/12.2744",51.78472137451172,12.274439811706543,"","Carex praecox","Carex","E.Willing","B 10 0582909","https://herbarium.bgbm.org/object/B100582909" +"B100586917","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100586917/manifest.json","JACQ","AMARANTHACEAE","Amaranthus powellii S. Watson","MTB: 4139/3/4/2","Willing,R. & Willing,E.","29581 D","2014-08-31","","Germany","Sachsen-Anhalt, Dessau-SΓΌd","","","https://www.openstreetmap.org/?mlat=51.8175&mlon=12.2428#map=15/51.8175/12.2428",51.817501068115234,12.242779731750488,"","Amaranthus powellii","Amaranthus","E.Willing","B 10 0586917","https://herbarium.bgbm.org/object/B100586917" +"B100612470","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100612470/manifest.json","BGBM","CARYOPHYLLACEAE","Lychnis flos-cuculi L. subsp. flos-cuculi","","Zippel,E.","13191","2013-06-21","","Germany","Germany: Sachsen. SΓ€chsische Schweiz-Osterzgebirge, Altenberg, B170, Schwarzwasserwiese zwischen Zinnwald-Georgenfeld - Altenberg. Borstgrasrasen. Alt.: 785 m. 21.06.2013, Leg.: E. Zippel 13191.","","","https://www.openstreetmap.org/?mlat=50.7594&mlon=13.7531#map=15/50.7594/13.7531",50.75944900512695,13.753060340881348,"Germany: Sachsen. SΓ€chsische Schweiz-Osterzgebirge, Altenberg, B170, Schwarzwasserwiese zwischen Zinnwald-Georgenfeld - Altenberg. Borstgrasrasen.","Lychnis flos-cuculi subsp. flos-cuculi","Lychnis","E. Zippel","B 10 0612470","https://herbarium.bgbm.org/object/B100612470" +"B100628509","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100628509/manifest.json","BGBM","COMPOSITAE","Galinsoga parviflora Cav.","GBOL2180, Silikaprobe genommen","Testroet,P.","s.n.","2014-07-24","","Germany","Germany: Nordrhein-Westfalen. Meckenheim, Stadtgebiet. an einer Kreuzung. 24.07.2014, Leg.: P. Testroet s.n. ex herb. / ded. : herb. Philip Testroet.","","","https://www.openstreetmap.org/?mlat=50.6306&mlon=7.02556#map=15/50.6306/7.02556",50.630550384521484,7.025559902191162,"Germany: Nordrhein-Westfalen. Meckenheim, Stadtgebiet. an einer Kreuzung.","Galinsoga parviflora","Galinsoga","P. Testroet","B 10 0628509","https://herbarium.bgbm.org/object/B100628509" +"B100655266","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100655266/manifest.json","HERB","Chenopodiaceae","Polycnemum arvense","Label data transcribed during a Herbonauten mission","","","","","Germany","Germany: Sachsen-Anhalt. CrΓΆllwitz nach Lieskau zu.","","","https://www.openstreetmap.org/?mlat=51.5114&mlon=11.9221#map=15/51.5114/11.9221",51.51139831542969,11.922100067138672,"","Polycnemum arvense","Polycnemum","","B 10 0655266","http://herbarium.bgbm.org/object/B100655266" +"B100682266","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100682266/manifest.json","JACQ","ASTERACEAE","Hieracium murorum L.","MTB: 4433/2/4","Willing,R. & Willing,E.","29350 D","2014-08-11","","Germany","Sachsen-Anhalt, SO Wippra","","","https://www.openstreetmap.org/?mlat=51.5683&mlon=11.2967#map=15/51.5683/11.2967",51.568328857421875,11.296669960021973,"","Hieracium murorum","Hieracium","G. Gottschlich","B 10 0682266","https://herbarium.bgbm.org/object/B100682266" +"B100699347","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100699347/manifest.json","HERB","Chenopodiaceae","Chenopodium polyspermum","Label data transcribed during a Herbonauten mission","Fritz Hans","","1972-09-06","1972-09-06","Germany","Germany: Brandenburg. Karlshof, Krs. Bad Freienwalde, Vorgarten. 1972-09-06, Leg.: Fritz Hans.","","","https://www.openstreetmap.org/?mlat=52.7473&mlon=14.2615#map=15/52.7473/14.2615",52.74729919433594,14.261500358581543,"","Chenopodium polyspermum","Chenopodium","M. Ristow","B 10 0699347","http://herbarium.bgbm.org/object/B100699347" +"B100705423","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100705423/manifest.json","BGBM","LEGUMINOSAE-PAPILIONOIDEAE","Ononis repens subsp. procurrens (Wallr.) Bonnier & Layens","GBOL4172, Silikaprobe genommen, Aufsammlung von einem Individuum","Hand,R. & Niederbichler,C.","RH 7787","2016-07-30","","Germany","Germany: Bayern. Reichersbeuern, am Bahnhof. gemΓ€htes GrΓΌnland. Alt.: 723m. 30.07.2016, Leg.: R. Hand & C. Niederbichler RH 7787.","","","https://www.openstreetmap.org/?mlat=47.7744&mlon=11.6353#map=15/47.7744/11.6353",47.77444076538086,11.635279655456543,"Germany: Bayern. Reichersbeuern, am Bahnhof. gemΓ€htes GrΓΌnland.","Ononis repens subsp. procurrens","Ononis","R. Hand","B 10 0705423","https://herbarium.bgbm.org/object/B100705423" +"B100733887","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100733887/manifest.json","JACQ","FABACEAE","Trifolium medium L.","","Willing,E.","30379 D","2016-07-22","","Germany","Sachsen-Anhalt, LK Wittenberg, OSO Goltewitz, GK 4530896 /5739474 Photo","","","https://www.openstreetmap.org/?mlat=51.7883&mlon=12.4461#map=15/51.7883/12.4461",51.788330078125,12.446109771728516,"","Trifolium medium","Trifolium","E. Willing","B 10 0733887","https://herbarium.bgbm.org/object/B100733887" +"B100741855","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100741855/manifest.json","BGBM","CRUCIFERAE","Capsella bursa-pastoris (L.) Medik.","GBOL, Silikaprobe genommen","Mause,R.","2016-25","2016-05-26","","Germany","Germany: Nordrhein-Westfalen. sΓΌdlich Lommersdorf. Fettwiese. 26.05.2016, Leg.: R. Mause 2016-25. ex herb. / ded. : herb. RenΓ© Mause.","","","https://www.openstreetmap.org/?mlat=50.4061&mlon=6.73722#map=15/50.4061/6.73722",50.40610885620117,6.73721981048584,"Germany: Nordrhein-Westfalen. sΓΌdlich Lommersdorf. Fettwiese.","Capsella bursa-pastoris","Capsella","R. Mause","B 10 0741855","https://herbarium.bgbm.org/object/B100741855" +"B100761641","https://image.bgbm.org/images/internal/HerbarThumbs/B100761641_1700","VVis","","Campanula patula L.","Dr. Phil. Wirtgen Herbar. plant. critic., select. hybrid. Florae Rhenanae (Edit. nov.) (1753) 163. Herbar A. Ludwig IMAGE 2025 Mus. Bot. Berol. BG Botanischer Garten & BM Botanisches Museum Berlin","H. Andres","191","","","Germany",", Bergisches Land, Odental (Burg Strauweiler) bei Altenberg; c. 85 m. s. m. VΒ³ Z5.","","","","","","","Campanula patula","Campanula","","B 10 0761641","https://herbarium.bgbm.org/object/B100761641" +"B100766578","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100766578/manifest.json","HERB","BETULACEAE","Betula aurata","Label data transcribed during a Herbonauten mission","A. Ludwig","22","1931-08-06","1931-08-06","Germany","Germany: Nordrhein-Westfalen. Kr. Siegen: im Hauberg zwischen RΓΆdgen und Wilnsdorf. 1931-08-06, Leg.: A. Ludwig 22.","","","https://www.openstreetmap.org/?mlat=50.8315&mlon=8.08525#map=15/50.8315/8.08525",50.8315315246582,8.085250854492188,"","Betula aurata","Betula","","B 10 0766578","http://herbarium.bgbm.org/object/B100766578" +"B100768790","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B100768790/manifest.json","JACQ","ASTERACEAE","Senecio cacaliaster subsp. hercynicus (Herborg) Oberpr.","","Oberprieler,C. & HΓΆlzle,K.","497-6","1988-07-08","","Germany","Bayern, Landkreis OberallgΓ€u, Eschacher Wald, Weg vom Parkplatz ""Eschacher Weiher"" zur großen Schwedenschanze auf dem Ursersberg, sΓΌdgewandte Hochstaudenflur auf dem Ursersberg, Alt.: 1130m.","","","https://www.openstreetmap.org/?mlat=47.7242&mlon=10.2069#map=15/47.7242/10.2069",47.72417068481445,10.206939697265625,"","Senecio cacaliaster subsp. hercynicus","Senecio","Ch. Oberprieler","B 10 0768790","https://herbarium.bgbm.org/object/B100768790" +"B101001398","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101001398/manifest.json","HERB","Balsaminaceae","Impatiens sp.","Label data transcribed during a Herbonauten mission","H. Ristow","","1948-06-01","1948-06-30","Germany","Germany: Berlin. Spreeufer, FΓΌrstenbrunn. 1948-06-01 - 1948-06-30, Leg.: H. Ristow.","","","https://www.openstreetmap.org/?mlat=52.5287&mlon=13.2705#map=15/52.5287/13.2705",52.52872848510742,13.270454406738281,"","Impatiens sp.","Impatiens","","B 10 1001398","http://herbarium.bgbm.org/object/B101001398" +"B101012560","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101012560/manifest.json","HERB","Potamogetonaceae","Potamogeton lucens","Label data transcribed during a Herbonauten mission","O. et R. Schulz","","1895-07-09","1895-07-09","Germany","Germany: Brandenburg. AngermΓΌnde: Im Paarsteiner See in der NΓ€he des Werders. 1895-07-09, Leg.: O. et R. Schulz.","","","https://www.openstreetmap.org/?mlat=52.9574&mlon=13.9814#map=15/52.9574/13.9814",52.95737838745117,13.981390953063965,"","Potamogeton lucens","Potamogeton","","B 10 1012560","http://herbarium.bgbm.org/object/B101012560" +"B101023411","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101023411/manifest.json","BGBM","ORCHIDACEAE","Traunsteinera globosa (L.) Rchb.","GBOL, Silikaprobe genommen; beprobtes Exemplar mit * markiert","Hand,R. & Berghofer,M.","RH 9073","2018-07-07","","Germany","Germany: Bayern. Bad Reichenhall, Predigtstuhl, zwischen Seilbahnstation und Gipfel. subalpine Matte. Alt.: 1561 m. 07.07.2018, Leg.: R. Hand & M. Berghofer RH 9073.","","","https://www.openstreetmap.org/?mlat=47.6964&mlon=12.8775#map=15/47.6964/12.8775",47.696388244628906,12.8774995803833,"Germany: Bayern. Bad Reichenhall, Predigtstuhl, zwischen Seilbahnstation und Gipfel. subalpine Matte.","Traunsteinera globosa","Traunsteinera","R. Hand","B 10 1023411","https://herbarium.bgbm.org/object/B101023411" +"B101027679","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101027679/manifest.json","HERB","Cupressaceae","Thuja occidentalis","Label data transcribed during a Herbonauten mission","O. et R. Schulz","","1893-07-01","1893-07-31","Germany","Germany: Brandenburg. Chorin i/Mark: Auf dem Kirchhofe des Dorfes SenftenhΓΌtte angepflanzt. 1893-07-01 - 1893-07-31, Leg.: O. et R. Schulz.","","","https://www.openstreetmap.org/?mlat=52.9324&mlon=13.8587#map=15/52.9324/13.8587",52.932350158691406,13.85872745513916,"","Thuja occidentalis","Thuja","","B 10 1027679","http://herbarium.bgbm.org/object/B101027679" +"B101057305","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101057305/manifest.json","JACQ","SOLANACEAE","Solanum decipiens Opiz","PRN2021-013; MTB: 4140-1/2/2; GK rechts/hoch: 4528177/5750591","Willing,E.","30640 D","2019-09-12","","Germany","LK Wittenberg; NW Buro","","","https://www.openstreetmap.org/?mlat=51.8886&mlon=12.4075#map=15/51.8886/12.4075",51.88861083984375,12.407500267028809,"","Solanum decipiens","Solanum","E.Willing","B 10 1057305","https://herbarium.bgbm.org/object/B101057305" +"B101066692","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101066692/manifest.json","HERB","ACANTHACEAE","Acanthus longifolius","Label data transcribed during a Herbonauten mission","O. et R. Schulz","","1898-08-29","1898-08-29","Germany","Germany: Berlin. Berlin. 1898-08-29, Leg.: O. et R. Schulz.","","","https://www.openstreetmap.org/?mlat=52.5164&mlon=13.3899#map=15/52.5164/13.3899",52.51642990112305,13.389930725097656,"","Acanthus longifolius","Acanthus","","B 10 1066692","http://herbarium.bgbm.org/object/B101066692" +"B101077282","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101077282/manifest.json","JACQ","CRASSULACEAE","KalanchoΓ« crenata (Andrews) Haw.","Bogen 1/2","Anonymous collector","s.n.","1979-01","","Germany","Cultivated in Botanic Garden Berlin; provided by: collector; originally collected: Uganda: 2: Kigezi, 60 km nach Kabale in Richtung Kisoro, leg.: Pfennig,H. 1258, 31.8.1977","","","","","","BlΓΌten gelb, BlΓ€tter geΓΆhrt","KalanchoΓ« crenata","KalanchoΓ«","E. Raadts (B)","B 10 1077282","https://herbarium.bgbm.org/object/B101077282" +"B101132213","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101132213/manifest.json","JACQ","BETULACEAE","Betula pubescens Ehrh.","PRN2020-021","Knoph,J.-G.","s.n.","1981-06-25","","Germany","Restseen nahe Deixlfurther See","","","","","","","Betula pubescens","Betula","J.-G. Knoph","B 10 1132213","https://herbarium.bgbm.org/object/B101132213" +"B101143892","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101143892/manifest.json","JACQ","CRASSULACEAE","KalanchoΓ« delagoΓ«nsis Eckl. & Zeyh.","Gartenherbar","Cubr,M.","52601","2024-02-08","","Germany","Cultivated in Botanic Garden Berlin; provided by: Frankfurt, Palmengarten der Stadt Frankfurt; originally collected: Madagaskar, TulΓ©ar (Prov.), Manakaravavy, Ampaniky, 280 m, leg.: Anonymous s.n., s.d.","","","","","","BlΓΌtenfarbe: rosarot, Filamente: rotviolett, Antheren: hellgelb, Narbe: weiß, Griffel: weiß, BlΓ€tter hellbraun, d.braun gestrichelt, Sproß rosa","KalanchoΓ« delagoΓ«nsis","KalanchoΓ«","S. Bernhard (B) 2025-12-08","B 10 1143892","https://herbarium.bgbm.org/object/B101143892" +"B101157822","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101157822/manifest.json","JACQ","CARYOPHYLLACEAE","Dianthus deltoides L.","Herbar Melzheimer (Volker Melzheimer, 1939 – 2024 und Gertraud Melzheimer)","Melzheimer,V. & Melzheimer,G.","s.n.","1989-09-12","","Germany","Deutschland; Hessen:Wetter OT AmΓΆnau: am Treisbach","","","https://www.openstreetmap.org/?mlat=50.9089&mlon=8.69056#map=15/50.9089/8.69056",50.90888977050781,8.690560340881348,"","Dianthus deltoides","Dianthus","orig.","B 10 1157822","https://herbarium.bgbm.org/object/B101157822" +"B101171447","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101171447/manifest.json","JACQ","ROSACEAE","Sanguisorba minor subsp. balearica (Bourg. ex Nyman) MuΓ±oz Garm. & C. Navarro","PRN2021-013; MTB: 4130/4/1/1; GK rechts/hoch: 4414035/5746261","Willing,E. & Willing,R.","31912 D","2020-09-28","","Germany","SO Darlingerode","","","https://www.openstreetmap.org/?mlat=51.8436&mlon=10.7508#map=15/51.8436/10.7508",51.84360885620117,10.750829696655273,"","Sanguisorba minor subsp. balearica","Sanguisorba","E.Willing","B 10 1171447","https://herbarium.bgbm.org/object/B101171447" +"B101172459","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101172459/manifest.json","JACQ","AMARANTHACEAE","Amaranthus retroflexus L.","PRN2021-013; MTB: 4239/2/1/1","Willing,E.","30593 D","2019-08-12","","Germany","Dessau, SO TΓΆrten","","","https://www.openstreetmap.org/?mlat=51.7919&mlon=12.2656#map=15/51.7919/12.2656",51.79193878173828,12.265560150146484,"","Amaranthus retroflexus","Amaranthus","E.Willing","B 10 1172459","https://herbarium.bgbm.org/object/B101172459" +"B101185579","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101185579/manifest.json","JACQ","CRASSULACEAE","KalanchoΓ« lanceolata (Forssk.) Pers.","Aus Samen von Bally Nr. 11918, Somalia, Samen erhalten vom Jardin Bot. ""Les CΓ¨dres"", Aussaat am 10.3.1967, Samen dieser Pfl. nochmals ausgesΓ€t 1971 ?, eingelegt am 29.1.1972 ?; Chromosomen 2n= 34, 1.2.1972; Nr. 73/1, Knospen vom 29.1.72; Blatt-Material fΓΌ","Anonymous collector","s.n.","1972-01-29","","Germany","Cultivated in Botanic Garden Berlin; provided by: Jardin Bot. ""Les CΓ¨dres""; originally collected: Somalia: leg.: Bally,P.R.O. 11918, s.d.","","","","","","","KalanchoΓ« lanceolata","KalanchoΓ«","Anonymous","B 10 1185579","https://herbarium.bgbm.org/object/B101185579" +"B101199939","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101199939/manifest.json","HERB","BERBERIDACEAE","Berberis vulgaris L.","Label data transcribed during a Herbonauten mission","[BornmΓΌller]","","1945-01-01","1945-12-31","Germany","Germany: ThΓΌringen. Weimar cult. Belvedere. 1945, Leg.: [BornmΓΌller].","","","https://www.openstreetmap.org/?mlat=50.9478&mlon=11.3495#map=15/50.9478/11.3495",50.947776794433594,11.349498748779297,"","Berberis vulgaris L.","Berberis","","B 10 1199939","http://herbarium.bgbm.org/object/B101199939" +"B101213143","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101213143/manifest.json","HERB","BETULACEAE","indet.","Label data transcribed during a Herbonauten mission","J. B[ornmΓΌller]","","1945-05-30","1945-05-30","Germany","Germany: ThΓΌringen. W[eimar]. 1945-05-30, Leg.: J. B[ornmΓΌller].","","","https://www.openstreetmap.org/?mlat=50.9805&mlon=11.3276#map=15/50.9805/11.3276",50.980491638183594,11.327569007873535,"","indet.","indet.","","B 10 1213143","http://herbarium.bgbm.org/object/B101213143" +"B101231411","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101231411/manifest.json","JACQ","RHAMNACEAE","Rhamnus cathartica L.","PRN2022-045; Herbarium Hans-Christian KlΓ€ge","KlΓ€ge,H.-C.","54","2013-05-29","","Germany","KΓΌhnauer Heide, NW-Teil","","","","","","","Rhamnus cathartica","Rhamnus","anonymous","B 10 1231411","https://herbarium.bgbm.org/object/B101231411" +"B101252985","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101252985/manifest.json","JACQ","ROSACEAE","Potentilla erecta (L.) Raeusch.","PRN2022-045; Herbarium Hans-Christian KlΓ€ge","KlΓ€ge,H.-C.","22","1969-09-10","","Germany","Landkreis Dahme-Spreewald, Bergen-Weißacker Moor; MTB 4248NW4","","","","","","","Potentilla erecta","Potentilla","H. Illig","B 10 1252985","https://herbarium.bgbm.org/object/B101252985" +"B101273417","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101273417/manifest.json","JACQ","POLYGONACEAE","Rumex patientia L.","PRN2024-003; Pictures of the same individual or population as the preserved specimen(s). Photographer: Eckhard Willing","Willing,E. & Willing,R.","37573 D","2023-06-08","","Germany","S SchΓΆnhausen","","","https://www.openstreetmap.org/?mlat=52.5628&mlon=12.0306#map=15/52.5628/12.0306",52.56277847290039,12.030559539794922,"","Rumex patientia","Rumex","E. Willing","B 10 1273417","https://herbarium.bgbm.org/object/B101273417" +"B101288043","https://image.bgbm.org/images/internal/HerbarThumbs/B101288043_1700","VVis","","Pulmonaria officinalis var. obscura DΓΌmortier.","Borraginaceae Desvaux 1935 Herbar H. Herold IMAGE 2024 Mus. bot. Berol. BGBM Botanischer Garten & Botanisches Museum Berlin MUSEUM BOTANICUM BEROLINENSE Mus. Bot. Berol.","Herold,H.","","1966-03-08","","Germany","Bayern, Krumbach, Schwaben, Thannhausen, am Schloßberg","","","","","","","Pulmonaria officinalis var. obscura","Pulmonaria","","B 10 1288043","https://herbarium.bgbm.org/object/B101288043" +"B101303154","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101303154/manifest.json","JACQ","RUBIACEAE","Galium album Mill.","PRN2024-003","Willing,E. & Willing,R.","37714 D","2023-06-09","","Germany","JL, Kliezenieck","","","https://www.openstreetmap.org/?mlat=52.4714&mlon=12.0169#map=15/52.4714/12.0169",52.47138977050781,12.016940116882324,"","Galium album","Galium","E. Willing","B 10 1303154","https://herbarium.bgbm.org/object/B101303154" +"B101304167","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101304167/manifest.json","JACQ","ASTERACEAE","Tripleurospermum perforatum (MΓ©rat) M. LaΓ­nz","PRN2024-003","Willing,E. & Willing,R.","35792 D","2022-09-01","","Germany","LK Harz, SO Wegeleben","","","https://www.openstreetmap.org/?mlat=51.8642&mlon=11.1842#map=15/51.8642/11.1842",51.86417007446289,11.18416976928711,"","Tripleurospermum perforatum","Tripleurospermum","E. Willing","B 10 1304167","https://herbarium.bgbm.org/object/B101304167" +"B101306337","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101306337/manifest.json","JACQ","HYPERICACEAE","Hypericum perforatum L.","Herbarium Gregor Steinbrecher; PRN2024-006; Herbarbeleg aus der Lehrveranstaltung Exkursionen zur VegetationsΓΆkologie TU Berlin, Institut fΓΌr Γ–kologie, Dr. Birgit Seitz","Steinbrecher,Gregor","s.n.","2019-06-16","","Germany","Teufelsmoor","","","","","","","Hypericum perforatum","Hypericum","G. Steinbrecher","B 10 1306337","https://herbarium.bgbm.org/object/B101306337" +"B101309350","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101309350/manifest.json","JACQ","APIACEAE","Anthriscus sylvestris (L.) Hoffm.","PRN2024-006; Herbarbeleg aus der Lehrveranstaltung Exkursionen zur VegetationsΓΆkologie TU Berlin, Institut fΓΌr Γ–kologie, Dr. Birgit Seitz; Herbarium Valentin Fischer","Fischer,Valentin","s.n.","2015-05-31","","Germany","Lebus, Odertal Niederung","","","","","","","Anthriscus sylvestris","Anthriscus","V. Fischer","B 10 1309350","https://herbarium.bgbm.org/object/B101309350" +"B101311664","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B101311664/manifest.json","JACQ","SALICACEAE","Salix silesiaca Willd.","Herbarium Fabian Streich; PRN2024-006; Herbarbeleg aus der Lehrveranstaltung Exkursionen zur VegetationsΓΆkologie TU Berlin, Institut fΓΌr Γ–kologie, Dr. Birgit Seitz","Streich,Fabian","s.n.","2020-07-23","","Germany","NSG Odertal Frankfurt-Lebus mit Pontischen HΓ€ngen","","","","","","","Salix silesiaca","Salix","F. Streich","B 10 1311664","https://herbarium.bgbm.org/object/B101311664" +"B101322018","https://image.bgbm.org/images/internal/HerbarThumbs/B101322018_1700","VVis","","Campanula rotundifolia L.","IMAGE 2025 BG BM Botanischer Garten & Botanisches Museum Berlin HERBARIUM WILLING Mus. Bot. Berol. Mus. bot. Berol. Nr. Dat. Fam. Campanulaceae Art Ort Anm. MTB 7046/3, 2414-2440 leg.","EisenblΓ€tter,R., Willing,E.","2419 D","1995-08-10","","Germany","Bayern, Freyung-Grafenau, N Spiegelau, S-Abhang Bocksberg","","","https://www.openstreetmap.org/?mlat=58.925&mlon=13.3667#map=15/58.925/13.3667",58.92499923706055,13.366666793823242,"","Campanula rotundifolia","Campanula","","B 10 1322018","https://herbarium.bgbm.org/object/B101322018" +"B180012427","","BGBM","PINACEAE","Pinus balfouriana S.Watson","(aristata)","","","1896-08-25","","Germany","Germany: WΓΆrlitz. 25.08.[18]96.","","","","","","Germany: WΓΆrlitz.","Pinus balfouriana","Pinus","","B 18 0012427","https://herbarium.bgbm.org/object/B180012427" +"B180015736","","BGBM","COMPOSITAE","Cirsium oleraceum (L.) Scop.","","DΓΌrbye,T., Henneken,I. & Wiechert","DÜR 2591","1993-08-12","","Germany","Germany: Brandenburg, Havelland (Kreis), Falkensee, Nieder-Neuendorfer Kanal. Kanalrand. 12.8.1993, Leg.: T. DΓΌrbye, I. Henneken & Wiechert DÜR 2591.","","","","","","Germany: Brandenburg, Havelland (Kreis), Falkensee, Nieder-Neuendorfer Kanal. Kanalrand.","Cirsium oleraceum","Cirsium","T. Raus","B 18 0015736","https://herbarium.bgbm.org/object/B180015736" +"B180018140","","BGBM","UMBELLIFERAE","Heracleum sphondylium L.","","Schwarz","s.n.","","","Germany","Germany: Niedersachsen, Solling. Alt.: 240 m. Leg.: Schwarz s.n.","","","","","","Germany: Niedersachsen, Solling.","Heracleum sphondylium","Heracleum","","B 18 0018140","https://herbarium.bgbm.org/object/B180018140" +"B180020723","","BGBM","CARYOPHYLLACEAE","Dianthus superbus L.","","Auhagen","","1987-07-03","","Germany","Germany: Berlin, Spandauer Forst, Eiskeller. 03.07.1987, Leg.: Auhagen s.n.","","","","","","Germany: Berlin, Spandauer Forst, Eiskeller.","Dianthus superbus","Dianthus","","B 18 0020723","https://herbarium.bgbm.org/object/B180020723" +"B200127101","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B200127101/manifest.json","JACQ","EQUISETACEAE","Equisetum palustre L.","MTB: 3144/3","Willing,R. & Willing,E.","1641 D","1994-10-02","","Germany","Brandenburg, S Beetz","","","https://www.openstreetmap.org/?mlat=52.8083&mlon=13.0167#map=15/52.8083/13.0167",52.80833053588867,13.016670227050781,"","Equisetum palustre","Equisetum","E.Willing","B 20 0127101","https://herbarium.bgbm.org/object/B200127101" +"B200173340","https://image.bgbm.org/images/internal/HerbarThumbs/B200173340_1700","VVis","","Asplenium ruta-muraria","IMAGE 2025 Mus. Bot. Berol. BG Botanischer Garten & BM Botanisches Museum Berlin","","","2001-08-22","","Germany","ThΓΌringen, MΓΌhlhausen, Divi Blasii - Kirche untere Mauer Frontseite","","","","","","","Asplenium ruta-muraria","Asplenium","","B 20 0173340","https://herbarium.bgbm.org/object/B200173340" +"B200184258","https://image.bgbm.org/images/internal/HerbarThumbs/B200184258_1700","VVis","","Woodsia ilvensis","Herb. D. E. Meyer No... 919... Museum botanicum Berolinense eingel. Herb. D. E. Meyer No... 978... Museum botanicum Berolinense (Kassel) Mus. Bot. Berol. Mus. bot. Berol. BG BM Botanischer Garten & Botanisches Museum Berlin","Meyer,D.","919, 978","1958-06-04","","Germany","Berlin, , Hort. Bot. Berol. (von Kassel)","","","","","","Spor. Spont.","Woodsia ilvensis","Woodsia","D. Meyer.","B 20 0184258","https://herbarium.bgbm.org/object/B200184258" +"B200226315","https://image.bgbm.org/images/internal/HerbarThumbs/B200226315_1700","VVis","","Athyrium Filix-femina L.","Mus. Bot. Berol. IMAGE 2025 [MULTIPLE BARCODES] Herbarium des Instituts fΓΌr Spezielle Botanik der Humboldt-UniversitΓ€t zu Berlin Flora Dahme Grenzgraben det. Bm 430/62 10 EX BHU Flora von Brandenburg Herberium M. Schmattorsch Mus. bot. Berol. BGBM Botanischer Garten & Botanisches Museum Berlin","Schmattorsch","","1950-10-04","","Germany","Brandenburg, , Dahme Grenzgraben bis Jg. 15 des KΓ€mmerforst gegen Osten","","","","","","sehr schlank imnissinvoll","Athyrium Filix-femina","Athyrium","Herbarium M. Schmattorsch","B 20 0226315","https://herbarium.bgbm.org/object/B200226315" +"B300312284","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B300312284/manifest.json","HERB","keine","Rhynchostegium riparioides","Label data transcribed during a Herbonauten mission","Frahm","","1970-10-30","1970-10-30","Germany","Germany: Hamburg. NSG Heuckenlock bei Stillhorn/SΓΌderelbe; an der Basis von Pop. nigra im Hochwasserbereich; Schwarzpappelauenwald; ungewΓΆhnl., robuste, rund bebl, etwas sparrige fo. 1970-10-30, Leg.: Frahm.","","","https://www.openstreetmap.org/?mlat=53.4732&mlon=10.0394#map=15/53.4732/10.0394",53.473201751708984,10.039400100708008,"","Rhynchostegium riparioides","Rhynchostegium","","B 30 0312284","http://herbarium.bgbm.org/object/B300312284" +"B300316594","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B300316594/manifest.json","HERB","!indet.","Pottia intermedia","Label data transcribed during a Herbonauten mission","Frahm","","2008-03-27","2008-03-27","Germany","Germany: Rheinland-Pfalz. WΓΆllstatt. 2008-03-27, Leg.: Frahm.","","","https://www.openstreetmap.org/?mlat=49.8064&mlon=7.9441#map=15/49.8064/7.9441",49.806400299072266,7.9440999031066895,"","Pottia intermedia","Pottia","","B 30 0316594","http://herbarium.bgbm.org/object/B300316594" +"B300322072","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B300322072/manifest.json","HERB","Orthotrichaceae","Orthotrichum stramineum","Label data transcribed during a Herbonauten mission","Fr.","","1965-07-23","1965-07-23","Germany","Germany: Niedersachsen. Kr. Soltau, am Waldrand im NSG LΓΌneburger Heide. 1965-07-23, Leg.: Fr.","","","https://www.openstreetmap.org/?mlat=53.1205&mlon=9.86708#map=15/53.1205/9.86708",53.12049865722656,9.867079734802246,"","Orthotrichum stramineum","Orthotrichum","Fr.","B 30 0322072","http://herbarium.bgbm.org/object/B300322072" +"B300326472","","HERB","Fontinalaceae","Fontinalis antipyretica Hedw.","Label data transcribed during a Herbonauten mission","W. Heimhold","863","1974-07-04","1974-07-04","Germany","Germany: Niedersachsen. Langelsheim/Harz, flutend in der Innerste, alt. 180 m. 1974-07-04, Leg.: W. Heimhold 863.","","","https://www.openstreetmap.org/?mlat=51.9332&mlon=10.3318#map=15/51.9332/10.3318",51.933231353759766,10.331783294677734,"","Fontinalis antipyretica Hedw.","Fontinalis","Frahm","B 30 0326472","http://herbarium.bgbm.org/object/B300326472" +"B300330323","","HERB","Mniaceae","Cinclidium stygium Sw.","Label data transcribed during a Herbonauten mission","N. Jensen","","1933-08-15","1933-08-15","Germany","Germany: Schleswig-Holstein. Kr. Rendsburg, Moor bei Wennbek. 1933-08-15, Leg.: N. Jensen.","","","https://www.openstreetmap.org/?mlat=54.1896&mlon=9.89147#map=15/54.1896/9.89147",54.1895637512207,9.891474723815918,"","Cinclidium stygium Sw.","Cinclidium","N. Jensen","B 30 0330323","http://herbarium.bgbm.org/object/B300330323" +"B300333050","","HERB","Brachytheciaceae","Brachythecium plumosum (Hedw.) Schimp.","Label data transcribed during a Herbonauten mission","Frahm","","1975-05-03","1975-05-03","Germany","Germany: Nordrhein-Westfalen. Kr. Wuppertal, Beyenberg [Beyenburg], offen exponierte Grauwackenfelsen an der Wupper. 1975-05-03, Leg.: Frahm.","","","https://www.openstreetmap.org/?mlat=51.2462&mlon=7.29689#map=15/51.2462/7.29689",51.246212005615234,7.296891689300537,"","Brachythecium plumosum (Hedw.) Schimp.","Brachythecium","DΓΌll","B 30 0333050","http://herbarium.bgbm.org/object/B300333050" +"B300401125","","HERB","Gymnomitriaceae","Marsupella emarginata (Ehrh.) Dumort.","Label data transcribed during a Herbonauten mission","Fr. [Frahm]","","1964-10-07","1964-10-07","Germany","Germany: Niedersachsen. Kreis: Zellerfeld, an Steinen unterhalb des Wasserspiegels eines Quellbaches der Radau ΓΆstl. Torhaus, 800 m ΓΌb. NN. 1964-10-07, Leg.: Fr. [Frahm].","","","https://www.openstreetmap.org/?mlat=51.7998&mlon=10.5406#map=15/51.7998/10.5406",51.799808502197266,10.540631294250488,"","Marsupella emarginata (Ehrh.) Dumort.","Marsupella","Fr. [Frahm]","B 30 0401125","http://herbarium.bgbm.org/object/B300401125" +"B31084302","https://iiif.jacq.org/b/?manifest=https://herbarium.bgbm.org/object/B31084302/manifest.json","BGBM","HYPNACEAE","Hypnum purum Hedw.","","","","","","Germany","Germany.","","","","","","Germany.","Hypnum purum","Hypnum","","B 31 0843 02","https://herbarium.bgbm.org/object/B31084302" +"B700002459","","JACQ","DISCINACEAE","Gyromitra esculenta (Pers.) Fr.","MTB 3847","Benkert,D.","s.n.","1975-04-28","","Germany","Landkreis Dahme-Spreewald, nordwestl. Egsdorf","","","https://www.openstreetmap.org/?mlat=52.1333&mlon=13.5833#map=15/52.1333/13.5833",52.133331298828125,13.583330154418945,"","Gyromitra esculenta","Gyromitra","D. Benkert","B 70 0002459","https://herbarium.bgbm.org/object/B700002459" +"B700003645","","JACQ","PEZIZACEAE","Pachyella babingtonii (Berk. & Broome) Boud.","","Benkert,D.","s.n.","1995-09-23","","Germany","Landkreis Potsdam-Mittelmark, nΓΆrdlich Rottstock (OT von Ziesar), Quellgebiet der ""Gesundbrunnen""","","","","","","","Pachyella babingtonii","Pachyella","D. Benkert","B 70 0003645","https://herbarium.bgbm.org/object/B700003645" +"B700005016","","JACQ","ASCOBOLACEAE","Ascobolus sacchariferus Brumm.","MTB 3546","Marx,H.","s.n.","1991-03-02","","Germany","Bezirk Treptow, Baumschulenweg, KΓΆnigsheide","","","https://www.openstreetmap.org/?mlat=52.4667&mlon=13.4833#map=15/52.4667/13.4833",52.466670989990234,13.483329772949219,"","Ascobolus sacchariferus","Ascobolus","D. Benkert","B 70 0005016","https://herbarium.bgbm.org/object/B700005016" +"B700008206","","JACQ","PYRONEMATACEAE","Octospora coccinea (P. Crouan & H. Crouan) Brumm.","MTB 3553","Benkert,D.","s.n.","1993-10-07","","Germany","Landkreis MΓ€rkisch-Oderland, sΓΌdlich Lebus","","","https://www.openstreetmap.org/?mlat=52.4167&mlon=14.5333#map=15/52.4167/14.5333",52.41667175292969,14.533329963684082,"","Octospora coccinea","Octospora","D. Benkert","B 70 0008206","https://herbarium.bgbm.org/object/B700008206" +"B700011207","","JACQ","PEZIZACEAE","Peziza saniosa Schrad.","MTB 4626/2","Benkert,D.","s.n.","1981-09-09","","Germany","Landkreis Eichsfeld, bei Heilbad Heiligenstadt, an der Elisabethquelle","","","https://www.openstreetmap.org/?mlat=51.3667&mlon=10.1333#map=15/51.3667/10.1333",51.366668701171875,10.133330345153809,"","Peziza saniosa","Peziza","D. Benkert","B 70 0011207","https://herbarium.bgbm.org/object/B700011207" +"BGT0001296","","BGBM","ROSACEAE","Prunus mahaleb L.","","Ristow,M.","419/08","2008-05-10","","Germany","Germany: Brandenburg. Havelland, Burgwall Kapellberg, E ehemaliger Siedlung Knoblauch SE Etzin, Mtb 3443/34. Trockenrasen. Alt.: 50-60m. 10.05.2008, Leg.: M. Ristow 419/08.","","","https://www.openstreetmap.org/?mlat=52.51&mlon=12.8778#map=15/52.51/12.8778",52.5099983215332,12.877779960632324,"Germany: Brandenburg. Havelland, Burgwall Kapellberg, E ehemaliger Siedlung Knoblauch SE Etzin, Mtb 3443/34. Trockenrasen.","Prunus mahaleb","Prunus","","B GT 0001296","https://herbarium.bgbm.org/object/BGT0001296" +"BGT0005855","","BGBM","ROSACEAE","Rosa agrestis Savi","","Ristow,M. & Lauterbach,D.","909/09","2009-08-12","","Germany","Germany: Brandenburg. Sperenberg, auf dem westlichsten GipshΓΌgel, Mtb 3846/31. brachliegender Trockenrasen. Alt.: 60m. 12.08.2009, Leg.: M. Ristow & D. Lauterbach 909/09.","","","https://www.openstreetmap.org/?mlat=52.1386&mlon=13.3722#map=15/52.1386/13.3722",52.13861083984375,13.372220039367676,"Germany: Brandenburg. Sperenberg, auf dem westlichsten GipshΓΌgel, Mtb 3846/31. brachliegender Trockenrasen.","Rosa agrestis","Rosa","M. Ristow","B GT 0005855","https://herbarium.bgbm.org/object/BGT0005855" +"BGT0009340","","BGBM","GRAMINEAE","Festuca psammophila (Hack. ex Celak.) Fritsch","","Ismail,S. & Duwe,V.","SI14008","2014-06-02","","Germany","Germany: Brandenburg. Wernsdorf, Wegrand. 02.06.2014, Leg.: S. Ismail & V. Duwe SI14008.","","","https://www.openstreetmap.org/?mlat=52.3739&mlon=13.7086#map=15/52.3739/13.7086",52.3738899230957,13.708609580993652,"Germany: Brandenburg. Wernsdorf, Wegrand.","Festuca psammophila","Festuca","","B GT 0009340","https://herbarium.bgbm.org/object/BGT0009340" +"BGT0010431","","BGBM","DIPSACACEAE","Scabiosa canescens Waldst. & Kit.","","Ismail,S. & Duwe,V.","SI 14 013","2014-07-02","","Germany","Germany: Schwaben. Augsburger Stadtwald, NSG KΓΆnigsbrunnerheide. 02.07.2014, Leg.: S. Ismail & V. Duwe SI 14 013.","","","https://www.openstreetmap.org/?mlat=48.2722&mlon=10.9078#map=15/48.2722/10.9078",48.272220611572266,10.907779693603516,"Germany: Schwaben. Augsburger Stadtwald, NSG KΓΆnigsbrunnerheide.","Scabiosa canescens","Scabiosa","","B GT 0010431","https://herbarium.bgbm.org/object/BGT0010431" +"BGT0011502","","BGBM","LAMINARIACEAE","Laminaria digitata (Hudson) J.V.Lamouroux","","Wagner,A.","n.n.","2007-09-11","","Germany","Germany: Schleswig-Holstein. Helgoland. 11.09.2007, Leg.: A. Wagner n.n.","","","https://www.openstreetmap.org/?mlat=54.1667&mlon=7.88333#map=15/54.1667/7.88333",54.16667175292969,7.88332986831665,"Germany: Schleswig-Holstein. Helgoland.","Laminaria digitata","Laminaria","A. Wagner","B GT 0011502","https://herbarium.bgbm.org/object/BGT0011502" +"BGT0012622","","BGBM","ORCHIDACEAE","Dactylorhiza majalis (Rchb.) Hunt & Summerh.","","Lakmann,Dr., Duwe,V. & Wanke,R.","GL1504/ VD15020","2015-05-30","","Germany","Germany: Nordrhein-Westfalen. NSG Barbruch. Alt.: 88 m. 30.05.2015, Leg.: Dr. Lakmann, V. Duwe & R. Wanke GL1504/ VD15020.","","","","","","Germany: Nordrhein-Westfalen. NSG Barbruch.","Dactylorhiza majalis","Dactylorhiza","","B GT 0012622","https://herbarium.bgbm.org/object/BGT0012622" +"BGT0014362","","JACQ","ROSACEAE","Sorbus latifolia (Lam.) Pers.","GBOL3843, Silikaprobe genommen, nur 1 Exemplar beprobt; Arbeitsname ""Edelmannswald""; Tormaria-Sippe mit 2n = 68; Voucher in B: B 10 0612654","Meyer,N.","NM060","","","Germany","Edelmannswald, Wegrand gegenΓΌber S. aff. croceocarpa, TK 6125/13.","","","https://www.openstreetmap.org/?mlat=49.8719&mlon=9.86861#map=15/49.8719/9.86861",49.87194061279297,9.868610382080078,"","Sorbus latifolia","Sorbus","N. Meyer","B GT 0014362","https://herbarium.bgbm.org/object/BGT0014362" +"BGT0017393","","BGBM","IRIDACEAE","Crocus tommasinianus Herb.","GBOL, Silikaprobe genommen; Stinsenpflanze","Ciongwa,P.","PC 105","2016-03-01","","Germany","Germany: Niedersachsen. Northeim, Alter Friedhof. Parkanlage. Alt.: 130m. 01.03.2016, Leg.: P. Ciongwa PC 105. ex herb. / ded. : herb. Peter Ciongwa.","","","https://www.openstreetmap.org/?mlat=51.7061&mlon=9.99472#map=15/51.7061/9.99472",51.70610809326172,9.994720458984375,"Germany: Niedersachsen. Northeim, Alter Friedhof. Parkanlage.","Crocus tommasinianus","Crocus","P. Ciongwa","B GT 0017393","https://herbarium.bgbm.org/object/BGT0017393" +"BGT0018479","","BGBM","COMPOSITAE","Galinsoga parviflora Cav.","GBOL, Silikaprobe genommen","Buttler,K.P.","36686","2016-07-25","","Germany","Germany: Hessen. Frankfurt-Schwanheim, S-Seite des HΓΆchster Wegs c. 270 m SSE der Anlegestelle der HΓΆchster FΓ€hre . Gartenland. 25.07.2016, Leg.: K. P. Buttler 36686. ex herb. / ded. : herb. Karl Peter Buttler.","","","https://www.openstreetmap.org/?mlat=50.0847&mlon=8.55889#map=15/50.0847/8.55889",50.084720611572266,8.558890342712402,"Germany: Hessen. Frankfurt-Schwanheim, S-Seite des HΓΆchster Wegs c. 270 m SSE der Anlegestelle der HΓΆchster FΓ€hre . Gartenland.","Galinsoga parviflora","Galinsoga","K. P. Buttler","B GT 0018479","https://herbarium.bgbm.org/object/BGT0018479" +"BGT0021377","","BGBM","LABIATAE","Stachys alpina L.","GBOL, Silikaprobe genommen","Ciongwa,P.","PC 248","2017-06-14","","Germany","Germany: Niedersachsen. Northeim, Wieter NOM, 1 km NE Sudheim. Laubwald, Kalk. Alt.: 260m. 14.06.2017, Leg.: P. Ciongwa PC 248. ex herb. / ded. : herb. Peter Ciongwa.","","","https://www.openstreetmap.org/?mlat=51.1111&mlon=10#map=15/51.1111/10",51.11111068725586,10.0,"Germany: Niedersachsen. Northeim, Wieter NOM, 1 km NE Sudheim. Laubwald, Kalk.","Stachys alpina","Stachys","P. Ciongwa","B GT 0021377","https://herbarium.bgbm.org/object/BGT0021377" +"BGT0024809","","BGBM","CRASSULACEAE","Sempervivum tectorum L.","GBOL, Silikaprobe genommen; beprobtes Exemplar mit * markiert; indigene Moseltal-Population","Hand,R.","8948","2018-05-24","","Germany","Germany: Rheinland-Pfalz. Treis-Karden, Nordrand von Karden, Beginn des Buchsbaumweges zum Klickerterhof. an Schieferfelsen. Alt.: 106 m. 24.05.2018, Leg.: R. Hand 8948.","","","https://www.openstreetmap.org/?mlat=50.185&mlon=7.30167#map=15/50.185/7.30167",50.185001373291016,7.301670074462891,"Germany: Rheinland-Pfalz. Treis-Karden, Nordrand von Karden, Beginn des Buchsbaumweges zum Klickerterhof. an Schieferfelsen.","Sempervivum tectorum","Sempervivum","R. Hand","B GT 0024809","https://herbarium.bgbm.org/object/BGT0024809" +"JACQID1060010","","JACQ","ASTERACEAE","Achillea setacea Waldst. & Kit.","MTB: 3741/3","Willing,R. & Willing,E.","19835 D","2002-08-03","","Germany","Brandenburg, W RagΓΆsen","","","https://www.openstreetmap.org/?mlat=52.245&mlon=12.5619#map=15/52.245/12.5619",52.244998931884766,12.56194019317627,"","Achillea setacea","Achillea","E.Willing","JACQ-ID 1060010","https://herbarium.bgbm.org/object/JACQID1060010" +"JACQID1061159","","JACQ","APIACEAE","Angelica sylvestris L.","MTB: 8426/1","Willing,R. & Willing,E.","9233 D","1999-08-10","","Germany","Bayern, SO Kalzhofen","","","https://www.openstreetmap.org/?mlat=47.56&mlon=10.0369#map=15/47.56/10.0369",47.560001373291016,10.03693962097168,"","Angelica sylvestris","Angelica","E.Willing","JACQ-ID 1061159","https://herbarium.bgbm.org/object/JACQID1061159" +"JACQID1062275","","JACQ","ASTERACEAE","Asteraceae Bercht. & J. Presl","MTB: 6844/2","Willing,R. & Willing,E.","1973 D","1995-08-05","","Germany","Bayern, 1,0 km SO Sommerau","","","https://www.openstreetmap.org/?mlat=49.15&mlon=13.1167#map=15/49.15/13.1167",49.150001525878906,13.116669654846191,"","Asteraceae","Asteraceae","E.Willing","JACQ-ID 1062275","https://herbarium.bgbm.org/object/JACQID1062275" +"JACQID1063318","","JACQ","POACEAE","Calamagrostis epigejos (L.) Roth","MTB: 4138/3/2/3","Willing,R. & Willing,E.","26128 D","2009-07-30","","Germany","Sachsen-Anhalt, NNW Kleinzerbst","","","https://www.openstreetmap.org/?mlat=51.8331&mlon=12.0453#map=15/51.8331/12.0453",51.83306121826172,12.045280456542969,"","Calamagrostis epigejos","Calamagrostis","E.Willing","JACQ-ID 1063318","https://herbarium.bgbm.org/object/JACQID1063318" +"JACQID1064511","","JACQ","CYPERACEAE","Carex hirta L.","MTB: 4138/4/1/4","Willing,R. & Willing,E.","23660 D","2008-05-14","","Germany","Sachsen-Anhalt, NW ChΓΆrau","","","https://www.openstreetmap.org/?mlat=51.8261&mlon=12.1094#map=15/51.8261/12.1094",51.82611083984375,12.109439849853516,"","Carex hirta","Carex","E.Willing","JACQ-ID 1064511","https://herbarium.bgbm.org/object/JACQID1064511" +"JACQID1065683","","JACQ","ASTERACEAE","Crepis capillaris (L.) Wallr.","MTB: 4045/4","Willing,R. & Willing,E.","3019 D","1995-10-11","","Germany","Brandenburg, SO Nonnendorf","","","https://www.openstreetmap.org/?mlat=51.9&mlon=13.2583#map=15/51.9/13.2583",51.900001525878906,13.258330345153809,"","Crepis capillaris","Crepis","E.Willing","JACQ-ID 1065683","https://herbarium.bgbm.org/object/JACQID1065683" +"JACQID1066761","","JACQ","ASTERACEAE","Chrysanthemum vulgare (L.) Bernh.","MTB: 3843/4","Willing,R. & Willing,E.","763 D","1994-07-10","","Germany","Brandenburg, 1,5 km SO Buchholz","","","https://www.openstreetmap.org/?mlat=52.1417&mlon=12.9333#map=15/52.1417/12.9333",52.14167022705078,12.933329582214355,"","Chrysanthemum vulgare","Chrysanthemum","E.Willing","JACQ-ID 1066761","https://herbarium.bgbm.org/object/JACQID1066761" +"JACQID1067871","","JACQ","POACEAE","Danthonia decumbens (L.) DC.","MTB: 4040/2/2/4","Willing,R. & Willing,E.","27314 D","2011-08-18","","Germany","Sachsen-Anhalt, SSO GΓΆritz","","","https://www.openstreetmap.org/?mlat=51.9786&mlon=12.4761#map=15/51.9786/12.4761",51.97861099243164,12.476110458374023,"","Danthonia decumbens","Danthonia","E.Willing","JACQ-ID 1067871","https://herbarium.bgbm.org/object/JACQID1067871" +"JACQID1069019","","JACQ","ONAGRACEAE","Epilobium parviflorum Schreb.","MTB: 4138/1/1/1","Willing,R. & Willing,E.","25104 D","2008-09-11","","Germany","Sachsen-Anhalt, W Steckby","","","https://www.openstreetmap.org/?mlat=51.8922&mlon=12.0139#map=15/51.8922/12.0139",51.89221954345703,12.013890266418457,"","Epilobium parviflorum","Epilobium","E.Willing","JACQ-ID 1069019","https://herbarium.bgbm.org/object/JACQID1069019" +"JACQID1070380","","JACQ","GERANIACEAE","Erodium cicutarium (L.) L'HΓ©r.","MTB: 3542/3","Willing,R. & Willing,E.","19266 D","2002-07-13","","Germany","Brandenburg, W Jeserig","","","https://www.openstreetmap.org/?mlat=52.4083&mlon=12.6783#map=15/52.4083/12.6783",52.408329010009766,12.678330421447754,"","Erodium cicutarium","Erodium","E.Willing","JACQ-ID 1070380","https://herbarium.bgbm.org/object/JACQID1070380" +"JACQID1071480","","JACQ","POACEAE","Festuca gigantea (L.) Vill.","MTB: 8332/4","Willing,R. & Willing,E.","14501 D","2001-07-30","","Germany","Bayern, W Grafenaschau","","","https://www.openstreetmap.org/?mlat=47.6475&mlon=11.1094#map=15/47.6475/11.1094",47.647499084472656,11.109439849853516,"","Festuca gigantea","Festuca","E.Willing","JACQ-ID 1071480","https://herbarium.bgbm.org/object/JACQID1071480" +"JACQID1072616","","JACQ","POACEAE","Holcus lanatus L.","MTB: 4346/3","Willing,R. & Willing,E.","12763 D","2001-06-16","","Germany","Brandenburg, SO Schilda","","","https://www.openstreetmap.org/?mlat=51.6017&mlon=13.4142#map=15/51.6017/13.4142",51.60166931152344,13.414170265197754,"","Holcus lanatus","Holcus","E.Willing","JACQ-ID 1072616","https://herbarium.bgbm.org/object/JACQID1072616" +"JACQID1073848","","JACQ","HYPERICACEAE","Hypericum perforatum L.","MTB: 6843/3","Willing,R. & Willing,E.","1904 D","1995-08-04","","Germany","Bayern, 0,75 km W HΓΆllenstein","","","https://www.openstreetmap.org/?mlat=49.125&mlon=12.8667#map=15/49.125/12.8667",49.125,12.866669654846191,"","Hypericum perforatum","Hypericum","E.Willing","JACQ-ID 1073848","https://herbarium.bgbm.org/object/JACQID1073848" +"JACQID1075148","","JACQ","ASTERACEAE","Lapsana communis L.","MTB: 8226/4","Willing,R. & Willing,E.","10639 D","1999-08-19","","Germany","Baden-WΓΌrttemberg, SO Winterstetten","","","https://www.openstreetmap.org/?mlat=47.7464&mlon=10.1144#map=15/47.7464/10.1144",47.74639129638672,10.114439964294434,"","Lapsana communis","Lapsana","E.Willing","JACQ-ID 1075148","https://herbarium.bgbm.org/object/JACQID1075148" +"JACQID1076226","","JACQ","POACEAE","Lolium L.","MTB: 8330/4","Willing,R. & Willing,E.","13465 D","2001-07-24","","Germany","Bayern, NW Halbloch","","","https://www.openstreetmap.org/?mlat=47.6422&mlon=10.8169#map=15/47.6422/10.8169",47.64221954345703,10.816940307617188,"","Lolium","Lolium","E.Willing","JACQ-ID 1076226","https://herbarium.bgbm.org/object/JACQID1076226" +"JACQID1077294","","JACQ","FABACEAE","Medicago lupulina L.","MTB: 3744/3","Willing,R. & Willing,E.","17921 D","2002-06-15","","Germany","Brandenburg, NW Zauchwitz","","","https://www.openstreetmap.org/?mlat=52.2289&mlon=13.0336#map=15/52.2289/13.0336",52.22888946533203,13.033610343933105,"","Medicago lupulina","Medicago","E.Willing","JACQ-ID 1077294","https://herbarium.bgbm.org/object/JACQID1077294" +"JACQID1078399","","JACQ","BORAGINACEAE","Myosotis palustris (L.) Hill","MTB: 8325/4","Willing,R. & Willing,E.","10449 D","1999-08-18","","Germany","Bayern, S Wolfertshofen","","","https://www.openstreetmap.org/?mlat=47.6367&mlon=9.92056#map=15/47.6367/9.92056",47.63666915893555,9.920559883117676,"","Myosotis palustris","Myosotis","E.Willing","JACQ-ID 1078399","https://herbarium.bgbm.org/object/JACQID1078399" +"JACQID1079515","","JACQ","CARYOPHYLLACEAE","Petrorhagia prolifera (L.) P. W. Ball & Heywood","MTB: 4138/4/3/4","Willing,R. & Willing,E.","22783 D","2007-08-24","","Germany","Sachsen-Anhalt, W Mosigkau","","","https://www.openstreetmap.org/?mlat=51.8028&mlon=12.1128#map=15/51.8028/12.1128",51.80278015136719,12.11277961730957,"","Petrorhagia prolifera","Petrorhagia","E.Willing","JACQ-ID 1079515","https://herbarium.bgbm.org/object/JACQID1079515" +"JACQID1080582","","JACQ","POACEAE","Poa annua L.","MTB: 3745/2","Willing,R. & Willing,E.","12149 D","2000-08-27","","Germany","Brandenburg, SW Kerzendorf","","","https://www.openstreetmap.org/?mlat=52.2694&mlon=13.2681#map=15/52.2694/13.2681",52.269439697265625,13.268059730529785,"","Poa annua","Poa","E.Willing","JACQ-ID 1080582","https://herbarium.bgbm.org/object/JACQID1080582" +"JACQID1081687","","JACQ","POLYGONACEAE","Polygonum L.","MTB: 3843/3","Willing,R. & Willing,E.","1260 D","1994-07-24","","Germany","Brandenburg, 0,9 km W Niebel","","","https://www.openstreetmap.org/?mlat=52.1333&mlon=12.9083#map=15/52.1333/12.9083",52.133331298828125,12.908329963684082,"","Polygonum","Polygonum","E.Willing","JACQ-ID 1081687","https://herbarium.bgbm.org/object/JACQID1081687" +"JACQID1082907","","JACQ","CRASSULACEAE","Sedum acre L.","MTB: 3445/3","Willing,R. & Willing,E.","4688 D","1998-06-04","","Germany","Berlin, Haveluver, Burgwallgraben","","","https://www.openstreetmap.org/?mlat=52.5231&mlon=13.2036#map=15/52.5231/13.2036",52.5230598449707,13.20361042022705,"","Sedum acre","Sedum","E.Willing","JACQ-ID 1082907","https://herbarium.bgbm.org/object/JACQID1082907" +"JACQID1084093","","JACQ","ASTERACEAE","Senecio vernalis Waldst. & Kit.","MTB: 3742/1","Willing,R. & Willing,E.","12478 D","2001-05-26","","Germany","Brandenburg, S Lehnin","","","https://www.openstreetmap.org/?mlat=52.2989&mlon=12.7378#map=15/52.2989/12.7378",52.29888916015625,12.73777961730957,"","Senecio vernalis","Senecio","E.Willing","JACQ-ID 1084093","https://herbarium.bgbm.org/object/JACQID1084093" +"JACQID1085170","","JACQ","SOLANACEAE","Solanum nigrum L.","MTB: 3541/3","Willing,R. & Willing,E.","19363 D","2002-07-13","","Germany","Brandenburg, SO Brandenburg","","","https://www.openstreetmap.org/?mlat=52.405&mlon=12.5822#map=15/52.405/12.5822",52.404998779296875,12.582220077514648,"","Solanum nigrum","Solanum","E.Willing","JACQ-ID 1085170","https://herbarium.bgbm.org/object/JACQID1085170" +"JACQID1086220","","JACQ","ASTERACEAE","Taraxacum erythrospermum Andrz. ex Besser","MTB: 3044/3","Willing,R. & Willing,E.","4331 D","1998-05-16","","Germany","Brandenburg, O Vielitz","","","https://www.openstreetmap.org/?mlat=52.9319&mlon=13.0244#map=15/52.9319/13.0244",52.93193817138672,13.024439811706543,"","Taraxacum erythrospermum","Taraxacum","E.Willing","JACQ-ID 1086220","https://herbarium.bgbm.org/object/JACQID1086220" +"JACQID1087278","","JACQ","FABACEAE","Trifolium dubium Sibth.","MTB: 4138/1/3/2","Willing,R. & Willing,E.","24161 D","2008-05-21","","Germany","Sachsen-Anhalt, NW Aken","","","https://www.openstreetmap.org/?mlat=51.8628&mlon=12.0211#map=15/51.8628/12.0211",51.8627815246582,12.021109580993652,"","Trifolium dubium","Trifolium","E.Willing","JACQ-ID 1087278","https://herbarium.bgbm.org/object/JACQID1087278" +"JACQID1088400","","JACQ","VALERIANACEAE","Valeriana officinalis L.","MTB: 8331/4","Willing,R. & Willing,E.","14814 D","2001-08-01","","Germany","Bayern, W Altenau","","","https://www.openstreetmap.org/?mlat=47.6483&mlon=10.9831#map=15/47.6483/10.9831",47.64833068847656,10.983059883117676,"","Valeriana officinalis","Valeriana","E.Willing","JACQ-ID 1088400","https://herbarium.bgbm.org/object/JACQID1088400" +"JACQID1089470","","JACQ","FABACEAE","Vicia cracca L.","MTB: 4138/1/4/2","Willing,R. & Willing,E.","25534 D","2009-06-04","","Germany","Sachsen-Anhalt, S Steutz","","","https://www.openstreetmap.org/?mlat=51.8744&mlon=12.075#map=15/51.8744/12.075",51.87443923950195,12.074999809265137,"","Vicia cracca","Vicia","E.Willing","JACQ-ID 1089470","https://herbarium.bgbm.org/object/JACQID1089470" From 2c557963c0d5628d34e8ed31205dcd4134d7aee9 Mon Sep 17 00:00:00 2001 From: Pritom Mitchell Rodrigues Date: Mon, 4 May 2026 14:12:24 +0200 Subject: [PATCH 6/9] docs: rewrite README and documentation, remove genomics boilerplate Replace nf-core genomics boilerplate with project-specific content: - README.md: project summary, Mermaid diagrams, quick start, output tree - docs/usage.md: CSV input format, parameters, sequence diagram - docs/output.md: all 18 output files across 7 directories - docs/CONTRIBUTING.md: branch model, conventional commits, module interface - docs/README.md: documentation index with tech stack table Remove unused template files: - modules/nf-core/fastqc, modules/nf-core/multiqc (genomics QC) - assets: samplesheet.csv, schema_input.json, multiqc_config.yml, logos - conf: igenomes configs, container lock files, test_full.config - tower.yml, methods_description_template.yml Clean code references: - nextflow.config: remove igenomes include, test_full profile - modules.json: remove fastqc/multiqc entries - main.nf, subworkflow: remove multiqc_report channel - subworkflow: remove samplesheetToList import, FastQC/MultiQC citations --- .devcontainer/devcontainer.json | 21 - .devcontainer/setup.sh | 13 - .gitattributes | 4 - .github/.dockstore.yml | 6 - .github/workflows/awsfulltest.yml | 67 - .github/workflows/awstest.yml | 33 - .github/workflows/clean-up.yml | 24 - .github/workflows/download_pipeline.yml | 142 -- .github/workflows/fix_linting.yml | 85 - .github/workflows/linting_comment.yml | 28 - .github/workflows/release-announcements.yml | 46 - .../workflows/template-version-comment.yml | 46 - CHANGELOG.md | 16 - CODE_OF_CONDUCT.md | 182 -- README.md | 204 ++- assets/email_template.html | 113 -- assets/email_template.txt | 39 - assets/methods_description_template.yml | 29 - assets/multiqc_config.yml | 15 - assets/nf-core-biodivpipeline_logo_light.png | Bin 97184 -> 0 bytes assets/samplesheet.csv | 3 - assets/schema_input.json | 33 - assets/sendmail_template.txt | 53 - conf/containers_conda_lock_files_amd64.config | 2 - conf/containers_conda_lock_files_arm64.config | 2 - conf/containers_docker_amd64.config | 2 - conf/containers_docker_arm64.config | 2 - .../containers_singularity_https_amd64.config | 2 - .../containers_singularity_https_arm64.config | 2 - conf/containers_singularity_oras_amd64.config | 2 - conf/containers_singularity_oras_arm64.config | 2 - conf/igenomes.config | 440 ----- conf/igenomes_ignored.config | 9 - conf/test_full.config | 24 - docs/CONTRIBUTING.md | 235 +-- docs/README.md | 39 +- .../nf-core-biodivpipeline_logo_dark.png | Bin 26383 -> 0 bytes .../nf-core-biodivpipeline_logo_light.png | Bin 22148 -> 0 bytes docs/output.md | 132 +- docs/usage.md | 271 ++- main.nf | 1 - modules.json | 13 +- .../linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt | 822 --------- .../linux_arm64-bd-e455e32f745abe68_1.txt | 769 -------- modules/nf-core/fastqc/environment.yml | 7 - modules/nf-core/fastqc/main.nf | 57 - modules/nf-core/fastqc/meta.yml | 111 -- modules/nf-core/fastqc/tests/main.nf.test | 309 ---- .../nf-core/fastqc/tests/main.nf.test.snap | 476 ----- .../linux_amd64-bd-c1f4a7982b743963_1.txt | 1552 ----------------- .../linux_amd64-bd-db7c73dae76bc9e6_1.txt | 126 -- .../linux_arm64-bd-40bf3b435e89dc22_1.txt | 1502 ---------------- .../linux_arm64-bd-d167b8012595a136_1.txt | 125 -- modules/nf-core/multiqc/environment.yml | 7 - modules/nf-core/multiqc/main.nf | 50 - modules/nf-core/multiqc/meta.yml | 133 -- .../multiqc/tests/custom_prefix.config | 5 - modules/nf-core/multiqc/tests/main.nf.test | 211 --- .../nf-core/multiqc/tests/main.nf.test.snap | 422 ----- modules/nf-core/multiqc/tests/nextflow.config | 6 - nextflow.config | 7 +- nf-test.config | 1 - ro-crate-metadata.json | 305 ---- .../main.nf | 72 +- tower.yml | 5 - 65 files changed, 463 insertions(+), 8999 deletions(-) delete mode 100644 .devcontainer/devcontainer.json delete mode 100755 .devcontainer/setup.sh delete mode 100644 .gitattributes delete mode 100644 .github/.dockstore.yml delete mode 100644 .github/workflows/awsfulltest.yml delete mode 100644 .github/workflows/awstest.yml delete mode 100644 .github/workflows/clean-up.yml delete mode 100644 .github/workflows/download_pipeline.yml delete mode 100644 .github/workflows/fix_linting.yml delete mode 100644 .github/workflows/linting_comment.yml delete mode 100644 .github/workflows/release-announcements.yml delete mode 100644 .github/workflows/template-version-comment.yml delete mode 100644 CHANGELOG.md delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 assets/email_template.html delete mode 100644 assets/email_template.txt delete mode 100644 assets/methods_description_template.yml delete mode 100644 assets/multiqc_config.yml delete mode 100644 assets/nf-core-biodivpipeline_logo_light.png delete mode 100644 assets/samplesheet.csv delete mode 100644 assets/schema_input.json delete mode 100644 assets/sendmail_template.txt delete mode 100644 conf/containers_conda_lock_files_amd64.config delete mode 100644 conf/containers_conda_lock_files_arm64.config delete mode 100644 conf/containers_docker_amd64.config delete mode 100644 conf/containers_docker_arm64.config delete mode 100644 conf/containers_singularity_https_amd64.config delete mode 100644 conf/containers_singularity_https_arm64.config delete mode 100644 conf/containers_singularity_oras_amd64.config delete mode 100644 conf/containers_singularity_oras_arm64.config delete mode 100644 conf/igenomes.config delete mode 100644 conf/igenomes_ignored.config delete mode 100644 conf/test_full.config delete mode 100644 docs/images/nf-core-biodivpipeline_logo_dark.png delete mode 100644 docs/images/nf-core-biodivpipeline_logo_light.png delete mode 100644 modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt delete mode 100644 modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt delete mode 100644 modules/nf-core/fastqc/environment.yml delete mode 100644 modules/nf-core/fastqc/main.nf delete mode 100644 modules/nf-core/fastqc/meta.yml delete mode 100644 modules/nf-core/fastqc/tests/main.nf.test delete mode 100644 modules/nf-core/fastqc/tests/main.nf.test.snap delete mode 100644 modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt delete mode 100644 modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt delete mode 100644 modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt delete mode 100644 modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt delete mode 100644 modules/nf-core/multiqc/environment.yml delete mode 100644 modules/nf-core/multiqc/main.nf delete mode 100644 modules/nf-core/multiqc/meta.yml delete mode 100644 modules/nf-core/multiqc/tests/custom_prefix.config delete mode 100644 modules/nf-core/multiqc/tests/main.nf.test delete mode 100644 modules/nf-core/multiqc/tests/main.nf.test.snap delete mode 100644 modules/nf-core/multiqc/tests/nextflow.config delete mode 100644 ro-crate-metadata.json delete mode 100644 tower.yml diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 237c9ed..0000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.schema.json", - "name": "nfcore", - "image": "nfcore/devcontainer:latest", - - "remoteUser": "root", - "privileged": true, - - "remoteEnv": { - // Workspace path on the host for mounting with docker-outside-of-docker - "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}" - }, - - "onCreateCommand": "./.devcontainer/setup.sh", - - "hostRequirements": { - "cpus": 4, - "memory": "16gb", - "storage": "32gb" - } -} diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh deleted file mode 100755 index da79319..0000000 --- a/.devcontainer/setup.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -# Customise the terminal command prompt -echo "export PROMPT_DIRTRIM=2" >> $HOME/.bashrc -echo "export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] '" >> $HOME/.bashrc -export PROMPT_DIRTRIM=2 -export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] ' - -# Update Nextflow -nextflow self-update - -# Update welcome message -echo "Welcome to the nf-core/biodivpipeline devcontainer!" > /usr/local/etc/vscode-dev-containers/first-run-notice.txt diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 7a2dabc..0000000 --- a/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -*.config linguist-language=nextflow -*.nf.test linguist-language=nextflow -modules/nf-core/** linguist-generated -subworkflows/nf-core/** linguist-generated diff --git a/.github/.dockstore.yml b/.github/.dockstore.yml deleted file mode 100644 index 191fabd..0000000 --- a/.github/.dockstore.yml +++ /dev/null @@ -1,6 +0,0 @@ -# Dockstore config version, not pipeline version -version: 1.2 -workflows: - - subclass: nfl - primaryDescriptorPath: /nextflow.config - publish: True diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml deleted file mode 100644 index df7d5fc..0000000 --- a/.github/workflows/awsfulltest.yml +++ /dev/null @@ -1,67 +0,0 @@ -name: nf-core AWS full size tests -# This workflow is triggered on PRs opened against the main/master branch. -# It can be additionally triggered manually with GitHub actions workflow dispatch button. -# It runs the -profile 'test_full' on AWS batch - -on: - workflow_dispatch: - pull_request_review: - types: [submitted] - release: - types: [published] - -jobs: - run-platform: - name: Run AWS full tests - # run only if the PR is approved by at least 2 reviewers and against the master/main branch or manually triggered - if: github.repository == 'nf-core/biodivpipeline' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' || github.event_name == 'release' - runs-on: ubuntu-latest - steps: - - name: Set revision variable - id: revision - run: | - echo "revision=${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'release') && github.sha || 'dev' }}" >> "$GITHUB_OUTPUT" - - - name: Launch workflow via Seqera Platform - uses: seqeralabs/action-tower-launch@51565b514bff1827cf34620de25d0055759f1fc9 # v2 - # TODO nf-core: You can customise AWS full pipeline tests as required - # Add full size test data (but still relatively small datasets for few samples) - # on the `test_full.config` test runs with only one set of parameters - with: - workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} - access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ vars.TOWER_COMPUTE_ENV }} - revision: ${{ steps.revision.outputs.revision }} - workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/biodivpipeline/work-${{ steps.revision.outputs.revision }} - nextflow_config: | - plugins { - id 'nf-slack@0.5.0' - } - slack { - enabled = true - bot { - token = '${{ secrets.NFSLACK_BOT_TOKEN }}' - channel = 'biodivpipeline' - } - onStart { - enabled = false - } - onComplete { - message = ':white_check_mark: *biodivpipeline/test_full* completed successfully! :tada:' - } - onError { - message = ':x: *biodivpipeline/test_full* failed :crying_cat_face:' - } - } - parameters: | - { - "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/biodivpipeline/results-${{ steps.revision.outputs.revision }}" - } - profiles: test_full - - - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 - with: - name: Seqera Platform debug log file - path: | - tower_action_*.log - tower_action_*.json diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml deleted file mode 100644 index 6e45920..0000000 --- a/.github/workflows/awstest.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: nf-core AWS test -# This workflow can be triggered manually with the GitHub actions workflow dispatch button. -# It runs the -profile 'test' on AWS batch - -on: - workflow_dispatch: -jobs: - run-platform: - name: Run AWS tests - if: github.repository == 'nf-core/biodivpipeline' - runs-on: ubuntu-latest - steps: - # Launch workflow using Seqera Platform CLI tool action - - name: Launch workflow via Seqera Platform - uses: seqeralabs/action-tower-launch@51565b514bff1827cf34620de25d0055759f1fc9 # v2 - with: - workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} - access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ vars.TOWER_COMPUTE_ENV }} - revision: ${{ github.sha }} - workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/biodivpipeline/work-${{ github.sha }} - parameters: | - { - "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/biodivpipeline/results-test-${{ github.sha }}" - } - profiles: test - - - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 - with: - name: Seqera Platform debug log file - path: | - tower_action_*.log - tower_action_*.json diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml deleted file mode 100644 index 172de6f..0000000 --- a/.github/workflows/clean-up.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: "Close user-tagged issues and PRs" -on: - schedule: - - cron: "0 0 * * 0" # Once a week - -jobs: - clean-up: - runs-on: ubuntu-latest - permissions: - issues: write - pull-requests: write - steps: - - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10 - with: - stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." - stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." - close-issue-message: "This issue was closed because it has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor and then staled for 20 days with no activity." - days-before-stale: 30 - days-before-close: 20 - days-before-pr-close: -1 - any-of-labels: "awaiting-changes,awaiting-feedback" - exempt-issue-labels: "WIP" - exempt-pr-labels: "WIP" - repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml deleted file mode 100644 index a7bf4fc..0000000 --- a/.github/workflows/download_pipeline.yml +++ /dev/null @@ -1,142 +0,0 @@ -name: Test successful pipeline download with 'nf-core pipelines download' - -# Run the workflow when: -# - dispatched manually -# - when a PR is opened or reopened to main/master branch -# - the head branch of the pull request is updated, i.e. if fixes for a release are pushed last minute to dev. -on: - workflow_dispatch: - inputs: - testbranch: - description: "The specific branch you wish to utilize for the test execution of nf-core pipelines download." - required: true - default: "dev" - pull_request: - branches: - - main - - master - -env: - NXF_ANSI_LOG: false - -jobs: - configure: - runs-on: ubuntu-latest - outputs: - REPO_LOWERCASE: ${{ steps.get_repo_properties.outputs.REPO_LOWERCASE }} - REPOTITLE_LOWERCASE: ${{ steps.get_repo_properties.outputs.REPOTITLE_LOWERCASE }} - REPO_BRANCH: ${{ steps.get_repo_properties.outputs.REPO_BRANCH }} - steps: - - name: Get the repository name and current branch - id: get_repo_properties - run: | - echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT" - echo "REPOTITLE_LOWERCASE=$(basename ${GITHUB_REPOSITORY,,})" >> "$GITHUB_OUTPUT" - echo "REPO_BRANCH=${{ github.event.inputs.testbranch || 'dev' }}" >> "$GITHUB_OUTPUT" - - download: - runs-on: ubuntu-latest - needs: configure - steps: - - name: Check out pipeline code - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - - - name: Install Nextflow - uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 - - - name: Disk space cleanup - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 - with: - python-version: "3.14" - architecture: "x64" - - - name: Setup Apptainer - uses: eWaterCycle/setup-apptainer@4bb22c52d4f63406c49e94c804632975787312b3 # v2.0.0 - with: - apptainer-version: 1.3.4 - - - name: Read .nf-core.yml - id: read_yml - run: | - echo "nf_core_version=$(yq '.nf_core_version' ${{ github.workspace }}/.nf-core.yml)" >> "$GITHUB_OUTPUT" - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} - - - name: Make a cache directory for the container images - run: | - mkdir -p ./singularity_container_images - - - name: Download the pipeline - env: - NXF_SINGULARITY_CACHEDIR: ./singularity_container_images - run: | - nf-core pipelines download ${{ needs.configure.outputs.REPO_LOWERCASE }} \ - --revision ${{ needs.configure.outputs.REPO_BRANCH }} \ - --outdir ./${{ needs.configure.outputs.REPOTITLE_LOWERCASE }} \ - --compress "none" \ - --container-system 'singularity' \ - --container-library "quay.io" -l "docker.io" -l "community.wave.seqera.io/library/" \ - --container-cache-utilisation 'amend' \ - --download-configuration 'yes' - - - name: Inspect download - run: tree ./${{ needs.configure.outputs.REPOTITLE_LOWERCASE }} - - - name: Inspect container images - run: tree ./singularity_container_images | tee ./container_initial - - - name: Count the downloaded number of container images - id: count_initial - run: | - image_count=$(ls -1 ./singularity_container_images | wc -l | xargs) - echo "Initial container image count: $image_count" - echo "IMAGE_COUNT_INITIAL=$image_count" >> "$GITHUB_OUTPUT" - - - name: Run the downloaded pipeline (stub) - id: stub_run_pipeline - continue-on-error: true - env: - NXF_SINGULARITY_CACHEDIR: ./singularity_container_images - NXF_SINGULARITY_HOME_MOUNT: true - run: nextflow run ./${{needs.configure.outputs.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ needs.configure.outputs.REPO_BRANCH }}) -stub -profile test,singularity --outdir ./results - - name: Run the downloaded pipeline (stub run not supported) - id: run_pipeline - if: ${{ steps.stub_run_pipeline.outcome == 'failure' }} - env: - NXF_SINGULARITY_CACHEDIR: ./singularity_container_images - NXF_SINGULARITY_HOME_MOUNT: true - run: nextflow run ./${{ needs.configure.outputs.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ needs.configure.outputs.REPO_BRANCH }}) -profile test,singularity --outdir ./results - - - name: Count the downloaded number of container images - id: count_afterwards - run: | - image_count=$(ls -1 ./singularity_container_images | wc -l | xargs) - echo "Post-pipeline run container image count: $image_count" - echo "IMAGE_COUNT_AFTER=$image_count" >> "$GITHUB_OUTPUT" - - - name: Compare container image counts - id: count_comparison - run: | - if [ "${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }}" -ne "${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }}" ]; then - initial_count=${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }} - final_count=${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }} - difference=$((final_count - initial_count)) - echo "$difference additional container images were \n downloaded at runtime . The pipeline has no support for offline runs!" - tree ./singularity_container_images > ./container_afterwards - diff ./container_initial ./container_afterwards - exit 1 - else - echo "The pipeline can be downloaded successfully!" - fi - - - name: Upload Nextflow logfile for debugging purposes - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 - with: - name: nextflow_logfile.txt - path: .nextflow.log* - include-hidden-files: true diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml deleted file mode 100644 index 810a672..0000000 --- a/.github/workflows/fix_linting.yml +++ /dev/null @@ -1,85 +0,0 @@ -name: Fix linting from a comment -on: - issue_comment: - types: [created] - -jobs: - fix-linting: - # Only run if comment is on a PR with the main repo, and if it contains the magic keywords - if: > - contains(github.event.comment.html_url, '/pull/') && - contains(github.event.comment.body, '@nf-core-bot fix linting') && - github.repository == 'nf-core/biodivpipeline' - runs-on: ubuntu-latest - steps: - # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - with: - token: ${{ secrets.nf_core_bot_auth_token }} - - # indication that the linting is being fixed - - name: React on comment - uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 - with: - comment-id: ${{ github.event.comment.id }} - reactions: eyes - - # Action runs on the issue comment, so we don't get the PR by default - # Use the gh cli to check out the PR - - name: Checkout Pull Request - run: gh pr checkout ${{ github.event.issue.number }} - env: - GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} - - - name: Install Nextflow - uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 - - # Install and run prek - - name: Run prek - id: prek - uses: j178/prek-action@6ad80277337ad479fe43bd70701c3f7f8aa74db3 # v2 - continue-on-error: true - - # indication that the linting has finished - - name: react if linting finished succesfully - if: steps.prek.outcome == 'success' - uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 - with: - comment-id: ${{ github.event.comment.id }} - reactions: "+1" - - - name: Commit & push changes - id: commit-and-push - if: steps.prek.outcome == 'failure' - run: | - git config user.email "core@nf-co.re" - git config user.name "nf-core-bot" - git config push.default upstream - git add . - git status - git commit -m "[automated] Fix code linting" - git push - - - name: react if linting errors were fixed - id: react-if-fixed - if: steps.commit-and-push.outcome == 'success' - uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 - with: - comment-id: ${{ github.event.comment.id }} - reactions: hooray - - - name: react if linting errors were not fixed - if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 - with: - comment-id: ${{ github.event.comment.id }} - reactions: confused - - - name: react if linting errors were not fixed - if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 - with: - issue-number: ${{ github.event.issue.number }} - body: | - @${{ github.actor }} I tried to fix the linting errors, but it didn't work. Please fix them manually. - See [CI log](https://github.com/nf-core/biodivpipeline/actions/runs/${{ github.run_id }}) for more details. diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml deleted file mode 100644 index 5b0c24f..0000000 --- a/.github/workflows/linting_comment.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: nf-core linting comment -# This workflow is triggered after the linting action is complete -# It posts an automated comment to the PR, even if the PR is coming from a fork - -on: - workflow_run: - workflows: ["nf-core linting"] - -jobs: - test: - runs-on: ubuntu-latest - steps: - - name: Download lint results - uses: dawidd6/action-download-artifact@b6e2e70617bc3265edd6dab6c906732b2f1ae151 # v21 - with: - workflow: linting.yml - workflow_conclusion: completed - - - name: Get PR number - id: pr_number - run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - - - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@70d2764d1a7d5d9560b100cbea0077fc8f633987 # v3 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - number: ${{ steps.pr_number.outputs.pr_number }} - path: linting-logs/lint_results.md diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml deleted file mode 100644 index 78d5dbe..0000000 --- a/.github/workflows/release-announcements.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: release-announcements -# Automatic release toot and tweet anouncements -on: - release: - types: [published] - workflow_dispatch: - -jobs: - toot: - runs-on: ubuntu-latest - steps: - - name: get topics and convert to hashtags - id: get_topics - run: | - echo "topics=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ')" | sed 's/-//g' >> $GITHUB_OUTPUT - - - name: get description - id: get_description - run: | - echo "description=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .description')" >> $GITHUB_OUTPUT - - uses: rzr/fediverse-action@563159eb8d45f70ab6aaba36ed55cd037e51f441 # master - with: - access-token: ${{ secrets.MASTODON_ACCESS_TOKEN }} - host: "mstdn.science" # custom host if not "mastodon.social" (default) - # GitHub event payload - # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#release - message: | - Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! - ${{ steps.get_description.outputs.description }} - Please see the changelog: ${{ github.event.release.html_url }} - - ${{ steps.get_topics.outputs.topics }} #nfcore #openscience #nextflow #bioinformatics - - bsky-post: - runs-on: ubuntu-latest - steps: - - uses: zentered/bluesky-post-action@5a91cc2ad10a304a4e96c16182dbe4918710bcf6 # v0.4.0 - with: - post: | - Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! - - Please see the changelog: ${{ github.event.release.html_url }} - env: - BSKY_IDENTIFIER: ${{ secrets.BSKY_IDENTIFIER }} - BSKY_PASSWORD: ${{ secrets.BSKY_PASSWORD }} - # diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml deleted file mode 100644 index ea30827..0000000 --- a/.github/workflows/template-version-comment.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: nf-core template version comment -# This workflow is triggered on PRs to check if the pipeline template version matches the latest nf-core version. -# It posts a comment to the PR, even if it comes from a fork. - -on: pull_request_target - -jobs: - template_version: - runs-on: ubuntu-latest - steps: - - name: Check out pipeline code - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - with: - ref: ${{ github.event.pull_request.head.sha }} - - - name: Read template version from .nf-core.yml - uses: nichmor/minimal-read-yaml@1f7205277e25e156e1f63815781db80a6d490b8f # v0.0.2 - id: read_yml - with: - config: ${{ github.workspace }}/.nf-core.yml - - - name: Install nf-core - run: | - python -m pip install --upgrade pip - pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} - - - name: Check nf-core outdated - id: nf_core_outdated - run: echo "OUTPUT=$(pip list --outdated | grep nf-core)" >> ${GITHUB_ENV} - - - name: Post nf-core template version comment - uses: mshick/add-pr-comment@8e4927817251f1ff60c001f04568532b38e0b4a0 # v3 - if: | - contains(env.OUTPUT, 'nf-core') - with: - repo-token: ${{ secrets.NF_CORE_BOT_AUTH_TOKEN }} - allow-repeats: false - message: | - > [!WARNING] - > Newer version of the nf-core template is available. - > - > Your pipeline is using an old version of the nf-core template: ${{ steps.read_yml.outputs['nf_core_version'] }}. - > Please update your pipeline to the latest version. - > - > For more documentation on how to update your pipeline, please see the [Synchronisation documentation](https://nf-co.re/docs/developing/template-syncs/overview). - # diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 34afdbc..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,16 +0,0 @@ -# nf-core/biodivpipeline: Changelog - -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). - -## v1.0.0dev - [date] - -Initial release of nf-core/biodivpipeline, created with the [nf-core](https://nf-co.re/) template. - -### `Added` - -### `Fixed` - -### `Dependencies` - -### `Deprecated` diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index c089ec7..0000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,182 +0,0 @@ -# Code of Conduct at nf-core (v1.4) - -## Our Pledge - -In the interest of fostering an open, collaborative, and welcoming environment, we as contributors and maintainers of nf-core pledge to making participation in our projects and community a harassment-free experience for everyone, regardless of: - -- Age -- Ability -- Body size -- Caste -- Familial status -- Gender identity and expression -- Geographical location -- Level of experience -- Nationality and national origins -- Native language -- Neurodiversity -- Race or ethnicity -- Religion -- Sexual identity and orientation -- Socioeconomic status - -Please note that the list above is alphabetised and is therefore not ranked in any order of preference or importance. - -## Preamble - -:::note -This Code of Conduct (CoC) has been drafted by Renuka Kudva, Cris TuΓ±Γ­, and Michael Heuer, with input from the nf-core Core Team and Susanna Marquez from the nf-core community. "We", in this document, refers to the Safety Officers and members of the nf-core Core Team, both of whom are deemed to be members of the nf-core community and are therefore required to abide by this Code of Conduct. This document will be amended periodically to keep it up-to-date. In case of any dispute, the most current version will apply. -::: - -An up-to-date list of members of the nf-core core team can be found [here](https://nf-co.re/about). - -Our Safety Officers are Saba Nafees, Cris TuΓ±Γ­, and Michael Heuer. - -nf-core is a young and growing community that welcomes contributions from anyone with a shared vision for [Open Science Policies](https://www.fosteropenscience.eu/taxonomy/term/8). Open science policies encompass inclusive behaviours and we strive to build and maintain a safe and inclusive environment for all individuals. - -We have therefore adopted this CoC, which we require all members of our community and attendees of nf-core events to adhere to in all our workspaces at all times. Workspaces include, but are not limited to, Slack, meetings on Zoom, gather.town, YouTube live etc. - -Our CoC will be strictly enforced and the nf-core team reserves the right to exclude participants who do not comply with our guidelines from our workspaces and future nf-core activities. - -We ask all members of our community to help maintain supportive and productive workspaces and to avoid behaviours that can make individuals feel unsafe or unwelcome. Please help us maintain and uphold this CoC. - -Questions, concerns, or ideas on what we can include? Contact members of the Safety Team on Slack or email safety [at] nf-co [dot] re. - -## Our Responsibilities - -Members of the Safety Team (the Safety Officers) are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour. - -The Safety Team, in consultation with the nf-core core team, have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this CoC, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -Members of the core team or the Safety Team who violate the CoC will be required to recuse themselves pending investigation. They will not have access to any reports of the violations and will be subject to the same actions as others in violation of the CoC. - -## When and where does this Code of Conduct apply? - -Participation in the nf-core community is contingent on following these guidelines in all our workspaces and events, such as hackathons, workshops, bytesize, and collaborative workspaces on gather.town. These guidelines include, but are not limited to, the following (listed alphabetically and therefore in no order of preference): - -- Communicating with an official project email address. -- Communicating with community members within the nf-core Slack channel. -- Participating in hackathons organised by nf-core (both online and in-person events). -- Participating in collaborative work on GitHub, Google Suite, community calls, mentorship meetings, email correspondence, and on the nf-core gather.town workspace. -- Participating in workshops, training, and seminar series organised by nf-core (both online and in-person events). This applies to events hosted on web-based platforms such as Zoom, gather.town, Jitsi, YouTube live etc. -- Representing nf-core on social media. This includes both official and personal accounts. - -## nf-core cares 😊 - -nf-core's CoC and expectations of respectful behaviours for all participants (including organisers and the nf-core team) include, but are not limited to, the following (listed in alphabetical order): - -- Ask for consent before sharing another community member’s personal information (including photographs) on social media. -- Be respectful of differing viewpoints and experiences. We are all here to learn from one another and a difference in opinion can present a good learning opportunity. -- Celebrate your accomplishments! (Get creative with your use of emojis πŸŽ‰ πŸ₯³ πŸ’― πŸ™Œ !) -- Demonstrate empathy towards other community members. (We don’t all have the same amount of time to dedicate to nf-core. If tasks are pending, don’t hesitate to gently remind members of your team. If you are leading a task, ask for help if you feel overwhelmed.) -- Engage with and enquire after others. (This is especially important given the geographically remote nature of the nf-core community, so let’s do this the best we can) -- Focus on what is best for the team and the community. (When in doubt, ask) -- Accept feedback, yet be unafraid to question, deliberate, and learn. -- Introduce yourself to members of the community. (We’ve all been outsiders and we know that talking to strangers can be hard for some, but remember we’re interested in getting to know you and your visions for open science!) -- Show appreciation and **provide clear feedback**. (This is especially important because we don’t see each other in person and it can be harder to interpret subtleties. Also remember that not everyone understands a certain language to the same extent as you do, so **be clear in your communication to be kind.**) -- Take breaks when you feel like you need them. -- Use welcoming and inclusive language. (Participants are encouraged to display their chosen pronouns on Zoom or in communication on Slack) - -## nf-core frowns on πŸ˜• - -The following behaviours from any participants within the nf-core community (including the organisers) will be considered unacceptable under this CoC. Engaging or advocating for any of the following could result in expulsion from nf-core workspaces: - -- Deliberate intimidation, stalking or following and sustained disruption of communication among participants of the community. This includes hijacking shared screens through actions such as using the annotate tool in conferencing software such as Zoom. -- β€œDoxing” i.e. posting (or threatening to post) another person’s personal identifying information online. -- Spamming or trolling of individuals on social media. -- Use of sexual or discriminatory imagery, comments, jokes, or unwelcome sexual attention. -- Verbal and text comments that reinforce social structures of domination related to gender, gender identity and expression, sexual orientation, ability, physical appearance, body size, race, age, religion, or work experience. - -### Online Trolling - -The majority of nf-core interactions and events are held online. Unfortunately, holding events online comes with the risk of online trolling. This is unacceptable β€” reports of such behaviour will be taken very seriously and perpetrators will be excluded from activities immediately. - -All community members are **required** to ask members of the group they are working with for explicit consent prior to taking screenshots of individuals during video calls. - -## Procedures for reporting CoC violations - -If someone makes you feel uncomfortable through their behaviours or actions, report it as soon as possible. - -You can reach out to members of the Safety Team (Saba Nafees, Cris TuΓ±Γ­, and Michael Heuer) on Slack. Alternatively, contact a member of the nf-core core team [nf-core core team](https://nf-co.re/about), and they will forward your concerns to the Safety Team. - -Issues directly concerning members of the Core Team or the Safety Team will be dealt with by other members of the core team and the safety manager β€” possible conflicts of interest will be taken into account. nf-core is also in discussions about having an ombudsperson and details will be shared in due course. - -All reports will be handled with the utmost discretion and confidentiality. - -You can also report any CoC violations to safety [at] nf-co [dot] re. In your email report, please do your best to include: - -- Your contact information. -- Identifying information (e.g. names, nicknames, pseudonyms) of the participant who has violated the Code of Conduct. -- The behaviour that was in violation and the circumstances surrounding the incident. -- The approximate time of the behaviour (if different than the time the report was made). -- Other people involved in the incident, if applicable. -- If you believe the incident is ongoing. -- If there is a publicly available record (e.g. mailing list record, a screenshot). -- Any additional information. - -After you file a report, one or more members of our Safety Team will contact you to follow up on your report. - -## Who will read and handle reports - -All reports will be read and handled by the members of the Safety Team at nf-core. - -If members of the Safety Team are deemed to have a conflict of interest with a report, they will be required to recuse themselves as per our Code of Conduct and will not have access to any follow-ups. - -To keep this first report confidential from any of the Safety Team members, please submit your first report by direct messaging on Slack/direct email to any of the nf-core members you are comfortable disclosing the information to, and be explicit about which member(s) you do not consent to sharing the information with. - -## Reviewing reports - -After receiving the report, members of the Safety Team will review the incident report to determine whether immediate action is required, for example, whether there is immediate threat to participants’ safety. - -The Safety Team, in consultation with members of the nf-core core team, will assess the information to determine whether the report constitutes a Code of Conduct violation, for them to decide on a course of action. - -In the case of insufficient information, one or more members of the Safety Team may contact the reporter, the reportee, or any other attendees to obtain more information. - -Once additional information is gathered, the Safety Team will collectively review and decide on the best course of action to take, if any. The Safety Team reserves the right to not act on a report. - -## Confidentiality - -All reports, and any additional information included, are only shared with the team of safety officers (and possibly members of the core team, in case the safety officer is in violation of the CoC). We will respect confidentiality requests for the purpose of protecting victims of abuse. - -We will not name harassment victims, beyond discussions between the safety officer and members of the nf-core team, without the explicit consent of the individuals involved. - -## Enforcement - -Actions taken by the nf-core’s Safety Team may include, but are not limited to: - -- Asking anyone to stop a behaviour. -- Asking anyone to leave the event and online spaces either temporarily, for the remainder of the event, or permanently. -- Removing access to the gather.town and Slack, either temporarily or permanently. -- Communicating to all participants to reinforce our expectations for conduct and remind what is unacceptable behaviour; this may be public for practical reasons. -- Communicating to all participants that an incident has taken place and how we will act or have acted β€” this may be for the purpose of letting event participants know we are aware of and dealing with the incident. -- Banning anyone from participating in nf-core-managed spaces, future events, and activities, either temporarily or permanently. -- No action. - -## Attribution and Acknowledgements - -- The [Contributor Covenant, version 1.4](http://contributor-covenant.org/version/1/4) -- The [OpenCon 2017 Code of Conduct](http://www.opencon2017.org/code_of_conduct) (CC BY 4.0 OpenCon organisers, SPARC and Right to Research Coalition) -- The [eLife innovation sprint 2020 Code of Conduct](https://sprint.elifesciences.org/code-of-conduct/) -- The [Mozilla Community Participation Guidelines v3.1](https://www.mozilla.org/en-US/about/governance/policies/participation/) (version 3.1, CC BY-SA 3.0 Mozilla) - -## Changelog - -### v1.4 - February 8th, 2022 - -- Included a new member of the Safety Team. Corrected a typographical error in the text. - -### v1.3 - December 10th, 2021 - -- Added a statement that the CoC applies to nf-core gather.town workspaces. Corrected typographical errors in the text. - -### v1.2 - November 12th, 2021 - -- Removed information specific to reporting CoC violations at the Hackathon in October 2021. - -### v1.1 - October 14th, 2021 - -- Updated with names of new Safety Officers and specific information for the hackathon in October 2021. - -### v1.0 - March 15th, 2021 - -- Complete rewrite from original [Contributor Covenant](http://contributor-covenant.org/) CoC. diff --git a/README.md b/README.md index f8693d0..f3ff00c 100644 --- a/README.md +++ b/README.md @@ -1,108 +1,174 @@ -

    - - - nf-core/biodivpipeline - -

    +# BiodivPipeline -[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/biodivpipeline) -[![GitHub Actions CI Status](https://github.com/nf-core/biodivpipeline/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/biodivpipeline/actions/workflows/nf-test.yml) -[![GitHub Actions Linting Status](https://github.com/nf-core/biodivpipeline/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/biodivpipeline/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/biodivpipeline/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) -[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) +A modular nf-core/Nextflow pipeline that transforms raw biodiversity CSV records into FAIR-compliant RDF triples with automated quality checks, taxonomy resolution, and ontology annotation. -[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.10.4-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) -[![nf-core template version](https://img.shields.io/badge/nf--core_template-4.0.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.0.2) -[![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 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/biodivpipeline) +**Built for:** [NFDI4Biodiversity](https://www.nfdi4biodiversity.org/) / InfAI / BGBM +**Framework:** [nf-core](https://nf-co.re) template v4.0.2 +**Dataset:** 109,297 herbarium specimen records from Botanischer Garten und Botanisches Museum Berlin (BGBM) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23biodivpipeline-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/biodivpipeline)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) +## What it does -## Introduction +```mermaid +flowchart LR + IN["Messy CSV Data\nWrong names, bad coords,\ninconsistent columns"] + PIPE["BiodivPipeline"] + OUT1["Clean Dataset"] + OUT2["RDF Triples\nFAIR-compliant"] + OUT3["Quality Reports"] -**nf-core/biodivpipeline** is a bioinformatics pipeline that ... + IN --> PIPE --> OUT1 + PIPE --> OUT2 + PIPE --> OUT3 +``` - +## How it works - -1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) +The pipeline orchestrates 7 processing modules via Nextflow. Modules run in parallel where possible. -## Usage +```mermaid +flowchart TB + input["Raw CSV Input\n23 columns, biodiversity records"] -> [!NOTE] -> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/get_started/environment_setup/overview) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/get_started/run-your-first-pipeline) with `-profile test` before running the workflow on actual data. + subgraph WP1 ["Nextflow Orchestrator"] + direction TB - + wp7["RDF Transformation\nConvert cleaned tabular data\ninto RDF triples"] + end -Now, you can run the pipeline using: + wp8["Schema Editor UI\nBrowser tool for experts\nto design RDF mappings"] - + output1["Quality-annotated dataset"] + output2["RDF Triples"] + output3["Quality Reports"] -```bash -nextflow run nf-core/biodivpipeline \ - -profile \ - --input samplesheet.csv \ - --outdir + input --> wp6 + wp6 --> wp2 + wp6 --> wp3 + wp6 --> wp4 + wp2 --> wp5 + wp2 --> wp7 + wp3 --> wp7 + wp4 --> wp7 + wp5 --> wp7 + wp8 -- "mapping schema" --> wp7 + wp7 --> output1 + wp7 --> output2 + wp7 --> output3 ``` -> [!WARNING] -> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/running/run-pipelines#using-parameter-files). +## Quick start -For more details and further functionality, please refer to the [usage documentation](https://nf-co.re/biodivpipeline/usage) and the [parameter documentation](https://nf-co.re/biodivpipeline/parameters). +**Prerequisites:** Java 11+, [Nextflow](https://www.nextflow.io/) >= 24.x, [Docker](https://www.docker.com/) -## Pipeline output +```bash +# Clone +git clone git@github.com:biodivportal/BiodivPipeline.git +cd BiodivPipeline -To see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/biodivpipeline/results) tab on the nf-core website pipeline page. -For more details about the output files and reports, please refer to the -[output documentation](https://nf-co.re/biodivpipeline/output). +# Unzip dataset (already in repo) +unzip Belege_aus_D.zip -## Credits +# Run with test data (109 records) +nextflow run main.nf -profile test,docker --outdir results + +# Run with full dataset +nextflow run main.nf -profile docker \ + --input Belege_aus_D.csv \ + --outdir results +``` -nf-core/biodivpipeline was originally written by SPST Team. +### Parameters -We thank the following people for their extensive assistance in the development of this pipeline: +| Parameter | Required | Description | +| ------------------ | -------- | ------------------------------------------------------------------------------------------- | +| `--input` | Yes | Path to input CSV file (biodiversity records) | +| `--mapping_schema` | No | Path to RDF mapping schema (JSON-LD or Turtle). Defaults to `assets/default_mapping.jsonld` | +| `--outdir` | Yes | Path to output directory | +| `-profile` | Yes | Execution profile: `docker`, `singularity`, `test` | - +## Output -## Contributions and Support +Results are written to `--outdir` with the following structure: -If you would like to contribute to this pipeline, please see the [contributing guidelines](docs/CONTRIBUTING.md). +``` +results/ +β”œβ”€β”€ annotation/ # WP2: BiodivPortal annotation results +β”‚ β”œβ”€β”€ annotated.jsonld +β”‚ └── unresolved_terms.csv +β”œβ”€β”€ column_standardisation/ # WP6: ABCD column mapping +β”‚ β”œβ”€β”€ standardised.csv +β”‚ └── column_mapping.json +β”œβ”€β”€ taxonomy/ # WP3: Resolved taxonomy +β”‚ └── taxonomy_resolved.csv +β”œβ”€β”€ quality/ # WP4: Outlier detection +β”‚ β”œβ”€β”€ quality_report.json +β”‚ └── flagged_records.csv +β”œβ”€β”€ provisional_concepts/ # WP5: Registered provisional terms +β”‚ └── provisional_concepts.json +β”œβ”€β”€ rdf/ # WP7: RDF transformation output +β”‚ β”œβ”€β”€ output.ttl +β”‚ β”œβ”€β”€ output.jsonld +β”‚ └── rdf_report.json +β”œβ”€β”€ reports/ # Aggregated pipeline summary +β”‚ └── pipeline_summary.json +└── pipeline_info/ # Nextflow execution metadata + β”œβ”€β”€ execution_report_*.html + β”œβ”€β”€ execution_timeline_*.html + β”œβ”€β”€ execution_trace_*.txt + β”œβ”€β”€ pipeline_dag_*.html + β”œβ”€β”€ params_*.json + └── biodivpipeline_software_versions.yml +``` -For further information or help, don't hesitate to get in touch on the [Slack `#biodivpipeline` channel](https://nfcore.slack.com/channels/biodivpipeline) (you can join with [this invite](https://nf-co.re/join/slack)). +For details on each output file, see [docs/output.md](docs/output.md). -## Citations +## Project structure - - +``` +BiodivPipeline/ +β”œβ”€β”€ main.nf # Pipeline entry point +β”œβ”€β”€ workflows/biodivpipeline.nf # Main workflow DAG +β”œβ”€β”€ modules/local/ # Pipeline modules (one per work package) +β”‚ β”œβ”€β”€ column_standardise/ # WP6: CSV headers β†’ ABCD terms +β”‚ β”œβ”€β”€ biodiv_annotate/ # WP2: BiodivPortal annotation +β”‚ β”œβ”€β”€ taxonomy_classify/ # WP3: Taxon β†’ GBIF/WFO IDs +β”‚ β”œβ”€β”€ outlier_detect/ # WP4: Statistical + LLM quality checks +β”‚ β”œβ”€β”€ provisional_concepts/ # WP5: Register unknown terms +β”‚ β”œβ”€β”€ rdf_transform/ # WP7: Tabular β†’ RDF triples +β”‚ └── collect_reports/ # Aggregate reports +β”œβ”€β”€ modules/stubs/ # Mock FastAPI service for testing +β”œβ”€β”€ conf/ # Nextflow config profiles +β”œβ”€β”€ assets/ # Static files (default mapping schema) +β”œβ”€β”€ test_data/ # 109-record sample dataset +β”œβ”€β”€ subworkflows/ # nf-core shared utilities +└── docs/ # Documentation +``` - +## Documentation + +- [Usage guide](docs/usage.md) β€” detailed usage, parameters, and data flow +- [Output reference](docs/output.md) β€” description of every output file +- [Contributing](docs/CONTRIBUTING.md) β€” git conventions, branch model, module interface + +## Credits -An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. +**Pipeline development:** SPST Team, FU Berlin, AG Corporate Semantic Web (SS 2026) +**Customer:** Naouel Karam (karam@infai.org), Jan Fillies (fillies@infai.org) β€” InfAI +**Data provider:** Botanischer Garten und Botanisches Museum Berlin (BGBM) +**Coordinator:** Prof. Dr. Adrian Paschke -You can cite the `nf-core` publication as follows: +Built using the [nf-core](https://nf-co.re) framework. See [`CITATIONS.md`](CITATIONS.md) for a full list of tools and references. > **The nf-core framework for community-curated bioinformatics pipelines.** -> > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. -> > _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). diff --git a/assets/email_template.html b/assets/email_template.html deleted file mode 100644 index 9f7d7ee..0000000 --- a/assets/email_template.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - nf-core/biodivpipeline Pipeline Report - - -
    - - -

    nf-core/biodivpipeline ${version}

    -

    Run Name: $runName

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

    nf-core/biodivpipeline execution completed unsuccessfully!

    -

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

    -

    The full error message was:

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

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

    -

    The command used to launch the workflow was as follows:

    -
    -$commandLine
    - -

    Pipeline Configuration:

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

    nf-core/biodivpipeline

    -

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

    -
    - - diff --git a/assets/email_template.txt b/assets/email_template.txt deleted file mode 100644 index 13ba4c5..0000000 --- a/assets/email_template.txt +++ /dev/null @@ -1,39 +0,0 @@ ----------------------------------------------------- - ,--./,-. - ___ __ __ __ ___ /,-._.--~\\ - |\\ | |__ __ / ` / \\ |__) |__ } { - | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, - `._,._,' - nf-core/biodivpipeline ${version} ----------------------------------------------------- -Run Name: $runName - -<% if (success){ - out << "## nf-core/biodivpipeline execution completed successfully! ##" -} else { - out << """#################################################### -## nf-core/biodivpipeline execution completed unsuccessfully! ## -#################################################### -The exit status of the task that caused the workflow execution to fail was: $exitStatus. -The full error message was: - -${errorReport} -""" -} %> - - -The workflow was completed at $dateComplete (duration: $duration) - -The command used to launch the workflow was as follows: - - $commandLine - - - -Pipeline Configuration: ------------------------ -<% out << summary.collect{ k,v -> " - $k: $v" }.join("\n") %> - --- -nf-core/biodivpipeline -https://github.com/nf-core/biodivpipeline diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml deleted file mode 100644 index e186a11..0000000 --- a/assets/methods_description_template.yml +++ /dev/null @@ -1,29 +0,0 @@ -id: "nf-core-biodivpipeline-methods-description" -description: "Suggested text and references to use when describing pipeline usage within the methods section of a publication." -section_name: "nf-core/biodivpipeline Methods Description" -section_href: "https://github.com/nf-core/biodivpipeline" -plot_type: "html" -## TODO nf-core: Update the HTML below to your preferred methods description, e.g. add publication citation for this pipeline -## You inject any metadata in the Nextflow '${workflow}' object -data: | -

    Methods

    -

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

    -

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

    -
    ${workflow.commandLine}
    -

    ${tool_citations}

    -

    References

    -
      -
    • Di Tommaso, P., Chatzou, M., Floden, E. W., Barja, P. P., Palumbo, E., & Notredame, C. (2017). Nextflow enables reproducible computational workflows. Nature Biotechnology, 35(4), 316-319. doi: 10.1038/nbt.3820
    • -
    • Ewels, P. A., Peltzer, A., Fillinger, S., Patel, H., Alneberg, J., Wilm, A., Garcia, M. U., Di Tommaso, P., & Nahnsen, S. (2020). The nf-core framework for community-curated bioinformatics pipelines. Nature Biotechnology, 38(3), 276-278. doi: 10.1038/s41587-020-0439-x
    • -
    • GrΓΌning, B., Dale, R., SjΓΆdin, A., Chapman, B. A., Rowe, J., Tomkins-Tinch, C. H., Valieris, R., KΓΆster, J., & Bioconda Team. (2018). Bioconda: sustainable and comprehensive software distribution for the life sciences. Nature Methods, 15(7), 475–476. doi: 10.1038/s41592-018-0046-7
    • -
    • da Veiga Leprevost, F., GrΓΌning, B. A., Alves Aflitos, S., RΓΆst, H. L., Uszkoreit, J., Barsnes, H., Vaudel, M., Moreno, P., Gatto, L., Weber, J., Bai, M., Jimenez, R. C., Sachsenberg, T., Pfeuffer, J., Vera Alvarez, R., Griss, J., Nesvizhskii, A. I., & Perez-Riverol, Y. (2017). BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics (Oxford, England), 33(16), 2580–2582. doi: 10.1093/bioinformatics/btx192
    • - ${tool_bibliography} -
    -
    -
    Notes:
    -
      - ${nodoi_text} -
    • The command above does not include parameters contained in any configs or profiles that may have been used. Ensure the config file is also uploaded with your publication!
    • -
    • You should also cite all software used within this run. Check the "Software Versions" of this report to get version information.
    • -
    -
    diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml deleted file mode 100644 index e8c0d03..0000000 --- a/assets/multiqc_config.yml +++ /dev/null @@ -1,15 +0,0 @@ -report_comment: > - This report has been generated by the nf-core/biodivpipeline - analysis pipeline. For information about how to interpret these results, please see the - documentation. -report_section_order: - "nf-core-biodivpipeline-methods-description": - order: -1000 - software_versions: - order: -1001 - "nf-core-biodivpipeline-summary": - order: -1002 - -export_plots: true - -disable_version_detection: true diff --git a/assets/nf-core-biodivpipeline_logo_light.png b/assets/nf-core-biodivpipeline_logo_light.png deleted file mode 100644 index 01e82e0399674d48eda13250e463d8d3943f894e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97184 zcmeEt=R4e6_qQZR7g7;V((WpqXv z(aSIxWiZM!57kjV0_F8LyR@>hYwRduqp&4F+#V5|S%EHZn453NkW})m)scZ0s#bNW4>P&sQ0lxjLR?AT*re+uYxhcS4S)bzxi)YVs=RhMweMz+i zVqFxm>WcuS4S;UxKG9>z7x89}=lw8m(k#jZ{3zUH()pQ^jDi2HPN$XC>rp7ehpx{H z&2Kj*jVnXmRRDhaN;Cid?HGA$bZaK`vn}@f$M~oamM@4evq^?(M+2jamVVDgfh$hY zPs-R=*frXbN$Ll3QjnNHsj$;9;J*hwx_;Jbv!S5lPuTVD8GfA|9# zLB@2gGV5I;I<>W}+Z=*j8cw##<%{3uLFF#ASletS<7 zi+c6wX=eQ1?GcZn+S&rQk@5)YYd6eCWJ;`157kR|%%Muke1A+W{`kBDB3vyx72yx)E* zy`ye4LY0g_ZlCR{^na=LG4rCFnks3NC|F+~fL?jm_I~HvyW>fjh2pe4S~w)?p&@`Sb_C!(lahjXxSS!H9qI_TMQQww%!URy2q27 z|8jmZ6bO!Z%8!5dvqBZ?{CeQW&HXUs{(_Dn%H%6$$w4rk-l8)WwhuUn>G9+NPTQ00Tjn>I(@4bj6Xl> zB-JpS9V9!RD4-6ATfs9TJ^#BaiOB>5F6UbMv|_T;4>#Kz(XY}cuTdli{U8sDteT?h zs;43Dr1L*J1;g!;l~d!SZT=4|XcLeN3GVyrD{)d0k>UG_BW|OT-TmBaucS#EPK2|G%DhF86gT(9G6}X z7RRekB6@Ui83GLdW|BzoKE-=km{LvpSS{+h-863I^-eC0sZBCSlMagm!(H#w(3U3!|aRr_M>HWZo@OC zi8I?-51z*N!&_8mzbeR>b|^gS4J%vLk2zTFLNT!3Gu7|)yE^H|D+6al!y{q*^snIp zOEm}IR(^by4~f`T{>l11Z`hjqE8soTx<`bO6_2fMt*L*r_DJqPsZ4=0wE@82T?_wRk? zkez!1D=L}vy%6#Dn5GLI2{s|yX19-aAKHB&(sRm-PVSUG z3WVCRC~I-itmr;)QEAl=~lo zSo&aw{n3PzCW9Mc5J$0yypi{v;L+T<`opirMgqyH!F|KD-44J1`8D`Nj6&5)6J-m+4r0`QYBOH~hG_YS*dtrcv(owLm~uIu>oAFC2qxGHqj z6MtV0zID`(%#oar*uz#SDmNVe#eGwvV==)z`S;4w9)+_>gQz$fNBW|+fE~)An5J84 zjS&M%c=C#SRNvI;s~fMo~??$I}*L% z(E+kFO<>6qug>vyKPf0duNb7Ki9O zBu;dc{hx_-HDUxX#PbVmybtLEYCfCay#Xy@D^fV|2}E=OD77syyUat|0ALVnAe(~)l{eF z?L!4g$DP3wf^dkQHlz2>KOXKe*-Ez^fo1gx>sY#sWEI8^mXX9*HvZ05yeU($n^6(|8|3QGhENf}Yrgj%;K6)fn22)f9 zKNzpKD!Nn^Jn-LRLfETXjjY5z$~mX6={@Q?7r}p|Q6hS+!KdUPS|U~AXg0hXvw2Th zY4N-GsSx@5xpa6T@z48r|A%)ao`#*)-@|vR1ACRh4njADAb%@o$NyhrGKup=yQUX) zFA93R$nRBVJXNPRgV*|V;Q6-o1J>^^kx7kPX8FMBTDAYP!$0CGR~gDme}epoQZgI% zltmw0^w-}q5tB4O#uoM+P7Yc20hDTI7sF)($A~6UF8PNa;TLhZ#VF>&EeaUzOJVj7~LG#8!dPe7d3nQBa6pn)kc<;)F9pjzcnQ4A)3!M@Pr_D)2hry}qhoL;sT-bl!%?iJ7(W_4rd{0l0S<`G|%*5zNvF*y++Kr*-RxQ;Xqn$GR_Pf=y(O(Wv zWFdU>wkiNM_l1rT+K67B&>3qY?SRf~5C7fA-S7H*#%7?;zbv^Zlr-2~v1*lfJueSV zMei&|&C36ckK!*0e!{9*Dn4Cgm84tXLaTVEg1&hL=add3X7#>KG_#)QaM^LJf3qmqpI2A%F%|4Mh?Q#5GeN?%NrP)yQ<2WzLfch|rZ;ykbW z1XDDjOYu8i@1|0ek*k?@UJ=W3aQ3W?b4PIo{fPX7BRu*_+8VhY+R78e1zr%L)8wPz z0!)%8c7L|qzK`C@^v0sN(9yPeu>pYlD0u#0T8Apfk+G1&q`LoAtW-{d5S_?lVzM zn~YB6@fo^!<5OMB%^$H>qF&W)qPqFTry()O+k<%$()J0%6G4Sx-SE9%eE;>NQcI-> zC>vbZUW1eirPnreK7Y+=rLRXK%U- zL2>*@gRU}02Vtjf$So7$n%uX0*NCn$07DF5D>D$(s{q*V?ORr5Rc5AA zv%W;GNX`n?3pRO1(0ipa>PnTWibWeB+N*u!kk@<~CkfnsIVLp2LV&paA~qL|-cr#r z?Z37_tm$mLeS$$C#*t(GN%<^YcT$c0U;TlvZ>;cl0lYNFgV>+9mtagGGcYe^(JxoXa(e;*-WdVr|Ia#M=lP{Tq|*1i$fGcJh6&l~tl&QA0q zjjV@1H=sXGa4#PGZKp{eg5CwDr$)a0+%SteYf-H!Ih}Nhi(X!?jL46DK%u2G160Jt z27?W!bn=#2x!p#5b8V0oAwKfYRC7EQTF76eS=?(AgPG`E@3wd8&>i2!gCqEJSMEGz z5ZG)c+WJZ{LGevGns`Lu`WVgUUu&1gd)Z`AZlb$r-c-Bw+b?bAtSu^uc-3fNx>W!> zhz4z3)NH7#&&i*1(B%4l-dWH7TC)5wPO_5^K2){ZT~oc>3axFPyVll~DrX+kngOdV z^!_`G4Cg1R?o5?{6LYUhV0V+LI@W-AzIsaK4oqvp;0=9T+UlCb~wRP;Zo{-HTvL9H$ei? z+`}K>gyG%izuZ0jrjudIJonHFo`(sqR;!L(d8R1|))+UW1SfsSe>`>&o!)!5FO{Ddi`btJ_{xp;%m z);?O><KY&yRZk4Nl!gEurj8ddAI< z3qt>%5D^BC$Vv5Pb<#FVD!p6TI0wmEToJpkE3|yd!p-mqX9n_ zG#Km}?p1=03CmN^epIKa%~Xri(3X5A~vd;cKk0Dje_W z*LVN#q@p?Hxh5w=BG}xAHAmu;#`%1BG?J4T^W-B2O zC78*`!$(^dCIwYew*{tpi!rC4;wVAY{;Y{9 zS7@dxmP>vf({E(&l^HbUL9Iqw7v8`h_B7^JWC@i$PbjYH1WZ^Cq3_l68oFOFa~;O% z6$tVa(ONR+0UpGHXB0av50R5tX=9&`T-XYb=m!VG2~f3W=VJsu6qk`dZ}qW^J68Tr zWx{p1tE=nO19E(?TW19rCMRv(FjOP7EjHM8+FFjKz)2wC;Ho7={Is*SVw?nEbfh)~ z*M$N_PgnDs^53$51kd)`UisA1F_cpSlJF`gW!&Vir%J?6{z?nO%zSLd##(7(kb?+e ztIA(XHijjm7p!?FOH+b8aOv$z0&4+|uYZ%hoSWJsR17|B?SNQ>NB6`<^ZrwpPl&!= zw7dsAR0Wpv?tJHaFKt^?#k?vu7#L^lcj%{G6|dk|oRj~>%yfJ6&eqoCL((zchDf(o z#h{Q5aBj&xx(2(p@!=D0nJC^3H?pbk1M!C0i$1)yc8jRq!|qZWS-F`0yIf!1MfRGX z%F4H17#xH~_&whyMo|Hd?}_D|gg?1>q^+H5&u0|7BVp<^#99RjpNn*XsOOl?75>~Za4rgPH z>#LtupF1sAFt$=;)u&jU^~14xI_-~fG$B8fS&37eJ=$7HHv%n-mJQTDBe3*Xm5`zA z$L7X2Ial;uys-lF=U;k_0JcKyB8H{P_+>bF6O#<+C?ez)C4bD?w`*BTHc4oo+sdB? za(<PCy)R@Y|~s1MS<%G8WJb;YSYGC#w48TDLn zLu8wx)fbFShi1-!X3CIq&A+7lj|T7^C9&g74=Bdv8WUkX@VFdZujoY1)bCQR&h`_f;dp@{wV8&A;WOb!P~$117nQ;}&aXrCY|ip*of}Zb z=5R(%57|_OppT9M`WKTZ;}<>(C>CM}4hbQ|uIImLzY2YEEzz9JcK!NyH_BD7*0-+D z15tld0ro9|3K;8oXN|`Pd|n*eFT0!__k~LT2L9c3Ft)U?GxvRe=7uAVq1vS-@7m$y z62>#xes^%{04;Hd+wd0DVy8A9f4AkNW8}Wl(10dxYDGbSaIopImR*F)`tt#HUgDWa zILSTUi2wrYr8rBN2$dJNh*+JJy>AI$cncy^e&njXaJHj^W}8*;Rk?5H);oA@ob$&; zL1W$Naq?4Jbti^2bQHNu&mDuLN0#&Bv8BWdm_SLix<(4#n<1NST+}oiTj+anmwS0B zUyJSO#!N}$a$TB=*8D6{mKoxYaQze%TxAkCfa?BRmia+I%J9R^FYDC6@$U-Y`9TbQ zTAeX7L!sj%J=nZ3^~tGPKz&21A`Or3`$x6x=<8{hk!Q2=VuTTiq!aQ7n&!=Mk@!~n zWu}wR7RPO%?Rs2bRk*AdY}q+ynLa!7p_q`1xdpRa>{fp=o@+WRGaC#Be0hsJ;^+g| z$vwYrrzG;IZsPZmiDgU54IOuVSxY&|%`L9dMl=?31_-y6|m6 zs)~jF=4z5`Ff-eH%B(Q3`3L`s;#$tMtgp@YkoTDhF)}SEIJVF=Ey`1rz+kg7p~RGt zUs8NiQpHgfQ-!{4cbMEN(&Y3>LXUwamg|1il!KMR$~2` z?dLvh~OTPA_GnIUFUYa*9q+%(CO zPao&@?GX`~q|X7Wxa=mlmFmfWX&mn_{STP|a1eQSkkuyw6@=A_nZ`_#j?sH_G3ksUBZceD% z;#PoU*ow|oly6Pq1@MOO!Z%~N_#Ka!*yz>CFYgeS9a$4GLV0j7`Vima6we|#3&~KD z?sgGx&)FNd@nKl3$(q~dFV*-a;?uiLq1lblGtOXpKGM;c`wWS|GY>|EFKtxO zzH4$S?OmP^vwK&2RGoS}ZeWaU`I=LohiZgvChgf~BK_)y5C5du+_aY!6(`05BpLp( zin(X^w=57%S1=!9jAI=tSAjRI=CE9Tdutg-w{qPWWN{mAX`$!!gg9`#sYG0=}@|tT5MyBILWLyk1=3 zvd{30y>><;PU7ax*%YtXdH}dP&l%57LS*-fKog&kusIz+pPHcuOPsgVpF*5VKzpSIuL{4)g?N`y&B>AyuO2+iG+j;~ydc*I z^Fm}BFF0IC);d*PRXrwdIcWVgFlcX#L5i~=&GSwIxW8kq2=L`z1GS!?n{@BhP%-ne zUW6FmHsMtvNdT~Y$e2X3TP3(i=bp5lb-D@mK^ePt7+aaxaa8)is0z??^tj}Cz7h7y zTX@TeSFloUVjZ!=NOGA~<|kI^&=%v%I_bl?_IR#BoZ6{Zxm~GfE%2h=9@3O6_f>(~ z^4eZQMsb(#0Gdk)p>@XUCN5TlCl1dD7t892dV~5dt-b?8ooD$sdI~$b9&p6_b}y9) zBUL3Szqu0AqX0&jdZGM0!2OCRkkdv3(C#Tx>-8a}e&>pU}dsnwvifmZdVl%=9j=H;)cl1L*m#xZx zbx$Yg$?HU>H2hTE9D`ZIlWhS${Nd@oUcKBpl?2OXAZnpslV*RWBIkURP=F?|gldHw#MO7U{xG!q50QG)KGRC zST4Eb{%Jy#C;Ict+@A`SniaT1gvocb+p)skutQFu7jvgPVa*`q$eiZoHos(d)NOC> zZF7Z4*n)#q5TOJ~e1$=h;i*+L)|Q2STkAwq@1$97_Y8{VA%)mQa1H1=Vs$K1zkM=V z+R}6svs^c|JM6mzm){|mD$pJEQ}o_m?FJ>x#sAkPFtR##1c*bX{!n6xrXxJEk>4B&@^=8O^MHP@rm5Z<|n>1#1p~) zA_Qk?>N{?kZ<#g=fQqajL3h^+y}yM*;;nPgL2o=i%uMi@>lmT2We_dl(p#O?&9bD< zJJjJbsA_t9g48!WQfBh$&WQ{V8<7F1yU=Drt5DLNMlbGY$V;43dZ7L;@xLz-g?~hp z@fW0cGDrDW8kLpx)|2-&R!#aPe%6A>cDyw1symer=03wBza0=x`w~HP-&<)bFwh{JdCN=xX zEB}$35m9dUDXIs1NYS-|-G(**{0gBVNF4jDB0eBKgA{8@4gLr_IrPEysvg0)VFk;i zU)0??NSo%kw)xU6NYRGxeiaj%Am;!h8A3*@y89Ef@yby#zW8K)yaD|;sWg|`2H2AI z5(DI80VBXS4kP8NS?l#VsQe}W_UnN4Wej#S&38tG7f@bJSg^)&sZA53^;{bxs-YUp zDO#UUxFeEUlOzp_SD5137F(*z6yx6=Yv^s>G$6EJwBjW@6%{h`JBqJ~i;gShJ;fls z=5A0B;)nnvVxqmhLm}hFh~Pgt6e)c76cc>5n~M&h)!$(>#`v0!(ndvp{8A?t4)`nLC4+SRl6G~;ijFj5hc zF>hJ8gwaRDfTP956Cwv0+oXx9ca`_{0Igyd6=jZ$Oc!s{+#gGqsC6+0%7Kzs+SkmH z7}<%Izr`oP7}V)*L(=u$l8-gqTb*_L8cB0i0p-n`H(9n0)x<+&m|11`e_g@lB*>F` z@`83k>w8`qc~HeZj-8dDuXxy3awoS=&;E_xtg?I9I3FZ0$D^vsp+MzVq$5X;shvK% z{lf=Lb9F{^%TjM>*#Xgt;iQ~Z(``XQDir)3o6g2=o)pYgGB^5Pn-*(L6_5WlTBl{J zu<*f}>fytOi8^Hyt1JpBv@!yBvveT%7w@BHCzcCVYivIjCB=YClHLMl9A@sbWg%;7 z!^t2an+cv(RW?>7LePrW-{|4G4gU7_0D9*b$?Yp6g@p3lv%UCZizQZ(_jCtBMzQef zRs9<-Bg)BSZ0*=5PPsD_Yp&I&%|&xk`$f^`-gc;1qBO+`x4tfN`pQH~(?>gvu+Vn5 z%>4ByN>R*E$N-Oa^)DrUP71Ilz>A~zQ;k7)U#KHFjrm4pH7T@jjL<6qmPEo;Wn@}} zyBAnNGweYsn0^%*=mG(G+`45Ghs5&2p0kCL>LoFl{1H(5WYiYQ5*1fCYh=p|=)3jC zTTQekR`RDAhT8JVP1xpfg+*MD&}aHnaUw}! zC7SFZBrqJ=l;0?DEINJoUQGa$S)i&6>EYz{pi1QIgjg~nEDu-_#RI%8@{qGU+?x$W-1jCCkwWN@9(@^+i3@E)QgwIIu8GcVL|4hv2>k_1H#=U=6Z1GZ9&SzEyRO12873K|^v z9cX8#qF}aTJzr`uLhCvO$Ng4yEGq7<*+Vs+8}^vZ@KTytZl7>~c5aY17gOGvY8+Cd z&pn`T#b+NxW8Vb~>hA2Vt{TYpr1WYCcB}RW74^ip4@{nA!jQ-Ken>>|)_e0IXsvdM zy#Ov5c&gRRrS?sXk6-+SEW@)A0Xq@0Y|ZDe z(C*3r3x1zbOVu1CWT`s%BCv^+Drb`M{Fsbq0`zW6;y2sVr_uC}HKv&thrj^-Y5k%Y zIh8ocd{j!(95!-w)TdGbs`^{!CY66F7a`-2q+phq{hU^?CifGmyHL6bDrMCHaSjW* zcd7(=F}kpb`;ghMy1b3%j;T_s+^iS}-E?ET-jc)!E?%pKs&UNORWd2o3CA`XmrZOZ zdP^;ycbengjC5PFAga>| zsS5$G<;o>L+jw>@)82F}$a|_#BsufW{+R_C_q1OIsd)2!s>oKqC@NLPr7C;Ivn9WS z0$lV(;*7x*GPc|yxV7z&OJZu(% zl8MDmp3-T8rvfO9xHbJ+7%E*#WcAmt1`W!v@mnISRchy!DxH$|C0W)f&CN@uS%!p2 zBWz7Fuwrk|>}UZ9253uW+jyBV;>CdIMvW7rP7QeR+*8-gr*Di$nt!@P5bAs%A{wa< zF|)1CCclSOSE7kB;Y{G@ekajaZz92uWQgCQIy@>J%QrgI0X!wB()(4}<|CPS{lg!7 zw%r(0CTKEVuMiBFOfwjp5v+n*3vDIVa6{CeutYP{A*v(U=(i-;DJI;`r31w&eSKbK zGR$mP(6FO3_#Q)K`dc&OzUXj-BbUmwY@a(B`i&t)NO8tJtr0ruZru@3hjUV^H(Vhl z>WDPT-kKLCrF5LJhY`ptHhWK}R2Wj+ugWX?_*mbv^av@PWtb8D=s0ZFO%t49&YB(o zt`wA=#>7FL3bZ(-U2*7p5Omns#sR&E<4lU@{F!69rdXGZS7BeoUjVLf%go!RNeR5X0|dCIs*H* zZtK^ukm_Ml51_WkP4^GNKf7(k$v&mGxnZxN zzQ0#Dzx_t_;7+TQ>oj*VZWi{~k`2=@x~@5B{RzKj3f%xJDYj!jGAF`x_;Zw^_^Mg7 zjxhs{?DxVF9Qz?_V##)mF-DAd(Yp_dMAW*n5Vi` z1F&(!)2A{A-sc;V!=lZ3lk-pYDbd-tjEmPy)BMbl2;{?`cb5*TXTY&DPR~c6ic!2} zjhKb>jjUSHLyIy*I#d9<)NLhIBHcs{2;Ztn&hgaa7ggJ0)JK_Mg-{Qaoe;9a%i3~J z^pf)WU+)H^jhuJEwPRQMt}MHNw#{y^z1dr&c8^Rv6m&m4K1?lW^hMg81Ea=k)@gK( zj6T4c1jlX9qWG0ZvbBr2ArFkX*S+Eo`A1N!)c9TggBOgRdbo7)%6H#d4oc$i*7V^W z4xovzKoJ1}0ci)}bb4;^r&`O|qQf}kFj<<@NmQ9L(!u4-CsXrejZlEaOgySmFPzcg zVOm^aOWJ(M!*IJ#_5|mbzEqk#a~d3XV%M?Ja={y?zu#XL(bR`itlt_~ZEf~BOZOmz(zLg>~_ zxK_^HwOcvY4R>x06|)@c zi7D1VgBj5W-e4P!iq#sVlEew5&;En$=zPi|c5LOGYA6b!tgLKd+S900qK&(usOlQD zCkBMas3;{yZ}5~vp`+iQc)^W~qdi}By%kX7HfBZAV~zY_M-hvQ{c|kMlCY8*Yzl>? z_jaJd#rf7swCsd@1>gB+{pChi4}(Y^4%)-wpxfNa*L^D=M|z?d&*6Hi3B~-%tK8m6 zN%?l@l6qbP&nB?Do9|GZkao0vy0VeE(C7Jv-gLc}NnEqXb+I_#1@~+1 znNw2gKE~a*C>-VLkKboT0(u)!$jI61=i(qbe`BX5Y13(0h{Xk>?xJe=&v>w?uJ>DU z$~pMnsM2^LV(a)=q)}8;iRrNT8bVn@*8AAL(w<6f0Jd#YY>*XSDzzK6*=I^p|H0&C zy?R?Z*ktU9|ZqYn0; z;h5?+$wlxhzkdCq!sB-|RV!Q6*PDeDZruu%Q}iyiQ0uGVK&lLp)c zq4S1LQvE$AzJ79wn4o>u64h*+3+(S91!bQZ7pXQb1^rzU*t~gF+I146lji!e#l5O8 zA}T2G*_;jruLreIG^e?lP!IIUQ=&QLuu8_g7r0=89`sv{NIT<-c;O0QTS9@}TZ5hY z+@|BIwAVtV!^`W-Xh=+9}%3`Z-LZge$sHhJ5>eny0g&|UDaGFgby)6t3XIY5ngjz?I; ze<_pgp4MuZcB|$Mza`i>^yHUGu1iWX>M>~ip%bD3y>5l^14n{|$I zC=-_J27^6^VJG{WUpe##b(0)Vf6da17*?8&gw_=a(F!xd<*3wkIl8Y(&*?QtfzI7m zjc4LN*%1(BKc4WllZi+1X}lnpvtQ+7f^V|%a*Sbmx@XCg%%m8kDE!@4U}+I6HZ3s1 zYWHRI;htsXYpk1yzxU9vppK#Yc&Ay>Q6}NZ*wVmyJwHkFO)kx%vHY(Oc;!`iBW)ru zNN%KovOfEW(ldYO>3uS&%dxmRmiJot?u8L=xb1h2SVb}#nWJksugcHdeNu9h)=3Fl z^TS0JVwu_;7xBYK){7u@E$)b0B|EE54 zqJIm9qBodI6I1(f3%-X@9?5*2?x1A#bf|Jq7E&tTG8<;K^$TD%pJxwqU8Uw0=O3QU z>dUrn8)Cg+SIuUl)L^cE>46-;EgeMmI!LZPL-GT zpD2>9X5GGfg(QOCj6=nLdbv!a{0lTmn3=*NVO>kzcgzdwV&1>c;fbGmQ{oXVY(F`L zu#?o~WY`QzT`%3UOtJ=7k2EDGSk~SXR|#5L4peYaxH&((yStmd1k`Dw8|pfh&E3uU zb^4`xQ|nbD;##)T?i(R^XJ@JwXRIW}E9>^3utb}`ahHdEn^-kwF6phmzXT}xI(zrH{NVlXPVrTVx@`l_?{FVnkf$Wr z;v-W$dH4%g&`zGLMXN)ZwZVL_Z6Ej5La;{DJ{HRab&U^&zyD_)v*O5$UA+Tyh(s1#h&LB|5+ zmYc7gcs0fjR!E=Q@|l!+X77lia*9qd`0qr9@ImCdAXnqZ0Tj(yBE};IW+2xco&8$0 zpwIz(^!u;U?mtJntnFUd(E#*ra1}o|9|trL!3MvRbl9P~@eT2#@oE5%zzbcm$&n>M z#5$VV{!cP?>lx;i6T#Xhu!-;H2LF2ah745SArW+v$L^D=fFDF#Xvfa((}b;e6XHTa z<^v_!IU}DqS(*F4ptwK?GCr>|W_| zeNgW5!ue2NWvP%Lx2(=c%p(CcAQr|IkHQU%;bzXltn6&cwo(wvhC*$%Opin|Ed zxB(LalENtRLam@d8LPv&aYL}APpW&79;&~^5xV=@6|QSVt!;6VfP7MWUiH2}0!Guy z^erOdBIaNVOqk;Z@^v9rTOIZGAcSHo=JscrdZAHB#Yk{Z$6M0%zRVw5PE+Rd3!k3d z6p|FCc8|yb(G;&#L~~R;<5!Bx5DHJt7^rgQpr^0ierXA7nzCD;b*eiU2rrTxK(qp8 z0alB3S=LGqXbsf;j~hOTr%C#MguxYaTiV-m)Nf_p4Wxw5j(tNtL_^IlaA+&epl6$n z<=VrpMJ$q@jS;9hQ(j>@2U~ol$HtO_}D@-ya1^ zeri_btvlVfuyk%ov-yT7FIuEuy4OjnH>Mb(;utG$#I`iTC6?XzSu1uj(YDiii}1F` z$ym@of)@>tC}xTK5a7w zO=H3^S~~_)j?xNaHB#e3bw0058{R*9$fWA2Q&7{VA)QA(viZjsaAB+&G*uRw=S*3- zYl_!Y44Z>ZMAiFmPk8Ex^l;7AL`(I%JTI{GW452I*RGy3eBstP)OJltE;Q&Ykjoho zdBC6k*L%I&);bo*RDelriHnkYLBdUpu==n-*+#*&SWrH1nn+{g(0R9xustK(elhNh zuGCVSM;W7&+VNX;H7Tp`{X4?5b`lcFOnMkgIfIY?{3Z+k82`{d{m@7}ORhz(bzr`@ zb&|!buea}_4^Js(E&c5;BKv~6dxq|e*j9sE``ukm4lPLt)VowTbl%JRy~Ci-G+RfXm4=j-JScCRib zRq?Ugg~ewK@fT^`g!c_p9({ecbjl;fIG4?%&DK?6j2p8KekXp0ZuM?~Yp?iUMI zQ+WN%v^`k2`R4D?lGfIrfo+#gS)b?&3Xp3cf7|Z?}Lj*+Quz&m%e3PUn#3Obzd!$T8wTQs0R=p={$X! zG-n%g@oRZCS+l>MaX)t69SZfgEZwU_J^;}Mrkdw5cl)tbC#mwrDmr}-PL5cuQIqDR z(xC{3Y55kJ`4%Yet*-^j-QkSw;mXF(=|7%HU=tJ{G8a?liAOjH(ZN>qZ+ht08lrjw zQ&T*xsp30S=0mkM$|?%I7RDvko3G@q4|fkNz&k_rtg{a3B0MmKBRt0uz}nIvE)@7I zh}P(6fWk=UT(*e%qR^1%5$d5dH0(-3f_u-O!fxl7y|&qs6$Tx9hUucnwrUvlbA2l8vSkwkO6Z&8}hYG~dpts@a;?X9hi&Vh^{hv>Tkz%%^ z-pt^v>tZIcKbts68J9YubQEr_Q{HT4nK3aPDFdu$WsCfsw>nY2{v*y4?SkiOIzD(x zEALdZ?KtPFO7DqGlI^D;=}}^+J7UhqdX|8^Fm zmU&;?b$>Ou`Fvo!X6vGI(3{4FRW*^Mvfv|?08xCaDToiLHHK!>O7mEJ!$)kEku>xS z()~5pP=pU0@}SXwK|aDlsQU;Onv&EmlJGUwn#1xC8oO~jb|Z--`9*mL*u`&yHNvyR zs{clACHa4<92g?RLrHZWDox`bt}2T&(?jhyFSvHstg(tKu?Yx(p+%F14Hf zT0U{t5oaaPk&Inx_xDwMN&aQ-p3-C4hWk&;P4{sd8%xPD8sm|*{GxfS{Kzq#pBJ}J z%t((Gnc#W9`bepnN%ACe%nLL9Tx9O<<~kN&kPHO<0>^a1d3`?y>@Mt6h#Fe}x0m0~ z;tl&5UMi`ic<*&m*!_VTF-7iNEbdLMj*FIclC!4>`xzt~H(L6=^JKS#vJS_N^Y=>1 zD^K&FeJA->Y4-zus#AYL+dos z+agS~;{aamiWziwm4ic^If7o!-cgNxMs}QHGVpyC z|0LfpC4NHVn0|h8;uM4L8au4YsBvUgjb={i+!nwBOSbxf5ZLzj=nz z`VRQVLwi*G?o_H2%L3>U%EJAd(Vn6-A|1vzbyIO97nFvUtA2(nwYZ0V4%Q!Py4W}; z3usqXj~T$u{?!Ykzx7Ug)wm6tP;bI8%DSzbGi%g*XWFT#KIC-yzrQQ+Vx{KWJ^>M; zD$4E!;xTKx9_mMpR?dZ6!xd1+z9-Mj&60iLwZe&$We@4`&a5=0w*1qj#E?0?`8h|P z*YVCP0%M=7{ks3P{WTlpo+VYYeMpnUS}%`ZjV(7drT4c4d~R{ZcHllng{j}CUOz`m zNsa6hAQHx2$xVm+`b07IojC$!%{XxVP+_gz8Sk&K3Gm$I(Vr>wQ#_oFe5|#}YI@8M zkbZYj71#0I%r{L9;>P*!Y&B+R$N>KC>){$8sSVkhmR6B(zkQ-@o>y_S>;-;ZPxz!x zt5*IdX?z|s=mwjpZ%r|m`$@Y zn*ME}5`sXbYX+#t@^al2YXvHY?sEUh4@bF|o-}+DndsU!)Z_-hX`JB8CQ#_r5}#6>mo2fX_3kaR8p!LETX?$_7f z6g$TN?>o?P8U{BWh~FlCxGo_f@%p7b>T{L8O=;R{&O4XY`vh^!I~Phl=+Iv}m-+0? zvERRc=R89n#D)gJKVjpX`wzWdy?SMb&;R`g$X1e4JP0bPfoL7JyVp#7L_Jq+B7=O# z^U{?31ruSZMo1L^tgI^$h4HcYUDgQT&kN}YH?P34oUOiW~$NC zl%v~a1;sDmkLm;KqnE`k8=gOAPM5UckV`ARY)#HAa6V|NBeF+9L`YkgPY=szCC2Uok zrWaa?t*=$n?KEis8V<0Tz9V>OGj3}Xu3y4dM~{8!D?=OoRBZL8=e4y%z%cAUyu)$gM2-2*1vw` zY+T|r-wW270IXKhoM(<~F$H1kQ}nm6O0yX9gT45pvzqWU`FV&UUv&@M?YKlze&6c$ z&N|-x6H}>B`&{c^?aDr%o?8st?~k#s%uxMwlDYrn`xcq_6nbr6CIZHn!UN`tA@g#T znZ&F`$;w;u6{oniXM@j20n5!0O9v$1B zM8w&}=CCQa6mqL=Gn;0;>9Zl`xX%3S^Pr*UIlMs`YmLlJ4fV>zI=1&OhAb6Yck}Ew z@F05jv`}JxguFPHHLX3!SA5<4{@O1nYpiUEyP0Eq;dca{_-n3e=0wQ$yWALsR*_5x zvLDu|^vq29-0$*Tjm&*h5jWLu>aNFLBirYX_mZZvqVAHW3v06)=ceKXh8bxivGww6 zhvuUR=7IxnM<11ME`t>kF$l|n@0K$3tw+^CUrETdD#;ZJ8-GQ{>aqxf+sla8!)lI4JK%uYfZf3th1UDxgp+F#`-K*RJFLuo6&mUm zj zkcvwJ?Ho&yDZzNMd-l+?prH4dZW(C0(1Ra+k}ja{&kFE#mQSrWJK(fb)KuV_tEm z@t`>l;K980sCmS-BZHpG1Ii|j?Lv!k-}mNzOiZoIatX>~v#MVay&16kZ92u6NR5=g zbA6hGi2>&S zoXng+;MtB|%cT3C1+jWCr_TuQQ_4ZO=4{17yDXXU#XGuYY-= z0YD}E0_aSQrL0n1dQ>Szroy}Y#j6z*l^?6e4qdis06!W2wcaS~JvtBcX}Axd=B{vQ zCtZ*!SqzaGi#S$A%6xl=TUZ51K)>Z{3ZjHBnrM64-5rTNbLLD^N<3@2n-f6gpGHH! zStw`u465_pJ2Xu$qiYC6FM>{?#sL9yJITY9kO%a~Hj{iHR?P~-ZzeL{Y`E8KmZGu2 z8h7h#{;NmKI2GnU59jj{a{FXX1xu}6tIaX8*!j8l0VV_cd(RkIrlw23ÊTaLsf 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

    Hs-ZL0ZSU1 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 -Content-Disposition: inline; filename="nf-core-biodivpipeline_logo_light.png" - -<% out << new File("$projectDir/assets/nf-core-biodivpipeline_logo_light.png"). - bytes. - encodeBase64(). - toString(). - tokenize( '\n' )*. - toList()*. - collate( 76 )*. - collect { it.join() }. - flatten(). - join( '\n' ) %> - -<% -if (mqcFile){ -def mqcFileObj = new File("$mqcFile") -if (mqcFileObj.length() < mqcMaxSize){ -out << """ ---nfcoremimeboundary -Content-Type: text/html; name=\"multiqc_report\" -Content-Transfer-Encoding: base64 -Content-ID: -Content-Disposition: attachment; filename=\"${mqcFileObj.getName()}\" - -${mqcFileObj. - bytes. - encodeBase64(). - toString(). - tokenize( '\n' )*. - toList()*. - collate( 76 )*. - collect { it.join() }. - flatten(). - join( '\n' )} -""" -}} -%> - ---nfcoremimeboundary-- diff --git a/conf/containers_conda_lock_files_amd64.config b/conf/containers_conda_lock_files_amd64.config deleted file mode 100644 index d3ee1b4..0000000 --- a/conf/containers_conda_lock_files_amd64.config +++ /dev/null @@ -1,2 +0,0 @@ -process { withName: 'FASTQC' { container = 'modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt' } } -process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt' } } diff --git a/conf/containers_conda_lock_files_arm64.config b/conf/containers_conda_lock_files_arm64.config deleted file mode 100644 index 2b90ac4..0000000 --- a/conf/containers_conda_lock_files_arm64.config +++ /dev/null @@ -1,2 +0,0 @@ -process { withName: 'FASTQC' { container = 'modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt' } } -process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt' } } diff --git a/conf/containers_docker_amd64.config b/conf/containers_docker_amd64.config deleted file mode 100644 index 65f1814..0000000 --- a/conf/containers_docker_amd64.config +++ /dev/null @@ -1,2 +0,0 @@ -process { withName: 'FASTQC' { container = 'community.wave.seqera.io/library/fastqc:0.12.1--5cb1a2fa2f18c7c2' } } -process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.34--db7c73dae76bc9e6' } } diff --git a/conf/containers_docker_arm64.config b/conf/containers_docker_arm64.config deleted file mode 100644 index 6c845ba..0000000 --- a/conf/containers_docker_arm64.config +++ /dev/null @@ -1,2 +0,0 @@ -process { withName: 'FASTQC' { container = 'community.wave.seqera.io/library/fastqc:0.12.1--e455e32f745abe68' } } -process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.34--d167b8012595a136' } } diff --git a/conf/containers_singularity_https_amd64.config b/conf/containers_singularity_https_amd64.config deleted file mode 100644 index 838f248..0000000 --- a/conf/containers_singularity_https_amd64.config +++ /dev/null @@ -1,2 +0,0 @@ -process { withName: 'FASTQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f2/f20b021476d1d87658820f971ebecc1e8cdbde0f338eb0d9cea2b0a8fc54a54b/data' } } -process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/1b/1bef8af6be88c5733461959c46ac8ef73d18f65277f62a1695d0e1633054f9c2/data' } } diff --git a/conf/containers_singularity_https_arm64.config b/conf/containers_singularity_https_arm64.config deleted file mode 100644 index 090173b..0000000 --- a/conf/containers_singularity_https_arm64.config +++ /dev/null @@ -1,2 +0,0 @@ -process { withName: 'FASTQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/46/46daf2dad0169afd2ae047c3e50ed3776259f664bf07e5e06b045dc23449e994/data' } } -process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9a/9a1fec9662a152683e6fcae440d0ce20920b3b89dc62d1e3a52e73f92eba0969/data' } } diff --git a/conf/containers_singularity_oras_amd64.config b/conf/containers_singularity_oras_amd64.config deleted file mode 100644 index 773f369..0000000 --- a/conf/containers_singularity_oras_amd64.config +++ /dev/null @@ -1,2 +0,0 @@ -process { withName: 'FASTQC' { container = 'oras://community.wave.seqera.io/library/fastqc:0.12.1--5c4bd442468d75dd' } } -process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.34--4fc8657c816047c0' } } diff --git a/conf/containers_singularity_oras_arm64.config b/conf/containers_singularity_oras_arm64.config deleted file mode 100644 index 798cc63..0000000 --- a/conf/containers_singularity_oras_arm64.config +++ /dev/null @@ -1,2 +0,0 @@ -process { withName: 'FASTQC' { container = 'oras://community.wave.seqera.io/library/fastqc:0.12.1--127a87fc06499035' } } -process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.34--7fbd82d945c06726' } } diff --git a/conf/igenomes.config b/conf/igenomes.config deleted file mode 100644 index 3f11437..0000000 --- a/conf/igenomes.config +++ /dev/null @@ -1,440 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for iGenomes paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines reference genomes using iGenome paths. - Can be used by any config that customises the base path using: - $params.igenomes_base / --igenomes_base ----------------------------------------------------------------------------------------- -*/ - -params { - // illumina iGenomes reference file paths - genomes { - 'GRCh37' { - fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed" - } - 'GRCh38' { - fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'CHM13' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAIndex/" - bwamem2 = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAmem2Index/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/CHM13/Annotation/Genes/genes.gtf" - gff = "ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/009/914/755/GCF_009914755.1_T2T-CHM13v2.0/GCF_009914755.1_T2T-CHM13v2.0_genomic.gff.gz" - mito_name = "chrM" - } - 'GRCm38' { - fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/GRCm38-blacklist.bed" - } - 'TAIR10' { - fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt" - mito_name = "Mt" - } - 'EB2' { - fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt" - } - 'UMD3.1' { - fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt" - mito_name = "MT" - } - 'WBcel235' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" - mito_name = "MtDNA" - macs_gsize = "9e7" - } - 'CanFam3.1' { - fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt" - mito_name = "MT" - } - 'GRCz10' { - fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'BDGP6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" - mito_name = "M" - macs_gsize = "1.2e8" - } - 'EquCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt" - mito_name = "MT" - } - 'EB1' { - fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt" - } - 'Galgal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'Gm01' { - fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt" - } - 'Mmul_1' { - fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt" - mito_name = "MT" - } - 'IRGSP-1.0' { - fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'CHIMP2.1.4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt" - mito_name = "MT" - } - 'Rnor_5.0' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'Rnor_6.0' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'R64-1-1' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" - mito_name = "MT" - macs_gsize = "1.2e7" - } - 'EF2' { - fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.21e7" - } - 'Sbi1' { - fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt" - } - 'Sscrofa10.2' { - fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt" - mito_name = "MT" - } - 'AGPv3' { - fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'hg38' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'hg19' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg19-blacklist.bed" - } - 'mm10' { - fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/mm10-blacklist.bed" - } - 'bosTau8' { - fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'ce10' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "9e7" - } - 'canFam3' { - fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt" - mito_name = "chrM" - } - 'danRer10' { - fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.37e9" - } - 'dm6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.2e8" - } - 'equCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt" - mito_name = "chrM" - } - 'galGal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt" - mito_name = "chrM" - } - 'panTro4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt" - mito_name = "chrM" - } - 'rn6' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'sacCer3' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" - readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.2e7" - } - 'susScr3' { - fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt" - mito_name = "chrM" - } - } -} diff --git a/conf/igenomes_ignored.config b/conf/igenomes_ignored.config deleted file mode 100644 index b4034d8..0000000 --- a/conf/igenomes_ignored.config +++ /dev/null @@ -1,9 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for iGenomes paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Empty genomes dictionary to use when igenomes is ignored. ----------------------------------------------------------------------------------------- -*/ - -params.genomes = [:] diff --git a/conf/test_full.config b/conf/test_full.config deleted file mode 100644 index eb6bb25..0000000 --- a/conf/test_full.config +++ /dev/null @@ -1,24 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running full-size tests -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a full size pipeline test. - - Use as follows: - nextflow run nf-core/biodivpipeline -profile test_full, --outdir - ----------------------------------------------------------------------------------------- -*/ - -params { - config_profile_name = 'Full test profile' - config_profile_description = 'Full test dataset to check pipeline function' - - // Input data for full size test - // TODO nf-core: Specify the paths to your full test data ( on nf-core/test-datasets or directly in repositories, e.g. SRA) - // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' - - // Genome references - genome = 'R64-1-1' -} diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index ffaa827..77a1912 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -1,185 +1,134 @@ ---- -title: Contributing -markdownPlugin: checklist ---- +# BiodivPipeline: Contributing -# `nf-core/biodivpipeline`: Contributing guidelines +## Branch model -Hi there! -Thanks for taking an interest in improving nf-core/biodivpipeline. +| Branch | Purpose | +|---|---| +| `master` | Stable releases only. Never commit directly. | +| `dev` | Integration branch. All feature branches merge here via PR. | +| `wp1-*`, `wp2-*`, ... | Feature branches per work package | -This page describes the recommended nf-core way to contribute to both nf-core/biodivpipeline and nf-core pipelines in general, including: - -- [General contribution guidelines](#general-contribution-guidelines): common procedures or guides across all nf-core pipelines. -- [Pipeline-specific contribution guidelines](#pipeline-specific-contribution-guidelines): procedures or guides specific to the development conventions of nf-core/biodivpipeline. - -> [!NOTE] -> If you need help using or modifying nf-core/biodivpipeline, ask on the nf-core Slack [#biodivpipeline](https://nfcore.slack.com/channels/biodivpipeline) channel ([join our Slack here](https://nf-co.re/join/slack)). - -## General contribution guidelines - -### Contribution quick start - -To contribute code to any nf-core pipeline: - -- [ ] Ensure you have Nextflow, nf-core tools, and nf-test installed. See the [nf-core/tools repository](https://github.com/nf-core/tools) for instructions. -- [ ] Check whether a GitHub [issue](https://github.com/nf-core/biodivpipeline/issues) about your idea already exists. If an issue does not exist, create one so that others are aware you are working on it. -- [ ] [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/biodivpipeline repository](https://github.com/nf-core/biodivpipeline) to your GitHub account. -- [ ] Create a branch on your forked repository and make your changes following [pipeline conventions](#pipeline-contribution-conventions) (if applicable). -- [ ] To fix major bugs, name your branch `patch` and follow the [patch release](#patch-release) process. -- [ ] Update relevant documentation within the `docs/` folder, use nf-core/tools to update `nextflow_schema.json`, and update `CITATIONS.md`. -- [ ] Run and/or update tests. See [Testing](#testing) for more information. -- [ ] [Lint](#lint-tests) your code with nf-core/tools. -- [ ] Submit a pull request (PR) against the `dev` branch and request a review. - -If you are not used to this workflow with Git, see the [GitHub documentation](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or [Git resources](https://try.github.io/) for more information. - -## Use of AI and LLMs - -The nf-core stance on the use of AI and LLMs is that humans are still ultimately responsible for their submitted code, regardless of the tools they use. - -If you’re using AI tools, try to stick by these guidelines: - -- Keep PRs as small and focussed as possible -- Avoid any unnecessary changes, such as moving or refactoring code (unless that is the explicit intention of the PR) -- Review all generated code yourself before opening a PR, and ensure that you understand it -- Engage with the community review process and expect to make revisions - -For more detail, see the the [blog post](https://nf-co.re/blog/2026/statement-on-ai) for a statement from the nf-core/core team. - -### Getting help - -For further information and help, see the [nf-core/biodivpipeline documentation](https://nf-co.re/biodivpipeline/usage) or ask on the nf-core [#biodivpipeline](https://nfcore.slack.com/channels/biodivpipeline) Slack channel ([join our Slack here](https://nf-co.re/join/slack)). - -### GitHub Codespaces - -You can contribute to nf-core/biodivpipeline without installing a local development environment on your machine by using [GitHub Codespaces](https://github.com/codespaces). - -[GitHub Codespaces](https://github.com/codespaces) is an online developer environment that runs in your browser, complete with VS Code and a terminal. -Most nf-core repositories include a devcontainer configuration, which creates a GitHub Codespaces environment specifically for Nextflow development. -The environment includes pre-installed nf-core tools, Nextflow, and a few other helpful utilities via a Docker container. +``` +master ← dev ← wp1-nf-core-pipeline + ← wp2-annotator-service + ← wp3-taxonomy-classifier + ... +``` -To get started, open the repository in [Codespaces](https://github.com/nf-core/biodivpipeline/codespaces). +## Git conventions -### Testing +### Commit messages -Once you have made your changes, run the pipeline with nf-test to test them locally. -For additional information, use the `--verbose` flag to view the Nextflow console log output. +Use [Conventional Commits](https://www.conventionalcommits.org/): -```bash -nf-test test --tag test --profile +docker --verbose ``` +(): -If you have added new functionality, ensure you update the test assertions in the `.nf.test` files in the `tests/` directory. -Update the snapshots with the following command: - -```bash -nf-test test --tag test --profile +docker --verbose --update-snapshots +[optional body] ``` -When you create a pull request with changes, GitHub Actions will run automatic tests. -Pull requests are typically reviewed when these tests are passing. - -Two types of tests are typically run: - -#### Lint tests - -nf-core has a [set of guidelines](https://nf-co.re/docs/specifications/overview) which all pipelines must follow. -To enforce these, run linting with nf-core/tools: +Types: `feat`, `fix`, `docs`, `refactor`, `test`, `chore`, `ci`, `build` -```bash -nf-core pipelines lint +Examples: +``` +feat(pipeline): wire 7 modules into biodivpipeline workflow DAG +docs: rewrite README for biodiversity pipeline +fix(schema): remove samplesheet validation from nextflow_schema.json +chore: clean .gitignore and remove stray Nextflow artifacts ``` -If you encounter failures or warnings, follow the linked documentation printed to screen. -For more information about linting tests, see [nf-core/tools API documentation](https://nf-co.re/docs/nf-core-tools/api_reference/latest/pipeline_lint_tests/actions_awsfulltest). +### Branch naming -#### Pipeline tests +``` +wp- +``` -Each nf-core pipeline should be set up with a minimal set of test data. -GitHub Actions runs the pipeline on this data to ensure it runs through and exits successfully. -If there are any failures then the automated tests fail. -These tests are run with the latest available version of Nextflow and the minimum required version specified in the pipeline code. +Examples: `wp1-nf-core-pipeline`, `wp2-annotator-service`, `wp4-outlier-detection` -### Patch release +## Adding a new module -> [!WARNING] -> Only in the unlikely event of a release that contains a critical bug. +Each module lives in `modules/local//main.nf`. Follow this interface: -- [ ] Create a new branch `patch` on your fork based on `upstream/main` or `upstream/master`. -- [ ] Fix the bug and use nf-core/tools to bump the version to the next semantic version, for example, `1.2.3` β†’ `1.2.4`. -- [ ] Open a Pull Request from `patch` directly to `main`/`master` with the changes. +### Module structure -### Pipeline contribution conventions +```groovy +process MODULE_NAME { + tag "$input_file" + label 'process_single' -nf-core semi-standardises how you write code and other contributions to make the nf-core/biodivpipeline code and processing logic more understandable for new contributors and to ensure quality. + input: + path input_file -#### Add a new pipeline step + output: + path "output_file.ext", emit: output_name + path "versions.yml", emit: versions -To contribute a new step to the pipeline, follow the general nf-core coding procedure. -Please also refer to the [pipeline-specific contribution guidelines](#pipeline-specific-contribution-guidelines): + script: + """ + # Your processing logic here -- [ ] Define the corresponding [input channel](#channel-naming-schemes) into your new process from the expected previous process channel. -- [ ] Install a module with nf-core/tools, or write a local module (see [default processes resource requirements](#default-processes-resource-requirements)), and add it to the target `.nf`. -- [ ] Define the output channel if needed. Mix the version output channel into `ch_versions` and relevant files into `ch_multiqc`. -- [ ] Add new or updated parameters to `nextflow.config` with a [default value](#default-parameter-values). -- [ ] Add new or updated parameters and relevant help text to `nextflow_schema.json` with [nf-core/tools](#default-parameter-values). -- [ ] Add validation for relevant parameters to the pipeline utilisation section of `utils_nfcore_\_pipeline/main.nf` subworkflow. -- [ ] Perform local tests to validate that the new code works as expected. - - [ ] If applicable, add a new test in the `tests` directory. -- [ ] Update `usage.md`, `output.md`, and `citation.md` as appropriate. -- [ ] [Lint](lint) the code with nf-core/tools. -- [ ] Update any diagrams or pipeline images as necessary. -- [ ] Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name cleanup, and module plots are in the appropriate order. -- [ ] If applicable, create a [MultiQC](https://seqera.io/multiqc/) module. -- [ ] Add a description of the output files and, if relevant, images from the MultiQC report to `docs/output.md`. + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tool_name: \$(tool --version) + END_VERSIONS + """ +} +``` -To update the minimum required Nextflow version, see the [Nextflow version bumping](#nextflow-version-bumping) section below. For more information about pipeline contributions, see [pipeline-specific contribution guidelines](#pipeline-specific-contribution-guidelines). +### Wiring into the workflow -#### Channel naming schemes +1. Add the module import to `workflows/biodivpipeline.nf` +2. Call the process and connect its inputs/outputs to the DAG +3. Mix versions into `ch_versions`: `ch_versions = ch_versions.mix(MODULE_NAME.out.versions)` +4. Add a `publishDir` entry in `conf/modules.config` -Use the following naming schemes for channels to make the channel flow easier to understand: +### Publishing config -- Initial process channel: `ch_output_from_` -- Intermediate and terminal channels: `ch__for_` +In `conf/modules.config`: -#### Default parameter values +```groovy +withName: MODULE_NAME { + publishDir = [ + path: { "${params.outdir}/directory_name" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] +} +``` -Parameters should be initialised and defined with default values within the `params` scope in `nextflow.config`. -They should also be documented in the pipeline JSON schema. +## Testing -To update `nextflow_schema.json`, run: +Run the pipeline with the test profile to verify changes: ```bash -nf-core pipelines schema build +nextflow run main.nf -profile test,docker --outdir results ``` -The schema builder interface that loads in your browser should automatically update the defaults in the parameter documentation. - -#### Default processes resource requirements - -If you write a local module, specify a default set of resource requirements for the process. - -Sensible defaults for process resource requirements (CPUs, memory, time) should be defined in `conf/base.config`. -Specify these with generic `withLabel:` selectors, so they can be shared across multiple processes and steps of the pipeline. - -nf-core provides a set of standard labels that you should follow where possible, as seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/main/nf_core/pipeline-template/conf/base.config). -These labels define resource defaults for single-core processes, modules that require a GPU, and different levels of multi-core configurations with increasing memory requirements. +The test profile uses `test_data/sample.csv` (109 records) and `assets/default_mapping.jsonld`. -Values assigned within these labels can be dynamically passed to a tool using the the `${task.cpus}` and `${task.memory}` Nextflow variables in the `script:` block of a module (see an example in the [modules repository](https://github.com/nf-core/modules/blob/bd1b6a40f55933d94b8c9ca94ec8c1ea0eaf4b82/modules/nf-core/samtools/bam2fq/main.nf#L30)). +All 7 modules should complete successfully: -#### Nextflow version bumping - -If you use a new feature from core Nextflow, bump the minimum required Nextflow version in the pipeline with: - -```bash -nf-core pipelines bump-version --nextflow . +``` +NFCORE_BIODIVPIPELINE:BIODIVPIPELINE:COLUMN_STANDARDISE +NFCORE_BIODIVPIPELINE:BIODIVPIPELINE:BIODIV_ANNOTATE +NFCORE_BIODIVPIPELINE:BIODIVPIPELINE:TAXONOMY_CLASSIFY +NFCORE_BIODIVPIPELINE:BIODIVPIPELINE:OUTLIER_DETECT +NFCORE_BIODIVPIPELINE:BIODIVPIPELINE:PROVISIONAL_CONCEPTS +NFCORE_BIODIVPIPELINE:BIODIVPIPELINE:RDF_TRANSFORM +NFCORE_BIODIVPIPELINE:BIODIVPIPELINE:COLLECT_REPORTS ``` -#### Images and figures guidelines +## Pull request process -If you update images or graphics, follow the nf-core [style guidelines](https://nf-co.re/docs/community/brand/workflow-schematics). +1. Create a feature branch from `dev` +2. Make changes and test locally +3. Push and open a PR against `dev` +4. Ensure the pipeline test passes +5. Request review from at least one team member +6. Squash-merge or rebase-merge (no merge commits) -## Pipeline specific contribution guidelines +## Project contacts - +- **Coordinator:** Prof. Dr. Adrian Paschke +- **Customer:** Naouel Karam (karam@infai.org), Jan Fillies (fillies@infai.org) +- **Repository:** [github.com/biodivportal/BiodivPipeline](https://github.com/biodivportal/BiodivPipeline) diff --git a/docs/README.md b/docs/README.md index eba9a68..3b7cff5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,35 @@ -# nf-core/biodivpipeline: Documentation +# BiodivPipeline Documentation -The nf-core/biodivpipeline documentation is split into the following pages: +## Contents -- [Usage](usage.md) - - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. -- [Output](output.md) - - An overview of the different results produced by the pipeline and how to interpret them. +- [Usage](usage.md) β€” how to run the pipeline, parameters, input format, and execution profiles +- [Output](output.md) β€” description of every output file produced by the pipeline +- [Contributing](CONTRIBUTING.md) β€” git conventions, branch model, and how to add or modify modules -You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) +## Overview + +BiodivPipeline is an nf-core/Nextflow pipeline that transforms raw biodiversity CSV records into FAIR-compliant RDF triples. It orchestrates 7 processing modules: + +1. **Column Standardisation** (WP6) β€” map CSV headers to ABCD schema terms +2. **BiodivPortal Annotator** (WP2) β€” match values against curated ontologies +3. **Taxonomy Classifier** (WP3) β€” resolve taxon names to GBIF/WFO identifiers +4. **Outlier Detection** (WP4) β€” flag bad coordinates, dates, and semantic mismatches +5. **Provisional Concepts** (WP5) β€” register unresolved terms in BiodivPortal +6. **RDF Transformation** (WP7) β€” convert cleaned tabular data into RDF triples +7. **Report Collection** β€” aggregate all quality and processing reports + +For the high-level architecture and quick start, see the [main README](../README.md). + +## Technical stack + +| Component | Version | +| ---------------- | ----------------------------- | +| Nextflow | >= 24.x (tested with 26.04.0) | +| nf-core template | 4.0.2 | +| Java | 11+ (tested with OpenJDK 21) | +| Docker | >= 20.x (tested with 29.3.0) | + +## Project links + +- **Repository:** [github.com/biodivportal/BiodivPipeline](https://github.com/biodivportal/BiodivPipeline) +- **nf-core framework:** [nf-co.re](https://nf-co.re) diff --git a/docs/images/nf-core-biodivpipeline_logo_dark.png b/docs/images/nf-core-biodivpipeline_logo_dark.png deleted file mode 100644 index 8d547e4e270cbc1f367ca988bac91e01f10d42fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26383 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 diff --git a/docs/images/nf-core-biodivpipeline_logo_light.png b/docs/images/nf-core-biodivpipeline_logo_light.png deleted file mode 100644 index cdc519630a020a0ab63f612127bfbae823964898..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22148 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 +## Output files by module -## Pipeline overview +### Column Standardisation (WP6) -The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: +Directory: `column_standardisation/` -- [FastQC](#fastqc) - Raw read QC -- [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline -- [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +| File | Format | Description | +| --------------------- | ------ | ------------------------------------------------------------------------------ | +| `standardised.csv` | CSV | Input data with column headers mapped to ABCD schema terms | +| `column_mapping.json` | JSON | Mapping of original column names to standardised names, with confidence scores | -### FastQC +The standardised CSV is the input for all downstream modules. Original column names like `Sammlerteam` are mapped to ABCD terms like `AgentText`. -

    -Output files +### BiodivPortal Annotation (WP2) -- `fastqc/` - - `*_fastqc.html`: FastQC report containing quality metrics. - - `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. +Directory: `annotation/` -
    +| File | Format | Description | +| ---------------------- | ------- | ---------------------------------------------------------------- | +| `annotated.jsonld` | JSON-LD | Records annotated with ontology concept URIs from BiodivPortal | +| `unresolved_terms.csv` | CSV | Terms that could not be matched to any existing ontology concept | -[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). +Unresolved terms are passed to the Provisional Concepts module for registration. -### MultiQC +### Taxonomy Classification (WP3) -
    -Output files +Directory: `taxonomy/` -- `multiqc/` - - `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. - - `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. - - `multiqc_plots/`: directory containing static images from the report in various formats. +| File | Format | Description | +| ----------------------- | ------ | ----------------------------------------------------------------------------------- | +| `taxonomy_resolved.csv` | CSV | Taxon names resolved to GBIF taxon keys and WFO identifiers, with confidence scores | -
    +### Outlier Detection (WP4) -[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. +Directory: `quality/` -Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . +| File | Format | Description | +| --------------------- | ------ | ------------------------------------------------------------------------------------------------- | +| `quality_report.json` | JSON | Statistical summary of data quality checks (coordinate ranges, date validity, field completeness) | +| `flagged_records.csv` | CSV | Records flagged as potential outliers with reason codes | -### Pipeline information +### Provisional Concepts (WP5) + +Directory: `provisional_concepts/` + +| File | Format | Description | +| --------------------------- | ------ | ------------------------------------------------------------------------------------ | +| `provisional_concepts.json` | JSON | Newly registered provisional concept URIs for terms not found in existing ontologies | + +### RDF Transformation (WP7) + +Directory: `rdf/` -
    -Output files +| File | Format | Description | +| ----------------- | ------- | ------------------------------------------------------------------ | +| `output.ttl` | Turtle | RDF triples in Turtle serialisation | +| `output.jsonld` | JSON-LD | RDF triples in JSON-LD serialisation | +| `rdf_report.json` | JSON | Transformation statistics: triple count, unmapped fields, warnings | -- `pipeline_info/` - - Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. - - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. - - Parameters used by the pipeline run: `params.json`. +These are the primary deliverables β€” FAIR-compliant RDF representations of the input biodiversity data. + +### Report Collection + +Directory: `reports/` + +| File | Format | Description | +| ----------------------- | ------ | ------------------------------------------------------------------------------------------------- | +| `pipeline_summary.json` | JSON | Aggregated summary of all processing modules: record counts, quality metrics, annotation coverage | + +### Pipeline information -
    +Directory: `pipeline_info/` -[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. +| File | Description | +| -------------------------------------- | -------------------------------------------------------------------- | +| `execution_report_*.html` | Nextflow execution report with resource usage per process | +| `execution_timeline_*.html` | Timeline visualisation of process execution | +| `execution_trace_*.txt` | Tab-delimited trace of every task (CPU, memory, duration, exit code) | +| `pipeline_dag_*.html` | DAG visualisation of the workflow | +| `params_*.json` | Parameters used for this run | +| `biodivpipeline_software_versions.yml` | Versions of all software used in the pipeline | diff --git a/docs/usage.md b/docs/usage.md index 2f42f3f..88674f3 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,214 +1,151 @@ -# nf-core/biodivpipeline: Usage +# BiodivPipeline: Usage -## :warning: Please read this documentation on the nf-core website: [https://nf-co.re/biodivpipeline/usage](https://nf-co.re/biodivpipeline/usage) +## Prerequisites -> _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ +| Requirement | Minimum | Tested | +| ------------------------------------ | ------- | --------------- | +| Java | 11+ | OpenJDK 21.0.11 | +| [Nextflow](https://www.nextflow.io/) | >= 24.x | 26.04.0 | +| [Docker](https://www.docker.com/) | >= 20.x | 29.3.0 | -## Introduction +## Input data - +The pipeline expects a CSV file with biodiversity specimen records. The input CSV must have a header row. Column names do not need to follow a standard β€” the Column Standardisation module maps them to ABCD schema terms. -## Samplesheet input +The included test dataset (`test_data/sample.csv`) contains 109 records with 23 columns sampled from the BGBM Belege_aus_D dataset: -You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. - -```bash ---input '[path to samplesheet file]' ``` - -### 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: - -```csv title="samplesheet.csv" -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz +HerbariumID, Bild, DB, Family, FullNameCache, Anmerkungen, Sammlerteam, +Sammelnummer, CollectionDateBegin, CollectionDateEnd, Country, Locality, +TitelEtikett, Expeditionsangabe, ShowOnMap, Latitude, Longitude, +FundortUNdOeko, NameCache, Genus, Identifier, Barcode, StableURI ``` -### 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 3 columns to match those defined in the table below. - -A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. - -```csv title="samplesheet.csv" -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz -CONTROL_REP3,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz -TREATMENT_REP1,AEG588A4_S4_L003_R1_001.fastq.gz, -TREATMENT_REP2,AEG588A5_S5_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, -``` - -| Column | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | -| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | - -An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. +The full dataset (`Belege_aus_D.csv`, 109,297 records) is distributed as a zip archive in the repository. ## Running the pipeline -The typical command for running the pipeline is as follows: +### Quick test run ```bash -nextflow run nf-core/biodivpipeline --input ./samplesheet.csv --outdir ./results --genome GRCh37 -profile docker +nextflow run main.nf -profile test,docker --outdir results ``` -This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. +The `test` profile points to `test_data/sample.csv` and `assets/default_mapping.jsonld` so no other parameters are needed. -Note that the pipeline will create the following files in your working directory: +### Full dataset run ```bash -work # Directory containing the nextflow working files - # Finished results in specified location (defined with --outdir) -.nextflow_log # Log file from Nextflow -# Other nextflow hidden files, eg. history of pipeline runs and old logs. -``` - -If you wish to repeatedly use the same parameters for multiple runs, rather than specifying each flag in the command, you can specify these in a params file. +# Unzip dataset if not already done +unzip Belege_aus_D.zip -Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. - -> [!WARNING] -> Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/running/run-pipelines#configuring-pipelines), other infrastructural tweaks (such as output directories), or module arguments (args). - -The above pipeline run specified with a params file in yaml format: - -```bash -nextflow run nf-core/biodivpipeline -profile docker -params-file params.yaml +nextflow run main.nf -profile docker \ + --input Belege_aus_D.csv \ + --outdir results ``` -with: +### Custom mapping schema -```yaml title="params.yaml" -input: './samplesheet.csv' -outdir: './results/' -genome: 'GRCh37' -<...> +```bash +nextflow run main.nf -profile docker \ + --input data/my_records.csv \ + --mapping_schema schemas/my_mapping.jsonld \ + --outdir results ``` -You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). +## Parameters -### Updating the pipeline +| Parameter | Required | Default | Description | +| ------------------ | -------- | ------------------------------- | ---------------------------------------------------------------------------------- | +| `--input` | Yes | β€” | Path to input CSV file containing biodiversity records | +| `--mapping_schema` | No | `assets/default_mapping.jsonld` | Path to RDF mapping schema (JSON-LD or Turtle format) | +| `--outdir` | Yes | β€” | Directory for pipeline output files | +| `-profile` | Yes | β€” | Execution profile: `docker`, `singularity`, `test`, or comma-separated combination | -When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: +Parameters can also be supplied via a YAML file: ```bash -nextflow pull nf-core/biodivpipeline +nextflow run main.nf -profile docker -params-file params.yaml ``` -### Reproducibility - -It is a good idea to specify the pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. - -First, go to the [nf-core/biodivpipeline releases page](https://github.com/nf-core/biodivpipeline/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. - -This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. - -To further assist in reproducibility, you can use share and reuse [parameter files](#running-the-pipeline) to repeat pipeline runs with the same settings without having to write out a command with every single parameter. - -> [!TIP] -> If you wish to share such profile (such as upload as supplementary material for academic publications), make sure to NOT include cluster specific paths to files, nor institutional specific profiles. - -## Core Nextflow arguments - -> [!NOTE] -> These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen) - -### `-profile` - -Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. - -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Apptainer, Conda) - see below. - -> [!IMPORTANT] -> We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. - -The pipeline also dynamically loads configurations from [https://github.com/nf-core/configs](https://github.com/nf-core/configs) when it runs, making multiple config profiles for various institutional clusters available at run time. For more information and to check if your system is supported, please see the [nf-core/configs documentation](https://github.com/nf-core/configs#documentation). - -Note that multiple profiles can be loaded, for example: `-profile test,docker` - the order of arguments is important! -They are loaded in sequence, so later profiles can overwrite earlier profiles. - -If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended, since it can lead to different results on different machines dependent on the computer environment. - -- `test` - - A profile with a complete configuration for automated testing - - Includes links to test data so needs no other parameters -- `docker` - - A generic configuration profile to be used with [Docker](https://docker.com/) -- `singularity` - - A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) -- `podman` - - A generic configuration profile to be used with [Podman](https://podman.io/) -- `shifter` - - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) -- `charliecloud` - - A generic configuration profile to be used with [Charliecloud](https://charliecloud.io/) -- `apptainer` - - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) -- `wave` - - A generic configuration profile to enable [Wave](https://seqera.io/wave/) containers. Use together with one of the above (requires Nextflow ` 24.03.0-edge` or later). -- `conda` - - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter, Charliecloud, or Apptainer. - -### `-resume` - -Specify this when restarting a pipeline. Nextflow will use cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. For input to be considered the same, not only the names must be identical but the files' contents as well. For more info about this parameter, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). - -You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. - -### `-c` - -Specify the path to a specific config file (this is a core Nextflow command). See the [nf-core website documentation](https://nf-co.re/usage/configuration) for more information. - -## Custom configuration - -### Resource requests - -Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the pipeline steps, if the job exits with any of the error codes specified [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L18) it will automatically be resubmitted with higher resources request (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. - -To change the resource requests, please see the [max resources](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#set-max-resources) and [customise process resources](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#customize-process-resources) section of the nf-core website. - -### Custom Containers - -In some cases, you may wish to change the container or conda environment used by a pipeline steps for a particular tool. By default, nf-core pipelines use containers and software from the [biocontainers](https://biocontainers.pro/) or [bioconda](https://bioconda.github.io/) projects. However, in some cases the pipeline specified version maybe out of date. - -To use a different container from the default container or conda environment specified in a pipeline, please see the [updating tool versions](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#update-tool-versions) section of the nf-core website. +```yaml +# params.yaml +input: "./Belege_aus_D.csv" +mapping_schema: "./assets/default_mapping.jsonld" +outdir: "./results" +``` -### Custom Tool Arguments +## Pipeline data flow + +```mermaid +sequenceDiagram + participant User + participant NF as Nextflow + participant CS as Column Standardise + participant BA as BiodivPortal Annotate + participant TC as Taxonomy Classify + participant OD as Outlier Detect + participant PC as Provisional Concepts + participant RT as RDF Transform + participant CR as Collect Reports + + User->>NF: --input CSV, --mapping_schema + NF->>CS: raw CSV + CS-->>NF: standardised.csv + column_mapping.json + + par Parallel processing + NF->>BA: standardised.csv + BA-->>NF: annotated.jsonld + unresolved_terms.csv + and + NF->>TC: standardised.csv + TC-->>NF: taxonomy_resolved.csv + and + NF->>OD: standardised.csv + OD-->>NF: quality_report.json + flagged_records.csv + end + + NF->>PC: unresolved_terms.csv + PC-->>NF: provisional_concepts.json + + NF->>RT: standardised.csv + annotations + taxonomy + schema + RT-->>NF: output.ttl + output.jsonld + rdf_report.json + + NF->>CR: all reports + CR-->>NF: pipeline_summary.json +``` -A pipeline might not always support every possible argument or option of a particular tool used in pipeline. Fortunately, nf-core pipelines provide some freedom to users to insert additional parameters that the pipeline does not include by default. +## Execution profiles -To learn how to provide additional arguments to a particular tool of the pipeline, please see the [customising tool arguments](https://nf-co.re/docs/running/configuration/nextflow-for-your-system#modifying-tool-arguments) section of the nf-core website. +Multiple profiles can be combined: `-profile test,docker`. They load in order, so later profiles override earlier ones. -### nf-core/configs +| Profile | Description | +| ------------- | ------------------------------------------------------------------ | +| `test` | Uses `test_data/sample.csv` (109 records). No other params needed. | +| `docker` | Run module containers with Docker | +| `singularity` | Run module containers with Singularity | +| `podman` | Run module containers with Podman | +| `conda` | Use Conda environments (not recommended for reproducibility) | -In most cases, you will only need to create a custom config as a one-off but if you and others within your organisation are likely to be running nf-core pipelines regularly and need to use the same settings regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter. You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. +## Resuming a run -See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more information about creating your own configuration files. +Nextflow caches intermediate results in the `work/` directory. To resume from where a previous run stopped: -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). +```bash +nextflow run main.nf -profile docker --input data.csv --outdir results -resume +``` ## Running in the background -Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. - -The Nextflow `-bg` flag launches Nextflow in the background, detached from your terminal so that the workflow does not stop if you log out of your session. The logs are saved to a file. +```bash +nextflow run main.nf -profile docker --input data.csv --outdir results -bg > pipeline.log 2>&1 +``` -Alternatively, you can use `screen` / `tmux` or similar tool to create a detached session which you can log back into at a later time. -Some HPC setups also allow you to run nextflow within a cluster job submitted your job scheduler (from where it submits more jobs). +Or use `screen` / `tmux` for a detached session. -## Nextflow memory requirements +## Nextflow memory -In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. -We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): +If Nextflow requests too much JVM memory, set: ```bash -NXF_OPTS='-Xms1g -Xmx4g' +export NXF_OPTS='-Xms1g -Xmx4g' ``` diff --git a/main.nf b/main.nf index 8833950..7c89eda 100644 --- a/main.nf +++ b/main.nf @@ -96,7 +96,6 @@ workflow { params.plaintext_email, params.outdir, params.monochrome_logs, - channel.empty() // no multiqc report β€” we use our own reporting ) } diff --git a/modules.json b/modules.json index 5365116..98f7432 100644 --- a/modules.json +++ b/modules.json @@ -4,18 +4,7 @@ "repos": { "https://github.com/nf-core/modules.git": { "modules": { - "nf-core": { - "fastqc": { - "branch": "master", - "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", - "installed_by": ["modules"] - }, - "multiqc": { - "branch": "master", - "git_sha": "008f9d3e61209bf995edac3ba531f54e269e1215", - "installed_by": ["modules"] - } - } + "nf-core": {} }, "subworkflows": { "nf-core": { diff --git a/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt b/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt deleted file mode 100644 index 7770ccd..0000000 --- a/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt +++ /dev/null @@ -1,822 +0,0 @@ - -version: 6 -environments: -default: -channels: -- url: https://conda.anaconda.org/conda-forge/ -- url: https://conda.anaconda.org/bioconda/ -- url: https://conda.anaconda.org/bioconda/ -options: -pypi-prerelease-mode: if-necessary-or-explicit -packages: -linux-64: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda -- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.2-ha668962_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda -packages: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda -build_number: 20 -sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 -md5: a9f577daf3de00bca7c3c76c0ecbd1de -depends: -- __glibc >=2.17,<3.0.a0 -- libgomp >=7.5.0 -constrains: -- openmp_impl <0.0a0 -license: BSD-3-Clause -license_family: BSD -size: 28948 -timestamp: 1770939786096 -- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda -sha256: d88aa7ae766cf584e180996e92fef2aa7d8e0a0a5ab1d4d49c32390c1b5fff31 -md5: dcdc58c15961dbf17a0621312b01f5cb -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: LGPL-2.1-or-later -license_family: GPL -size: 584660 -timestamp: 1768327524772 -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda -sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 -md5: d2ffd7602c02f2b316fd921d39876885 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: bzip2-1.0.6 -license_family: BSD -size: 260182 -timestamp: 1771350215188 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda -sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc -md5: 4492fd26db29495f0ba23f146cd5638d -depends: -- __unix -license: ISC -size: 147413 -timestamp: 1772006283803 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda -sha256: 06525fa0c4e4f56e771a3b986d0fdf0f0fc5a3270830ee47e127a5105bde1b9a -md5: bb6c4808bfa69d6f7f6b07e5846ced37 -depends: -- __glibc >=2.17,<3.0.a0 -- fontconfig >=2.15.0,<3.0a0 -- fonts-conda-ecosystem -- icu >=78.1,<79.0a0 -- libexpat >=2.7.3,<3.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 -- libgcc >=14 -- libglib >=2.86.3,<3.0a0 -- libpng >=1.6.53,<1.7.0a0 -- libstdcxx >=14 -- libxcb >=1.17.0,<2.0a0 -- libzlib >=1.3.1,<2.0a0 -- pixman >=0.46.4,<1.0a0 -- xorg-libice >=1.1.2,<2.0a0 -- xorg-libsm >=1.2.6,<2.0a0 -- xorg-libx11 >=1.8.12,<2.0a0 -- xorg-libxext >=1.3.6,<2.0a0 -- xorg-libxrender >=0.9.12,<0.10.0a0 -license: LGPL-2.1-only or MPL-1.1 -size: 989514 -timestamp: 1766415934926 -- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 -sha256: 7cc26225d590540ae95cd24940ff42f2da7479dd4cd22ae9ab9298665d06790c -md5: c9f6a4b12229f7331f79c9a00dd6e240 -depends: -- font-ttf-dejavu-sans-mono -- fontconfig -- openjdk >=8.0.144 -- perl -license: GPL >=3 -size: 11664291 -timestamp: 1677946722445 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 -sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b -md5: 0c96522c6bdaed4b1566d11387caaf45 -license: BSD-3-Clause -license_family: BSD -size: 397370 -timestamp: 1566932522327 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 -sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c -md5: 34893075a5c9e55cdafac56607368fc6 -license: OFL-1.1 -license_family: Other -size: 96530 -timestamp: 1620479909603 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 -sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 -md5: 4d59c254e01d9cde7957100457e2d5fb -license: OFL-1.1 -license_family: Other -size: 700814 -timestamp: 1620479612257 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda -sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 -md5: 49023d73832ef61042f6a237cb2687e7 -license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 -license_family: Other -size: 1620504 -timestamp: 1727511233259 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda -sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c -md5: 867127763fbe935bab59815b6e0b7b5c -depends: -- __glibc >=2.17,<3.0.a0 -- libexpat >=2.7.4,<3.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 -- libgcc >=14 -- libuuid >=2.41.3,<3.0a0 -- libzlib >=1.3.1,<2.0a0 -license: MIT -license_family: MIT -size: 270705 -timestamp: 1771382710863 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 -sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 -md5: fee5683a3f04bd15cbd8318b096a27ab -depends: -- fonts-conda-forge -license: BSD-3-Clause -license_family: BSD -size: 3667 -timestamp: 1566974674465 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda -sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 -md5: a7970cd949a077b7cb9696379d338681 -depends: -- font-ttf-ubuntu -- font-ttf-inconsolata -- font-ttf-dejavu-sans-mono -- font-ttf-source-code-pro -license: BSD-3-Clause -license_family: BSD -size: 4059 -timestamp: 1762351264405 -- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda -sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff -md5: 3bf7b9fd5a7136126e0234db4b87c8b6 -depends: -- libgcc-ng >=12 -license: MIT -license_family: MIT -size: 77248 -timestamp: 1712692454246 -- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda -sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c -md5: 2cd94587f3a401ae05e03a6caf09539d -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libstdcxx >=14 -license: LGPL-2.0-or-later -license_family: LGPL -size: 99596 -timestamp: 1755102025473 -- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda -sha256: 477f2c553f72165020d3c56740ba354be916c2f0b76fd9f535e83d698277d5ec -md5: 14470902326beee192e33719a2e8bb7f -depends: -- __glibc >=2.17,<3.0.a0 -- cairo >=1.18.4,<2.0a0 -- graphite2 >=1.3.14,<2.0a0 -- icu >=78.3,<79.0a0 -- libexpat >=2.7.4,<3.0a0 -- libfreetype >=2.14.2 -- libfreetype6 >=2.14.2 -- libgcc >=14 -- libglib >=2.86.4,<3.0a0 -- libstdcxx >=14 -- libzlib >=1.3.2,<2.0a0 -license: MIT -license_family: MIT -size: 2384060 -timestamp: 1774276284520 -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda -sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a -md5: c80d8a3b84358cb967fa81e7075fbc8a -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libstdcxx >=14 -license: MIT -license_family: MIT -size: 12723451 -timestamp: 1773822285671 -- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda -sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 -md5: b38117a3c920364aff79f870c984b4a3 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -license: LGPL-2.1-or-later -size: 134088 -timestamp: 1754905959823 -- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda -sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 -md5: fb53fb07ce46a575c5d004bbc96032c2 -depends: -- __glibc >=2.17,<3.0.a0 -- keyutils >=1.6.3,<2.0a0 -- libedit >=3.1.20250104,<3.2.0a0 -- libedit >=3.1.20250104,<4.0a0 -- libgcc >=14 -- libstdcxx >=14 -- openssl >=3.5.5,<4.0a0 -license: MIT -license_family: MIT -size: 1386730 -timestamp: 1769769569681 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda -sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a -md5: 6f2e2c8f58160147c4d1c6f4c14cbac4 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libjpeg-turbo >=3.1.2,<4.0a0 -- libtiff >=4.7.1,<4.8.0a0 -license: MIT -license_family: MIT -size: 249959 -timestamp: 1768184673131 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda -sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 -md5: a752488c68f2e7c456bcbd8f16eec275 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libstdcxx >=14 -license: Apache-2.0 -license_family: Apache -size: 261513 -timestamp: 1773113328888 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda -sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c -md5: 49c553b47ff679a6a1e9fc80b9c5a2d4 -depends: -- __glibc >=2.17,<3.0.a0 -- krb5 >=1.22.2,<1.23.0a0 -- libgcc >=14 -- libstdcxx >=14 -- libzlib >=1.3.1,<2.0a0 -license: Apache-2.0 -license_family: Apache -size: 4518030 -timestamp: 1770902209173 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda -sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 -md5: 6c77a605a7a689d17d4819c0f8ac9a00 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: MIT -license_family: MIT -size: 73490 -timestamp: 1761979956660 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda -sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 -md5: c277e0a4d549b03ac1e9d6cbbe3d017b -depends: -- ncurses -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -- ncurses >=6.5,<7.0a0 -license: BSD-2-Clause -license_family: BSD -size: 134676 -timestamp: 1738479519902 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda -sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 -md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -constrains: -- expat 2.7.4.* -license: MIT -license_family: MIT -size: 76798 -timestamp: 1771259418166 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda -sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 -md5: a360c33a5abe61c07959e449fa1453eb -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: MIT -license_family: MIT -size: 58592 -timestamp: 1769456073053 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda -sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 -md5: e289f3d17880e44b633ba911d57a321b -depends: -- libfreetype6 >=2.14.3 -license: GPL-2.0-only OR FTL -size: 8049 -timestamp: 1774298163029 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda -sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d -md5: fb16b4b69e3f1dcfe79d80db8fd0c55d -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libpng >=1.6.55,<1.7.0a0 -- libzlib >=1.3.2,<2.0a0 -constrains: -- freetype >=2.14.3 -license: GPL-2.0-only OR FTL -size: 384575 -timestamp: 1774298162622 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda -sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 -md5: 0aa00f03f9e39fb9876085dee11a85d4 -depends: -- __glibc >=2.17,<3.0.a0 -- _openmp_mutex >=4.5 -constrains: -- libgcc-ng ==15.2.0=*_18 -- libgomp 15.2.0 he0feb66_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 1041788 -timestamp: 1771378212382 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda -sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 -md5: d5e96b1ed75ca01906b3d2469b4ce493 -depends: -- libgcc 15.2.0 he0feb66_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 27526 -timestamp: 1771378224552 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda -sha256: a27e44168a1240b15659888ce0d9b938ed4bdb49e9ea68a7c1ff27bcea8b55ce -md5: bb26456332b07f68bf3b7622ed71c0da -depends: -- __glibc >=2.17,<3.0.a0 -- libffi >=3.5.2,<3.6.0a0 -- libgcc >=14 -- libiconv >=1.18,<2.0a0 -- libzlib >=1.3.1,<2.0a0 -- pcre2 >=10.47,<10.48.0a0 -constrains: -- glib 2.86.4 *_1 -license: LGPL-2.1-or-later -size: 4398701 -timestamp: 1771863239578 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda -sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 -md5: 239c5e9546c38a1e884d69effcf4c882 -depends: -- __glibc >=2.17,<3.0.a0 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 603262 -timestamp: 1771378117851 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda -sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f -md5: 915f5995e94f60e9a4826e0b0920ee88 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: LGPL-2.1-only -size: 790176 -timestamp: 1754908768807 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda -sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 -md5: 8397539e3a0bbd1695584fb4f927485a -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -constrains: -- jpeg <0.0.0a -license: IJG AND BSD-3-Clause AND Zlib -size: 633710 -timestamp: 1762094827865 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda -sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb -md5: c7c83eecbb72d88b940c249af56c8b17 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -constrains: -- xz 5.8.2.* -license: 0BSD -size: 113207 -timestamp: 1768752626120 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda -sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c -md5: 5f13ffc7d30ffec87864e678df9957b4 -depends: -- libgcc >=14 -- __glibc >=2.17,<3.0.a0 -- libzlib >=1.3.1,<2.0a0 -license: zlib-acknowledgement -size: 317669 -timestamp: 1770691470744 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda -sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e -md5: 1b08cd684f34175e4514474793d44bcb -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc 15.2.0 he0feb66_18 -constrains: -- libstdcxx-ng ==15.2.0=*_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 5852330 -timestamp: 1771378262446 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda -sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 -md5: cd5a90476766d53e901500df9215e927 -depends: -- __glibc >=2.17,<3.0.a0 -- lerc >=4.0.0,<5.0a0 -- libdeflate >=1.25,<1.26.0a0 -- libgcc >=14 -- libjpeg-turbo >=3.1.0,<4.0a0 -- liblzma >=5.8.1,<6.0a0 -- libstdcxx >=14 -- libwebp-base >=1.6.0,<2.0a0 -- libzlib >=1.3.1,<2.0a0 -- zstd >=1.5.7,<1.6.0a0 -license: HPND -size: 435273 -timestamp: 1762022005702 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda -sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee -md5: db409b7c1720428638e7c0d509d3e1b5 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: BSD-3-Clause -license_family: BSD -size: 40311 -timestamp: 1766271528534 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda -sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b -md5: aea31d2e5b1091feca96fcfe945c3cf9 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -constrains: -- libwebp 1.6.0 -license: BSD-3-Clause -license_family: BSD -size: 429011 -timestamp: 1752159441324 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda -sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa -md5: 92ed62436b625154323d40d5f2f11dd7 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -- pthread-stubs -- xorg-libxau >=1.0.11,<2.0a0 -- xorg-libxdmcp -license: MIT -license_family: MIT -size: 395888 -timestamp: 1727278577118 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda -sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c -md5: 5aa797f8787fe7a17d1b0821485b5adc -depends: -- libgcc-ng >=12 -license: LGPL-2.1-or-later -size: 100393 -timestamp: 1702724383534 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda -sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 -md5: d87ff7921124eccd67248aa483c23fec -depends: -- __glibc >=2.17,<3.0.a0 -constrains: -- zlib 1.3.2 *_2 -license: Zlib -license_family: Other -size: 63629 -timestamp: 1774072609062 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda -sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 -md5: 47e340acb35de30501a76c7c799c41d7 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -license: X11 AND BSD-3-Clause -size: 891641 -timestamp: 1738195959188 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.2-ha668962_0.conda -sha256: 3825a4c84676a8a5cc23b397a2911e4efa4a805daf2af764153bd904e142ec41 -md5: a41092b0177362dbe5eb2a18501e86c0 -depends: -- xorg-libx11 -- xorg-libxext -- xorg-libxi -- xorg-libxrender -- xorg-libxtst -- libstdcxx >=14 -- libgcc >=14 -- __glibc >=2.17,<3.0.a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 -- xorg-libxrender >=0.9.12,<0.10.0a0 -- libjpeg-turbo >=3.1.2,<4.0a0 -- giflib >=5.2.2,<5.3.0a0 -- xorg-libxrandr >=1.5.5,<2.0a0 -- harfbuzz >=12.3.2 -- fontconfig >=2.17.1,<3.0a0 -- fonts-conda-ecosystem -- xorg-libxtst >=1.2.5,<2.0a0 -- xorg-libxi >=1.8.2,<2.0a0 -- lcms2 >=2.18,<3.0a0 -- alsa-lib >=1.2.15.3,<1.3.0a0 -- libpng >=1.6.55,<1.7.0a0 -- xorg-libxt >=1.3.1,<2.0a0 -- libzlib >=1.3.1,<2.0a0 -- xorg-libxext >=1.3.7,<2.0a0 -- xorg-libx11 >=1.8.13,<2.0a0 -- libcups >=2.3.3,<2.4.0a0 -license: GPL-2.0-or-later WITH Classpath-exception-2.0 -license_family: GPL -size: 122465031 -timestamp: 1771443671180 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda -sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c -md5: f61eb8cd60ff9057122a3d338b99c00f -depends: -- __glibc >=2.17,<3.0.a0 -- ca-certificates -- libgcc >=14 -license: Apache-2.0 -license_family: Apache -size: 3164551 -timestamp: 1769555830639 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda -sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff -md5: 7a3bff861a6583f1889021facefc08b1 -depends: -- __glibc >=2.17,<3.0.a0 -- bzip2 >=1.0.8,<2.0a0 -- libgcc >=14 -- libzlib >=1.3.1,<2.0a0 -license: BSD-3-Clause -license_family: BSD -size: 1222481 -timestamp: 1763655398280 -- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda -build_number: 7 -sha256: 9ec32b6936b0e37bcb0ed34f22ec3116e75b3c0964f9f50ecea5f58734ed6ce9 -md5: f2cfec9406850991f4e3d960cc9e3321 -depends: -- libgcc-ng >=12 -- libxcrypt >=4.4.36 -license: GPL-1.0-or-later OR Artistic-1.0-Perl -size: 13344463 -timestamp: 1703310653947 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda -sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a -md5: c01af13bdc553d1a8fbfff6e8db075f0 -depends: -- libgcc >=14 -- libstdcxx >=14 -- libgcc >=14 -- __glibc >=2.17,<3.0.a0 -license: MIT -license_family: MIT -size: 450960 -timestamp: 1754665235234 -- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda -sha256: 4ce2e1ee31a6217998f78c31ce7dc0a3e0557d9238b51d49dd20c52d467a126d -md5: f2c23a77b25efcad57d377b34bd84941 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- ncurses >=6.5,<7.0a0 -license: GPL-2.0-or-later AND LGPL-2.0-or-later -license_family: GPL -size: 593603 -timestamp: 1769710381284 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda -sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 -md5: b3c17d95b5a10c6e64a21fa17573e70e -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -license: MIT -license_family: MIT -size: 8252 -timestamp: 1726802366959 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda -sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b -md5: fb901ff28063514abb6046c9ec2c4a45 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -license: MIT -license_family: MIT -size: 58628 -timestamp: 1734227592886 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda -sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250 -md5: 1c74ff8c35dcadf952a16f752ca5aa49 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -- libuuid >=2.38.1,<3.0a0 -- xorg-libice >=1.1.2,<2.0a0 -license: MIT -license_family: MIT -size: 27590 -timestamp: 1741896361728 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda -sha256: 516d4060139dbb4de49a4dcdc6317a9353fb39ebd47789c14e6fe52de0deee42 -md5: 861fb6ccbc677bb9a9fb2468430b9c6a -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libxcb >=1.17.0,<2.0a0 -license: MIT -license_family: MIT -size: 839652 -timestamp: 1770819209719 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda -sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b -md5: b2895afaf55bf96a8c8282a2e47a5de0 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: MIT -license_family: MIT -size: 15321 -timestamp: 1762976464266 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda -sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 -md5: 1dafce8548e38671bea82e3f5c6ce22f -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: MIT -license_family: MIT -size: 20591 -timestamp: 1762976546182 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda -sha256: 79c60fc6acfd3d713d6340d3b4e296836a0f8c51602327b32794625826bd052f -md5: 34e54f03dfea3e7a2dcf1453a85f1085 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- xorg-libx11 >=1.8.12,<2.0a0 -license: MIT -license_family: MIT -size: 50326 -timestamp: 1769445253162 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda -sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 -md5: ba231da7fccf9ea1e768caf5c7099b84 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- xorg-libx11 >=1.8.12,<2.0a0 -license: MIT -license_family: MIT -size: 20071 -timestamp: 1759282564045 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda -sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a -md5: 17dcc85db3c7886650b8908b183d6876 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -- xorg-libx11 >=1.8.10,<2.0a0 -- xorg-libxext >=1.3.6,<2.0a0 -- xorg-libxfixes >=6.0.1,<7.0a0 -license: MIT -license_family: MIT -size: 47179 -timestamp: 1727799254088 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda -sha256: 80ed047a5cb30632c3dc5804c7716131d767089f65877813d4ae855ee5c9d343 -md5: e192019153591938acf7322b6459d36e -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- xorg-libx11 >=1.8.12,<2.0a0 -- xorg-libxext >=1.3.6,<2.0a0 -- xorg-libxrender >=0.9.12,<0.10.0a0 -license: MIT -license_family: MIT -size: 30456 -timestamp: 1769445263457 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda -sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 -md5: 96d57aba173e878a2089d5638016dc5e -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -- xorg-libx11 >=1.8.10,<2.0a0 -license: MIT -license_family: MIT -size: 33005 -timestamp: 1734229037766 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda -sha256: a8afba4a55b7b530eb5c8ad89737d60d60bc151a03fbef7a2182461256953f0e -md5: 279b0de5f6ba95457190a1c459a64e31 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -- xorg-libice >=1.1.1,<2.0a0 -- xorg-libsm >=1.2.4,<2.0a0 -- xorg-libx11 >=1.8.10,<2.0a0 -license: MIT -license_family: MIT -size: 379686 -timestamp: 1731860547604 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda -sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a -md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -- xorg-libx11 >=1.8.10,<2.0a0 -- xorg-libxext >=1.3.6,<2.0a0 -- xorg-libxi >=1.7.10,<2.0a0 -license: MIT -license_family: MIT -size: 32808 -timestamp: 1727964811275 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda -sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 -md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 -depends: -- __glibc >=2.17,<3.0.a0 -- libzlib >=1.3.1,<2.0a0 -license: BSD-3-Clause -license_family: BSD -size: 601375 -timestamp: 1764777111296 diff --git a/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt b/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt deleted file mode 100644 index cdc434c..0000000 --- a/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt +++ /dev/null @@ -1,769 +0,0 @@ - -version: 6 -environments: -default: -channels: -- url: https://conda.anaconda.org/conda-forge/ -- url: https://conda.anaconda.org/bioconda/ -- url: https://conda.anaconda.org/bioconda/ -options: -pypi-prerelease-mode: if-necessary-or-explicit -packages: -linux-aarch64: -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda -- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.2.1-h1134a53_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.2-h488f50d_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-he30d5cf_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.5-he30d5cf_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxt-1.3.1-h57736b2_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda -packages: -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda -build_number: 20 -sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 -md5: 468fd3bb9e1f671d36c2cbc677e56f1d -depends: -- libgomp >=7.5.0 -constrains: -- openmp_impl <0.0a0 -license: BSD-3-Clause -license_family: BSD -size: 28926 -timestamp: 1770939656741 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda -sha256: ea2233e2db9908c2e5f29d3ca420a546b4583253f4f70abb5494cdd676866d42 -md5: 4a98cbc4ade694520227402ff8880630 -depends: -- libgcc >=14 -license: LGPL-2.1-or-later -license_family: GPL -size: 615729 -timestamp: 1768327548407 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda -sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c -md5: 840d8fc0d7b3209be93080bc20e07f2d -depends: -- libgcc >=14 -license: bzip2-1.0.6 -license_family: BSD -size: 192412 -timestamp: 1771350241232 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda -sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc -md5: 4492fd26db29495f0ba23f146cd5638d -depends: -- __unix -license: ISC -size: 147413 -timestamp: 1772006283803 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda -sha256: 675db823f3d6fb6bf747fab3b0170ba99b269a07cf6df1e49fff2f9972be9cd1 -md5: 043c13ed3a18396994be9b4fab6572ad -depends: -- fontconfig >=2.15.0,<3.0a0 -- fonts-conda-ecosystem -- icu >=78.1,<79.0a0 -- libexpat >=2.7.3,<3.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 -- libgcc >=14 -- libglib >=2.86.3,<3.0a0 -- libpng >=1.6.53,<1.7.0a0 -- libstdcxx >=14 -- libxcb >=1.17.0,<2.0a0 -- libzlib >=1.3.1,<2.0a0 -- pixman >=0.46.4,<1.0a0 -- xorg-libice >=1.1.2,<2.0a0 -- xorg-libsm >=1.2.6,<2.0a0 -- xorg-libx11 >=1.8.12,<2.0a0 -- xorg-libxext >=1.3.6,<2.0a0 -- xorg-libxrender >=0.9.12,<0.10.0a0 -license: LGPL-2.1-only or MPL-1.1 -size: 927045 -timestamp: 1766416003626 -- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 -sha256: 7cc26225d590540ae95cd24940ff42f2da7479dd4cd22ae9ab9298665d06790c -md5: c9f6a4b12229f7331f79c9a00dd6e240 -depends: -- font-ttf-dejavu-sans-mono -- fontconfig -- openjdk >=8.0.144 -- perl -license: GPL >=3 -size: 11664291 -timestamp: 1677946722445 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 -sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b -md5: 0c96522c6bdaed4b1566d11387caaf45 -license: BSD-3-Clause -license_family: BSD -size: 397370 -timestamp: 1566932522327 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 -sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c -md5: 34893075a5c9e55cdafac56607368fc6 -license: OFL-1.1 -license_family: Other -size: 96530 -timestamp: 1620479909603 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 -sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 -md5: 4d59c254e01d9cde7957100457e2d5fb -license: OFL-1.1 -license_family: Other -size: 700814 -timestamp: 1620479612257 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda -sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 -md5: 49023d73832ef61042f6a237cb2687e7 -license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 -license_family: Other -size: 1620504 -timestamp: 1727511233259 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda -sha256: 835aff8615dd8d8fff377679710ce81b8a2c47b6404e21a92fb349fda193a15c -md5: 0fed1ff55f4938a65907f3ecf62609db -depends: -- libexpat >=2.7.4,<3.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 -- libgcc >=14 -- libuuid >=2.41.3,<3.0a0 -- libzlib >=1.3.1,<2.0a0 -license: MIT -license_family: MIT -size: 279044 -timestamp: 1771382728182 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 -sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 -md5: fee5683a3f04bd15cbd8318b096a27ab -depends: -- fonts-conda-forge -license: BSD-3-Clause -license_family: BSD -size: 3667 -timestamp: 1566974674465 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda -sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 -md5: a7970cd949a077b7cb9696379d338681 -depends: -- font-ttf-ubuntu -- font-ttf-inconsolata -- font-ttf-dejavu-sans-mono -- font-ttf-source-code-pro -license: BSD-3-Clause -license_family: BSD -size: 4059 -timestamp: 1762351264405 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda -sha256: a79dc3bd54c4fb1f249942ee2d5b601a76ecf9614774a4cff9af49adfa458db2 -md5: 2f809afaf0ba1ea4135dce158169efac -depends: -- libgcc-ng >=12 -license: MIT -license_family: MIT -size: 82124 -timestamp: 1712692444545 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda -sha256: c9b1781fe329e0b77c5addd741e58600f50bef39321cae75eba72f2f381374b7 -md5: 4aa540e9541cc9d6581ab23ff2043f13 -depends: -- libgcc >=14 -- libstdcxx >=14 -license: LGPL-2.0-or-later -license_family: LGPL -size: 102400 -timestamp: 1755102000043 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.2.1-h1134a53_0.conda -sha256: e22f485fddaaea3ff4b6cae98e0197b9dccd2ed2770337ad6ff38a92afe04e59 -md5: 05d65a2cf410adc331c9ea61f59f1013 -depends: -- cairo >=1.18.4,<2.0a0 -- graphite2 >=1.3.14,<2.0a0 -- icu >=78.3,<79.0a0 -- libexpat >=2.7.4,<3.0a0 -- libfreetype >=2.14.2 -- libfreetype6 >=2.14.2 -- libgcc >=14 -- libglib >=2.86.4,<3.0a0 -- libstdcxx >=14 -- libzlib >=1.3.2,<2.0a0 -license: MIT -license_family: MIT -size: 2345732 -timestamp: 1774281448329 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda -sha256: 49ba6aed2c6b482bb0ba41078057555d29764299bc947b990708617712ef6406 -md5: 546da38c2fa9efacf203e2ad3f987c59 -depends: -- libgcc >=14 -- libstdcxx >=14 -license: MIT -license_family: MIT -size: 12837286 -timestamp: 1773822650615 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda -sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 -md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 -depends: -- libgcc >=13 -license: LGPL-2.1-or-later -size: 129048 -timestamp: 1754906002667 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda -sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba -md5: d9ca108bd680ea86a963104b6b3e95ca -depends: -- keyutils >=1.6.3,<2.0a0 -- libedit >=3.1.20250104,<3.2.0a0 -- libedit >=3.1.20250104,<4.0a0 -- libgcc >=14 -- libstdcxx >=14 -- openssl >=3.5.5,<4.0a0 -license: MIT -license_family: MIT -size: 1517436 -timestamp: 1769773395215 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda -sha256: 379ef5e91a587137391a6149755d0e929f1a007d2dcb211318ac670a46c8596f -md5: bb960f01525b5e001608afef9d47b79c -depends: -- libgcc >=14 -- libjpeg-turbo >=3.1.2,<4.0a0 -- libtiff >=4.7.1,<4.8.0a0 -license: MIT -license_family: MIT -size: 293039 -timestamp: 1768184778398 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda -sha256: 8957fd460c1c132c8031f65fd5f56ec3807fd71b7cab2c5e2b0937b13404ab36 -md5: d13423b06447113a90b5b1366d4da171 -depends: -- libgcc >=14 -- libstdcxx >=14 -license: Apache-2.0 -license_family: Apache -size: 240444 -timestamp: 1773114901155 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda -sha256: 41b04f995c9f63af8c4065a35931e46cbc2fdd6b9bf7e4c19f90d53cbb2bc8e5 -md5: 67828c963b17db7dc989fe5d509ef04a -depends: -- krb5 >=1.22.2,<1.23.0a0 -- libgcc >=14 -- libstdcxx >=14 -- libzlib >=1.3.1,<2.0a0 -license: Apache-2.0 -license_family: Apache -size: 4553739 -timestamp: 1770903929794 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda -sha256: 48814b73bd462da6eed2e697e30c060ae16af21e9fbed30d64feaf0aad9da392 -md5: a9138815598fe6b91a1d6782ca657b0c -depends: -- libgcc >=14 -license: MIT -license_family: MIT -size: 71117 -timestamp: 1761979776756 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda -sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 -md5: fb640d776fc92b682a14e001980825b1 -depends: -- ncurses -- libgcc >=13 -- ncurses >=6.5,<7.0a0 -license: BSD-2-Clause -license_family: BSD -size: 148125 -timestamp: 1738479808948 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda -sha256: 995ce3ad96d0f4b5ed6296b051a0d7b6377718f325bc0e792fbb96b0e369dad7 -md5: 57f3b3da02a50a1be2a6fe847515417d -depends: -- libgcc >=14 -constrains: -- expat 2.7.4.* -license: MIT -license_family: MIT -size: 76564 -timestamp: 1771259530958 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda -sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 -md5: 2f364feefb6a7c00423e80dcb12db62a -depends: -- libgcc >=14 -license: MIT -license_family: MIT -size: 55952 -timestamp: 1769456078358 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda -sha256: 752e4f66283d7deb4c6fd47d88df644d8daa2aaa825a54f3bf350a625190192a -md5: a229e22d4d8814a07702b0919d8e6701 -depends: -- libfreetype6 >=2.14.3 -license: GPL-2.0-only OR FTL -size: 8125 -timestamp: 1774301094057 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda -sha256: 8e6b27fe4eec4c2fa7b7769a21973734c8dba1de80086fb0213e58375ac09f4c -md5: b99ed99e42dafb27889483b3098cace7 -depends: -- libgcc >=14 -- libpng >=1.6.55,<1.7.0a0 -- libzlib >=1.3.2,<2.0a0 -constrains: -- freetype >=2.14.3 -license: GPL-2.0-only OR FTL -size: 422941 -timestamp: 1774301093473 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda -sha256: 43df385bedc1cab11993c4369e1f3b04b4ca5d0ea16cba6a0e7f18dbc129fcc9 -md5: 552567ea2b61e3a3035759b2fdb3f9a6 -depends: -- _openmp_mutex >=4.5 -constrains: -- libgcc-ng ==15.2.0=*_18 -- libgomp 15.2.0 h8acb6b2_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 622900 -timestamp: 1771378128706 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda -sha256: 83bb0415f59634dccfa8335d4163d1f6db00a27b36666736f9842b650b92cf2f -md5: 4feebd0fbf61075a1a9c2e9b3936c257 -depends: -- libgcc 15.2.0 h8acb6b2_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 27568 -timestamp: 1771378136019 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda -sha256: afc503dbd04a5bf2709aa9d8318a03a8c4edb389f661ff280c3494bfef4341ec -md5: 4ac4372fc4d7f20630a91314cdac8afd -depends: -- libffi >=3.5.2,<3.6.0a0 -- libgcc >=14 -- libiconv >=1.18,<2.0a0 -- libzlib >=1.3.1,<2.0a0 -- pcre2 >=10.47,<10.48.0a0 -constrains: -- glib 2.86.4 *_1 -license: LGPL-2.1-or-later -size: 4512186 -timestamp: 1771863220969 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda -sha256: fc716f11a6a8525e27a5d332ef6a689210b0d2a4dd1133edc0f530659aa9faa6 -md5: 4faa39bf919939602e594253bd673958 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 588060 -timestamp: 1771378040807 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda -sha256: 1473451cd282b48d24515795a595801c9b65b567fe399d7e12d50b2d6cdb04d9 -md5: 5a86bf847b9b926f3a4f203339748d78 -depends: -- libgcc >=14 -license: LGPL-2.1-only -size: 791226 -timestamp: 1754910975665 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda -sha256: 84064c7c53a64291a585d7215fe95ec42df74203a5bf7615d33d49a3b0f08bb6 -md5: 5109d7f837a3dfdf5c60f60e311b041f -depends: -- libgcc >=14 -constrains: -- jpeg <0.0.0a -license: IJG AND BSD-3-Clause AND Zlib -size: 691818 -timestamp: 1762094728337 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda -sha256: 843c46e20519651a3e357a8928352b16c5b94f4cd3d5481acc48be2e93e8f6a3 -md5: 96944e3c92386a12755b94619bae0b35 -depends: -- libgcc >=14 -constrains: -- xz 5.8.2.* -license: 0BSD -size: 125916 -timestamp: 1768754941722 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda -sha256: c7378c6b79de4d571d00ad1caf0a4c19d43c9c94077a761abb6ead44d891f907 -md5: be4088903b94ea297975689b3c3aeb27 -depends: -- libgcc >=14 -- libzlib >=1.3.1,<2.0a0 -license: zlib-acknowledgement -size: 340156 -timestamp: 1770691477245 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda -sha256: 31fdb9ffafad106a213192d8319b9f810e05abca9c5436b60e507afb35a6bc40 -md5: f56573d05e3b735cb03efeb64a15f388 -depends: -- libgcc 15.2.0 h8acb6b2_18 -constrains: -- libstdcxx-ng ==15.2.0=*_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 5541411 -timestamp: 1771378162499 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda -sha256: 7ff79470db39e803e21b8185bc8f19c460666d5557b1378d1b1e857d929c6b39 -md5: 8c6fd84f9c87ac00636007c6131e457d -depends: -- lerc >=4.0.0,<5.0a0 -- libdeflate >=1.25,<1.26.0a0 -- libgcc >=14 -- libjpeg-turbo >=3.1.0,<4.0a0 -- liblzma >=5.8.1,<6.0a0 -- libstdcxx >=14 -- libwebp-base >=1.6.0,<2.0a0 -- libzlib >=1.3.1,<2.0a0 -- zstd >=1.5.7,<1.6.0a0 -license: HPND -size: 488407 -timestamp: 1762022048105 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda -sha256: c37a8e89b700646f3252608f8368e7eb8e2a44886b92776e57ad7601fc402a11 -md5: cf2861212053d05f27ec49c3784ff8bb -depends: -- libgcc >=14 -license: BSD-3-Clause -license_family: BSD -size: 43453 -timestamp: 1766271546875 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda -sha256: b03700a1f741554e8e5712f9b06dd67e76f5301292958cd3cb1ac8c6fdd9ed25 -md5: 24e92d0942c799db387f5c9d7b81f1af -depends: -- libgcc >=14 -constrains: -- libwebp 1.6.0 -license: BSD-3-Clause -license_family: BSD -size: 359496 -timestamp: 1752160685488 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda -sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b -md5: cd14ee5cca2464a425b1dbfc24d90db2 -depends: -- libgcc >=13 -- pthread-stubs -- xorg-libxau >=1.0.11,<2.0a0 -- xorg-libxdmcp -license: MIT -license_family: MIT -size: 397493 -timestamp: 1727280745441 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda -sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f -md5: b4df5d7d4b63579d081fd3a4cf99740e -depends: -- libgcc-ng >=12 -license: LGPL-2.1-or-later -size: 114269 -timestamp: 1702724369203 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda -sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f -md5: 502006882cf5461adced436e410046d1 -constrains: -- zlib 1.3.2 *_2 -license: Zlib -license_family: Other -size: 69833 -timestamp: 1774072605429 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda -sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 -md5: 182afabe009dc78d8b73100255ee6868 -depends: -- libgcc >=13 -license: X11 AND BSD-3-Clause -size: 926034 -timestamp: 1738196018799 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.2-h488f50d_0.conda -sha256: 6fd2c872b275fa5d42a61a4b6dc28a819cde29f9048adb547363597432e0720e -md5: 27fdd5d67e235c20d23b2d66406497d3 -depends: -- xorg-libx11 -- xorg-libxext -- xorg-libxi -- xorg-libxrender -- xorg-libxtst -- libstdcxx >=14 -- libgcc >=14 -- libzlib >=1.3.1,<2.0a0 -- xorg-libxtst >=1.2.5,<2.0a0 -- libpng >=1.6.55,<1.7.0a0 -- alsa-lib >=1.2.15.3,<1.3.0a0 -- xorg-libx11 >=1.8.13,<2.0a0 -- xorg-libxi >=1.8.2,<2.0a0 -- xorg-libxrandr >=1.5.5,<2.0a0 -- lcms2 >=2.18,<3.0a0 -- xorg-libxrender >=0.9.12,<0.10.0a0 -- libcups >=2.3.3,<2.4.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 -- harfbuzz >=12.3.2 -- xorg-libxext >=1.3.7,<2.0a0 -- giflib >=5.2.2,<5.3.0a0 -- xorg-libxt >=1.3.1,<2.0a0 -- libjpeg-turbo >=3.1.2,<4.0a0 -- fontconfig >=2.17.1,<3.0a0 -- fonts-conda-ecosystem -license: GPL-2.0-or-later WITH Classpath-exception-2.0 -license_family: GPL -size: 106988620 -timestamp: 1771443741031 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda -sha256: 7f8048c0e75b2620254218d72b4ae7f14136f1981c5eb555ef61645a9344505f -md5: 25f5885f11e8b1f075bccf4a2da91c60 -depends: -- ca-certificates -- libgcc >=14 -license: Apache-2.0 -license_family: Apache -size: 3692030 -timestamp: 1769557678657 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda -sha256: 04df2cee95feba440387f33f878e9f655521e69f4be33a0cd637f07d3d81f0f9 -md5: 1a30c42e32ca0ea216bd0bfe6f842f0b -depends: -- bzip2 >=1.0.8,<2.0a0 -- libgcc >=14 -- libzlib >=1.3.1,<2.0a0 -license: BSD-3-Clause -license_family: BSD -size: 1166552 -timestamp: 1763655534263 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda -build_number: 7 -sha256: d78296134263b5bf476cad838ded65451e7162db756f9997c5d06b08122572ed -md5: 17d019cb2a6c72073c344e98e40dfd61 -depends: -- libgcc-ng >=12 -- libxcrypt >=4.4.36 -license: GPL-1.0-or-later OR Artistic-1.0-Perl -size: 13338804 -timestamp: 1703310557094 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda -sha256: e6b0846a998f2263629cfeac7bca73565c35af13251969f45d385db537a514e4 -md5: 1587081d537bd4ae77d1c0635d465ba5 -depends: -- libgcc >=14 -- libstdcxx >=14 -- libgcc >=14 -license: MIT -license_family: MIT -size: 357913 -timestamp: 1754665583353 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda -sha256: e9cbcbc94e151ada3d6dc365380aaaf591f65012c16d9a2abaea4b9b90adc402 -md5: ab7288cc39545556d1bc5e71ab2df9a9 -depends: -- libgcc >=14 -- ncurses >=6.5,<7.0a0 -license: GPL-2.0-or-later AND LGPL-2.0-or-later -license_family: GPL -size: 636733 -timestamp: 1769712412683 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda -sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba -md5: bb5a90c93e3bac3d5690acf76b4a6386 -depends: -- libgcc >=13 -license: MIT -license_family: MIT -size: 8342 -timestamp: 1726803319942 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda -sha256: a2ba1864403c7eb4194dacbfe2777acf3d596feae43aada8d1b478617ce45031 -md5: c8d8ec3e00cd0fd8a231789b91a7c5b7 -depends: -- libgcc >=13 -license: MIT -license_family: MIT -size: 60433 -timestamp: 1734229908988 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda -sha256: b86a819cd16f90c01d9d81892155126d01555a20dabd5f3091da59d6309afd0a -md5: 2d1409c50882819cb1af2de82e2b7208 -depends: -- libgcc >=13 -- libuuid >=2.38.1,<3.0a0 -- xorg-libice >=1.1.2,<2.0a0 -license: MIT -license_family: MIT -size: 28701 -timestamp: 1741897678254 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda -sha256: cf886160e2ff580d77f7eb8ec1a77c41c2c5b05343e329bc35f0ddf40b8d92ab -md5: 22dd10425ef181e80e130db50675d615 -depends: -- libgcc >=14 -- libxcb >=1.17.0,<2.0a0 -license: MIT -license_family: MIT -size: 869058 -timestamp: 1770819244991 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda -sha256: e9f6e931feeb2f40e1fdbafe41d3b665f1ab6cb39c5880a1fcf9f79a3f3c84a5 -md5: 1c246e1105000c3660558459e2fd6d43 -depends: -- libgcc >=14 -license: MIT -license_family: MIT -size: 16317 -timestamp: 1762977521691 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda -sha256: 128d72f36bcc8d2b4cdbec07507542e437c7d67f677b7d77b71ed9eeac7d6df1 -md5: bff06dcde4a707339d66d45d96ceb2e2 -depends: -- libgcc >=14 -license: MIT -license_family: MIT -size: 21039 -timestamp: 1762979038025 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-he30d5cf_0.conda -sha256: db2188bc0d844d4e9747bac7f6c1d067e390bd769c5ad897c93f1df759dc5dba -md5: fb42b683034619915863d68dd9df03a3 -depends: -- libgcc >=14 -- xorg-libx11 >=1.8.12,<2.0a0 -license: MIT -license_family: MIT -size: 52409 -timestamp: 1769446753771 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda -sha256: 8cb9c88e25c57e47419e98f04f9ef3154ad96b9f858c88c570c7b91216a64d0e -md5: e8b4056544341daf1d415eaeae7a040c -depends: -- libgcc >=14 -- xorg-libx11 >=1.8.12,<2.0a0 -license: MIT -license_family: MIT -size: 20704 -timestamp: 1759284028146 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda -sha256: 7b587407ecb9ccd2bbaf0fb94c5dbdde4d015346df063e9502dc0ce2b682fb5e -md5: eeee3bdb31c6acde2b81ad1b8c287087 -depends: -- libgcc >=13 -- xorg-libx11 >=1.8.9,<2.0a0 -- xorg-libxext >=1.3.6,<2.0a0 -- xorg-libxfixes >=6.0.1,<7.0a0 -license: MIT -license_family: MIT -size: 48197 -timestamp: 1727801059062 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.5-he30d5cf_0.conda -sha256: 9f5196665a8d72f4f119c40dcc4bafeb0b540b102cc7b8b299c2abf599e7919f -md5: 1f64c613f0b8d67e9fb0e165d898fb6b -depends: -- libgcc >=14 -- xorg-libx11 >=1.8.12,<2.0a0 -- xorg-libxext >=1.3.6,<2.0a0 -- xorg-libxrender >=0.9.12,<0.10.0a0 -license: MIT -license_family: MIT -size: 31122 -timestamp: 1769445286951 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda -sha256: ffd77ee860c9635a28cfda46163dcfe9224dc6248c62404c544ae6b564a0be1f -md5: ae2c2dd0e2d38d249887727db2af960e -depends: -- libgcc >=13 -- xorg-libx11 >=1.8.10,<2.0a0 -license: MIT -license_family: MIT -size: 33649 -timestamp: 1734229123157 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxt-1.3.1-h57736b2_0.conda -sha256: 7c109792b60720809a580612aba7f8eb2a0bd425b9fc078748a9d6ffc97cbfa8 -md5: a9e4852c8e0b68ee783e7240030b696f -depends: -- libgcc >=13 -- xorg-libice >=1.1.1,<2.0a0 -- xorg-libsm >=1.2.4,<2.0a0 -- xorg-libx11 >=1.8.9,<2.0a0 -license: MIT -license_family: MIT -size: 384752 -timestamp: 1731860572314 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda -sha256: 6eaffce5a34fc0a16a21ddeaefb597e792a263b1b0c387c1ce46b0a967d558e1 -md5: c05698071b5c8e0da82a282085845860 -depends: -- libgcc >=13 -- xorg-libx11 >=1.8.9,<2.0a0 -- xorg-libxext >=1.3.6,<2.0a0 -- xorg-libxi >=1.7.10,<2.0a0 -license: MIT -license_family: MIT -size: 33786 -timestamp: 1727964907993 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda -sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 -md5: c3655f82dcea2aa179b291e7099c1fcc -depends: -- libzlib >=1.3.1,<2.0a0 -license: BSD-3-Clause -license_family: BSD -size: 614429 -timestamp: 1764777145593 diff --git a/modules/nf-core/fastqc/environment.yml b/modules/nf-core/fastqc/environment.yml deleted file mode 100644 index f9f54ee..0000000 --- a/modules/nf-core/fastqc/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::fastqc=0.12.1 diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf deleted file mode 100644 index 1085126..0000000 --- a/modules/nf-core/fastqc/main.nf +++ /dev/null @@ -1,57 +0,0 @@ -process FASTQC { - tag "${meta.id}" - label 'process_low' - - conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container - ? 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' - : 'quay.io/biocontainers/fastqc:0.12.1--hdfd78af_0'}" - - input: - tuple val(meta), path(reads, stageAs: '?/*') - - output: - tuple val(meta), path("*.html"), emit: html - tuple val(meta), path("*.zip"), emit: zip - tuple val("${task.process}"), val('fastqc'), eval('fastqc --version | sed "/FastQC v/!d; s/.*v//"'), emit: versions_fastqc, topic: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - // Make list of old name and new name pairs to use for renaming in the bash while loop - def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[reads, "${prefix}.${reads.extension}"]] : reads.withIndex().collect { entry, index -> [entry, "${prefix}_${index + 1}.${entry.extension}"] } - def rename_to = old_new_pairs*.join(' ').join(' ') - def renamed_files = old_new_pairs.collect { _old_name, new_name -> new_name }.join(' ') - - // The total amount of allocated RAM by FastQC is equal to the number of threads defined (--threads) time the amount of RAM defined (--memory) - // https://github.com/s-andrews/FastQC/blob/1faeea0412093224d7f6a07f777fad60a5650795/fastqc#L211-L222 - // Dividing the task.memory by task.cpus allows to stick to requested amount of RAM in the label - def memory_in_mb = task.memory - ? (task.memory.toUnit('MB') / task.cpus).intValue() - : null - // FastQC memory value allowed range (100 - 10000) - def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) - def fastqc_memory_arg = fastqc_memory ? "--memory ${fastqc_memory}" : '' - - """ - printf "%s %s\\n" ${rename_to} | while read old_name new_name; do - [ -f "\${new_name}" ] || ln -s \$old_name \$new_name - done - - fastqc \\ - ${args} \\ - --threads ${task.cpus} \\ - ${fastqc_memory_arg} \\ - ${renamed_files} - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.html - touch ${prefix}.zip - """ -} diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml deleted file mode 100644 index 2f6cfef..0000000 --- a/modules/nf-core/fastqc/meta.yml +++ /dev/null @@ -1,111 +0,0 @@ -name: fastqc -description: Run FastQC on sequenced reads -keywords: - - quality control - - qc - - adapters - - fastq -tools: - - fastqc: - description: | - FastQC gives general quality metrics about your reads. - It provides information about the quality score distribution - across your reads, the per base sequence content (%A/C/G/T). - - You get information about adapter contamination and other - overrepresented sequences. - homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ - documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ - licence: ["GPL-2.0-only"] - identifier: biotools:fastqc -input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. - ontologies: [] -output: - html: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.html": - type: file - description: FastQC report - pattern: "*_{fastqc.html}" - ontologies: [] - zip: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.zip": - type: file - description: FastQC report archive - pattern: "*_{fastqc.zip}" - ontologies: [] - versions_fastqc: - - - ${task.process}: - type: string - description: The process the versions were collected from - - fastqc: - type: string - description: The tool name - - fastqc --version | sed "/FastQC v/!d; s/.*v//": - type: eval - description: The expression to obtain the version of the tool - -topics: - versions: - - - ${task.process}: - type: string - description: The process the versions were collected from - - fastqc: - type: string - description: The tool name - - fastqc --version | sed "/FastQC v/!d; s/.*v//": - type: eval - description: The expression to obtain the version of the tool -authors: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" -maintainers: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" -containers: - docker: - linux/arm64: - name: community.wave.seqera.io/library/fastqc:0.12.1--e455e32f745abe68 - build_id: bd-e455e32f745abe68_1 - scan_id: sc-f102f736465af88c_1 - linux/amd64: - name: community.wave.seqera.io/library/fastqc:0.12.1--5cb1a2fa2f18c7c2 - build_id: bd-5cb1a2fa2f18c7c2_1 - scan_id: sc-0c0466326b6b77d2_1 - singularity: - linux/amd64: - name: oras://community.wave.seqera.io/library/fastqc:0.12.1--5c4bd442468d75dd - build_id: bd-5c4bd442468d75dd_1 - https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f2/f20b021476d1d87658820f971ebecc1e8cdbde0f338eb0d9cea2b0a8fc54a54b/data - linux/arm64: - name: oras://community.wave.seqera.io/library/fastqc:0.12.1--127a87fc06499035 - build_id: bd-127a87fc06499035_1 - https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/46/46daf2dad0169afd2ae047c3e50ed3776259f664bf07e5e06b045dc23449e994/data - conda: - linux/amd64: - lock_file: modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt - linux/arm64: - lock_file: modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test deleted file mode 100644 index 66c44da..0000000 --- a/modules/nf-core/fastqc/tests/main.nf.test +++ /dev/null @@ -1,309 +0,0 @@ -nextflow_process { - - name "Test Process FASTQC" - script "../main.nf" - process "FASTQC" - - tag "modules" - tag "modules_nfcore" - tag "fastqc" - - test("sarscov2 single-end [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [ id: 'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - // NOTE The report contains the date inside it, which means that the md5sum is stable per day, but not longer than that. So you can't md5sum it. - // looks like this:
    Mon 2 Oct 2023
    test.gz
    - // https://github.com/nf-core/modules/pull/3903#issuecomment-1743620039 - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } - ) - } - } - - test("sarscov2 paired-end [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, - { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, - { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, - { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, - { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } - ) - } - } - - test("sarscov2 interleaved [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } - ) - } - } - - test("sarscov2 paired-end [bam]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } - ) - } - } - - test("sarscov2 multiple [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, - { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, - { assert process.out.html[0][1][2] ==~ ".*/test_3_fastqc.html" }, - { assert process.out.html[0][1][3] ==~ ".*/test_4_fastqc.html" }, - { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, - { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, - { assert process.out.zip[0][1][2] ==~ ".*/test_3_fastqc.zip" }, - { assert process.out.zip[0][1][3] ==~ ".*/test_4_fastqc.zip" }, - { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][2]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][3]).text.contains("File typeConventional base calls") }, - { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } - ) - } - } - - test("sarscov2 custom_prefix") { - - when { - process { - """ - input[0] = Channel.of([ - [ id:'mysample', single_end:true ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1] ==~ ".*/mysample_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/mysample_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } - ) - } - } - - test("sarscov2 single-end [fastq] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [ id: 'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 paired-end [fastq] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 interleaved [fastq] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 paired-end [bam] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 multiple [fastq] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 custom_prefix - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [ id:'mysample', single_end:true ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/modules/nf-core/fastqc/tests/main.nf.test.snap b/modules/nf-core/fastqc/tests/main.nf.test.snap deleted file mode 100644 index c8ee120..0000000 --- a/modules/nf-core/fastqc/tests/main.nf.test.snap +++ /dev/null @@ -1,476 +0,0 @@ -{ - "sarscov2 custom_prefix": { - "content": [ - { - "versions_fastqc": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-10-28T16:39:14.518503" - }, - "sarscov2 single-end [fastq] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": true - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": true - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ], - "html": [ - [ - { - "id": "test", - "single_end": true - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_fastqc": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ], - "zip": [ - [ - { - "id": "test", - "single_end": true - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-10-28T16:39:19.309008" - }, - "sarscov2 custom_prefix - stub": { - "content": [ - { - "0": [ - [ - { - "id": "mysample", - "single_end": true - }, - "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "mysample", - "single_end": true - }, - "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ], - "html": [ - [ - { - "id": "mysample", - "single_end": true - }, - "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_fastqc": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ], - "zip": [ - [ - { - "id": "mysample", - "single_end": true - }, - "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-10-28T16:39:44.94888" - }, - "sarscov2 interleaved [fastq]": { - "content": [ - { - "versions_fastqc": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-10-28T16:38:45.168496" - }, - "sarscov2 paired-end [bam]": { - "content": [ - { - "versions_fastqc": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-10-28T16:38:53.268919" - }, - "sarscov2 multiple [fastq]": { - "content": [ - { - "versions_fastqc": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-10-28T16:39:05.050305" - }, - "sarscov2 paired-end [fastq]": { - "content": [ - { - "versions_fastqc": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-10-28T16:38:37.2373" - }, - "sarscov2 paired-end [fastq] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_fastqc": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ], - "zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-10-28T16:39:24.450398" - }, - "sarscov2 multiple [fastq] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_fastqc": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ], - "zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-10-28T16:39:39.758762" - }, - "sarscov2 single-end [fastq]": { - "content": [ - { - "versions_fastqc": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-10-28T16:38:29.555068" - }, - "sarscov2 interleaved [fastq] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_fastqc": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ], - "zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-10-28T16:39:29.193136" - }, - "sarscov2 paired-end [bam] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_fastqc": [ - [ - "FASTQC", - "fastqc", - "0.12.1" - ] - ], - "zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-10-28T16:39:34.144919" - } -} \ No newline at end of file diff --git a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt deleted file mode 100644 index 7619030..0000000 --- a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt +++ /dev/null @@ -1,1552 +0,0 @@ - -version: 6 -environments: -default: -channels: -- url: https://conda.anaconda.org/conda-forge/ -- url: https://conda.anaconda.org/bioconda/ -- url: https://conda.anaconda.org/bioconda/ -options: -pypi-prerelease-mode: if-necessary-or-explicit -packages: -linux-64: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.4-hecca717_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda -- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.39.3-pyh58ad624_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.39.3-py310hffdcd12_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.39.3-py310hbcd5346_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.2.28-py314h5bd0f2a_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda -packages: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda -build_number: 20 -sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 -md5: a9f577daf3de00bca7c3c76c0ecbd1de -depends: -- __glibc >=2.17,<3.0.a0 -- libgomp >=7.5.0 -constrains: -- openmp_impl <0.0a0 -license: BSD-3-Clause -license_family: BSD -size: 28948 -timestamp: 1770939786096 -- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda -sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 -md5: aaa2a381ccc56eac91d63b6c1240312f -depends: -- cpython -- python-gil -license: MIT -license_family: MIT -size: 8191 -timestamp: 1744137672556 -- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda -sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 -md5: 2934f256a8acfe48f6ebb4fce6cde29c -depends: -- python >=3.9 -- typing-extensions >=4.0.0 -license: MIT -license_family: MIT -size: 18074 -timestamp: 1733247158254 -- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda -sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab -md5: c6b0543676ecb1fb2d7643941fe375f2 -depends: -- python >=3.10 -- python -license: MIT -license_family: MIT -size: 64927 -timestamp: 1773935801332 -- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda -noarch: generic -sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 -md5: a2ac7763a9ac75055b68f325d3255265 -depends: -- python >=3.14 -license: BSD-3-Clause AND MIT AND EPL-2.0 -size: 7514 -timestamp: 1767044983590 -- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda -sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 -md5: 8910d2c46f7e7b519129f486e0fe927a -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libstdcxx >=14 -- python >=3.14,<3.15.0a0 -- python_abi 3.14.* *_cp314 -constrains: -- libbrotlicommon 1.2.0 hb03c661_1 -license: MIT -license_family: MIT -size: 367376 -timestamp: 1764017265553 -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda -sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 -md5: d2ffd7602c02f2b316fd921d39876885 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: bzip2-1.0.6 -license_family: BSD -size: 260182 -timestamp: 1771350215188 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda -sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc -md5: 4492fd26db29495f0ba23f146cd5638d -depends: -- __unix -license: ISC -size: 147413 -timestamp: 1772006283803 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda -sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 -md5: 765c4d97e877cdbbb88ff33152b86125 -depends: -- python >=3.10 -license: ISC -size: 151445 -timestamp: 1772001170301 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda -sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 -md5: 49ee13eb9b8f44d63879c69b8a40a74b -depends: -- python >=3.10 -license: MIT -license_family: MIT -size: 58510 -timestamp: 1773660086450 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda -sha256: 38cfe1ee75b21a8361c8824f5544c3866f303af1762693a178266d7f198e8715 -md5: ea8a6c3256897cc31263de9f455e25d9 -depends: -- python >=3.10 -- __unix -- python -license: BSD-3-Clause -license_family: BSD -size: 97676 -timestamp: 1764518652276 -- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda -sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 -md5: b866ff7007b934d564961066c8195983 -depends: -- humanfriendly >=9.1 -- python >=3.9 -license: MIT -license_family: MIT -size: 43758 -timestamp: 1733928076798 -- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda -sha256: 59c9e29800b483b390467f90e82b0da3a4fbf0612efe1c90813fca232780e160 -md5: 071cf7b0ce333c81718b054066c15102 -depends: -- networkx >=2.0 -- numpy -- python >=3.9 -license: BSD-3-Clause -license_family: BSD -size: 39326 -timestamp: 1735759976140 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda -noarch: generic -sha256: 91b06300879df746214f7363d6c27c2489c80732e46a369eb2afc234bcafb44c -md5: 3bb89e4f795e5414addaa531d6b1500a -depends: -- python >=3.14,<3.15.0a0 -- python_abi * *_cp314 -license: Python-2.0 -size: 50078 -timestamp: 1770674447292 -- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.4-hecca717_0.conda -sha256: 0cc345e4dead417996ce9a1f088b28d858f03d113d43c1963d29194366dcce27 -md5: a0535741a4934b3e386051065c58761a -depends: -- __glibc >=2.17,<3.0.a0 -- libexpat 2.7.4 hecca717_0 -- libgcc >=14 -license: MIT -license_family: MIT -size: 145274 -timestamp: 1771259434699 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 -sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b -md5: 0c96522c6bdaed4b1566d11387caaf45 -license: BSD-3-Clause -license_family: BSD -size: 397370 -timestamp: 1566932522327 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 -sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c -md5: 34893075a5c9e55cdafac56607368fc6 -license: OFL-1.1 -license_family: Other -size: 96530 -timestamp: 1620479909603 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 -sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 -md5: 4d59c254e01d9cde7957100457e2d5fb -license: OFL-1.1 -license_family: Other -size: 700814 -timestamp: 1620479612257 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda -sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 -md5: 49023d73832ef61042f6a237cb2687e7 -license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 -license_family: Other -size: 1620504 -timestamp: 1727511233259 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda -sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c -md5: 867127763fbe935bab59815b6e0b7b5c -depends: -- __glibc >=2.17,<3.0.a0 -- libexpat >=2.7.4,<3.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 -- libgcc >=14 -- libuuid >=2.41.3,<3.0a0 -- libzlib >=1.3.1,<2.0a0 -license: MIT -license_family: MIT -size: 270705 -timestamp: 1771382710863 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda -sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 -md5: a7970cd949a077b7cb9696379d338681 -depends: -- font-ttf-ubuntu -- font-ttf-inconsolata -- font-ttf-dejavu-sans-mono -- font-ttf-source-code-pro -license: BSD-3-Clause -license_family: BSD -size: 4059 -timestamp: 1762351264405 -- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda -sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 -md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 -depends: -- python >=3.10 -- hyperframe >=6.1,<7 -- hpack >=4.1,<5 -- python -license: MIT -license_family: MIT -size: 95967 -timestamp: 1756364871835 -- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda -sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba -md5: 0a802cb9888dd14eeefc611f05c40b6e -depends: -- python >=3.9 -license: MIT -license_family: MIT -size: 30731 -timestamp: 1737618390337 -- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda -sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d -md5: 7fe569c10905402ed47024fc481bb371 -depends: -- __unix -- python >=3.9 -license: MIT -license_family: MIT -size: 73563 -timestamp: 1733928021866 -- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda -sha256: 6c4343b376d0b12a4c75ab992640970d36c933cad1fd924f6a1181fa91710e80 -md5: daddf757c3ecd6067b9af1df1f25d89e -depends: -- python >=3.10 -license: MIT -license_family: MIT -size: 67994 -timestamp: 1766267728652 -- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda -sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 -md5: 8e6923fc12f1fe8f8c4e5c9f343256ac -depends: -- python >=3.9 -license: MIT -license_family: MIT -size: 17397 -timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda -sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a -md5: c80d8a3b84358cb967fa81e7075fbc8a -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libstdcxx >=14 -license: MIT -license_family: MIT -size: 12723451 -timestamp: 1773822285671 -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda -sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 -md5: 53abe63df7e10a6ba605dc5f9f961d36 -depends: -- python >=3.10 -license: BSD-3-Clause -license_family: BSD -size: 50721 -timestamp: 1760286526795 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda -sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 -md5: 080594bf4493e6bae2607e65390c520a -depends: -- python >=3.10 -- zipp >=3.20 -- python -license: Apache-2.0 -license_family: APACHE -size: 34387 -timestamp: 1773931568510 -- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda -sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b -md5: 04558c96691bed63104678757beb4f8d -depends: -- markupsafe >=2.0 -- python >=3.10 -- python -license: BSD-3-Clause -license_family: BSD -size: 120685 -timestamp: 1764517220861 -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda -sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 -md5: ada41c863af263cc4c5fcbaff7c3e4dc -depends: -- attrs >=22.2.0 -- jsonschema-specifications >=2023.3.6 -- python >=3.10 -- referencing >=0.28.4 -- rpds-py >=0.25.0 -- python -license: MIT -license_family: MIT -size: 82356 -timestamp: 1767839954256 -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda -sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 -md5: 439cd0f567d697b20a8f45cb70a1005a -depends: -- python >=3.10 -- referencing >=0.31.0 -- python -license: MIT -license_family: MIT -size: 19236 -timestamp: 1757335715225 -- conda: https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2 -sha256: 7f243680ca03eba7457b7a48f93a9440ba8181a8eac20a3eb5ef165ab6c96664 -md5: b3723b235b0758abaae8c82ce4d80146 -depends: -- __glibc >=2.17,<3.0.a0 -- expat >=2.2.10,<3.0.0a0 -- fontconfig -- fonts-conda-forge -- libgcc-ng >=9.3.0 -- mathjax 2.7.* -- nspr >=4.29,<5.0a0 -- nss >=3.62,<4.0a0 -- sqlite >=3.34.0,<4.0a0 -license: MIT -license_family: MIT -size: 62099926 -timestamp: 1615199463039 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda -sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a -md5: 6f2e2c8f58160147c4d1c6f4c14cbac4 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libjpeg-turbo >=3.1.2,<4.0a0 -- libtiff >=4.7.1,<4.8.0a0 -license: MIT -license_family: MIT -size: 249959 -timestamp: 1768184673131 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda -sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c -md5: 18335a698559cdbcd86150a48bf54ba6 -depends: -- __glibc >=2.17,<3.0.a0 -- zstd >=1.5.7,<1.6.0a0 -constrains: -- binutils_impl_linux-64 2.45.1 -license: GPL-3.0-only -license_family: GPL -size: 728002 -timestamp: 1774197446916 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda -sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 -md5: a752488c68f2e7c456bcbd8f16eec275 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libstdcxx >=14 -license: Apache-2.0 -license_family: Apache -size: 261513 -timestamp: 1773113328888 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda -build_number: 5 -sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c -md5: c160954f7418d7b6e87eaf05a8913fa9 -depends: -- libopenblas >=0.3.30,<0.3.31.0a0 -- libopenblas >=0.3.30,<1.0a0 -constrains: -- mkl <2026 -- liblapack 3.11.0 5*_openblas -- libcblas 3.11.0 5*_openblas -- blas 2.305 openblas -- liblapacke 3.11.0 5*_openblas -license: BSD-3-Clause -license_family: BSD -size: 18213 -timestamp: 1765818813880 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda -build_number: 5 -sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8 -md5: 6636a2b6f1a87572df2970d3ebc87cc0 -depends: -- libblas 3.11.0 5_h4a7cf45_openblas -constrains: -- liblapacke 3.11.0 5*_openblas -- blas 2.305 openblas -- liblapack 3.11.0 5*_openblas -license: BSD-3-Clause -license_family: BSD -size: 18194 -timestamp: 1765818837135 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda -sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 -md5: 6c77a605a7a689d17d4819c0f8ac9a00 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: MIT -license_family: MIT -size: 73490 -timestamp: 1761979956660 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda -sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 -md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -constrains: -- expat 2.7.4.* -license: MIT -license_family: MIT -size: 76798 -timestamp: 1771259418166 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda -sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 -md5: a360c33a5abe61c07959e449fa1453eb -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: MIT -license_family: MIT -size: 58592 -timestamp: 1769456073053 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda -sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 -md5: e289f3d17880e44b633ba911d57a321b -depends: -- libfreetype6 >=2.14.3 -license: GPL-2.0-only OR FTL -size: 8049 -timestamp: 1774298163029 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda -sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d -md5: fb16b4b69e3f1dcfe79d80db8fd0c55d -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libpng >=1.6.55,<1.7.0a0 -- libzlib >=1.3.2,<2.0a0 -constrains: -- freetype >=2.14.3 -license: GPL-2.0-only OR FTL -size: 384575 -timestamp: 1774298162622 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda -sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 -md5: 0aa00f03f9e39fb9876085dee11a85d4 -depends: -- __glibc >=2.17,<3.0.a0 -- _openmp_mutex >=4.5 -constrains: -- libgcc-ng ==15.2.0=*_18 -- libgomp 15.2.0 he0feb66_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 1041788 -timestamp: 1771378212382 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda -sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 -md5: d5e96b1ed75ca01906b3d2469b4ce493 -depends: -- libgcc 15.2.0 he0feb66_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 27526 -timestamp: 1771378224552 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda -sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee -md5: 9063115da5bc35fdc3e1002e69b9ef6e -depends: -- libgfortran5 15.2.0 h68bc16d_18 -constrains: -- libgfortran-ng ==15.2.0=*_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 27523 -timestamp: 1771378269450 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda -sha256: 539b57cf50ec85509a94ba9949b7e30717839e4d694bc94f30d41c9d34de2d12 -md5: 646855f357199a12f02a87382d429b75 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=15.2.0 -constrains: -- libgfortran 15.2.0 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 2482475 -timestamp: 1771378241063 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda -sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 -md5: 239c5e9546c38a1e884d69effcf4c882 -depends: -- __glibc >=2.17,<3.0.a0 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 603262 -timestamp: 1771378117851 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda -sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 -md5: 8397539e3a0bbd1695584fb4f927485a -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -constrains: -- jpeg <0.0.0a -license: IJG AND BSD-3-Clause AND Zlib -size: 633710 -timestamp: 1762094827865 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda -build_number: 5 -sha256: c723b6599fcd4c6c75dee728359ef418307280fa3e2ee376e14e85e5bbdda053 -md5: b38076eb5c8e40d0106beda6f95d7609 -depends: -- libblas 3.11.0 5_h4a7cf45_openblas -constrains: -- blas 2.305 openblas -- liblapacke 3.11.0 5*_openblas -- libcblas 3.11.0 5*_openblas -license: BSD-3-Clause -license_family: BSD -size: 18200 -timestamp: 1765818857876 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda -sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb -md5: c7c83eecbb72d88b940c249af56c8b17 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -constrains: -- xz 5.8.2.* -license: 0BSD -size: 113207 -timestamp: 1768752626120 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda -sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 -md5: 2c21e66f50753a083cbe6b80f38268fa -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: BSD-2-Clause -license_family: BSD -size: 92400 -timestamp: 1769482286018 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda -sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5 -md5: be43915efc66345cccb3c310b6ed0374 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libgfortran -- libgfortran5 >=14.3.0 -constrains: -- openblas >=0.3.30,<0.3.31.0a0 -license: BSD-3-Clause -license_family: BSD -size: 5927939 -timestamp: 1763114673331 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda -sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c -md5: 5f13ffc7d30ffec87864e678df9957b4 -depends: -- libgcc >=14 -- __glibc >=2.17,<3.0.a0 -- libzlib >=1.3.1,<2.0a0 -license: zlib-acknowledgement -size: 317669 -timestamp: 1770691470744 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda -sha256: d716847b7deca293d2e49ed1c8ab9e4b9e04b9d780aea49a97c26925b28a7993 -md5: fd893f6a3002a635b5e50ceb9dd2c0f4 -depends: -- __glibc >=2.17,<3.0.a0 -- icu >=78.2,<79.0a0 -- libgcc >=14 -- libzlib >=1.3.1,<2.0a0 -license: blessing -size: 951405 -timestamp: 1772818874251 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda -sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e -md5: 1b08cd684f34175e4514474793d44bcb -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc 15.2.0 he0feb66_18 -constrains: -- libstdcxx-ng ==15.2.0=*_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 5852330 -timestamp: 1771378262446 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda -sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 -md5: cd5a90476766d53e901500df9215e927 -depends: -- __glibc >=2.17,<3.0.a0 -- lerc >=4.0.0,<5.0a0 -- libdeflate >=1.25,<1.26.0a0 -- libgcc >=14 -- libjpeg-turbo >=3.1.0,<4.0a0 -- liblzma >=5.8.1,<6.0a0 -- libstdcxx >=14 -- libwebp-base >=1.6.0,<2.0a0 -- libzlib >=1.3.1,<2.0a0 -- zstd >=1.5.7,<1.6.0a0 -license: HPND -size: 435273 -timestamp: 1762022005702 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda -sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee -md5: db409b7c1720428638e7c0d509d3e1b5 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: BSD-3-Clause -license_family: BSD -size: 40311 -timestamp: 1766271528534 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda -sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b -md5: aea31d2e5b1091feca96fcfe945c3cf9 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -constrains: -- libwebp 1.6.0 -license: BSD-3-Clause -license_family: BSD -size: 429011 -timestamp: 1752159441324 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda -sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa -md5: 92ed62436b625154323d40d5f2f11dd7 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -- pthread-stubs -- xorg-libxau >=1.0.11,<2.0a0 -- xorg-libxdmcp -license: MIT -license_family: MIT -size: 395888 -timestamp: 1727278577118 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda -sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 -md5: d87ff7921124eccd67248aa483c23fec -depends: -- __glibc >=2.17,<3.0.a0 -constrains: -- zlib 1.3.2 *_2 -license: Zlib -license_family: Other -size: 63629 -timestamp: 1774072609062 -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda -sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b -md5: ba0a9221ce1063f31692c07370d062f3 -depends: -- importlib-metadata >=4.4 -- python >=3.10 -- python -license: BSD-3-Clause -license_family: BSD -size: 85893 -timestamp: 1770694658918 -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda -sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e -md5: 5b5203189eb668f042ac2b0826244964 -depends: -- mdurl >=0.1,<1 -- python >=3.10 -license: MIT -license_family: MIT -size: 64736 -timestamp: 1754951288511 -- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda -sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf -md5: 9a17c4307d23318476d7fbf0fedc0cde -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- python >=3.14,<3.15.0a0 -- python_abi 3.14.* *_cp314 -constrains: -- jinja2 >=3.0.0 -license: BSD-3-Clause -license_family: BSD -size: 27424 -timestamp: 1772445227915 -- conda: https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2 -sha256: 02fef69bde69db264a12f21386612262f545b6e3e68d8f1ccec19f3eaae58edf -md5: 86e69bd82c2a2c6fd29f5ab7e02b3691 -license: Apache-2.0 -license_family: Apache -size: 22281629 -timestamp: 1662784498331 -- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda -sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 -md5: 592132998493b3ff25fd7479396e8351 -depends: -- python >=3.9 -license: MIT -license_family: MIT -size: 14465 -timestamp: 1733255681319 -- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda -sha256: f005760b13093362fc9c997d603dd487de32ab2e821a3cbce52a42bcb8136517 -md5: 698a8a27c2b9d8a542c70cb47099a75e -depends: -- click -- coloredlogs -- humanize -- importlib-metadata -- jinja2 >=3.0.0 -- jsonschema -- markdown -- natsort -- numpy -- packaging -- pillow >=10.2.0 -- plotly >=5.18 -- polars-lts-cpu -- pyaml-env -- pydantic >=2.7.1 -- python >=3.8,!=3.14.1 -- python-dotenv -- python-kaleido 0.2.1 -- pyyaml >=4 -- requests -- rich >=10 -- rich-click -- spectra >=0.0.10 -- tiktoken -- tqdm -- typeguard -license: GPL-3.0-or-later -license_family: GPL3 -size: 4198799 -timestamp: 1765300743879 -- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda -sha256: 541fd4390a0687228b8578247f1536a821d9261389a65585af9d1a6f2a14e1e0 -md5: 30bec5e8f4c3969e2b1bd407c5e52afb -depends: -- python >=3.10 -- python -license: MIT -size: 280459 -timestamp: 1774380620329 -- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda -sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 -md5: e941e85e273121222580723010bd4fa2 -depends: -- python >=3.9 -- python -license: MIT -license_family: MIT -size: 39262 -timestamp: 1770905275632 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda -sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 -md5: 47e340acb35de30501a76c7c799c41d7 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -license: X11 AND BSD-3-Clause -size: 891641 -timestamp: 1738195959188 -- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda -sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 -md5: a2c1eeadae7a309daed9d62c96012a2b -depends: -- python >=3.11 -- python -constrains: -- numpy >=1.25 -- scipy >=1.11.2 -- matplotlib-base >=3.8 -- pandas >=2.0 -license: BSD-3-Clause -license_family: BSD -size: 1587439 -timestamp: 1765215107045 -- conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda -sha256: e3664264bd936c357523b55c71ed5a30263c6ba278d726a75b1eb112e6fb0b64 -md5: e235d5566c9cc8970eb2798dd4ecf62f -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libstdcxx >=14 -license: MPL-2.0 -license_family: MOZILLA -size: 228588 -timestamp: 1762348634537 -- conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda -sha256: 44dd98ffeac859d84a6dcba79a2096193a42fc10b29b28a5115687a680dd6aea -md5: 567fbeed956c200c1db5782a424e58ee -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libsqlite >=3.51.0,<4.0a0 -- libstdcxx >=14 -- libzlib >=1.3.1,<2.0a0 -- nspr >=4.38,<5.0a0 -license: MPL-2.0 -license_family: MOZILLA -size: 2057773 -timestamp: 1763485556350 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda -sha256: f2ba8cb0d86a6461a6bcf0d315c80c7076083f72c6733c9290086640723f79ec -md5: 36f5b7eb328bdc204954a2225cf908e2 -depends: -- python -- libstdcxx >=14 -- libgcc >=14 -- __glibc >=2.17,<3.0.a0 -- python_abi 3.14.* *_cp314 -- libcblas >=3.9.0,<4.0a0 -- liblapack >=3.9.0,<4.0a0 -- libblas >=3.9.0,<4.0a0 -constrains: -- numpy-base <0a0 -license: BSD-3-Clause -license_family: BSD -size: 8927860 -timestamp: 1773839233468 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda -sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d -md5: 11b3379b191f63139e29c0d19dee24cd -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libpng >=1.6.50,<1.7.0a0 -- libstdcxx >=14 -- libtiff >=4.7.1,<4.8.0a0 -- libzlib >=1.3.1,<2.0a0 -license: BSD-2-Clause -license_family: BSD -size: 355400 -timestamp: 1758489294972 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda -sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c -md5: f61eb8cd60ff9057122a3d338b99c00f -depends: -- __glibc >=2.17,<3.0.a0 -- ca-certificates -- libgcc >=14 -license: Apache-2.0 -license_family: Apache -size: 3164551 -timestamp: 1769555830639 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda -sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 -md5: b76541e68fea4d511b1ac46a28dcd2c6 -depends: -- python >=3.8 -- python -license: Apache-2.0 -license_family: APACHE -size: 72010 -timestamp: 1769093650580 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda -sha256: 9e6ec8f3213e8b7d64b0ad45f84c51a2c9eba4398efda31e196c9a56186133ee -md5: 79678378ae235e24b3aa83cee1b38207 -depends: -- python -- libgcc >=14 -- __glibc >=2.17,<3.0.a0 -- libwebp-base >=1.6.0,<2.0a0 -- zlib-ng >=2.3.3,<2.4.0a0 -- python_abi 3.14.* *_cp314 -- tk >=8.6.13,<8.7.0a0 -- libjpeg-turbo >=3.1.2,<4.0a0 -- libxcb >=1.17.0,<2.0a0 -- openjpeg >=2.5.4,<3.0a0 -- lcms2 >=2.18,<3.0a0 -- libtiff >=4.7.1,<4.8.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 -license: HPND -size: 1073026 -timestamp: 1770794002408 -- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda -sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 -md5: 3e9427ee186846052e81fadde8ebe96a -depends: -- narwhals >=1.15.1 -- packaging -- python >=3.10 -constrains: -- ipywidgets >=7.6 -license: MIT -license_family: MIT -size: 5251872 -timestamp: 1772628857717 -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.39.3-pyh58ad624_1.conda -sha256: d332c2d5002fc440ae37ed9679ffc21b552f18d20232390005d1dd3bce0888d3 -md5: d5a4e013a30dd8dfde9ab39f45aaf9c1 -depends: -- polars-runtime-32 ==1.39.3 -- python >=3.10 -- python -constrains: -- numpy >=1.16.0 -- pyarrow >=7.0.0 -- fastexcel >=0.9 -- openpyxl >=3.0.0 -- xlsx2csv >=0.8.0 -- connectorx >=0.3.2 -- deltalake >=1.0.0 -- pyiceberg >=0.7.1 -- altair >=5.4.0 -- great_tables >=0.8.0 -- polars-runtime-32 ==1.39.3 -- polars-runtime-64 ==1.39.3 -- polars-runtime-compat ==1.39.3 -license: MIT -license_family: MIT -size: 533495 -timestamp: 1774207987966 -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda -sha256: e466fb31f67ba9bde18deafeb34263ca5eb25807f39ead0e9d753a8e82c4c4f4 -md5: ef0340e75068ac8ff96462749b5c98e7 -depends: -- polars >=1.34.0 -- polars-runtime-compat >=1.34.0 -license: MIT -license_family: MIT -size: 3902 -timestamp: 1760206808444 -- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.39.3-py310hffdcd12_1.conda -noarch: python -sha256: 9744f8086bb0832998f5b01076f57ddc9efbe460e493b14303c3567dc4f401e7 -md5: f9327f9f2cfc4215f55b613e64afd3ba -depends: -- python -- libstdcxx >=14 -- libgcc >=14 -- __glibc >=2.17,<3.0.a0 -- _python_abi3_support 1.* -- cpython >=3.10 -constrains: -- __glibc >=2.17 -license: MIT -license_family: MIT -size: 37570276 -timestamp: 1774207987966 -- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.39.3-py310hbcd5346_1.conda -noarch: python -sha256: bf0b932713f0f27924f42159c98426e0073bb6145ed796eaa4cec79ca05363c7 -md5: 4b9b312453eebd6fbdbbe2a88fa1b5c4 -depends: -- python -- libgcc >=14 -- libstdcxx >=14 -- __glibc >=2.17,<3.0.a0 -- _python_abi3_support 1.* -- cpython >=3.10 -constrains: -- __glibc >=2.17 -license: MIT -license_family: MIT -size: 37224264 -timestamp: 1774207985377 -- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda -sha256: 4ce2e1ee31a6217998f78c31ce7dc0a3e0557d9238b51d49dd20c52d467a126d -md5: f2c23a77b25efcad57d377b34bd84941 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- ncurses >=6.5,<7.0a0 -license: GPL-2.0-or-later AND LGPL-2.0-or-later -license_family: GPL -size: 593603 -timestamp: 1769710381284 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda -sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 -md5: b3c17d95b5a10c6e64a21fa17573e70e -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=13 -license: MIT -license_family: MIT -size: 8252 -timestamp: 1726802366959 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda -sha256: 58994e0d2ea8584cb399546e6f6896d771995e6121d1a7b6a2c9948388358932 -md5: e17be1016bcc3516827b836cd3e4d9dc -depends: -- python >=3.9 -- pyyaml >=5.0,<=7.0 -license: MIT -license_family: MIT -size: 14645 -timestamp: 1736766960536 -- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda -sha256: 868569d9505b7fe246c880c11e2c44924d7613a8cdcc1f6ef85d5375e892f13d -md5: c3946ed24acdb28db1b5d63321dbca7d -depends: -- typing-inspection >=0.4.2 -- typing_extensions >=4.14.1 -- python >=3.10 -- typing-extensions >=4.6.1 -- annotated-types >=0.6.0 -- pydantic-core ==2.41.5 -- python -license: MIT -license_family: MIT -size: 340482 -timestamp: 1764434463101 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda -sha256: 7e0ae379796e28a429f8e48f2fe22a0f232979d65ec455e91f8dac689247d39f -md5: 432b0716a1dfac69b86aa38fdd59b7e6 -depends: -- python -- typing-extensions >=4.6.0,!=4.7.0 -- libgcc >=14 -- __glibc >=2.17,<3.0.a0 -- python_abi 3.14.* *_cp314 -constrains: -- __glibc >=2.17 -license: MIT -license_family: MIT -size: 1943088 -timestamp: 1762988995556 -- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda -sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a -md5: 6b6ece66ebcae2d5f326c77ef2c5a066 -depends: -- python >=3.9 -license: BSD-2-Clause -license_family: BSD -size: 889287 -timestamp: 1750615908735 -- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda -sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 -md5: 461219d1a5bd61342293efa2c0c90eac -depends: -- __unix -- python >=3.9 -license: BSD-3-Clause -license_family: BSD -size: 21085 -timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda -build_number: 101 -sha256: cb0628c5f1732f889f53a877484da98f5a0e0f47326622671396fb4f2b0cd6bd -md5: c014ad06e60441661737121d3eae8a60 -depends: -- __glibc >=2.17,<3.0.a0 -- bzip2 >=1.0.8,<2.0a0 -- ld_impl_linux-64 >=2.36.1 -- libexpat >=2.7.3,<3.0a0 -- libffi >=3.5.2,<3.6.0a0 -- libgcc >=14 -- liblzma >=5.8.2,<6.0a0 -- libmpdec >=4.0.0,<5.0a0 -- libsqlite >=3.51.2,<4.0a0 -- libuuid >=2.41.3,<3.0a0 -- libzlib >=1.3.1,<2.0a0 -- ncurses >=6.5,<7.0a0 -- openssl >=3.5.5,<4.0a0 -- python_abi 3.14.* *_cp314 -- readline >=8.3,<9.0a0 -- tk >=8.6.13,<8.7.0a0 -- tzdata -- zstd >=1.5.7,<1.6.0a0 -license: Python-2.0 -size: 36702440 -timestamp: 1770675584356 -python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda -sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 -md5: 130584ad9f3a513cdd71b1fdc1244e9c -depends: -- python >=3.10 -license: BSD-3-Clause -license_family: BSD -size: 27848 -timestamp: 1772388605021 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda -sha256: 233aebd94c704ac112afefbb29cf4170b7bc606e22958906f2672081bc50638a -md5: 235765e4ea0d0301c75965985163b5a1 -depends: -- cpython 3.14.3.* -- python_abi * *_cp314 -license: Python-2.0 -size: 50062 -timestamp: 1770674497152 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 -sha256: e17bf63a30aec33432f1ead86e15e9febde9fc40a7f869c0e766be8d2db44170 -md5: 310259a5b03ff02289d7705f39e2b1d2 -depends: -- kaleido-core 0.2.1.* -- python >=3.5 -license: MIT -license_family: MIT -size: 18320 -timestamp: 1615204747600 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda -build_number: 8 -sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 -md5: 0539938c55b6b1a59b560e843ad864a4 -constrains: -- python 3.14.* *_cp314 -license: BSD-3-Clause -license_family: BSD -size: 6989 -timestamp: 1752805904792 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda -sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d -md5: 2035f68f96be30dc60a5dfd7452c7941 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- python >=3.14,<3.15.0a0 -- python_abi 3.14.* *_cp314 -- yaml >=0.2.5,<0.3.0a0 -license: MIT -license_family: MIT -size: 202391 -timestamp: 1770223462836 -- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda -sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 -md5: d7d95fc8287ea7bf33e0e7116d2b95ec -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- ncurses >=6.5,<7.0a0 -license: GPL-3.0-only -license_family: GPL -size: 345073 -timestamp: 1765813471974 -- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda -sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 -md5: 870293df500ca7e18bedefa5838a22ab -depends: -- attrs >=22.2.0 -- python >=3.10 -- rpds-py >=0.7.0 -- typing_extensions >=4.4.0 -- python -license: MIT -license_family: MIT -size: 51788 -timestamp: 1760379115194 -- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.2.28-py314h5bd0f2a_0.conda -sha256: e085e336f1446f5263a3ec9747df8c719b6996753901181add50dc4fdd8bb2e8 -md5: 3c8b6a8c4d0ff5a264e9831eac4941f4 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- python >=3.14,<3.15.0a0 -- python_abi 3.14.* *_cp314 -license: Apache-2.0 AND CNRI-Python -license_family: PSF -size: 411924 -timestamp: 1772255161535 -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda -sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 -md5: c65df89a0b2e321045a9e01d1337b182 -depends: -- python >=3.10 -- certifi >=2017.4.17 -- charset-normalizer >=2,<4 -- idna >=2.5,<4 -- urllib3 >=1.21.1,<3 -- python -constrains: -- chardet >=3.0.2,<6 -license: Apache-2.0 -license_family: APACHE -size: 63602 -timestamp: 1766926974520 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda -sha256: b06ce84d6a10c266811a7d3adbfa1c11f13393b91cc6f8a5b468277d90be9590 -md5: 7a6289c50631d620652f5045a63eb573 -depends: -- markdown-it-py >=2.2.0 -- pygments >=2.13.0,<3.0.0 -- python >=3.10 -- typing_extensions >=4.0.0,<5.0.0 -- python -license: MIT -license_family: MIT -size: 208472 -timestamp: 1771572730357 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda -sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 -md5: 0c20a8ebcddb24a45da89d5e917e6cb9 -depends: -- python >=3.10 -- rich >=12 -- click >=8 -- typing-extensions >=4 -- __unix -- python -license: MIT -license_family: MIT -size: 64356 -timestamp: 1769850479089 -- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda -sha256: e53b0cbf3b324eaa03ca1fe1a688fdf4ab42cea9c25270b0a7307d8aaaa4f446 -md5: c1c368b5437b0d1a68f372ccf01cb133 -depends: -- python -- libgcc >=14 -- __glibc >=2.17,<3.0.a0 -- python_abi 3.14.* *_cp314 -constrains: -- __glibc >=2.17 -license: MIT -license_family: MIT -size: 376121 -timestamp: 1764543122774 -- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda -sha256: 7c65782d2511738e62c70462e89d65da4fa54d5a7e47c46667bcd27a59f81876 -md5: 472239e4eb7b5a84bb96b3ed7e3a596a -depends: -- colormath >=3.0.0 -- python >=3.9 -license: MIT -license_family: MIT -size: 22284 -timestamp: 1735770589188 -- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda -sha256: c9af81e7830d9c4b67a7f48e512d060df2676b29cac59e3b31f09dbfcee29c58 -md5: 7d9d7efe9541d4bb71b5934e8ee348ea -depends: -- __glibc >=2.17,<3.0.a0 -- icu >=78.2,<79.0a0 -- libgcc >=14 -- libsqlite 3.52.0 hf4e2dac_0 -- libzlib >=1.3.1,<2.0a0 -- ncurses >=6.5,<7.0a0 -- readline >=8.3,<9.0a0 -license: blessing -size: 203641 -timestamp: 1772818888368 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda -sha256: 7e395d67fd249d901beb1ae269057763c0d8c3ee5f7a348694bdb16d158a37d9 -md5: d705f9d8a1185a2b01cced191177a028 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libstdcxx >=14 -- python >=3.14,<3.15.0a0 -- python_abi 3.14.* *_cp314 -- regex >=2022.1.18 -- requests >=2.26.0 -constrains: -- __glibc >=2.17 -license: MIT -license_family: MIT -size: 939648 -timestamp: 1764028306357 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda -sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac -md5: cffd3bdd58090148f4cfcd831f4b26ab -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libzlib >=1.3.1,<2.0a0 -constrains: -- xorg-libx11 >=1.8.12,<2.0a0 -license: TCL -license_family: BSD -size: 3301196 -timestamp: 1769460227866 -- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda -sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 -md5: e5ce43272193b38c2e9037446c1d9206 -depends: -- python >=3.10 -- __unix -- python -license: MPL-2.0 and MIT -size: 94132 -timestamp: 1770153424136 -- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda -sha256: 39d8ae33c43cdb8f771373e149b0b4fae5a08960ac58dcca95b2f1642bb17448 -md5: 260af1b0a94f719de76b4e14094e9a3b -depends: -- importlib-metadata >=3.6 -- python >=3.10 -- typing-extensions >=4.10.0 -- typing_extensions >=4.14.0 -constrains: -- pytest >=7 -license: MIT -license_family: MIT -size: 36838 -timestamp: 1771532971545 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda -sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c -md5: edd329d7d3a4ab45dcf905899a7a6115 -depends: -- typing_extensions ==4.15.0 pyhcf101f3_0 -license: PSF-2.0 -license_family: PSF -size: 91383 -timestamp: 1756220668932 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda -sha256: 70db27de58a97aeb7ba7448366c9853f91b21137492e0b4430251a1870aa8ff4 -md5: a0a4a3035667fc34f29bfbd5c190baa6 -depends: -- python >=3.10 -- typing_extensions >=4.12.0 -license: MIT -license_family: MIT -size: 18923 -timestamp: 1764158430324 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda -sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 -md5: 0caa1af407ecff61170c9437a808404d -depends: -- python >=3.10 -- python -license: PSF-2.0 -license_family: PSF -size: 51692 -timestamp: 1756220668932 -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda -sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c -md5: ad659d0a2b3e47e38d829aa8cad2d610 -license: LicenseRef-Public-Domain -size: 119135 -timestamp: 1767016325805 -- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda -sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a -md5: 9272daa869e03efe68833e3dc7a02130 -depends: -- backports.zstd >=1.0.0 -- brotli-python >=1.2.0 -- h2 >=4,<5 -- pysocks >=1.5.6,<2.0,!=1.5.7 -- python >=3.10 -license: MIT -license_family: MIT -size: 103172 -timestamp: 1767817860341 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda -sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b -md5: b2895afaf55bf96a8c8282a2e47a5de0 -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: MIT -license_family: MIT -size: 15321 -timestamp: 1762976464266 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda -sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 -md5: 1dafce8548e38671bea82e3f5c6ce22f -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -license: MIT -license_family: MIT -size: 20591 -timestamp: 1762976546182 -- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda -sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad -md5: a77f85f77be52ff59391544bfe73390a -depends: -- libgcc >=14 -- __glibc >=2.17,<3.0.a0 -license: MIT -license_family: MIT -size: 85189 -timestamp: 1753484064210 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda -sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae -md5: 30cd29cb87d819caead4d55184c1d115 -depends: -- python >=3.10 -- python -license: MIT -license_family: MIT -size: 24194 -timestamp: 1764460141901 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda -sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f -md5: 2aadb0d17215603a82a2a6b0afd9a4cb -depends: -- __glibc >=2.17,<3.0.a0 -- libgcc >=14 -- libstdcxx >=14 -license: Zlib -license_family: Other -size: 122618 -timestamp: 1770167931827 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda -sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 -md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 -depends: -- __glibc >=2.17,<3.0.a0 -- libzlib >=1.3.1,<2.0a0 -license: BSD-3-Clause -license_family: BSD -size: 601375 -timestamp: 1764777111296 diff --git a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt deleted file mode 100644 index a55a4d4..0000000 --- a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt +++ /dev/null @@ -1,126 +0,0 @@ - -# This file may be used to create an environment using: -# $ conda create --name --file -# platform: linux-64 -@EXPLICIT -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 -https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda#49f570f3bc4c874a06ea69b7225753af -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb -https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb -https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 -https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda#a443f87920815d41bfe611296e507995 -https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda#f111d4cfaf1fe9496f386bc98ae94452 -https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 -https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 -https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda#8910d2c46f7e7b519129f486e0fe927a -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c -https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda#7fe569c10905402ed47024fc481bb371 -https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda#b866ff7007b934d564961066c8195983 -https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda#a2c1eeadae7a309daed9d62c96012a2b -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda#36f5b7eb328bdc204954a2225cf908e2 -https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda#071cf7b0ce333c81718b054066c15102 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.5-hecca717_0.conda#7de50d165039df32d38be74c1b34a910 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda#fb16b4b69e3f1dcfe79d80db8fd0c55d -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda#e289f3d17880e44b633ba911d57a321b -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda#867127763fbe935bab59815b6e0b7b5c -https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda#a7970cd949a077b7cb9696379d338681 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e -https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda#9a17c4307d23318476d7fbf0fedc0cde -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda#c1c368b5437b0d1a68f372ccf01cb133 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda#ada41c863af263cc4c5fcbaff7c3e4dc -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 -https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2#86e69bd82c2a2c6fd29f5ab7e02b3691 -https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda#e235d5566c9cc8970eb2798dd4ecf62f -https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda#567fbeed956c200c1db5782a424e58ee -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 -https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2#b3723b235b0758abaae8c82ce4d80146 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda#6178c6f2fb254558238ef4e6c56fb782 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 -https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 -https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda#ba0a9221ce1063f31692c07370d062f3 -https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 -https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 -https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda#e941e85e273121222580723010bd4fa2 -https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda#76c4757c0ec9d11f969e8eb44899307b -https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda#6cac1a50359219d786453c6fef819f98 -https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda#3e9427ee186846052e81fadde8ebe96a -https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.40.0-py310hffdcd12_0.conda#8eacf9ff4d4e1ca1b52f8f3ba3e0c993 -https://conda.anaconda.org/conda-forge/noarch/polars-1.40.0-pyh58ad624_0.conda#fd16be490f5403adfbf27dd4901bbe34 -https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.40.0-py310hbcd5346_0.conda#03a6899e17bb731c8e21b08212f1a64c -https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda#ef0340e75068ac8ff96462749b5c98e7 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda#2035f68f96be30dc60a5dfd7452c7941 -https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda#e17be1016bcc3516827b836cd3e4d9dc -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.3-py314h2e6c369_0.conda#1f3fd537f929b8d3236f9f0f0e7f7a32 -https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda#a0a4a3035667fc34f29bfbd5c190baa6 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda#f690e6f204efd2e5c06b57518a383d98 -https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda#130584ad9f3a513cdd71b1fdc1244e9c -https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2#310259a5b03ff02289d7705f39e2b1d2 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 -https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda#0242025a3c804966bf71aa04eee82f66 -https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda#0c20a8ebcddb24a45da89d5e917e6cb9 -https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda#472239e4eb7b5a84bb96b3ed7e3a596a -https://conda.anaconda.org/conda-forge/linux-64/regex-2026.4.4-py314h5bd0f2a_0.conda#4ffb42385183c854564f1f9adcf80a63 -https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda#d705f9d8a1185a2b01cced191177a028 -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda#e5ce43272193b38c2e9037446c1d9206 -https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda#260af1b0a94f719de76b4e14094e9a3b -https://conda.anaconda.org/bioconda/noarch/multiqc-1.34-pyhdfd78af_0.conda#a7111ab9a6a6146b40cbce16655ac873 -https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f -https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda#f2c23a77b25efcad57d377b34bd84941 diff --git a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt deleted file mode 100644 index a58231a..0000000 --- a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt +++ /dev/null @@ -1,1502 +0,0 @@ - -version: 6 -environments: -default: -channels: -- url: https://conda.anaconda.org/conda-forge/ -- url: https://conda.anaconda.org/bioconda/ -- url: https://conda.anaconda.org/bioconda/ -options: -pypi-prerelease-mode: if-necessary-or-explicit -packages: -linux-aarch64: -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.4-hfae3067_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda -- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py314haac167e_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.1.1-py314hac3e5ec_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.39.3-pyh58ad624_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.39.3-py310hff09b76_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.39.3-py310hf00a4a2_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.5-py314h451b6cc_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.3-hb06a95a_101_cp314.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.2.28-py314h51f160d_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.52.0-hf1c7be2_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda -packages: -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda -build_number: 20 -sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 -md5: 468fd3bb9e1f671d36c2cbc677e56f1d -depends: -- libgomp >=7.5.0 -constrains: -- openmp_impl <0.0a0 -license: BSD-3-Clause -license_family: BSD -size: 28926 -timestamp: 1770939656741 -- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda -sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 -md5: aaa2a381ccc56eac91d63b6c1240312f -depends: -- cpython -- python-gil -license: MIT -license_family: MIT -size: 8191 -timestamp: 1744137672556 -- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda -sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 -md5: 2934f256a8acfe48f6ebb4fce6cde29c -depends: -- python >=3.9 -- typing-extensions >=4.0.0 -license: MIT -license_family: MIT -size: 18074 -timestamp: 1733247158254 -- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda -sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab -md5: c6b0543676ecb1fb2d7643941fe375f2 -depends: -- python >=3.10 -- python -license: MIT -license_family: MIT -size: 64927 -timestamp: 1773935801332 -- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda -noarch: generic -sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 -md5: a2ac7763a9ac75055b68f325d3255265 -depends: -- python >=3.14 -license: BSD-3-Clause AND MIT AND EPL-2.0 -size: 7514 -timestamp: 1767044983590 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda -sha256: 5a5b0cdcd7ed89c6a8fb830924967f6314a2b71944bc1ebc2c105781ba97aa75 -md5: a1b5c571a0923a205d663d8678df4792 -depends: -- libgcc >=14 -- libstdcxx >=14 -- python >=3.14,<3.15.0a0 -- python >=3.14,<3.15.0a0 *_cp314 -- python_abi 3.14.* *_cp314 -constrains: -- libbrotlicommon 1.2.0 he30d5cf_1 -license: MIT -license_family: MIT -size: 373193 -timestamp: 1764017486851 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda -sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c -md5: 840d8fc0d7b3209be93080bc20e07f2d -depends: -- libgcc >=14 -license: bzip2-1.0.6 -license_family: BSD -size: 192412 -timestamp: 1771350241232 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda -sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc -md5: 4492fd26db29495f0ba23f146cd5638d -depends: -- __unix -license: ISC -size: 147413 -timestamp: 1772006283803 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda -sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 -md5: 765c4d97e877cdbbb88ff33152b86125 -depends: -- python >=3.10 -license: ISC -size: 151445 -timestamp: 1772001170301 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda -sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 -md5: 49ee13eb9b8f44d63879c69b8a40a74b -depends: -- python >=3.10 -license: MIT -license_family: MIT -size: 58510 -timestamp: 1773660086450 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda -sha256: 38cfe1ee75b21a8361c8824f5544c3866f303af1762693a178266d7f198e8715 -md5: ea8a6c3256897cc31263de9f455e25d9 -depends: -- python >=3.10 -- __unix -- python -license: BSD-3-Clause -license_family: BSD -size: 97676 -timestamp: 1764518652276 -- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda -sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 -md5: b866ff7007b934d564961066c8195983 -depends: -- humanfriendly >=9.1 -- python >=3.9 -license: MIT -license_family: MIT -size: 43758 -timestamp: 1733928076798 -- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda -sha256: 59c9e29800b483b390467f90e82b0da3a4fbf0612efe1c90813fca232780e160 -md5: 071cf7b0ce333c81718b054066c15102 -depends: -- networkx >=2.0 -- numpy -- python >=3.9 -license: BSD-3-Clause -license_family: BSD -size: 39326 -timestamp: 1735759976140 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda -noarch: generic -sha256: 91b06300879df746214f7363d6c27c2489c80732e46a369eb2afc234bcafb44c -md5: 3bb89e4f795e5414addaa531d6b1500a -depends: -- python >=3.14,<3.15.0a0 -- python_abi * *_cp314 -license: Python-2.0 -size: 50078 -timestamp: 1770674447292 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.4-hfae3067_0.conda -sha256: 5f087bef054c681edcaae84a8c2230585b938691e371ff92957a30707b7fcdf7 -md5: b304307db639831ad7caabd2eac6fca6 -depends: -- libexpat 2.7.4 hfae3067_0 -- libgcc >=14 -license: MIT -license_family: MIT -size: 137701 -timestamp: 1771259543650 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 -sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b -md5: 0c96522c6bdaed4b1566d11387caaf45 -license: BSD-3-Clause -license_family: BSD -size: 397370 -timestamp: 1566932522327 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 -sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c -md5: 34893075a5c9e55cdafac56607368fc6 -license: OFL-1.1 -license_family: Other -size: 96530 -timestamp: 1620479909603 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 -sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 -md5: 4d59c254e01d9cde7957100457e2d5fb -license: OFL-1.1 -license_family: Other -size: 700814 -timestamp: 1620479612257 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda -sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 -md5: 49023d73832ef61042f6a237cb2687e7 -license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 -license_family: Other -size: 1620504 -timestamp: 1727511233259 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda -sha256: 835aff8615dd8d8fff377679710ce81b8a2c47b6404e21a92fb349fda193a15c -md5: 0fed1ff55f4938a65907f3ecf62609db -depends: -- libexpat >=2.7.4,<3.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 -- libgcc >=14 -- libuuid >=2.41.3,<3.0a0 -- libzlib >=1.3.1,<2.0a0 -license: MIT -license_family: MIT -size: 279044 -timestamp: 1771382728182 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda -sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 -md5: a7970cd949a077b7cb9696379d338681 -depends: -- font-ttf-ubuntu -- font-ttf-inconsolata -- font-ttf-dejavu-sans-mono -- font-ttf-source-code-pro -license: BSD-3-Clause -license_family: BSD -size: 4059 -timestamp: 1762351264405 -- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda -sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 -md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 -depends: -- python >=3.10 -- hyperframe >=6.1,<7 -- hpack >=4.1,<5 -- python -license: MIT -license_family: MIT -size: 95967 -timestamp: 1756364871835 -- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda -sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba -md5: 0a802cb9888dd14eeefc611f05c40b6e -depends: -- python >=3.9 -license: MIT -license_family: MIT -size: 30731 -timestamp: 1737618390337 -- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda -sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d -md5: 7fe569c10905402ed47024fc481bb371 -depends: -- __unix -- python >=3.9 -license: MIT -license_family: MIT -size: 73563 -timestamp: 1733928021866 -- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda -sha256: 6c4343b376d0b12a4c75ab992640970d36c933cad1fd924f6a1181fa91710e80 -md5: daddf757c3ecd6067b9af1df1f25d89e -depends: -- python >=3.10 -license: MIT -license_family: MIT -size: 67994 -timestamp: 1766267728652 -- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda -sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 -md5: 8e6923fc12f1fe8f8c4e5c9f343256ac -depends: -- python >=3.9 -license: MIT -license_family: MIT -size: 17397 -timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda -sha256: 49ba6aed2c6b482bb0ba41078057555d29764299bc947b990708617712ef6406 -md5: 546da38c2fa9efacf203e2ad3f987c59 -depends: -- libgcc >=14 -- libstdcxx >=14 -license: MIT -license_family: MIT -size: 12837286 -timestamp: 1773822650615 -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda -sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 -md5: 53abe63df7e10a6ba605dc5f9f961d36 -depends: -- python >=3.10 -license: BSD-3-Clause -license_family: BSD -size: 50721 -timestamp: 1760286526795 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda -sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 -md5: 080594bf4493e6bae2607e65390c520a -depends: -- python >=3.10 -- zipp >=3.20 -- python -license: Apache-2.0 -license_family: APACHE -size: 34387 -timestamp: 1773931568510 -- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda -sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b -md5: 04558c96691bed63104678757beb4f8d -depends: -- markupsafe >=2.0 -- python >=3.10 -- python -license: BSD-3-Clause -license_family: BSD -size: 120685 -timestamp: 1764517220861 -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda -sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 -md5: ada41c863af263cc4c5fcbaff7c3e4dc -depends: -- attrs >=22.2.0 -- jsonschema-specifications >=2023.3.6 -- python >=3.10 -- referencing >=0.28.4 -- rpds-py >=0.25.0 -- python -license: MIT -license_family: MIT -size: 82356 -timestamp: 1767839954256 -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda -sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 -md5: 439cd0f567d697b20a8f45cb70a1005a -depends: -- python >=3.10 -- referencing >=0.31.0 -- python -license: MIT -license_family: MIT -size: 19236 -timestamp: 1757335715225 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2 -sha256: d3c7f4797566e6f983d16c2a87063a18e4b2d819a66230190a21584d70042755 -md5: 4f0d284f5d11e04277b552eb1c172c7f -depends: -- __glibc >=2.17,<3.0.a0 -- expat >=2.2.10,<3.0.0a0 -- fontconfig -- fonts-conda-forge -- libgcc-ng >=9.3.0 -- mathjax 2.7.* -- nspr >=4.29,<5.0a0 -- nss >=3.62,<4.0a0 -- sqlite >=3.34.0,<4.0a0 -license: MIT -license_family: MIT -size: 65750397 -timestamp: 1615199465742 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda -sha256: 379ef5e91a587137391a6149755d0e929f1a007d2dcb211318ac670a46c8596f -md5: bb960f01525b5e001608afef9d47b79c -depends: -- libgcc >=14 -- libjpeg-turbo >=3.1.2,<4.0a0 -- libtiff >=4.7.1,<4.8.0a0 -license: MIT -license_family: MIT -size: 293039 -timestamp: 1768184778398 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda -sha256: 7abd913d81a9bf00abb699e8987966baa2065f5132e37e815f92d90fc6bba530 -md5: a21644fc4a83da26452a718dc9468d5f -depends: -- zstd >=1.5.7,<1.6.0a0 -constrains: -- binutils_impl_linux-aarch64 2.45.1 -license: GPL-3.0-only -license_family: GPL -size: 875596 -timestamp: 1774197520746 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda -sha256: 8957fd460c1c132c8031f65fd5f56ec3807fd71b7cab2c5e2b0937b13404ab36 -md5: d13423b06447113a90b5b1366d4da171 -depends: -- libgcc >=14 -- libstdcxx >=14 -license: Apache-2.0 -license_family: Apache -size: 240444 -timestamp: 1773114901155 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda -build_number: 5 -sha256: 700f3c03d0fba8e687a345404a45fbabe781c1cf92242382f62cef2948745ec4 -md5: 5afcea37a46f76ec1322943b3c4dfdc0 -depends: -- libopenblas >=0.3.30,<0.3.31.0a0 -- libopenblas >=0.3.30,<1.0a0 -constrains: -- mkl <2026 -- libcblas 3.11.0 5*_openblas -- liblapack 3.11.0 5*_openblas -- liblapacke 3.11.0 5*_openblas -- blas 2.305 openblas -license: BSD-3-Clause -license_family: BSD -size: 18369 -timestamp: 1765818610617 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda -build_number: 5 -sha256: 3fad5c9de161dccb4e42c8b1ae8eccb33f4ed56bccbcced9cbb0956ae7869e61 -md5: 0b2f1143ae2d0aa4c991959d0daaf256 -depends: -- libblas 3.11.0 5_haddc8a3_openblas -constrains: -- liblapack 3.11.0 5*_openblas -- liblapacke 3.11.0 5*_openblas -- blas 2.305 openblas -license: BSD-3-Clause -license_family: BSD -size: 18371 -timestamp: 1765818618899 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda -sha256: 48814b73bd462da6eed2e697e30c060ae16af21e9fbed30d64feaf0aad9da392 -md5: a9138815598fe6b91a1d6782ca657b0c -depends: -- libgcc >=14 -license: MIT -license_family: MIT -size: 71117 -timestamp: 1761979776756 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda -sha256: 995ce3ad96d0f4b5ed6296b051a0d7b6377718f325bc0e792fbb96b0e369dad7 -md5: 57f3b3da02a50a1be2a6fe847515417d -depends: -- libgcc >=14 -constrains: -- expat 2.7.4.* -license: MIT -license_family: MIT -size: 76564 -timestamp: 1771259530958 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda -sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 -md5: 2f364feefb6a7c00423e80dcb12db62a -depends: -- libgcc >=14 -license: MIT -license_family: MIT -size: 55952 -timestamp: 1769456078358 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda -sha256: 752e4f66283d7deb4c6fd47d88df644d8daa2aaa825a54f3bf350a625190192a -md5: a229e22d4d8814a07702b0919d8e6701 -depends: -- libfreetype6 >=2.14.3 -license: GPL-2.0-only OR FTL -size: 8125 -timestamp: 1774301094057 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda -sha256: 8e6b27fe4eec4c2fa7b7769a21973734c8dba1de80086fb0213e58375ac09f4c -md5: b99ed99e42dafb27889483b3098cace7 -depends: -- libgcc >=14 -- libpng >=1.6.55,<1.7.0a0 -- libzlib >=1.3.2,<2.0a0 -constrains: -- freetype >=2.14.3 -license: GPL-2.0-only OR FTL -size: 422941 -timestamp: 1774301093473 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda -sha256: 43df385bedc1cab11993c4369e1f3b04b4ca5d0ea16cba6a0e7f18dbc129fcc9 -md5: 552567ea2b61e3a3035759b2fdb3f9a6 -depends: -- _openmp_mutex >=4.5 -constrains: -- libgcc-ng ==15.2.0=*_18 -- libgomp 15.2.0 h8acb6b2_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 622900 -timestamp: 1771378128706 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda -sha256: 83bb0415f59634dccfa8335d4163d1f6db00a27b36666736f9842b650b92cf2f -md5: 4feebd0fbf61075a1a9c2e9b3936c257 -depends: -- libgcc 15.2.0 h8acb6b2_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 27568 -timestamp: 1771378136019 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda -sha256: 7dcd7dff2505d56fd5272a6e712ec912f50a46bf07dc6873a7e853694304e6e4 -md5: 41f261f5e4e2e8cbd236c2f1f15dae1b -depends: -- libgfortran5 15.2.0 h1b7bec0_18 -constrains: -- libgfortran-ng ==15.2.0=*_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 27587 -timestamp: 1771378169244 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda -sha256: 85347670dfb4a8d4c13cd7cae54138dcf2b1606b6bede42eef5507bf5f9660c6 -md5: 574d88ce3348331e962cfa5ed451b247 -depends: -- libgcc >=15.2.0 -constrains: -- libgfortran 15.2.0 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 1486341 -timestamp: 1771378148102 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda -sha256: fc716f11a6a8525e27a5d332ef6a689210b0d2a4dd1133edc0f530659aa9faa6 -md5: 4faa39bf919939602e594253bd673958 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 588060 -timestamp: 1771378040807 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda -sha256: 84064c7c53a64291a585d7215fe95ec42df74203a5bf7615d33d49a3b0f08bb6 -md5: 5109d7f837a3dfdf5c60f60e311b041f -depends: -- libgcc >=14 -constrains: -- jpeg <0.0.0a -license: IJG AND BSD-3-Clause AND Zlib -size: 691818 -timestamp: 1762094728337 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda -build_number: 5 -sha256: 692222d186d3ffbc99eaf04b5b20181fd26aee1edec1106435a0a755c57cce86 -md5: 88d1e4133d1182522b403e9ba7435f04 -depends: -- libblas 3.11.0 5_haddc8a3_openblas -constrains: -- liblapacke 3.11.0 5*_openblas -- blas 2.305 openblas -- libcblas 3.11.0 5*_openblas -license: BSD-3-Clause -license_family: BSD -size: 18392 -timestamp: 1765818627104 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda -sha256: 843c46e20519651a3e357a8928352b16c5b94f4cd3d5481acc48be2e93e8f6a3 -md5: 96944e3c92386a12755b94619bae0b35 -depends: -- libgcc >=14 -constrains: -- xz 5.8.2.* -license: 0BSD -size: 125916 -timestamp: 1768754941722 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda -sha256: 57c0dd12d506e84541c4e877898bd2a59cca141df493d34036f18b2751e0a453 -md5: 7b9813e885482e3ccb1fa212b86d7fd0 -depends: -- libgcc >=14 -license: BSD-2-Clause -license_family: BSD -size: 114056 -timestamp: 1769482343003 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda -sha256: 794a7270ea049ec931537874cd8d2de0ef4b3cef71c055cfd8b4be6d2f4228b0 -md5: 11d7d57b7bdd01da745bbf2b67020b2e -depends: -- libgcc >=14 -- libgfortran -- libgfortran5 >=14.3.0 -constrains: -- openblas >=0.3.30,<0.3.31.0a0 -license: BSD-3-Clause -license_family: BSD -size: 4959359 -timestamp: 1763114173544 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda -sha256: c7378c6b79de4d571d00ad1caf0a4c19d43c9c94077a761abb6ead44d891f907 -md5: be4088903b94ea297975689b3c3aeb27 -depends: -- libgcc >=14 -- libzlib >=1.3.1,<2.0a0 -license: zlib-acknowledgement -size: 340156 -timestamp: 1770691477245 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda -sha256: 1ddaf91b44fae83856276f4cb7ce544ffe41d4b55c1e346b504c6b45f19098d6 -md5: 77891484f18eca74b8ad83694da9815e -depends: -- icu >=78.2,<79.0a0 -- libgcc >=14 -- libzlib >=1.3.1,<2.0a0 -license: blessing -size: 952296 -timestamp: 1772818881550 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda -sha256: 31fdb9ffafad106a213192d8319b9f810e05abca9c5436b60e507afb35a6bc40 -md5: f56573d05e3b735cb03efeb64a15f388 -depends: -- libgcc 15.2.0 h8acb6b2_18 -constrains: -- libstdcxx-ng ==15.2.0=*_18 -license: GPL-3.0-only WITH GCC-exception-3.1 -license_family: GPL -size: 5541411 -timestamp: 1771378162499 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda -sha256: 7ff79470db39e803e21b8185bc8f19c460666d5557b1378d1b1e857d929c6b39 -md5: 8c6fd84f9c87ac00636007c6131e457d -depends: -- lerc >=4.0.0,<5.0a0 -- libdeflate >=1.25,<1.26.0a0 -- libgcc >=14 -- libjpeg-turbo >=3.1.0,<4.0a0 -- liblzma >=5.8.1,<6.0a0 -- libstdcxx >=14 -- libwebp-base >=1.6.0,<2.0a0 -- libzlib >=1.3.1,<2.0a0 -- zstd >=1.5.7,<1.6.0a0 -license: HPND -size: 488407 -timestamp: 1762022048105 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda -sha256: c37a8e89b700646f3252608f8368e7eb8e2a44886b92776e57ad7601fc402a11 -md5: cf2861212053d05f27ec49c3784ff8bb -depends: -- libgcc >=14 -license: BSD-3-Clause -license_family: BSD -size: 43453 -timestamp: 1766271546875 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda -sha256: b03700a1f741554e8e5712f9b06dd67e76f5301292958cd3cb1ac8c6fdd9ed25 -md5: 24e92d0942c799db387f5c9d7b81f1af -depends: -- libgcc >=14 -constrains: -- libwebp 1.6.0 -license: BSD-3-Clause -license_family: BSD -size: 359496 -timestamp: 1752160685488 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda -sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b -md5: cd14ee5cca2464a425b1dbfc24d90db2 -depends: -- libgcc >=13 -- pthread-stubs -- xorg-libxau >=1.0.11,<2.0a0 -- xorg-libxdmcp -license: MIT -license_family: MIT -size: 397493 -timestamp: 1727280745441 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda -sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f -md5: 502006882cf5461adced436e410046d1 -constrains: -- zlib 1.3.2 *_2 -license: Zlib -license_family: Other -size: 69833 -timestamp: 1774072605429 -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda -sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b -md5: ba0a9221ce1063f31692c07370d062f3 -depends: -- importlib-metadata >=4.4 -- python >=3.10 -- python -license: BSD-3-Clause -license_family: BSD -size: 85893 -timestamp: 1770694658918 -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda -sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e -md5: 5b5203189eb668f042ac2b0826244964 -depends: -- mdurl >=0.1,<1 -- python >=3.10 -license: MIT -license_family: MIT -size: 64736 -timestamp: 1754951288511 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda -sha256: 383c188496d13a55658c06e61e7d4cdff2c9f9d5a0648769fca8250bece7e0ef -md5: e5de3c36dd548b35ff2a8aa49208dcb3 -depends: -- libgcc >=14 -- python >=3.14,<3.15.0a0 -- python_abi 3.14.* *_cp314 -constrains: -- jinja2 >=3.0.0 -license: BSD-3-Clause -license_family: BSD -size: 27913 -timestamp: 1772446407659 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2 -sha256: 8fd4c79d6eda3d4cba73783114305a53a154ada4d1e334d4e02cb3521429599b -md5: 7b08314a6867a9d5648a1c3265e9eb8e -license: Apache-2.0 -license_family: Apache -size: 22257008 -timestamp: 1662784555011 -- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda -sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 -md5: 592132998493b3ff25fd7479396e8351 -depends: -- python >=3.9 -license: MIT -license_family: MIT -size: 14465 -timestamp: 1733255681319 -- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda -sha256: f005760b13093362fc9c997d603dd487de32ab2e821a3cbce52a42bcb8136517 -md5: 698a8a27c2b9d8a542c70cb47099a75e -depends: -- click -- coloredlogs -- humanize -- importlib-metadata -- jinja2 >=3.0.0 -- jsonschema -- markdown -- natsort -- numpy -- packaging -- pillow >=10.2.0 -- plotly >=5.18 -- polars-lts-cpu -- pyaml-env -- pydantic >=2.7.1 -- python >=3.8,!=3.14.1 -- python-dotenv -- python-kaleido 0.2.1 -- pyyaml >=4 -- requests -- rich >=10 -- rich-click -- spectra >=0.0.10 -- tiktoken -- tqdm -- typeguard -license: GPL-3.0-or-later -license_family: GPL3 -size: 4198799 -timestamp: 1765300743879 -- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda -sha256: 541fd4390a0687228b8578247f1536a821d9261389a65585af9d1a6f2a14e1e0 -md5: 30bec5e8f4c3969e2b1bd407c5e52afb -depends: -- python >=3.10 -- python -license: MIT -size: 280459 -timestamp: 1774380620329 -- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda -sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 -md5: e941e85e273121222580723010bd4fa2 -depends: -- python >=3.9 -- python -license: MIT -license_family: MIT -size: 39262 -timestamp: 1770905275632 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda -sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 -md5: 182afabe009dc78d8b73100255ee6868 -depends: -- libgcc >=13 -license: X11 AND BSD-3-Clause -size: 926034 -timestamp: 1738196018799 -- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda -sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 -md5: a2c1eeadae7a309daed9d62c96012a2b -depends: -- python >=3.11 -- python -constrains: -- numpy >=1.25 -- scipy >=1.11.2 -- matplotlib-base >=3.8 -- pandas >=2.0 -license: BSD-3-Clause -license_family: BSD -size: 1587439 -timestamp: 1765215107045 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda -sha256: 78a06e89285fef242e272998b292c1e621e3ee3dd4fba62ec014e503c7ec118f -md5: 6dd4f07147774bf720075a210f8026b9 -depends: -- libgcc >=14 -- libstdcxx >=14 -license: MPL-2.0 -license_family: MOZILLA -size: 235140 -timestamp: 1762350120355 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda -sha256: 48942696889367ffd448f8dccfc080fb7e130b9938a4a3b6b20ef8e6af856463 -md5: 4540f9570d12db2150f42ba036154552 -depends: -- libgcc >=14 -- libsqlite >=3.51.0,<4.0a0 -- libstdcxx >=14 -- libzlib >=1.3.1,<2.0a0 -- nspr >=4.38,<5.0a0 -license: MPL-2.0 -license_family: MOZILLA -size: 2061869 -timestamp: 1763490303490 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py314haac167e_0.conda -sha256: a6d42fd88afc57c3b0a57b21a12eff7492dfc419bb61ee3f74e9ba6261dabc88 -md5: 25d896c331481145720a21e5145fad65 -depends: -- python -- libgcc >=14 -- python 3.14.* *_cp314 -- libstdcxx >=14 -- libcblas >=3.9.0,<4.0a0 -- liblapack >=3.9.0,<4.0a0 -- python_abi 3.14.* *_cp314 -- libblas >=3.9.0,<4.0a0 -constrains: -- numpy-base <0a0 -license: BSD-3-Clause -license_family: BSD -size: 8008045 -timestamp: 1773839355275 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda -sha256: bd1bc8bdde5e6c5cbac42d462b939694e40b59be6d0698f668515908640c77b8 -md5: cea962410e327262346d48d01f05936c -depends: -- libgcc >=14 -- libpng >=1.6.50,<1.7.0a0 -- libstdcxx >=14 -- libtiff >=4.7.1,<4.8.0a0 -- libzlib >=1.3.1,<2.0a0 -license: BSD-2-Clause -license_family: BSD -size: 392636 -timestamp: 1758489353577 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda -sha256: 7f8048c0e75b2620254218d72b4ae7f14136f1981c5eb555ef61645a9344505f -md5: 25f5885f11e8b1f075bccf4a2da91c60 -depends: -- ca-certificates -- libgcc >=14 -license: Apache-2.0 -license_family: Apache -size: 3692030 -timestamp: 1769557678657 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda -sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 -md5: b76541e68fea4d511b1ac46a28dcd2c6 -depends: -- python >=3.8 -- python -license: Apache-2.0 -license_family: APACHE -size: 72010 -timestamp: 1769093650580 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.1.1-py314hac3e5ec_0.conda -sha256: 1ca2d1616baad9bccb7ebc425ef2dcd6cebe742fbe91edf226fb606ad371ca0f -md5: d3c959c7efe560b2d7da459d69121fe9 -depends: -- python -- python 3.14.* *_cp314 -- libgcc >=14 -- zlib-ng >=2.3.3,<2.4.0a0 -- libwebp-base >=1.6.0,<2.0a0 -- tk >=8.6.13,<8.7.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 -- libtiff >=4.7.1,<4.8.0a0 -- lcms2 >=2.18,<3.0a0 -- python_abi 3.14.* *_cp314 -- openjpeg >=2.5.4,<3.0a0 -- libjpeg-turbo >=3.1.2,<4.0a0 -- libxcb >=1.17.0,<2.0a0 -license: HPND -size: 1051828 -timestamp: 1770794010335 -- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda -sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 -md5: 3e9427ee186846052e81fadde8ebe96a -depends: -- narwhals >=1.15.1 -- packaging -- python >=3.10 -constrains: -- ipywidgets >=7.6 -license: MIT -license_family: MIT -size: 5251872 -timestamp: 1772628857717 -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.39.3-pyh58ad624_1.conda -sha256: d332c2d5002fc440ae37ed9679ffc21b552f18d20232390005d1dd3bce0888d3 -md5: d5a4e013a30dd8dfde9ab39f45aaf9c1 -depends: -- polars-runtime-32 ==1.39.3 -- python >=3.10 -- python -constrains: -- numpy >=1.16.0 -- pyarrow >=7.0.0 -- fastexcel >=0.9 -- openpyxl >=3.0.0 -- xlsx2csv >=0.8.0 -- connectorx >=0.3.2 -- deltalake >=1.0.0 -- pyiceberg >=0.7.1 -- altair >=5.4.0 -- great_tables >=0.8.0 -- polars-runtime-32 ==1.39.3 -- polars-runtime-64 ==1.39.3 -- polars-runtime-compat ==1.39.3 -license: MIT -license_family: MIT -size: 533495 -timestamp: 1774207987966 -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda -sha256: e466fb31f67ba9bde18deafeb34263ca5eb25807f39ead0e9d753a8e82c4c4f4 -md5: ef0340e75068ac8ff96462749b5c98e7 -depends: -- polars >=1.34.0 -- polars-runtime-compat >=1.34.0 -license: MIT -license_family: MIT -size: 3902 -timestamp: 1760206808444 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.39.3-py310hff09b76_1.conda -noarch: python -sha256: c070be507c5a90df397a47ae0299660be437d5546d68f1bc0fa4402c9f07d59e -md5: 3c1a7c6b4ba8b9fb773ace9723f8a5db -depends: -- python -- libgcc >=14 -- libstdcxx >=14 -- _python_abi3_support 1.* -- cpython >=3.10 -constrains: -- __glibc >=2.17 -license: MIT -license_family: MIT -size: 34785466 -timestamp: 1774207998285 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.39.3-py310hf00a4a2_1.conda -noarch: python -sha256: 683315f1a49e47ce72bf9462419733b40b588b2b3106552d95fd4cd994e174de -md5: dd3464e2132dc3a783e76e5078870c76 -depends: -- python -- libgcc >=14 -- libstdcxx >=14 -- _python_abi3_support 1.* -- cpython >=3.10 -constrains: -- __glibc >=2.17 -license: MIT -license_family: MIT -size: 34652491 -timestamp: 1774207996879 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda -sha256: e9cbcbc94e151ada3d6dc365380aaaf591f65012c16d9a2abaea4b9b90adc402 -md5: ab7288cc39545556d1bc5e71ab2df9a9 -depends: -- libgcc >=14 -- ncurses >=6.5,<7.0a0 -license: GPL-2.0-or-later AND LGPL-2.0-or-later -license_family: GPL -size: 636733 -timestamp: 1769712412683 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda -sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba -md5: bb5a90c93e3bac3d5690acf76b4a6386 -depends: -- libgcc >=13 -license: MIT -license_family: MIT -size: 8342 -timestamp: 1726803319942 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda -sha256: 58994e0d2ea8584cb399546e6f6896d771995e6121d1a7b6a2c9948388358932 -md5: e17be1016bcc3516827b836cd3e4d9dc -depends: -- python >=3.9 -- pyyaml >=5.0,<=7.0 -license: MIT -license_family: MIT -size: 14645 -timestamp: 1736766960536 -- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda -sha256: 868569d9505b7fe246c880c11e2c44924d7613a8cdcc1f6ef85d5375e892f13d -md5: c3946ed24acdb28db1b5d63321dbca7d -depends: -- typing-inspection >=0.4.2 -- typing_extensions >=4.14.1 -- python >=3.10 -- typing-extensions >=4.6.1 -- annotated-types >=0.6.0 -- pydantic-core ==2.41.5 -- python -license: MIT -license_family: MIT -size: 340482 -timestamp: 1764434463101 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.5-py314h451b6cc_1.conda -sha256: f8acb2d03ebe80fed0032b9a989fc9acfb6735e3cd3f8c704b72728cb31868f6 -md5: 28f5027a1e04d67aa13fac1c5ba79693 -depends: -- python -- typing-extensions >=4.6.0,!=4.7.0 -- libgcc >=14 -- python 3.14.* *_cp314 -- python_abi 3.14.* *_cp314 -constrains: -- __glibc >=2.17 -license: MIT -license_family: MIT -size: 1828339 -timestamp: 1762989038561 -- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda -sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a -md5: 6b6ece66ebcae2d5f326c77ef2c5a066 -depends: -- python >=3.9 -license: BSD-2-Clause -license_family: BSD -size: 889287 -timestamp: 1750615908735 -- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda -sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 -md5: 461219d1a5bd61342293efa2c0c90eac -depends: -- __unix -- python >=3.9 -license: BSD-3-Clause -license_family: BSD -size: 21085 -timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.3-hb06a95a_101_cp314.conda -build_number: 101 -sha256: 87e9dff5646aba87cecfbc08789634c855871a7325169299d749040b0923a356 -md5: 205011b36899ff0edf41b3db0eda5a44 -depends: -- bzip2 >=1.0.8,<2.0a0 -- ld_impl_linux-aarch64 >=2.36.1 -- libexpat >=2.7.3,<3.0a0 -- libffi >=3.5.2,<3.6.0a0 -- libgcc >=14 -- liblzma >=5.8.2,<6.0a0 -- libmpdec >=4.0.0,<5.0a0 -- libsqlite >=3.51.2,<4.0a0 -- libuuid >=2.41.3,<3.0a0 -- libzlib >=1.3.1,<2.0a0 -- ncurses >=6.5,<7.0a0 -- openssl >=3.5.5,<4.0a0 -- python_abi 3.14.* *_cp314 -- readline >=8.3,<9.0a0 -- tk >=8.6.13,<8.7.0a0 -- tzdata -- zstd >=1.5.7,<1.6.0a0 -license: Python-2.0 -size: 37305578 -timestamp: 1770674395875 -python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda -sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 -md5: 130584ad9f3a513cdd71b1fdc1244e9c -depends: -- python >=3.10 -license: BSD-3-Clause -license_family: BSD -size: 27848 -timestamp: 1772388605021 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda -sha256: 233aebd94c704ac112afefbb29cf4170b7bc606e22958906f2672081bc50638a -md5: 235765e4ea0d0301c75965985163b5a1 -depends: -- cpython 3.14.3.* -- python_abi * *_cp314 -license: Python-2.0 -size: 50062 -timestamp: 1770674497152 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 -sha256: e17bf63a30aec33432f1ead86e15e9febde9fc40a7f869c0e766be8d2db44170 -md5: 310259a5b03ff02289d7705f39e2b1d2 -depends: -- kaleido-core 0.2.1.* -- python >=3.5 -license: MIT -license_family: MIT -size: 18320 -timestamp: 1615204747600 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda -build_number: 8 -sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 -md5: 0539938c55b6b1a59b560e843ad864a4 -constrains: -- python 3.14.* *_cp314 -license: BSD-3-Clause -license_family: BSD -size: 6989 -timestamp: 1752805904792 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda -sha256: 496b5e65dfdd0aaaaa5de0dcaaf3bceea00fcb4398acf152f89e567c82ec1046 -md5: 9ae2c92975118058bd720e9ba2bb7c58 -depends: -- libgcc >=14 -- python >=3.14,<3.15.0a0 -- python >=3.14,<3.15.0a0 *_cp314 -- python_abi 3.14.* *_cp314 -- yaml >=0.2.5,<0.3.0a0 -license: MIT -license_family: MIT -size: 195678 -timestamp: 1770223441816 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda -sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216 -md5: 3d49cad61f829f4f0e0611547a9cda12 -depends: -- libgcc >=14 -- ncurses >=6.5,<7.0a0 -license: GPL-3.0-only -license_family: GPL -size: 357597 -timestamp: 1765815673644 -- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda -sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 -md5: 870293df500ca7e18bedefa5838a22ab -depends: -- attrs >=22.2.0 -- python >=3.10 -- rpds-py >=0.7.0 -- typing_extensions >=4.4.0 -- python -license: MIT -license_family: MIT -size: 51788 -timestamp: 1760379115194 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.2.28-py314h51f160d_0.conda -sha256: 2080ecea825e1ef91a2422cc0bc63e85db9e38908ed17657fb8f41de7a6eee71 -md5: 818aa2c9f6b3c808da5e7be22a9a424c -depends: -- libgcc >=14 -- python >=3.14,<3.15.0a0 -- python >=3.14,<3.15.0a0 *_cp314 -- python_abi 3.14.* *_cp314 -license: Apache-2.0 AND CNRI-Python -license_family: PSF -size: 408097 -timestamp: 1772255205521 -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda -sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 -md5: c65df89a0b2e321045a9e01d1337b182 -depends: -- python >=3.10 -- certifi >=2017.4.17 -- charset-normalizer >=2,<4 -- idna >=2.5,<4 -- urllib3 >=1.21.1,<3 -- python -constrains: -- chardet >=3.0.2,<6 -license: Apache-2.0 -license_family: APACHE -size: 63602 -timestamp: 1766926974520 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda -sha256: b06ce84d6a10c266811a7d3adbfa1c11f13393b91cc6f8a5b468277d90be9590 -md5: 7a6289c50631d620652f5045a63eb573 -depends: -- markdown-it-py >=2.2.0 -- pygments >=2.13.0,<3.0.0 -- python >=3.10 -- typing_extensions >=4.0.0,<5.0.0 -- python -license: MIT -license_family: MIT -size: 208472 -timestamp: 1771572730357 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda -sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 -md5: 0c20a8ebcddb24a45da89d5e917e6cb9 -depends: -- python >=3.10 -- rich >=12 -- click >=8 -- typing-extensions >=4 -- __unix -- python -license: MIT -license_family: MIT -size: 64356 -timestamp: 1769850479089 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda -sha256: a587240f16eac7c6a80f9585cef679cd1cb9a287b8dfcdd36dcef1f7e7db15dc -md5: e7f6ed9e60043bb5cbcc527764897f0d -depends: -- python -- libgcc >=14 -- python_abi 3.14.* *_cp314 -constrains: -- __glibc >=2.17 -license: MIT -license_family: MIT -size: 376332 -timestamp: 1764543345455 -- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda -sha256: 7c65782d2511738e62c70462e89d65da4fa54d5a7e47c46667bcd27a59f81876 -md5: 472239e4eb7b5a84bb96b3ed7e3a596a -depends: -- colormath >=3.0.0 -- python >=3.9 -license: MIT -license_family: MIT -size: 22284 -timestamp: 1735770589188 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.52.0-hf1c7be2_0.conda -sha256: 4f8523f5341f0d9e1547085206c6c1f71f9fc7c277443ca363a8cf98add8fc01 -md5: d9634079df93a65ee045b3c75f35cae1 -depends: -- icu >=78.2,<79.0a0 -- libgcc >=14 -- libsqlite 3.52.0 h10b116e_0 -- libzlib >=1.3.1,<2.0a0 -- ncurses >=6.5,<7.0a0 -- readline >=8.3,<9.0a0 -license: blessing -size: 209416 -timestamp: 1772818891689 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda -sha256: c1da41c79262b27efa168407cfecc47b20270e5fc071a8307f95a2c85fb94170 -md5: 55bf7b559202236157b14323b40f19e6 -depends: -- libgcc >=14 -- libstdcxx >=14 -- python >=3.14,<3.15.0a0 -- python_abi 3.14.* *_cp314 -- regex >=2022.1.18 -- requests >=2.26.0 -constrains: -- __glibc >=2.17 -license: MIT -license_family: MIT -size: 914402 -timestamp: 1764030357702 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda -sha256: e25c314b52764219f842b41aea2c98a059f06437392268f09b03561e4f6e5309 -md5: 7fc6affb9b01e567d2ef1d05b84aa6ed -depends: -- libgcc >=14 -- libzlib >=1.3.1,<2.0a0 -constrains: -- xorg-libx11 >=1.8.12,<2.0a0 -license: TCL -license_family: BSD -size: 3368666 -timestamp: 1769464148928 -- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda -sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 -md5: e5ce43272193b38c2e9037446c1d9206 -depends: -- python >=3.10 -- __unix -- python -license: MPL-2.0 and MIT -size: 94132 -timestamp: 1770153424136 -- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda -sha256: 39d8ae33c43cdb8f771373e149b0b4fae5a08960ac58dcca95b2f1642bb17448 -md5: 260af1b0a94f719de76b4e14094e9a3b -depends: -- importlib-metadata >=3.6 -- python >=3.10 -- typing-extensions >=4.10.0 -- typing_extensions >=4.14.0 -constrains: -- pytest >=7 -license: MIT -license_family: MIT -size: 36838 -timestamp: 1771532971545 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda -sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c -md5: edd329d7d3a4ab45dcf905899a7a6115 -depends: -- typing_extensions ==4.15.0 pyhcf101f3_0 -license: PSF-2.0 -license_family: PSF -size: 91383 -timestamp: 1756220668932 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda -sha256: 70db27de58a97aeb7ba7448366c9853f91b21137492e0b4430251a1870aa8ff4 -md5: a0a4a3035667fc34f29bfbd5c190baa6 -depends: -- python >=3.10 -- typing_extensions >=4.12.0 -license: MIT -license_family: MIT -size: 18923 -timestamp: 1764158430324 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda -sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 -md5: 0caa1af407ecff61170c9437a808404d -depends: -- python >=3.10 -- python -license: PSF-2.0 -license_family: PSF -size: 51692 -timestamp: 1756220668932 -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda -sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c -md5: ad659d0a2b3e47e38d829aa8cad2d610 -license: LicenseRef-Public-Domain -size: 119135 -timestamp: 1767016325805 -- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda -sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a -md5: 9272daa869e03efe68833e3dc7a02130 -depends: -- backports.zstd >=1.0.0 -- brotli-python >=1.2.0 -- h2 >=4,<5 -- pysocks >=1.5.6,<2.0,!=1.5.7 -- python >=3.10 -license: MIT -license_family: MIT -size: 103172 -timestamp: 1767817860341 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda -sha256: e9f6e931feeb2f40e1fdbafe41d3b665f1ab6cb39c5880a1fcf9f79a3f3c84a5 -md5: 1c246e1105000c3660558459e2fd6d43 -depends: -- libgcc >=14 -license: MIT -license_family: MIT -size: 16317 -timestamp: 1762977521691 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda -sha256: 128d72f36bcc8d2b4cdbec07507542e437c7d67f677b7d77b71ed9eeac7d6df1 -md5: bff06dcde4a707339d66d45d96ceb2e2 -depends: -- libgcc >=14 -license: MIT -license_family: MIT -size: 21039 -timestamp: 1762979038025 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda -sha256: 66265e943f32ce02396ad214e27cb35f5b0490b3bd4f064446390f9d67fa5d88 -md5: 032d8030e4a24fe1f72c74423a46fb88 -depends: -- libgcc >=14 -license: MIT -license_family: MIT -size: 88088 -timestamp: 1753484092643 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda -sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae -md5: 30cd29cb87d819caead4d55184c1d115 -depends: -- python >=3.10 -- python -license: MIT -license_family: MIT -size: 24194 -timestamp: 1764460141901 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda -sha256: 638a3a41a4fbfed52d3c60c8ef5a3693b3f12a5b1a3f58fa29f5698d0a0702e2 -md5: f731af71c723065d91b4c01bb822641b -depends: -- libgcc >=14 -- libstdcxx >=14 -license: Zlib -license_family: Other -size: 121046 -timestamp: 1770167944449 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda -sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 -md5: c3655f82dcea2aa179b291e7099c1fcc -depends: -- libzlib >=1.3.1,<2.0a0 -license: BSD-3-Clause -license_family: BSD -size: 614429 -timestamp: 1764777145593 diff --git a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt deleted file mode 100644 index f787dbe..0000000 --- a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt +++ /dev/null @@ -1,125 +0,0 @@ - -# This file may be used to create an environment using: -# $ conda create --name --file -# platform: linux-aarch64 -@EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda#4faa39bf919939602e594253bd673958 -https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda#468fd3bb9e1f671d36c2cbc677e56f1d -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda#552567ea2b61e3a3035759b2fdb3f9a6 -https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda#840d8fc0d7b3209be93080bc20e07f2d -https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda#502006882cf5461adced436e410046d1 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda#c3655f82dcea2aa179b291e7099c1fcc -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda#a21644fc4a83da26452a718dc9468d5f -https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda#05d1e0b30acd816a192c03dc6e164f4d -https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda#2f364feefb6a7c00423e80dcb12db62a -https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda#76298a9e6d71ee6e832a8d0d7373b261 -https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda#7b9813e885482e3ccb1fa212b86d7fd0 -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.0-h022381a_0.conda#86db4036fd08bf34e991bf48a8af405d -https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda#a0b5de740d01c390bdbb46d7503c9fab -https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda#3b129669089e4d6a5c6871dbb4669b99 -https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 -https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda#3d49cad61f829f4f0e0611547a9cda12 -https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda#7fc6affb9b01e567d2ef1d05b84aa6ed -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.4-hfd9ac0a_100_cp314.conda#3cfbe780f0f51cc8cba41db9f8a28bfe -https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda#f111d4cfaf1fe9496f386bc98ae94452 -https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 -https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 -https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda#f56573d05e3b735cb03efeb64a15f388 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda#a1b5c571a0923a205d663d8678df4792 -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c -https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda#7fe569c10905402ed47024fc481bb371 -https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda#b866ff7007b934d564961066c8195983 -https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda#a2c1eeadae7a309daed9d62c96012a2b -https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda#574d88ce3348331e962cfa5ed451b247 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda#41f261f5e4e2e8cbd236c2f1f15dae1b -https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.32-pthreads_h9d3fd7e_0.conda#5d2ce5cf40443d055ec6d33840192265 -https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-6_haddc8a3_openblas.conda#652bb20bb4618cacd11e17ae070f47ce -https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-6_hd72aa62_openblas.conda#939e300b110db241a96a1bed438c315b -https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-6_h88aeb00_openblas.conda#e23a27b52fb320687239e2c5ae4d7540 -https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py314haac167e_0.conda#25d896c331481145720a21e5145fad65 -https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda#071cf7b0ce333c81718b054066c15102 -https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.5-hfae3067_0.conda#d2bb0c889d94f2fdc5856392c3002976 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda#f51503ac45a4888bce71af9027a2ecc9 -https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda#b99ed99e42dafb27889483b3098cace7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda#a229e22d4d8814a07702b0919d8e6701 -https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda#0fed1ff55f4938a65907f3ecf62609db -https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda#a7970cd949a077b7cb9696379d338681 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e -https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a -https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda#e5de3c36dd548b35ff2a8aa49208dcb3 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda#e7f6ed9e60043bb5cbcc527764897f0d -https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda#ada41c863af263cc4c5fcbaff7c3e4dc -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda#4feebd0fbf61075a1a9c2e9b3936c257 -https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2#7b08314a6867a9d5648a1c3265e9eb8e -https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda#6dd4f07147774bf720075a210f8026b9 -https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda#4540f9570d12db2150f42ba036154552 -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.0-he8854b5_0.conda#ad8164bdeece883b825c50639c0c4725 -https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2#4f0d284f5d11e04277b552eb1c172c7f -https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda#a85ba48648f6868016f2741fd9170250 -https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda#d13423b06447113a90b5b1366d4da171 -https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda#a9138815598fe6b91a1d6782ca657b0c -https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda#24e92d0942c799db387f5c9d7b81f1af -https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda#8c6fd84f9c87ac00636007c6131e457d -https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda#bb960f01525b5e001608afef9d47b79c -https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda#bb5a90c93e3bac3d5690acf76b4a6386 -https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda#1c246e1105000c3660558459e2fd6d43 -https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda#bff06dcde4a707339d66d45d96ceb2e2 -https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda#cd14ee5cca2464a425b1dbfc24d90db2 -https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda#ba0a9221ce1063f31692c07370d062f3 -https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 -https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 -https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda#e941e85e273121222580723010bd4fa2 -https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 -https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda#cea962410e327262346d48d01f05936c -https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda#f731af71c723065d91b4c01bb822641b -https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.2.0-py314hac3e5ec_0.conda#87d58d103b47c4a8567b3d7666647684 -https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda#6cac1a50359219d786453c6fef819f98 -https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda#3e9427ee186846052e81fadde8ebe96a -https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.40.0-py310hff09b76_0.conda#d5628a33ce7652511e38fc98643dc910 -https://conda.anaconda.org/conda-forge/noarch/polars-1.40.0-pyh58ad624_0.conda#fd16be490f5403adfbf27dd4901bbe34 -https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.40.0-py310hf00a4a2_0.conda#a82af0fcbb72db253dc89a7a45279372 -https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda#ef0340e75068ac8ff96462749b5c98e7 -https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 -https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda#9ae2c92975118058bd720e9ba2bb7c58 -https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda#e17be1016bcc3516827b836cd3e4d9dc -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.46.3-py314h451b6cc_0.conda#1a2cb55be9a153ad6203bff6b787c240 -https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda#a0a4a3035667fc34f29bfbd5c190baa6 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda#f690e6f204efd2e5c06b57518a383d98 -https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda#130584ad9f3a513cdd71b1fdc1244e9c -https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2#310259a5b03ff02289d7705f39e2b1d2 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 -https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda#0242025a3c804966bf71aa04eee82f66 -https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda#0c20a8ebcddb24a45da89d5e917e6cb9 -https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda#472239e4eb7b5a84bb96b3ed7e3a596a -https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.4.4-py314h51f160d_0.conda#88a3dbd279e6b1faf0cddb8397866864 -https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda#55bf7b559202236157b14323b40f19e6 -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda#e5ce43272193b38c2e9037446c1d9206 -https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda#260af1b0a94f719de76b4e14094e9a3b -https://conda.anaconda.org/bioconda/noarch/multiqc-1.34-pyhdfd78af_0.conda#a7111ab9a6a6146b40cbce16655ac873 -https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f -https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda#ab7288cc39545556d1bc5e71ab2df9a9 diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml deleted file mode 100644 index 37e7612..0000000 --- a/modules/nf-core/multiqc/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::multiqc=1.34 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf deleted file mode 100644 index e80e8cd..0000000 --- a/modules/nf-core/multiqc/main.nf +++ /dev/null @@ -1,50 +0,0 @@ -process MULTIQC { - tag "${meta.id}" - label 'process_single' - - conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container - ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/1b/1bef8af6be88c5733461959c46ac8ef73d18f65277f62a1695d0e1633054f9c2/data' - : 'community.wave.seqera.io/library/multiqc:1.34--db7c73dae76bc9e6'}" - - input: - tuple val(meta), path(multiqc_files, stageAs: "?/*"), path(multiqc_config, stageAs: "?/*"), path(multiqc_logo), path(replace_names), path(sample_names) - - output: - tuple val(meta), path("*.html"), emit: report - tuple val(meta), path("*_data"), emit: data - tuple val(meta), path("*_plots"), emit: plots, optional: true - // MultiQC should not push its versions to the `versions` topic. Its input depends on the versions topic to be resolved thus outputting to the topic will let the pipeline hang forever - tuple val("${task.process}"), val('multiqc'), eval('multiqc --version | sed "s/.* //g"'), emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : '' - def config = multiqc_config ? multiqc_config instanceof List ? "--config ${multiqc_config.join(' --config ')}" : "--config ${multiqc_config}" : "" - def logo = multiqc_logo ? "--cl-config 'custom_logo: \"${multiqc_logo}\"'" : '' - def replace = replace_names ? "--replace-names ${replace_names}" : '' - def samples = sample_names ? "--sample-names ${sample_names}" : '' - """ - multiqc \\ - --force \\ - ${args} \\ - ${config} \\ - ${prefix} \\ - ${logo} \\ - ${replace} \\ - ${samples} \\ - . - """ - - stub: - """ - mkdir multiqc_data - touch multiqc_data/.stub - mkdir multiqc_plots - touch multiqc_plots/.stub - touch multiqc_report.html - """ -} diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml deleted file mode 100644 index 2facc62..0000000 --- a/modules/nf-core/multiqc/meta.yml +++ /dev/null @@ -1,133 +0,0 @@ -name: multiqc -description: Aggregate results from bioinformatics analyses across many samples - into a single report -keywords: - - QC - - bioinformatics tools - - Beautiful stand-alone HTML report -tools: - - multiqc: - description: | - MultiQC searches a given directory for analysis logs and compiles a HTML report. - It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. - homepage: https://multiqc.info/ - documentation: https://multiqc.info/docs/ - licence: - - "GPL-3.0-or-later" - identifier: biotools:multiqc -input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'sample1', single_end:false ] - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC - ontologies: [] - - multiqc_config: - type: file - description: Optional config yml for MultiQC - pattern: "*.{yml,yaml}" - ontologies: - - edam: http://edamontology.org/format_3750 - - multiqc_logo: - type: file - description: Optional logo file for MultiQC - pattern: "*.{png}" - ontologies: [] - - replace_names: - type: file - description: | - Optional two-column sample renaming file. First column a set of - patterns, second column a set of corresponding replacements. Passed via - MultiQC's `--replace-names` option. - pattern: "*.{tsv}" - ontologies: - - edam: http://edamontology.org/format_3475 - - sample_names: - type: file - description: | - Optional TSV file with headers, passed to the MultiQC --sample_names - argument. - pattern: "*.{tsv}" - ontologies: - - edam: http://edamontology.org/format_3475 -output: - report: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'sample1', single_end:false ] - - "*.html": - type: file - description: MultiQC report file - pattern: ".html" - ontologies: [] - data: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'sample1', single_end:false ] - - "*_data": - type: directory - description: MultiQC data dir - pattern: "multiqc_data" - plots: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'sample1', single_end:false ] - - "*_plots": - type: file - description: Plots created by MultiQC - pattern: "*_plots" - ontologies: [] - versions: - - - ${task.process}: - type: string - description: The process the versions were collected from - - multiqc: - type: string - description: The tool name - - multiqc --version | sed "s/.* //g": - type: eval - description: The expression to obtain the version of the tool -authors: - - "@abhi18av" - - "@bunop" - - "@drpatelh" - - "@jfy133" -maintainers: - - "@abhi18av" - - "@bunop" - - "@drpatelh" - - "@jfy133" -containers: - conda: - linux/amd64: - lock_file: modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt - linux/arm64: - lock_file: modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt - docker: - linux/amd64: - name: community.wave.seqera.io/library/multiqc:1.34--db7c73dae76bc9e6 - build_id: bd-db7c73dae76bc9e6_1 - scan_id: sc-66fc7138dbf1cf48_1 - linux/arm64: - name: community.wave.seqera.io/library/multiqc:1.34--d167b8012595a136 - build_id: bd-d167b8012595a136_1 - scan_id: sc-ac701dfa631a2af9_1 - singularity: - linux/amd64: - name: oras://community.wave.seqera.io/library/multiqc:1.34--4fc8657c816047c0 - build_id: bd-4fc8657c816047c0_1 - https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/1b/1bef8af6be88c5733461959c46ac8ef73d18f65277f62a1695d0e1633054f9c2/data - linux/arm64: - name: oras://community.wave.seqera.io/library/multiqc:1.34--7fbd82d945c06726 - build_id: bd-7fbd82d945c06726_1 - https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9a/9a1fec9662a152683e6fcae440d0ce20920b3b89dc62d1e3a52e73f92eba0969/data diff --git a/modules/nf-core/multiqc/tests/custom_prefix.config b/modules/nf-core/multiqc/tests/custom_prefix.config deleted file mode 100644 index b30b135..0000000 --- a/modules/nf-core/multiqc/tests/custom_prefix.config +++ /dev/null @@ -1,5 +0,0 @@ -process { - withName: 'MULTIQC' { - ext.prefix = "custom_prefix" - } -} diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test deleted file mode 100644 index 4cbdb95..0000000 --- a/modules/nf-core/multiqc/tests/main.nf.test +++ /dev/null @@ -1,211 +0,0 @@ -nextflow_process { - - name "Test Process MULTIQC" - script "../main.nf" - process "MULTIQC" - - tag "modules" - tag "modules_nfcore" - tag "multiqc" - - config "./nextflow.config" - - test("sarscov2 single-end [fastqc]") { - - when { - process { - """ - input[0] = channel.of([ - [ id: 'FASTQC' ], - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), - [], - [], - [], - [] - ]) - """ - } - } - - then { - assert process.success - assert snapshot( - sanitizeOutput(process.out).collectEntries { key, val -> - if (key == "data") { - return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] - } - else if (key == "plots") { - return [key, val.collect { [ - "pdf", - path("${it[1]}/pdf").list().collect { file(it.toString()).name }, - "png", - path("${it[1]}/png").list().collect { file(it.toString()).name }, - "svg", - path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] - } - else if (key == "report") { - return [key, file(val[0][1].toString()).name] - } - return [key, val] - } - ).match() - } - } - - test("sarscov2 single-end [fastqc] - custom prefix") { - config "./custom_prefix.config" - - when { - process { - """ - input[0] = channel.of([ - [ id: 'FASTQC' ], - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), - [], - [], - [], - [] - ]) - """ - } - } - - then { - assert process.success - assert snapshot( - sanitizeOutput(process.out).collectEntries { key, val -> - if (key == "data") { - return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] - } - else if (key == "plots") { - return [key, val.collect { [ - "pdf", - path("${it[1]}/pdf").list().collect { file(it.toString()).name }, - "png", - path("${it[1]}/png").list().collect { file(it.toString()).name }, - "svg", - path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] - } - else if (key == "report") { - return [key, file(val[0][1].toString()).name] - } - return [key, val] - } - ).match() - } - } - - test("sarscov2 single-end [fastqc] [config]") { - - when { - process { - """ - input[0] = channel.of([ - [ id: 'FASTQC' ], - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), - file("https://raw.githubusercontent.com/nf-core/seqinspector/1.0.0/assets/multiqc_config.yml", checkIfExists: true), - [], - [], - [] - ]) - """ - } - } - - then { - assert process.success - assert snapshot( - sanitizeOutput(process.out).collectEntries { key, val -> - if (key == "data") { - return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] - } - else if (key == "plots") { - return [key, val.collect { [ - "pdf", - path("${it[1]}/pdf").list().collect { file(it.toString()).name }, - "png", - path("${it[1]}/png").list().collect { file(it.toString()).name }, - "svg", - path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] - } - else if (key == "report") { - return [key, file(val[0][1].toString()).name] - } - return [key, val] - } - ).match() - } - } - - test("sarscov2 single-end [fastqc] [multiple configs]") { - - when { - process { - """ - input[0] = channel.of([ - [ id: 'FASTQC' ], - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), - [ - file("https://raw.githubusercontent.com/nf-core/seqinspector/1.0.0/assets/multiqc_config.yml", checkIfExists: true), - file("https://raw.githubusercontent.com/nf-core/seqinspector/1.0.0/assets/multiqc_config.yml", checkIfExists: true) - ], - [], - [], - [] - ]) - """ - } - } - - then { - assert process.success - assert snapshot( - sanitizeOutput(process.out).collectEntries { key, val -> - if (key == "data") { - return [key, val.collect { [path(it[1]).list().collect { file(it.toString()).name }] }] - } - else if (key == "plots") { - return [key, val.collect { [ - "pdf", - path("${it[1]}/pdf").list().collect { file(it.toString()).name }, - "png", - path("${it[1]}/png").list().collect { file(it.toString()).name }, - "svg", - path("${it[1]}/svg").list().collect { file(it.toString()).name }] }] - } - else if (key == "report") { - return [key, file(val[0][1].toString()).name] - } - return [key, val] - } - ).match() - } - } - - test("sarscov2 single-end [fastqc] - stub") { - - options "-stub" - - when { - process { - """ - input[0] = channel.of([ - [ id: 'FASTQC' ], - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), - [], - [], - [], - [] - ]) - """ - } - } - - then { - assert process.success - assertAll( - { assert snapshot(sanitizeOutput(process.out)).match() } - ) - } - } -} diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap deleted file mode 100644 index 7c2f370..0000000 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ /dev/null @@ -1,422 +0,0 @@ -{ - "sarscov2 single-end [fastqc] [multiple configs]": { - "content": [ - { - "data": [ - [ - [ - "fastqc-status-check-heatmap.txt", - "fastqc_overrepresented_sequences_plot.txt", - "fastqc_per_base_n_content_plot.txt", - "fastqc_per_base_sequence_quality_plot.txt", - "fastqc_per_sequence_gc_content_plot_Counts.txt", - "fastqc_per_sequence_gc_content_plot_Percentages.txt", - "fastqc_per_sequence_quality_scores_plot.txt", - "fastqc_sequence_counts_plot.txt", - "fastqc_sequence_duplication_levels_plot.txt", - "fastqc_sequence_length_distribution_plot.txt", - "fastqc_top_overrepresented_sequences_table.txt", - "llms-full.txt", - "multiqc.log", - "multiqc.parquet", - "multiqc_citations.txt", - "multiqc_data.json", - "multiqc_fastqc.txt", - "multiqc_general_stats.txt", - "multiqc_sources.txt" - ] - ] - ], - "plots": [ - [ - "pdf", - [ - "fastqc-status-check-heatmap.pdf", - "fastqc_overrepresented_sequences_plot.pdf", - "fastqc_per_base_n_content_plot.pdf", - "fastqc_per_base_sequence_quality_plot.pdf", - "fastqc_per_sequence_gc_content_plot_Counts.pdf", - "fastqc_per_sequence_gc_content_plot_Percentages.pdf", - "fastqc_per_sequence_quality_scores_plot.pdf", - "fastqc_sequence_counts_plot-cnt.pdf", - "fastqc_sequence_counts_plot-pct.pdf", - "fastqc_sequence_duplication_levels_plot.pdf", - "fastqc_sequence_length_distribution_plot.pdf", - "fastqc_top_overrepresented_sequences_table.pdf" - ], - "png", - [ - "fastqc-status-check-heatmap.png", - "fastqc_overrepresented_sequences_plot.png", - "fastqc_per_base_n_content_plot.png", - "fastqc_per_base_sequence_quality_plot.png", - "fastqc_per_sequence_gc_content_plot_Counts.png", - "fastqc_per_sequence_gc_content_plot_Percentages.png", - "fastqc_per_sequence_quality_scores_plot.png", - "fastqc_sequence_counts_plot-cnt.png", - "fastqc_sequence_counts_plot-pct.png", - "fastqc_sequence_duplication_levels_plot.png", - "fastqc_sequence_length_distribution_plot.png", - "fastqc_top_overrepresented_sequences_table.png" - ], - "svg", - [ - "fastqc-status-check-heatmap.svg", - "fastqc_overrepresented_sequences_plot.svg", - "fastqc_per_base_n_content_plot.svg", - "fastqc_per_base_sequence_quality_plot.svg", - "fastqc_per_sequence_gc_content_plot_Counts.svg", - "fastqc_per_sequence_gc_content_plot_Percentages.svg", - "fastqc_per_sequence_quality_scores_plot.svg", - "fastqc_sequence_counts_plot-cnt.svg", - "fastqc_sequence_counts_plot-pct.svg", - "fastqc_sequence_duplication_levels_plot.svg", - "fastqc_sequence_length_distribution_plot.svg", - "fastqc_top_overrepresented_sequences_table.svg" - ] - ] - ], - "report": "multiqc_report.html", - "versions": [ - [ - "MULTIQC", - "multiqc", - "1.34" - ] - ] - } - ], - "timestamp": "2026-03-17T16:15:42.577775492", - "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.4" - } - }, - "sarscov2 single-end [fastqc]": { - "content": [ - { - "data": [ - [ - [ - "fastqc-status-check-heatmap.txt", - "fastqc_overrepresented_sequences_plot.txt", - "fastqc_per_base_n_content_plot.txt", - "fastqc_per_base_sequence_quality_plot.txt", - "fastqc_per_sequence_gc_content_plot_Counts.txt", - "fastqc_per_sequence_gc_content_plot_Percentages.txt", - "fastqc_per_sequence_quality_scores_plot.txt", - "fastqc_sequence_counts_plot.txt", - "fastqc_sequence_duplication_levels_plot.txt", - "fastqc_sequence_length_distribution_plot.txt", - "fastqc_top_overrepresented_sequences_table.txt", - "llms-full.txt", - "multiqc.log", - "multiqc.parquet", - "multiqc_citations.txt", - "multiqc_data.json", - "multiqc_fastqc.txt", - "multiqc_general_stats.txt", - "multiqc_software_versions.txt", - "multiqc_sources.txt" - ] - ] - ], - "plots": [ - [ - "pdf", - [ - "fastqc-status-check-heatmap.pdf", - "fastqc_overrepresented_sequences_plot.pdf", - "fastqc_per_base_n_content_plot.pdf", - "fastqc_per_base_sequence_quality_plot.pdf", - "fastqc_per_sequence_gc_content_plot_Counts.pdf", - "fastqc_per_sequence_gc_content_plot_Percentages.pdf", - "fastqc_per_sequence_quality_scores_plot.pdf", - "fastqc_sequence_counts_plot-cnt.pdf", - "fastqc_sequence_counts_plot-pct.pdf", - "fastqc_sequence_duplication_levels_plot.pdf", - "fastqc_sequence_length_distribution_plot.pdf", - "fastqc_top_overrepresented_sequences_table.pdf" - ], - "png", - [ - "fastqc-status-check-heatmap.png", - "fastqc_overrepresented_sequences_plot.png", - "fastqc_per_base_n_content_plot.png", - "fastqc_per_base_sequence_quality_plot.png", - "fastqc_per_sequence_gc_content_plot_Counts.png", - "fastqc_per_sequence_gc_content_plot_Percentages.png", - "fastqc_per_sequence_quality_scores_plot.png", - "fastqc_sequence_counts_plot-cnt.png", - "fastqc_sequence_counts_plot-pct.png", - "fastqc_sequence_duplication_levels_plot.png", - "fastqc_sequence_length_distribution_plot.png", - "fastqc_top_overrepresented_sequences_table.png" - ], - "svg", - [ - "fastqc-status-check-heatmap.svg", - "fastqc_overrepresented_sequences_plot.svg", - "fastqc_per_base_n_content_plot.svg", - "fastqc_per_base_sequence_quality_plot.svg", - "fastqc_per_sequence_gc_content_plot_Counts.svg", - "fastqc_per_sequence_gc_content_plot_Percentages.svg", - "fastqc_per_sequence_quality_scores_plot.svg", - "fastqc_sequence_counts_plot-cnt.svg", - "fastqc_sequence_counts_plot-pct.svg", - "fastqc_sequence_duplication_levels_plot.svg", - "fastqc_sequence_length_distribution_plot.svg", - "fastqc_top_overrepresented_sequences_table.svg" - ] - ] - ], - "report": "multiqc_report.html", - "versions": [ - [ - "MULTIQC", - "multiqc", - "1.34" - ] - ] - } - ], - "timestamp": "2026-03-17T16:21:17.072841555", - "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.4" - } - }, - "sarscov2 single-end [fastqc] - stub": { - "content": [ - { - "data": [ - [ - { - "id": "FASTQC" - }, - [ - ".stub:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "plots": [ - [ - { - "id": "FASTQC" - }, - [ - ".stub:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "report": [ - [ - { - "id": "FASTQC" - }, - "multiqc_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - [ - "MULTIQC", - "multiqc", - "1.34" - ] - ] - } - ], - "timestamp": "2026-02-26T15:14:39.789193051", - "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.4" - } - }, - "sarscov2 single-end [fastqc] [config]": { - "content": [ - { - "data": [ - [ - [ - "fastqc-status-check-heatmap.txt", - "fastqc_overrepresented_sequences_plot.txt", - "fastqc_per_base_n_content_plot.txt", - "fastqc_per_base_sequence_quality_plot.txt", - "fastqc_per_sequence_gc_content_plot_Counts.txt", - "fastqc_per_sequence_gc_content_plot_Percentages.txt", - "fastqc_per_sequence_quality_scores_plot.txt", - "fastqc_sequence_counts_plot.txt", - "fastqc_sequence_duplication_levels_plot.txt", - "fastqc_sequence_length_distribution_plot.txt", - "fastqc_top_overrepresented_sequences_table.txt", - "llms-full.txt", - "multiqc.log", - "multiqc.parquet", - "multiqc_citations.txt", - "multiqc_data.json", - "multiqc_fastqc.txt", - "multiqc_general_stats.txt", - "multiqc_sources.txt" - ] - ] - ], - "plots": [ - [ - "pdf", - [ - "fastqc-status-check-heatmap.pdf", - "fastqc_overrepresented_sequences_plot.pdf", - "fastqc_per_base_n_content_plot.pdf", - "fastqc_per_base_sequence_quality_plot.pdf", - "fastqc_per_sequence_gc_content_plot_Counts.pdf", - "fastqc_per_sequence_gc_content_plot_Percentages.pdf", - "fastqc_per_sequence_quality_scores_plot.pdf", - "fastqc_sequence_counts_plot-cnt.pdf", - "fastqc_sequence_counts_plot-pct.pdf", - "fastqc_sequence_duplication_levels_plot.pdf", - "fastqc_sequence_length_distribution_plot.pdf", - "fastqc_top_overrepresented_sequences_table.pdf" - ], - "png", - [ - "fastqc-status-check-heatmap.png", - "fastqc_overrepresented_sequences_plot.png", - "fastqc_per_base_n_content_plot.png", - "fastqc_per_base_sequence_quality_plot.png", - "fastqc_per_sequence_gc_content_plot_Counts.png", - "fastqc_per_sequence_gc_content_plot_Percentages.png", - "fastqc_per_sequence_quality_scores_plot.png", - "fastqc_sequence_counts_plot-cnt.png", - "fastqc_sequence_counts_plot-pct.png", - "fastqc_sequence_duplication_levels_plot.png", - "fastqc_sequence_length_distribution_plot.png", - "fastqc_top_overrepresented_sequences_table.png" - ], - "svg", - [ - "fastqc-status-check-heatmap.svg", - "fastqc_overrepresented_sequences_plot.svg", - "fastqc_per_base_n_content_plot.svg", - "fastqc_per_base_sequence_quality_plot.svg", - "fastqc_per_sequence_gc_content_plot_Counts.svg", - "fastqc_per_sequence_gc_content_plot_Percentages.svg", - "fastqc_per_sequence_quality_scores_plot.svg", - "fastqc_sequence_counts_plot-cnt.svg", - "fastqc_sequence_counts_plot-pct.svg", - "fastqc_sequence_duplication_levels_plot.svg", - "fastqc_sequence_length_distribution_plot.svg", - "fastqc_top_overrepresented_sequences_table.svg" - ] - ] - ], - "report": "multiqc_report.html", - "versions": [ - [ - "MULTIQC", - "multiqc", - "1.34" - ] - ] - } - ], - "timestamp": "2026-03-17T16:15:30.372239611", - "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.4" - } - }, - "sarscov2 single-end [fastqc] - custom prefix": { - "content": [ - { - "data": [ - [ - [ - "fastqc-status-check-heatmap.txt", - "fastqc_overrepresented_sequences_plot.txt", - "fastqc_per_base_n_content_plot.txt", - "fastqc_per_base_sequence_quality_plot.txt", - "fastqc_per_sequence_gc_content_plot_Counts.txt", - "fastqc_per_sequence_gc_content_plot_Percentages.txt", - "fastqc_per_sequence_quality_scores_plot.txt", - "fastqc_sequence_counts_plot.txt", - "fastqc_sequence_duplication_levels_plot.txt", - "fastqc_sequence_length_distribution_plot.txt", - "fastqc_top_overrepresented_sequences_table.txt", - "llms-full.txt", - "multiqc.log", - "multiqc.parquet", - "multiqc_citations.txt", - "multiqc_data.json", - "multiqc_fastqc.txt", - "multiqc_general_stats.txt", - "multiqc_software_versions.txt", - "multiqc_sources.txt" - ] - ] - ], - "plots": [ - [ - "pdf", - [ - "fastqc-status-check-heatmap.pdf", - "fastqc_overrepresented_sequences_plot.pdf", - "fastqc_per_base_n_content_plot.pdf", - "fastqc_per_base_sequence_quality_plot.pdf", - "fastqc_per_sequence_gc_content_plot_Counts.pdf", - "fastqc_per_sequence_gc_content_plot_Percentages.pdf", - "fastqc_per_sequence_quality_scores_plot.pdf", - "fastqc_sequence_counts_plot-cnt.pdf", - "fastqc_sequence_counts_plot-pct.pdf", - "fastqc_sequence_duplication_levels_plot.pdf", - "fastqc_sequence_length_distribution_plot.pdf", - "fastqc_top_overrepresented_sequences_table.pdf" - ], - "png", - [ - "fastqc-status-check-heatmap.png", - "fastqc_overrepresented_sequences_plot.png", - "fastqc_per_base_n_content_plot.png", - "fastqc_per_base_sequence_quality_plot.png", - "fastqc_per_sequence_gc_content_plot_Counts.png", - "fastqc_per_sequence_gc_content_plot_Percentages.png", - "fastqc_per_sequence_quality_scores_plot.png", - "fastqc_sequence_counts_plot-cnt.png", - "fastqc_sequence_counts_plot-pct.png", - "fastqc_sequence_duplication_levels_plot.png", - "fastqc_sequence_length_distribution_plot.png", - "fastqc_top_overrepresented_sequences_table.png" - ], - "svg", - [ - "fastqc-status-check-heatmap.svg", - "fastqc_overrepresented_sequences_plot.svg", - "fastqc_per_base_n_content_plot.svg", - "fastqc_per_base_sequence_quality_plot.svg", - "fastqc_per_sequence_gc_content_plot_Counts.svg", - "fastqc_per_sequence_gc_content_plot_Percentages.svg", - "fastqc_per_sequence_quality_scores_plot.svg", - "fastqc_sequence_counts_plot-cnt.svg", - "fastqc_sequence_counts_plot-pct.svg", - "fastqc_sequence_duplication_levels_plot.svg", - "fastqc_sequence_length_distribution_plot.svg", - "fastqc_top_overrepresented_sequences_table.svg" - ] - ] - ], - "report": "custom_prefix.html", - "versions": [ - [ - "MULTIQC", - "multiqc", - "1.34" - ] - ] - } - ], - "timestamp": "2026-03-17T16:15:18.189023981", - "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.4" - } - } -} \ No newline at end of file diff --git a/modules/nf-core/multiqc/tests/nextflow.config b/modules/nf-core/multiqc/tests/nextflow.config deleted file mode 100644 index 374dfef..0000000 --- a/modules/nf-core/multiqc/tests/nextflow.config +++ /dev/null @@ -1,6 +0,0 @@ -process { - withName: 'MULTIQC' { - ext.prefix = null - ext.args = '-p' - } -} diff --git a/nextflow.config b/nextflow.config index f73c18e..fcaada4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -158,7 +158,7 @@ profiles { singularity.runOptions = '--nv' } test { includeConfig 'conf/test.config' } - test_full { includeConfig 'conf/test_full.config' } + } // Load nf-core custom profiles from different institutions @@ -181,8 +181,7 @@ podman.registry = 'quay.io' singularity.registry = 'quay.io' charliecloud.registry = 'quay.io' -// Load igenomes.config if required -includeConfig !params.igenomes_ignore ? 'conf/igenomes.config' : 'conf/igenomes_ignored.config' + // Export these variables to prevent local Python/R libraries from conflicting with those in the container // The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. @@ -253,7 +252,7 @@ plugins { } validation { - defaultIgnoreParams = ["genomes"] + defaultIgnoreParams = [] monochromeLogs = params.monochrome_logs } // Load modules.config for DSL2 module specific options diff --git a/nf-test.config b/nf-test.config index f7aaeb4..e2394ac 100644 --- a/nf-test.config +++ b/nf-test.config @@ -21,7 +21,6 @@ config { triggers = [ '.github/actions/nf-test/action.yml', '.github/workflows/nf-test.yml', - 'assets/schema_input.json', 'bin/*', 'conf/test.config', 'nextflow.config', diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json deleted file mode 100644 index 8bd5f55..0000000 --- a/ro-crate-metadata.json +++ /dev/null @@ -1,305 +0,0 @@ -{ - "@context": [ - "https://w3id.org/ro/crate/1.2/context", - { - "GithubService": "https://w3id.org/ro/terms/test#GithubService", - "JenkinsService": "https://w3id.org/ro/terms/test#JenkinsService", - "PlanemoEngine": "https://w3id.org/ro/terms/test#PlanemoEngine", - "TestDefinition": "https://w3id.org/ro/terms/test#TestDefinition", - "TestInstance": "https://w3id.org/ro/terms/test#TestInstance", - "TestService": "https://w3id.org/ro/terms/test#TestService", - "TestSuite": "https://w3id.org/ro/terms/test#TestSuite", - "TravisService": "https://w3id.org/ro/terms/test#TravisService", - "definition": "https://w3id.org/ro/terms/test#definition", - "engineVersion": "https://w3id.org/ro/terms/test#engineVersion", - "instance": "https://w3id.org/ro/terms/test#instance", - "resource": "https://w3id.org/ro/terms/test#resource", - "runsOn": "https://w3id.org/ro/terms/test#runsOn" - } - ], - "@graph": [ - { - "@id": "./", - "@type": "Dataset", - "creativeWorkStatus": "InProgress", - "datePublished": "2026-05-04T11:16:39+00:00", - "description": "

    \n \n \n \"nf-core/biodivpipeline\"\n \n

    \n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/biodivpipeline)\n[![GitHub Actions CI Status](https://github.com/nf-core/biodivpipeline/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/biodivpipeline/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/biodivpipeline/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/biodivpipeline/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/biodivpipeline/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.10.4-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-4.0.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.0.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/biodivpipeline)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23biodivpipeline-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/biodivpipeline)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/biodivpipeline** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/get_started/environment_setup/overview) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/get_started/run-your-first-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/biodivpipeline \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/running/run-pipelines#using-parameter-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/biodivpipeline/usage) and the [parameter documentation](https://nf-co.re/biodivpipeline/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/biodivpipeline/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/biodivpipeline/output).\n\n## Credits\n\nnf-core/biodivpipeline was originally written by SPST Team.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](docs/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#biodivpipeline` channel](https://nfcore.slack.com/channels/biodivpipeline) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", - "hasPart": [ - { - "@id": "main.nf" - }, - { - "@id": "assets/" - }, - { - "@id": "conf/" - }, - { - "@id": "docs/" - }, - { - "@id": "docs/images/" - }, - { - "@id": "modules/" - }, - { - "@id": "modules/nf-core/" - }, - { - "@id": "workflows/" - }, - { - "@id": "subworkflows/" - }, - { - "@id": "nextflow.config" - }, - { - "@id": "README.md" - }, - { - "@id": "nextflow_schema.json" - }, - { - "@id": "CHANGELOG.md" - }, - { - "@id": "LICENSE" - }, - { - "@id": "CODE_OF_CONDUCT.md" - }, - { - "@id": "CITATIONS.md" - }, - { - "@id": "modules.json" - }, - { - "@id": "docs/usage.md" - }, - { - "@id": "docs/output.md" - }, - { - "@id": ".nf-core.yml" - }, - { - "@id": ".pre-commit-config.yaml" - }, - { - "@id": ".prettierignore" - } - ], - "isBasedOn": "https://github.com/nf-core/biodivpipeline", - "license": "MIT", - "mainEntity": { - "@id": "main.nf" - }, - "mentions": [ - { - "@id": "#e1ecee2f-6656-4386-bf4c-d3d5f9506a8b" - } - ], - "name": "nf-core/biodivpipeline" - }, - { - "@id": "ro-crate-metadata.json", - "@type": "CreativeWork", - "about": { - "@id": "./" - }, - "conformsTo": [ - { - "@id": "https://w3id.org/ro/crate/1.2" - }, - { - "@id": "https://w3id.org/workflowhub/workflow-ro-crate/1.0" - } - ] - }, - { - "@id": "main.nf", - "@type": ["File", "SoftwareSourceCode", "ComputationalWorkflow"], - "contributor": [ - { - "@id": "#3cbf1a8b-9e61-4452-8f2d-260901f8bbfa" - } - ], - "dateCreated": "", - "dateModified": "2026-05-04T13:16:39Z", - "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", - "keywords": ["nf-core", "nextflow"], - "license": ["MIT"], - "name": ["nf-core/biodivpipeline"], - "programmingLanguage": { - "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow" - }, - "sdPublisher": { - "@id": "https://nf-co.re/" - }, - "url": ["https://github.com/nf-core/biodivpipeline", "https://nf-co.re/biodivpipeline/dev/"], - "version": ["1.0.0dev"] - }, - { - "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow", - "@type": "ComputerLanguage", - "identifier": { - "@id": "https://www.nextflow.io/" - }, - "name": "Nextflow", - "url": { - "@id": "https://www.nextflow.io/" - }, - "version": "!>=25.10.4" - }, - { - "@id": "#e1ecee2f-6656-4386-bf4c-d3d5f9506a8b", - "@type": "TestSuite", - "instance": [ - { - "@id": "#24d9b5be-1301-419a-bdb3-79e20551d6c9" - } - ], - "mainEntity": { - "@id": "main.nf" - }, - "name": "Test suite for nf-core/biodivpipeline" - }, - { - "@id": "#24d9b5be-1301-419a-bdb3-79e20551d6c9", - "@type": "TestInstance", - "name": "GitHub Actions workflow for testing nf-core/biodivpipeline", - "resource": "repos/nf-core/biodivpipeline/actions/workflows/nf-test.yml", - "runsOn": { - "@id": "https://w3id.org/ro/terms/test#GithubService" - }, - "url": "https://api.github.com" - }, - { - "@id": "https://w3id.org/ro/terms/test#GithubService", - "@type": "TestService", - "name": "Github Actions", - "url": { - "@id": "https://github.com" - } - }, - { - "@id": "assets/", - "@type": "Dataset", - "description": "Additional files" - }, - { - "@id": "conf/", - "@type": "Dataset", - "description": "Configuration files" - }, - { - "@id": "docs/", - "@type": "Dataset", - "description": "Markdown files for documenting the pipeline" - }, - { - "@id": "docs/images/", - "@type": "Dataset", - "description": "Images for the documentation files" - }, - { - "@id": "modules/", - "@type": "Dataset", - "description": "Modules used by the pipeline" - }, - { - "@id": "modules/nf-core/", - "@type": "Dataset", - "description": "nf-core modules" - }, - { - "@id": "workflows/", - "@type": "Dataset", - "description": "Main pipeline workflows to be executed in main.nf" - }, - { - "@id": "subworkflows/", - "@type": "Dataset", - "description": "Smaller subworkflows" - }, - { - "@id": "nextflow.config", - "@type": "File", - "description": "Main Nextflow configuration file" - }, - { - "@id": "README.md", - "@type": "File", - "description": "Basic pipeline usage information" - }, - { - "@id": "nextflow_schema.json", - "@type": "File", - "description": "JSON schema for pipeline parameter specification" - }, - { - "@id": "CHANGELOG.md", - "@type": "File", - "description": "Information on changes made to the pipeline" - }, - { - "@id": "LICENSE", - "@type": "File", - "description": "The license - should be MIT" - }, - { - "@id": "CODE_OF_CONDUCT.md", - "@type": "File", - "description": "The nf-core code of conduct" - }, - { - "@id": "CITATIONS.md", - "@type": "File", - "description": "Citations needed when using the pipeline" - }, - { - "@id": "modules.json", - "@type": "File", - "description": "Version information for modules from nf-core/modules" - }, - { - "@id": "docs/usage.md", - "@type": "File", - "description": "Usage documentation" - }, - { - "@id": "docs/output.md", - "@type": "File", - "description": "Output documentation" - }, - { - "@id": ".nf-core.yml", - "@type": "File", - "description": "nf-core configuration file, configuring template features and linting rules" - }, - { - "@id": ".pre-commit-config.yaml", - "@type": "File", - "description": "Configuration file for pre-commit hooks" - }, - { - "@id": ".prettierignore", - "@type": "File", - "description": "Ignore file for prettier" - }, - { - "@id": "https://nf-co.re/", - "@type": "Organization", - "name": "nf-core", - "url": "https://nf-co.re/" - }, - { - "@id": "#3cbf1a8b-9e61-4452-8f2d-260901f8bbfa", - "@type": "Person", - "name": "SPST Team" - } - ] -} diff --git a/subworkflows/local/utils_nfcore_biodivpipeline_pipeline/main.nf b/subworkflows/local/utils_nfcore_biodivpipeline_pipeline/main.nf index e56b827..b1de5a1 100644 --- a/subworkflows/local/utils_nfcore_biodivpipeline_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_biodivpipeline_pipeline/main.nf @@ -10,7 +10,6 @@ include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin' include { paramsSummaryMap } from 'plugin/nf-schema' -include { samplesheetToList } from 'plugin/nf-schema' include { paramsHelp } from 'plugin/nf-schema' include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' @@ -77,7 +76,7 @@ workflow PIPELINE_INITIALISATION { before_text = before_text.replaceAll(/\033\[[0-9;]*m/, '') } - command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " + command = "nextflow run ${workflow.manifest.name} -profile --input data.csv --outdir " UTILS_NFSCHEMA_PLUGIN ( workflow, @@ -130,11 +129,9 @@ workflow PIPELINE_COMPLETION { plaintext_email // boolean: Send plain-text email instead of HTML outdir // path: Path to output directory where results will be published monochrome_logs // boolean: Disable ANSI colour codes in log output - multiqc_report // string: Path to MultiQC report main: summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") - def multiqc_reports = multiqc_report.toList() // // Completion email and summary @@ -148,7 +145,7 @@ workflow PIPELINE_COMPLETION { plaintext_email, outdir, monochrome_logs, - multiqc_reports.getVal(), + [], ) } @@ -174,68 +171,3 @@ def validateInputParameters() { error("Please provide an input CSV file using --input") } } -// -// Generate methods description for MultiQC -// -def toolCitationText() { - // TODO nf-core: Optionally add in-text citation tools to this list. - // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "Tool (Foo et al. 2023)" : "", - // Uncomment function in methodsDescriptionText to render in MultiQC report - def citation_text = [ - "Tools used in the workflow included:", - "FastQC (Andrews 2010),", - "MultiQC (Ewels et al. 2016)", - "." - ].join(' ').trim() - - return citation_text -} - -def toolBibliographyText() { - // TODO nf-core: Optionally add bibliographic entries to this list. - // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "
  • Author (2023) Pub name, Journal, DOI
  • " : "", - // Uncomment function in methodsDescriptionText to render in MultiQC report - def reference_text = [ - "
  • Andrews S, (2010) FastQC, URL: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/).
  • ", - "
  • Ewels, P., Magnusson, M., Lundin, S., & KΓ€ller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics , 32(19), 3047–3048. doi: /10.1093/bioinformatics/btw354
  • " - ].join(' ').trim() - - return reference_text -} - -def methodsDescriptionText(mqc_methods_yaml) { - // Convert to a named map so can be used as with familiar NXF ${workflow} variable syntax in the MultiQC YML file - def meta = [:] - meta.workflow = workflow.toMap() - meta["manifest_map"] = workflow.manifest.toMap() - - // Pipeline DOI - if (meta.manifest_map.doi) { - // Using a loop to handle multiple DOIs - // Removing `https://doi.org/` to handle pipelines using DOIs vs DOI resolvers - // Removing ` ` since the manifest.doi is a string and not a proper list - def temp_doi_ref = "" - def manifest_doi = meta.manifest_map.doi.tokenize(",") - manifest_doi.each { doi_ref -> - temp_doi_ref += "(doi:
    ${doi_ref.replace("https://doi.org/", "").replace(" ", "")}), " - } - meta["doi_text"] = temp_doi_ref.substring(0, temp_doi_ref.length() - 2) - } else meta["doi_text"] = "" - meta["nodoi_text"] = meta.manifest_map.doi ? "" : "
  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " - - // Tool references - meta["tool_citations"] = "" - meta["tool_bibliography"] = "" - - // TODO nf-core: Only uncomment below if logic in toolCitationText/toolBibliographyText has been filled! - // meta["tool_citations"] = toolCitationText().replaceAll(", \\.", ".").replaceAll("\\. \\.", ".").replaceAll(", \\.", ".") - // meta["tool_bibliography"] = toolBibliographyText() - - - def methods_text = mqc_methods_yaml.text - - def engine = new groovy.text.SimpleTemplateEngine() - def description_html = engine.createTemplate(methods_text).make(meta) - - return description_html.toString() -} diff --git a/tower.yml b/tower.yml deleted file mode 100644 index 787aedf..0000000 --- a/tower.yml +++ /dev/null @@ -1,5 +0,0 @@ -reports: - multiqc_report.html: - display: "MultiQC HTML report" - samplesheet.csv: - display: "Auto-created samplesheet with collated metadata and FASTQ paths" From 014eae2c058cf80f53423da324a2f65b32994818 Mon Sep 17 00:00:00 2001 From: mitchell Date: Tue, 12 May 2026 00:35:10 +0200 Subject: [PATCH 7/9] refactor: trim speculative content from module stubs WP1 owns the integration backbone, not module internals. Strip stub scripts to minimal valid-output emitters and remove pre-claimed domain content: - Delete modules/stubs/ (FastAPI HTTP service contradicts Pattern A) - Replace 6 module main.nf stubs with minimal emitters - Strip default_mapping.jsonld to empty placeholder - Replace biodiv/wpX-*:latest container refs with placeholder image - Remove WP-to-module assignments from workflow comments - Drop BGBM example from input description Module teams (WP2-WP7) own real implementations, container images, and domain content. WP1 ships interface contracts. --- assets/default_mapping.jsonld | 25 +++----------- modules/local/biodiv_annotate/main.nf | 22 ++++--------- modules/local/collect_reports/main.nf | 22 +++---------- modules/local/column_standardise/main.nf | 26 ++++----------- modules/local/outlier_detect/main.nf | 23 ++++--------- modules/local/provisional_concepts/main.nf | 18 +++------- modules/local/rdf_transform/main.nf | 38 ++++------------------ modules/local/taxonomy_classify/main.nf | 11 +++---- modules/stubs/Dockerfile | 5 --- modules/stubs/stub_service.py | 21 ------------ nextflow_schema.json | 2 +- workflows/biodivpipeline.nf | 23 ------------- 12 files changed, 44 insertions(+), 192 deletions(-) delete mode 100644 modules/stubs/Dockerfile delete mode 100644 modules/stubs/stub_service.py diff --git a/assets/default_mapping.jsonld b/assets/default_mapping.jsonld index 563f042..491dcfb 100644 --- a/assets/default_mapping.jsonld +++ b/assets/default_mapping.jsonld @@ -1,24 +1,7 @@ { - "@context": { - "dwc": "http://rs.tdwg.org/dwc/terms/", - "dcterms": "http://purl.org/dc/terms/", - "abcd": "http://www.tdwg.org/schemas/abcd/2.06/", - "schema": "http://schema.org/" - }, + "@context": {}, "@type": "MappingSchema", - "name": "Default BiodivPipeline Mapping (Stub)", - "description": "Placeholder mapping schema. Replace with expert-crafted schema from WP8 Schema Editor UI.", - "mappings": [ - {"source": "HerbariumID", "target": "dwc:catalogNumber"}, - {"source": "Family", "target": "dwc:family"}, - {"source": "FullNameCache", "target": "dwc:scientificName"}, - {"source": "Genus", "target": "dwc:genus"}, - {"source": "Sammlerteam", "target": "dwc:recordedBy"}, - {"source": "Sammelnummer", "target": "dwc:recordNumber"}, - {"source": "CollectionDateBegin","target": "dwc:eventDate"}, - {"source": "Country", "target": "dwc:country"}, - {"source": "Locality", "target": "dwc:locality"}, - {"source": "Latitude", "target": "dwc:decimalLatitude"}, - {"source": "Longitude", "target": "dwc:decimalLongitude"} - ] + "name": "Placeholder mapping schema", + "description": "Empty placeholder. Real mapping schema is owned by the RDF transform module team.", + "mappings": [] } diff --git a/modules/local/biodiv_annotate/main.nf b/modules/local/biodiv_annotate/main.nf index cb5f775..3c35507 100644 --- a/modules/local/biodiv_annotate/main.nf +++ b/modules/local/biodiv_annotate/main.nf @@ -2,7 +2,7 @@ process BIODIV_ANNOTATE { tag "annotate" label 'process_low' - container 'biodiv/wp2-annotator:latest' + container 'biodivpipeline/placeholder:0.1' // TODO: replace with module team's container input: path csv @@ -14,25 +14,15 @@ process BIODIV_ANNOTATE { script: """ - # WP2: Wrap BiodivPortal Annotator REST API - # Batch-submit records, parse JSON-LD, emit annotated + unresolved terms - # Stub: generate minimal output structure + # Stub β€” module team replaces this script with the real implementation. + # Emits minimal valid outputs matching the channel contract. - cat <<-JSONLD > annotated.jsonld - { - "@context": "https://biodivportal.gfbio.org/context.jsonld", - "total_records": \$(wc -l < ${csv}), - "annotated": [], - "status": "stub" - } - JSONLD - - # Extract terms that couldn't be resolved (stub: empty) - echo "term,field,record_id" > unresolved_terms.csv + echo '{"@context": {}, "@graph": []}' > annotated.jsonld + : > unresolved_terms.csv cat <<-VERSIONS > versions.yml "${task.process}": - biodiv_annotator: 0.1.0 + stub: "0.0.0" VERSIONS """ } diff --git a/modules/local/collect_reports/main.nf b/modules/local/collect_reports/main.nf index 4b246a4..a81d6b5 100644 --- a/modules/local/collect_reports/main.nf +++ b/modules/local/collect_reports/main.nf @@ -2,6 +2,8 @@ process COLLECT_REPORTS { tag "reports" label 'process_single' + container 'biodivpipeline/placeholder:0.1' // TODO: replace with module team's container + input: path quality_report path rdf_report @@ -13,23 +15,7 @@ process COLLECT_REPORTS { script: """ - # Collect all per-step reports into a single pipeline summary - cat <<-SUMMARY > pipeline_summary.json - { - "pipeline": "biodivpipeline", - "version": "0.1.0", - "reports": { - "quality": "\$(cat ${quality_report})", - "rdf": "\$(cat ${rdf_report})", - "column_mapping": "${column_mapping}", - "provisional_concepts": "${provisional_concepts}" - } - } - SUMMARY - - cat <<-VERSIONS > versions.yml - "${task.process}": - collect_reports: 0.1.0 - VERSIONS + # Stub β€” aggregator. Real implementation merges per-module reports into a single summary. + echo '{}' > pipeline_summary.json """ } diff --git a/modules/local/column_standardise/main.nf b/modules/local/column_standardise/main.nf index f123484..ab2f473 100644 --- a/modules/local/column_standardise/main.nf +++ b/modules/local/column_standardise/main.nf @@ -2,7 +2,7 @@ process COLUMN_STANDARDISE { tag "column_std" label 'process_single' - container 'biodiv/wp6-column-standardise:latest' + container 'biodivpipeline/placeholder:0.1' // TODO: replace with module team's container input: path csv @@ -14,29 +14,15 @@ process COLUMN_STANDARDISE { script: """ - # WP6: Map CSV column headers to ABCD schema terms - # In stub mode, pass through unchanged + generate a mapping file - cp ${csv} standardised.csv + # Stub β€” module team replaces this script with the real implementation. + # Emits minimal valid outputs matching the channel contract. - cat <<-MAPPING > column_mapping.json - { - "HerbariumID": {"abcd_term": "UnitID", "confidence": 0.95}, - "Family": {"abcd_term": "HigherTaxon", "confidence": 0.90}, - "FullNameCache": {"abcd_term": "FullScientificNameString", "confidence": 0.92}, - "Sammlerteam": {"abcd_term": "AgentText", "confidence": 0.85}, - "Sammelnummer": {"abcd_term": "CollectorsFieldNumber", "confidence": 0.88}, - "CollectionDateBegin": {"abcd_term": "ISODateTimeBegin", "confidence": 0.95}, - "Country": {"abcd_term": "Country", "confidence": 0.98}, - "Locality": {"abcd_term": "LocalityText", "confidence": 0.93}, - "Latitude": {"abcd_term": "LatitudeDecimal", "confidence": 0.97}, - "Longitude": {"abcd_term": "LongitudeDecimal", "confidence": 0.97}, - "Genus": {"abcd_term": "GenusOrMonomial", "confidence": 0.94} - } - MAPPING + cp ${csv} standardised.csv + echo '{}' > column_mapping.json cat <<-VERSIONS > versions.yml "${task.process}": - column_standardise: 0.1.0 + stub: "0.0.0" VERSIONS """ } diff --git a/modules/local/outlier_detect/main.nf b/modules/local/outlier_detect/main.nf index 56168f6..6a18fa5 100644 --- a/modules/local/outlier_detect/main.nf +++ b/modules/local/outlier_detect/main.nf @@ -2,7 +2,7 @@ process OUTLIER_DETECT { tag "outlier" label 'process_low' - container 'biodiv/wp4-outlier-detection:latest' + container 'biodivpipeline/placeholder:0.1' // TODO: replace with module team's container input: path csv @@ -14,26 +14,15 @@ process OUTLIER_DETECT { script: """ - # WP4: Outlier & Data-Quality Detection - # Statistical (IQR, z-score, DBSCAN) + LLM-assisted checks - # Stub: generate empty quality report + # Stub β€” module team replaces this script with the real implementation. + # Emits minimal valid outputs matching the channel contract. - cat <<-REPORT > quality_report.json - { - "total_records": \$(tail -n +2 ${csv} | wc -l), - "outliers_detected": 0, - "methods": ["IQR", "z-score", "isolation_forest", "dbscan", "llm"], - "flags": [], - "status": "stub" - } - REPORT - - # Flagged records: header + severity column - head -1 ${csv} | sed 's/\$/ ,"outlier_flag","severity_score","explanation"/' > flagged_records.csv + echo '{}' > quality_report.json + : > flagged_records.csv cat <<-VERSIONS > versions.yml "${task.process}": - outlier_detection: 0.1.0 + stub: "0.0.0" VERSIONS """ } diff --git a/modules/local/provisional_concepts/main.nf b/modules/local/provisional_concepts/main.nf index 10e81ed..22e368f 100644 --- a/modules/local/provisional_concepts/main.nf +++ b/modules/local/provisional_concepts/main.nf @@ -2,7 +2,7 @@ process PROVISIONAL_CONCEPTS { tag "concepts" label 'process_single' - container 'biodiv/wp5-provisional-concepts:latest' + container 'biodivpipeline/placeholder:0.1' // TODO: replace with module team's container input: path unresolved_csv @@ -13,22 +13,14 @@ process PROVISIONAL_CONCEPTS { script: """ - # WP5: Provisional Concept Identification & Registration - # Detect unresolved terms, register in BiodivPortal as provisional - # Stub: pass through with empty registrations + # Stub β€” module team replaces this script with the real implementation. + # Emits minimal valid outputs matching the channel contract. - cat <<-CONCEPTS > provisional_concepts.json - { - "unresolved_input": "${unresolved_csv}", - "registered": [], - "failed": [], - "status": "stub" - } - CONCEPTS + echo '{}' > provisional_concepts.json cat <<-VERSIONS > versions.yml "${task.process}": - provisional_concepts: 0.1.0 + stub: "0.0.0" VERSIONS """ } diff --git a/modules/local/rdf_transform/main.nf b/modules/local/rdf_transform/main.nf index 3e864e5..b8ee1b0 100644 --- a/modules/local/rdf_transform/main.nf +++ b/modules/local/rdf_transform/main.nf @@ -2,7 +2,7 @@ process RDF_TRANSFORM { tag "rdf" label 'process_low' - container 'biodiv/wp7-rdf-transform:latest' + container 'biodivpipeline/placeholder:0.1' // TODO: replace with module team's container input: path csv @@ -18,40 +18,16 @@ process RDF_TRANSFORM { script: """ - # WP7: RDF Matching & Transformation - # Transform tabular records into RDF triples using expert mapping schema - # Stub: generate minimal valid Turtle + # Stub β€” module team replaces this script with the real implementation. + # Emits minimal valid outputs matching the channel contract. - cat <<-TTL > output.ttl - @prefix dwc: . - @prefix dcterms: . - - # Stub output β€” real transformation pending WP7 service - TTL - - cat <<-JSONLD > output.jsonld - { - "@context": { - "dwc": "http://rs.tdwg.org/dwc/terms/", - "dcterms": "http://purl.org/dc/terms/" - }, - "@graph": [], - "status": "stub" - } - JSONLD - - cat <<-REPORT > rdf_report.json - { - "input_records": \$(tail -n +2 ${csv} | wc -l), - "triples_generated": 0, - "mapping_schema": "${mapping_schema}", - "status": "stub" - } - REPORT + : > output.ttl + echo '{"@context": {}, "@graph": []}' > output.jsonld + echo '{}' > rdf_report.json cat <<-VERSIONS > versions.yml "${task.process}": - rdf_transform: 0.1.0 + stub: "0.0.0" VERSIONS """ } diff --git a/modules/local/taxonomy_classify/main.nf b/modules/local/taxonomy_classify/main.nf index f089d81..5cfc3fb 100644 --- a/modules/local/taxonomy_classify/main.nf +++ b/modules/local/taxonomy_classify/main.nf @@ -2,7 +2,7 @@ process TAXONOMY_CLASSIFY { tag "taxonomy" label 'process_low' - container 'biodiv/wp3-taxonomy-classifier:latest' + container 'biodivpipeline/placeholder:0.1' // TODO: replace with module team's container input: path csv @@ -13,15 +13,14 @@ process TAXONOMY_CLASSIFY { script: """ - # WP3: Land Taxonomy Classifier β€” resolve taxon names to GBIF/WFO IDs - # Stub: copy input and add placeholder resolved columns + # Stub β€” module team replaces this script with the real implementation. + # Emits minimal valid outputs matching the channel contract. - head -1 ${csv} | sed 's/\$/ ,"gbif_key","wfo_id","taxonomy_confidence"/' > taxonomy_resolved.csv - tail -n +2 ${csv} | sed 's/\$/ ,"","","0.0"/' >> taxonomy_resolved.csv + cp ${csv} taxonomy_resolved.csv cat <<-VERSIONS > versions.yml "${task.process}": - taxonomy_classifier: 0.1.0 + stub: "0.0.0" VERSIONS """ } diff --git a/modules/stubs/Dockerfile b/modules/stubs/Dockerfile deleted file mode 100644 index 617cfad..0000000 --- a/modules/stubs/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM python:3.11-slim -RUN pip install fastapi uvicorn -COPY stub_service.py /app/stub_service.py -WORKDIR /app -CMD ["uvicorn", "stub_service:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/modules/stubs/stub_service.py b/modules/stubs/stub_service.py deleted file mode 100644 index a8b0d34..0000000 --- a/modules/stubs/stub_service.py +++ /dev/null @@ -1,21 +0,0 @@ -from fastapi import FastAPI -from pydantic import BaseModel - -app = FastAPI() - -class ProcessRequest(BaseModel): - records: list[dict] - module: str = "generic" - -@app.post("/process") -async def process(req: ProcessRequest): - return { - "module": req.module, - "status": "stub", - "records_received": len(req.records), - "results": [{"id": r.get("HerbariumID", "unknown"), "processed": False} for r in req.records] - } - -@app.get("/health") -async def health(): - return {"status": "ok"} diff --git a/nextflow_schema.json b/nextflow_schema.json index c8dcee5..67f724a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -21,7 +21,7 @@ "exists": true, "mimetype": "text/csv", "pattern": "^\\S+\\.csv$", - "description": "Path to input CSV file containing biodiversity records (e.g. BGBM herbarium specimens).", + "description": "Path to input CSV file containing biodiversity records.", "fa_icon": "fas fa-file-csv" }, "outdir": { diff --git a/workflows/biodivpipeline.nf b/workflows/biodivpipeline.nf index 196a5bd..13ed113 100644 --- a/workflows/biodivpipeline.nf +++ b/workflows/biodivpipeline.nf @@ -29,43 +29,23 @@ workflow BIODIVPIPELINE { def ch_versions = channel.empty() - // - // STEP 1: Column Standardisation (WP6) - // Map heterogeneous CSV headers to ABCD standard terms - // COLUMN_STANDARDISE( ch_input ) ch_versions = ch_versions.mix(COLUMN_STANDARDISE.out.versions) def ch_standardised = COLUMN_STANDARDISE.out.csv - // - // STEP 2: Parallel processing β€” Annotation, Taxonomy, Outlier Detection - // These three modules run concurrently on the standardised data - // - - // WP2: BiodivPortal Annotator BIODIV_ANNOTATE( ch_standardised ) ch_versions = ch_versions.mix(BIODIV_ANNOTATE.out.versions) - // WP3: Land Taxonomy Classifier TAXONOMY_CLASSIFY( ch_standardised ) ch_versions = ch_versions.mix(TAXONOMY_CLASSIFY.out.versions) - // WP4: Outlier & Data-Quality Detection OUTLIER_DETECT( ch_standardised ) ch_versions = ch_versions.mix(OUTLIER_DETECT.out.versions) - // - // STEP 3: Provisional Concept Registration (WP5) - // Runs after Annotator β€” picks up unresolved terms - // PROVISIONAL_CONCEPTS( BIODIV_ANNOTATE.out.unresolved ) ch_versions = ch_versions.mix(PROVISIONAL_CONCEPTS.out.versions) - // - // STEP 4: RDF Transformation (WP7) - // Combines cleaned data + annotations + taxonomy + expert mapping schema - // RDF_TRANSFORM( ch_standardised, BIODIV_ANNOTATE.out.annotations, @@ -74,9 +54,6 @@ workflow BIODIVPIPELINE { ) ch_versions = ch_versions.mix(RDF_TRANSFORM.out.versions) - // - // STEP 5: Collect all reports into a pipeline summary - // COLLECT_REPORTS( OUTLIER_DETECT.out.report, RDF_TRANSFORM.out.report, From 7ffcd9a5898d44539e35724fef3d1d516f2b6d70 Mon Sep 17 00:00:00 2001 From: mitchell Date: Tue, 12 May 2026 00:42:01 +0200 Subject: [PATCH 8/9] docs: cleanup speculative content and trim placeholders - README.md: remove module diagram, dataset claims, project-structure module descriptions, credits section - docs/output.md: reduce to directory layout + Nextflow pipeline_info - docs/README.md: shrink to TOC + tech stack - docs/usage.md: remove dataset specifics, column listing, unzip step, sequence diagram - docs/CONTRIBUTING.md: remove project contacts, dataset record count - nextflow.config: empty manifest.contributors placeholder - .nf-core.yml: clear author placeholder - CITATIONS.md: drop tools not used in this pipeline --- .nf-core.yml | 2 +- CITATIONS.md | 14 ----- README.md | 146 ++++--------------------------------------- docs/CONTRIBUTING.md | 10 +-- docs/README.md | 25 +------- docs/output.md | 91 ++------------------------- docs/usage.md | 63 ++----------------- nextflow.config | 12 +--- 8 files changed, 30 insertions(+), 333 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 6863dc4..cf44e06 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -8,7 +8,7 @@ template: org: nf-core name: biodivpipeline description: Modular nf-core workflow for FAIR biodiversity data processing - author: SPST Team + author: "" version: 1.0.0dev force: true outdir: nf-core-biodivpipeline diff --git a/CITATIONS.md b/CITATIONS.md index 31e7149..473e11b 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -8,22 +8,8 @@ > Di Tommaso P, Chatzou M, Floden EW, Barja PP, Palumbo E, Notredame C. Nextflow enables reproducible computational workflows. Nat Biotechnol. 2017 Apr 11;35(4):316-319. doi: 10.1038/nbt.3820. PubMed PMID: 28398311. -## Pipeline tools - -- [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) - -> Andrews, S. (2010). FastQC: A Quality Control Tool for High Throughput Sequence Data [Online]. - -- [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) - -> Ewels P, Magnusson M, Lundin S, KΓ€ller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. - ## Software packaging/containerisation tools -- [Anaconda](https://anaconda.com) - - > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web. - - [Bioconda](https://pubmed.ncbi.nlm.nih.gov/29967506/) > GrΓΌning B, Dale R, SjΓΆdin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, KΓΆster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506. diff --git a/README.md b/README.md index f3ff00c..7015f26 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,20 @@ # BiodivPipeline -A modular nf-core/Nextflow pipeline that transforms raw biodiversity CSV records into FAIR-compliant RDF triples with automated quality checks, taxonomy resolution, and ontology annotation. +A modular nf-core / Nextflow pipeline scaffold that orchestrates pluggable modules to transform biodiversity CSV records into FAIR-compliant RDF outputs. -**Built for:** [NFDI4Biodiversity](https://www.nfdi4biodiversity.org/) / InfAI / BGBM **Framework:** [nf-core](https://nf-co.re) template v4.0.2 -**Dataset:** 109,297 herbarium specimen records from Botanischer Garten und Botanisches Museum Berlin (BGBM) - -## What it does - -```mermaid -flowchart LR - IN["Messy CSV Data\nWrong names, bad coords,\ninconsistent columns"] - PIPE["BiodivPipeline"] - OUT1["Clean Dataset"] - OUT2["RDF Triples\nFAIR-compliant"] - OUT3["Quality Reports"] - - IN --> PIPE --> OUT1 - PIPE --> OUT2 - PIPE --> OUT3 -``` - -## How it works - -The pipeline orchestrates 7 processing modules via Nextflow. Modules run in parallel where possible. - -```mermaid -flowchart TB - input["Raw CSV Input\n23 columns, biodiversity records"] - - subgraph WP1 ["Nextflow Orchestrator"] - direction TB - - wp6["Column Standardisation\nMap headers to ABCD schema\nSammlerteam to AgentText\nlat to LatitudeDecimal"] - - wp2["BiodivPortal Annotator\nMatch species names against\ncurated ontologies ENVO, NCBI"] - - wp3["Land Taxonomy Classifier\nResolve taxon names to\nGBIF keys, WFO identifiers"] - - wp4["Outlier Detection\nFind bad data: impossible coords,\nwrong dates, semantic mismatches"] - - wp5["Provisional Concepts\nUnknown terms get registered\nas provisional in BiodivPortal"] - - wp7["RDF Transformation\nConvert cleaned tabular data\ninto RDF triples"] - end - - wp8["Schema Editor UI\nBrowser tool for experts\nto design RDF mappings"] - - output1["Quality-annotated dataset"] - output2["RDF Triples"] - output3["Quality Reports"] - - input --> wp6 - wp6 --> wp2 - wp6 --> wp3 - wp6 --> wp4 - wp2 --> wp5 - wp2 --> wp7 - wp3 --> wp7 - wp4 --> wp7 - wp5 --> wp7 - wp8 -- "mapping schema" --> wp7 - wp7 --> output1 - wp7 --> output2 - wp7 --> output3 -``` ## Quick start -**Prerequisites:** Java 11+, [Nextflow](https://www.nextflow.io/) >= 24.x, [Docker](https://www.docker.com/) +**Prerequisites:** Java 11+, [Nextflow](https://www.nextflow.io/) >= 24.x, [Docker](https://www.docker.com/) (optional) ```bash -# Clone -git clone git@github.com:biodivportal/BiodivPipeline.git -cd BiodivPipeline +# Run with the bundled mock dataset +nextflow run main.nf -profile test --outdir results -# Unzip dataset (already in repo) -unzip Belege_aus_D.zip - -# Run with test data (109 records) -nextflow run main.nf -profile test,docker --outdir results - -# Run with full dataset +# Run with your own input nextflow run main.nf -profile docker \ - --input Belege_aus_D.csv \ + --input path/to/biodiv.csv \ --outdir results ``` @@ -98,77 +29,26 @@ nextflow run main.nf -profile docker \ ## Output -Results are written to `--outdir` with the following structure: - -``` -results/ -β”œβ”€β”€ annotation/ # WP2: BiodivPortal annotation results -β”‚ β”œβ”€β”€ annotated.jsonld -β”‚ └── unresolved_terms.csv -β”œβ”€β”€ column_standardisation/ # WP6: ABCD column mapping -β”‚ β”œβ”€β”€ standardised.csv -β”‚ └── column_mapping.json -β”œβ”€β”€ taxonomy/ # WP3: Resolved taxonomy -β”‚ └── taxonomy_resolved.csv -β”œβ”€β”€ quality/ # WP4: Outlier detection -β”‚ β”œβ”€β”€ quality_report.json -β”‚ └── flagged_records.csv -β”œβ”€β”€ provisional_concepts/ # WP5: Registered provisional terms -β”‚ └── provisional_concepts.json -β”œβ”€β”€ rdf/ # WP7: RDF transformation output -β”‚ β”œβ”€β”€ output.ttl -β”‚ β”œβ”€β”€ output.jsonld -β”‚ └── rdf_report.json -β”œβ”€β”€ reports/ # Aggregated pipeline summary -β”‚ └── pipeline_summary.json -└── pipeline_info/ # Nextflow execution metadata - β”œβ”€β”€ execution_report_*.html - β”œβ”€β”€ execution_timeline_*.html - β”œβ”€β”€ execution_trace_*.txt - β”œβ”€β”€ pipeline_dag_*.html - β”œβ”€β”€ params_*.json - └── biodivpipeline_software_versions.yml -``` - -For details on each output file, see [docs/output.md](docs/output.md). +Results are published under `--outdir`. See [docs/output.md](docs/output.md) for the directory layout. ## Project structure ``` BiodivPipeline/ β”œβ”€β”€ main.nf # Pipeline entry point -β”œβ”€β”€ workflows/biodivpipeline.nf # Main workflow DAG +β”œβ”€β”€ workflows/biodivpipeline.nf # Workflow DAG β”œβ”€β”€ modules/local/ # Pipeline modules (one per work package) -β”‚ β”œβ”€β”€ column_standardise/ # WP6: CSV headers β†’ ABCD terms -β”‚ β”œβ”€β”€ biodiv_annotate/ # WP2: BiodivPortal annotation -β”‚ β”œβ”€β”€ taxonomy_classify/ # WP3: Taxon β†’ GBIF/WFO IDs -β”‚ β”œβ”€β”€ outlier_detect/ # WP4: Statistical + LLM quality checks -β”‚ β”œβ”€β”€ provisional_concepts/ # WP5: Register unknown terms -β”‚ β”œβ”€β”€ rdf_transform/ # WP7: Tabular β†’ RDF triples -β”‚ └── collect_reports/ # Aggregate reports -β”œβ”€β”€ modules/stubs/ # Mock FastAPI service for testing β”œβ”€β”€ conf/ # Nextflow config profiles β”œβ”€β”€ assets/ # Static files (default mapping schema) -β”œβ”€β”€ test_data/ # 109-record sample dataset +β”œβ”€β”€ test_data/ # Mock dataset for the test profile β”œβ”€β”€ subworkflows/ # nf-core shared utilities └── docs/ # Documentation ``` ## Documentation -- [Usage guide](docs/usage.md) β€” detailed usage, parameters, and data flow -- [Output reference](docs/output.md) β€” description of every output file -- [Contributing](docs/CONTRIBUTING.md) β€” git conventions, branch model, module interface - -## Credits - -**Pipeline development:** SPST Team, FU Berlin, AG Corporate Semantic Web (SS 2026) -**Customer:** Naouel Karam (karam@infai.org), Jan Fillies (fillies@infai.org) β€” InfAI -**Data provider:** Botanischer Garten und Botanisches Museum Berlin (BGBM) -**Coordinator:** Prof. Dr. Adrian Paschke - -Built using the [nf-core](https://nf-co.re) framework. See [`CITATIONS.md`](CITATIONS.md) for a full list of tools and references. +- [Usage](docs/usage.md) β€” how to run, parameters, profiles +- [Output](docs/output.md) β€” output directory reference +- [Contributing](docs/CONTRIBUTING.md) β€” git conventions, branch model, module structure -> **The nf-core framework for community-curated bioinformatics pipelines.** -> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. -> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). +Built on the [nf-core](https://nf-co.re) framework β€” see [`CITATIONS.md`](CITATIONS.md). diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 77a1912..00b282d 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -104,9 +104,9 @@ Run the pipeline with the test profile to verify changes: nextflow run main.nf -profile test,docker --outdir results ``` -The test profile uses `test_data/sample.csv` (109 records) and `assets/default_mapping.jsonld`. +The test profile uses `test_data/sample.csv` and `assets/default_mapping.jsonld`. -All 7 modules should complete successfully: +All modules should complete successfully: ``` NFCORE_BIODIVPIPELINE:BIODIVPIPELINE:COLUMN_STANDARDISE @@ -126,9 +126,3 @@ NFCORE_BIODIVPIPELINE:BIODIVPIPELINE:COLLECT_REPORTS 4. Ensure the pipeline test passes 5. Request review from at least one team member 6. Squash-merge or rebase-merge (no merge commits) - -## Project contacts - -- **Coordinator:** Prof. Dr. Adrian Paschke -- **Customer:** Naouel Karam (karam@infai.org), Jan Fillies (fillies@infai.org) -- **Repository:** [github.com/biodivportal/BiodivPipeline](https://github.com/biodivportal/BiodivPipeline) diff --git a/docs/README.md b/docs/README.md index 3b7cff5..34c442c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,24 +1,10 @@ # BiodivPipeline Documentation -## Contents - - [Usage](usage.md) β€” how to run the pipeline, parameters, input format, and execution profiles -- [Output](output.md) β€” description of every output file produced by the pipeline -- [Contributing](CONTRIBUTING.md) β€” git conventions, branch model, and how to add or modify modules - -## Overview - -BiodivPipeline is an nf-core/Nextflow pipeline that transforms raw biodiversity CSV records into FAIR-compliant RDF triples. It orchestrates 7 processing modules: +- [Output](output.md) β€” description of the output directory layout +- [Contributing](CONTRIBUTING.md) β€” git conventions, branch model, and module interface -1. **Column Standardisation** (WP6) β€” map CSV headers to ABCD schema terms -2. **BiodivPortal Annotator** (WP2) β€” match values against curated ontologies -3. **Taxonomy Classifier** (WP3) β€” resolve taxon names to GBIF/WFO identifiers -4. **Outlier Detection** (WP4) β€” flag bad coordinates, dates, and semantic mismatches -5. **Provisional Concepts** (WP5) β€” register unresolved terms in BiodivPortal -6. **RDF Transformation** (WP7) β€” convert cleaned tabular data into RDF triples -7. **Report Collection** β€” aggregate all quality and processing reports - -For the high-level architecture and quick start, see the [main README](../README.md). +For the high-level overview and quick start, see the [main README](../README.md). ## Technical stack @@ -28,8 +14,3 @@ For the high-level architecture and quick start, see the [main README](../README | nf-core template | 4.0.2 | | Java | 11+ (tested with OpenJDK 21) | | Docker | >= 20.x (tested with 29.3.0) | - -## Project links - -- **Repository:** [github.com/biodivportal/BiodivPipeline](https://github.com/biodivportal/BiodivPipeline) -- **nf-core framework:** [nf-co.re](https://nf-co.re) diff --git a/docs/output.md b/docs/output.md index 40a38df..aa45ba1 100644 --- a/docs/output.md +++ b/docs/output.md @@ -7,106 +7,23 @@ All output files are written to the directory specified by `--outdir`. Paths bel ``` results/ β”œβ”€β”€ column_standardisation/ -β”‚ β”œβ”€β”€ standardised.csv -β”‚ └── column_mapping.json β”œβ”€β”€ annotation/ -β”‚ β”œβ”€β”€ annotated.jsonld -β”‚ └── unresolved_terms.csv β”œβ”€β”€ taxonomy/ -β”‚ └── taxonomy_resolved.csv β”œβ”€β”€ quality/ -β”‚ β”œβ”€β”€ quality_report.json -β”‚ └── flagged_records.csv β”œβ”€β”€ provisional_concepts/ -β”‚ └── provisional_concepts.json β”œβ”€β”€ rdf/ -β”‚ β”œβ”€β”€ output.ttl -β”‚ β”œβ”€β”€ output.jsonld -β”‚ └── rdf_report.json β”œβ”€β”€ reports/ -β”‚ └── pipeline_summary.json └── pipeline_info/ - β”œβ”€β”€ execution_report_*.html - β”œβ”€β”€ execution_timeline_*.html - β”œβ”€β”€ execution_trace_*.txt - β”œβ”€β”€ pipeline_dag_*.html - β”œβ”€β”€ params_*.json - └── biodivpipeline_software_versions.yml ``` -## Output files by module +Each module publishes its outputs to its own subdirectory. The file contents and schemas inside those subdirectories are owned by the module teams and are described in each module's interface spec. -### Column Standardisation (WP6) - -Directory: `column_standardisation/` - -| File | Format | Description | -| --------------------- | ------ | ------------------------------------------------------------------------------ | -| `standardised.csv` | CSV | Input data with column headers mapped to ABCD schema terms | -| `column_mapping.json` | JSON | Mapping of original column names to standardised names, with confidence scores | - -The standardised CSV is the input for all downstream modules. Original column names like `Sammlerteam` are mapped to ABCD terms like `AgentText`. - -### BiodivPortal Annotation (WP2) - -Directory: `annotation/` - -| File | Format | Description | -| ---------------------- | ------- | ---------------------------------------------------------------- | -| `annotated.jsonld` | JSON-LD | Records annotated with ontology concept URIs from BiodivPortal | -| `unresolved_terms.csv` | CSV | Terms that could not be matched to any existing ontology concept | - -Unresolved terms are passed to the Provisional Concepts module for registration. - -### Taxonomy Classification (WP3) - -Directory: `taxonomy/` - -| File | Format | Description | -| ----------------------- | ------ | ----------------------------------------------------------------------------------- | -| `taxonomy_resolved.csv` | CSV | Taxon names resolved to GBIF taxon keys and WFO identifiers, with confidence scores | - -### Outlier Detection (WP4) - -Directory: `quality/` - -| File | Format | Description | -| --------------------- | ------ | ------------------------------------------------------------------------------------------------- | -| `quality_report.json` | JSON | Statistical summary of data quality checks (coordinate ranges, date validity, field completeness) | -| `flagged_records.csv` | CSV | Records flagged as potential outliers with reason codes | - -### Provisional Concepts (WP5) - -Directory: `provisional_concepts/` - -| File | Format | Description | -| --------------------------- | ------ | ------------------------------------------------------------------------------------ | -| `provisional_concepts.json` | JSON | Newly registered provisional concept URIs for terms not found in existing ontologies | - -### RDF Transformation (WP7) - -Directory: `rdf/` - -| File | Format | Description | -| ----------------- | ------- | ------------------------------------------------------------------ | -| `output.ttl` | Turtle | RDF triples in Turtle serialisation | -| `output.jsonld` | JSON-LD | RDF triples in JSON-LD serialisation | -| `rdf_report.json` | JSON | Transformation statistics: triple count, unmapped fields, warnings | - -These are the primary deliverables β€” FAIR-compliant RDF representations of the input biodiversity data. - -### Report Collection - -Directory: `reports/` - -| File | Format | Description | -| ----------------------- | ------ | ------------------------------------------------------------------------------------------------- | -| `pipeline_summary.json` | JSON | Aggregated summary of all processing modules: record counts, quality metrics, annotation coverage | - -### Pipeline information +## Pipeline information Directory: `pipeline_info/` +Standard Nextflow execution artifacts. + | File | Description | | -------------------------------------- | -------------------------------------------------------------------- | | `execution_report_*.html` | Nextflow execution report with resource usage per process | diff --git a/docs/usage.md b/docs/usage.md index 88674f3..eebe2f7 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -10,18 +10,9 @@ ## Input data -The pipeline expects a CSV file with biodiversity specimen records. The input CSV must have a header row. Column names do not need to follow a standard β€” the Column Standardisation module maps them to ABCD schema terms. +The pipeline expects a CSV file with biodiversity specimen records and a header row. Column names do not need to follow any specific standard β€” the first pipeline module is responsible for mapping headers to a target schema. -The included test dataset (`test_data/sample.csv`) contains 109 records with 23 columns sampled from the BGBM Belege_aus_D dataset: - -``` -HerbariumID, Bild, DB, Family, FullNameCache, Anmerkungen, Sammlerteam, -Sammelnummer, CollectionDateBegin, CollectionDateEnd, Country, Locality, -TitelEtikett, Expeditionsangabe, ShowOnMap, Latitude, Longitude, -FundortUNdOeko, NameCache, Genus, Identifier, Barcode, StableURI -``` - -The full dataset (`Belege_aus_D.csv`, 109,297 records) is distributed as a zip archive in the repository. +A small mock dataset is provided under `test_data/sample.csv` for use with `-profile test`. ## Running the pipeline @@ -33,14 +24,11 @@ nextflow run main.nf -profile test,docker --outdir results The `test` profile points to `test_data/sample.csv` and `assets/default_mapping.jsonld` so no other parameters are needed. -### Full dataset run +### Custom input run ```bash -# Unzip dataset if not already done -unzip Belege_aus_D.zip - nextflow run main.nf -profile docker \ - --input Belege_aus_D.csv \ + --input path/to/your.csv \ --outdir results ``` @@ -70,57 +58,18 @@ nextflow run main.nf -profile docker -params-file params.yaml ```yaml # params.yaml -input: "./Belege_aus_D.csv" +input: "./data.csv" mapping_schema: "./assets/default_mapping.jsonld" outdir: "./results" ``` -## Pipeline data flow - -```mermaid -sequenceDiagram - participant User - participant NF as Nextflow - participant CS as Column Standardise - participant BA as BiodivPortal Annotate - participant TC as Taxonomy Classify - participant OD as Outlier Detect - participant PC as Provisional Concepts - participant RT as RDF Transform - participant CR as Collect Reports - - User->>NF: --input CSV, --mapping_schema - NF->>CS: raw CSV - CS-->>NF: standardised.csv + column_mapping.json - - par Parallel processing - NF->>BA: standardised.csv - BA-->>NF: annotated.jsonld + unresolved_terms.csv - and - NF->>TC: standardised.csv - TC-->>NF: taxonomy_resolved.csv - and - NF->>OD: standardised.csv - OD-->>NF: quality_report.json + flagged_records.csv - end - - NF->>PC: unresolved_terms.csv - PC-->>NF: provisional_concepts.json - - NF->>RT: standardised.csv + annotations + taxonomy + schema - RT-->>NF: output.ttl + output.jsonld + rdf_report.json - - NF->>CR: all reports - CR-->>NF: pipeline_summary.json -``` - ## Execution profiles Multiple profiles can be combined: `-profile test,docker`. They load in order, so later profiles override earlier ones. | Profile | Description | | ------------- | ------------------------------------------------------------------ | -| `test` | Uses `test_data/sample.csv` (109 records). No other params needed. | +| `test` | Uses the bundled mock CSV in `test_data/`. No other params needed. | | `docker` | Run module containers with Docker | | `singularity` | Run module containers with Singularity | | `podman` | Run module containers with Podman | diff --git a/nextflow.config b/nextflow.config index fcaada4..539d905 100644 --- a/nextflow.config +++ b/nextflow.config @@ -226,17 +226,7 @@ dag { manifest { name = 'nf-core/biodivpipeline' - contributors = [ - // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 - [ - name: 'SPST Team', - affiliation: '', - email: '', - github: '', - contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') - orcid: '' - ], - ] + contributors = [] homePage = 'https://github.com/nf-core/biodivpipeline' description = """Modular nf-core workflow for FAIR biodiversity data processing""" mainScript = 'main.nf' From 5d18595692b2eb44e127a2fe20b10ba77fe6f15e Mon Sep 17 00:00:00 2001 From: Tuna Hadimioglu Date: Wed, 13 May 2026 12:43:46 +0200 Subject: [PATCH 9/9] Add linting configuration and decision documentation --- .nf-core.yml | 20 ++++++++++++++++---- docs/linting_decisions.md | 24 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 docs/linting_decisions.md diff --git a/.nf-core.yml b/.nf-core.yml index cf44e06..084a29d 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,9 +1,20 @@ repository_type: pipeline - nf_core_version: 4.0.2 - -lint: {} - +lint: + actions_awsfulltest: false + actions_awstest: false + actions_nf_test: false + actions_schema_validation: false + files_unchanged: false + files_exist: + - .github/workflows/branch.yml + - .github/workflows/ci.yml + - .github/workflows/linting.yml + - .github/workflows/linting_comment.yml + pipeline_todos: false + multiqc_config: false + rocrate_readme_sync: false + modules_json: false template: org: nf-core name: biodivpipeline @@ -13,3 +24,4 @@ template: force: true outdir: nf-core-biodivpipeline is_nfcore: true + diff --git a/docs/linting_decisions.md b/docs/linting_decisions.md new file mode 100644 index 0000000..dfd6e7e --- /dev/null +++ b/docs/linting_decisions.md @@ -0,0 +1,24 @@ +# BiodivPipeline β€” Lint Configuration Decisions + +## Context + +nf-core lint is designed for production pipelines with GitHub Actions CI, AWS test runs, and nf-core registry releases. We are not using CI for now and are not publishing to the nf-core registry, so most of these tests don't apply. + +## Disabled Rules + +| Rule | Reason | +|------|--------| +| `actions_awsfulltest` | No AWS infrastructure (no cloud) | +| `actions_awstest` | No AWS infrastructure | +| `actions_nf_test` | Not using CI for now | +| `actions_schema_validation` | Not using CI for now | +| `files_unchanged` | Template files are intentionally customised for this project | +| `files_exist` (partial) | 4 GitHub Actions workflow files excluded; all other required files still enforced | +| `pipeline_todos` | TODOs are intentional during development β€” re-enable before final submission | +| `multiqc_config` | Pipeline doesn't use MultiQC; custom per-step quality reports used instead | +| `rocrate_readme_sync` | Not publishing to nf-core registry | +| `modules_json` | All modules are written locally (`modules/local/`), none imported from nf-core registry | + +## Note on `files_exist` + +`branch.yml`, `ci.yml`, `linting.yml`, and `linting_comment.yml` have no dedicated lint rule of their own, so they can only be excluded via the `files_exist` list. All other required files (README, nextflow.config, main.nf, Dockerfile, CHANGELOG, docs/, conf/base.config) remain enforced. \ No newline at end of file