diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index f069acb30..0ba417ec5 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -13,7 +13,32 @@ export_plots: true # Run only these modules run_modules: - custom_content - - run_alphafold2_pred - - colabfold_batch + +table_sample_merge: + "rank_0": "_rank_0" + "rank_1": "_rank_1" + "rank_2": "_rank_2" + "rank_3": "_rank_3" + "rank_4": "_rank_4" + "rank_5": "_rank_5" + "rank_6": "_rank_6" + "rank_7": "_rank_7" + "rank_8": "_rank_8" + "rank_9": "_rank_9" + "rank_10": "_rank_10" + "rank_11": "_rank_11" + "rank_12": "_rank_12" + "rank_13": "_rank_13" + "rank_14": "_rank_14" + "rank_15": "_rank_15" + "rank_16": "_rank_16" + "rank_17": "_rank_17" + "rank_18": "_rank_18" + "rank_19": "_rank_19" + "rank_20": "_rank_20" + "rank_21": "_rank_21" + "rank_22": "_rank_22" + "rank_23": "_rank_23" + "rank_24": "_rank_24" disable_version_detection: true diff --git a/assets/report_template.html b/assets/report_template.html index 0f0f851e7..421c2594d 100644 --- a/assets/report_template.html +++ b/assets/report_template.html @@ -2,9 +2,8 @@ - - Protein structure prediction + Protein structure report " + cannot terminate the enclosing " ) - -chainwise_ipsae_js_array = f"const CHAINWISE_IPSAE_SCORES = {json.dumps(chainwise_ipsae_matrices)};" proteinfold_template = proteinfold_template.replace( - "const CHAINWISE_IPSAE_SCORES = [];", chainwise_ipsae_js_array + "", f"{config_blob}\n ", 1 ) -i = 0 -for structure in aligned_structures: - proteinfold_template = proteinfold_template.replace( - f"*_data_ranked_{i}.cif*", open(structure, "r").read().replace("\n", "\\n") - ) - i += 1 - if not is_missing_input(args.msa): image_path = f"{args.output_dir}/{args.name}_{args.in_type}_seq_coverage.png" with open(image_path, "rb") as in_file: + data_uri = f"data:image/png;base64,{base64.b64encode(in_file.read()).decode('utf-8')}" proteinfold_template = proteinfold_template.replace( - "seq_coverage.png", - f"data:image/png;base64,{base64.b64encode(in_file.read()).decode('utf-8')}", + '
', + f'Sequence coverage (MSA)', ) else: pattern = r'
.*?(.*?)*?
\s*\s*\s*' diff --git a/conf/containers_conda_lock_files_amd64.config b/conf/containers_conda_lock_files_amd64.config index f487ba40c..01cc54586 100644 --- a/conf/containers_conda_lock_files_amd64.config +++ b/conf/containers_conda_lock_files_amd64.config @@ -1 +1 @@ -process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt' } } +process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt' } } diff --git a/conf/containers_conda_lock_files_arm64.config b/conf/containers_conda_lock_files_arm64.config index e9a3fedcf..6864e0b1b 100644 --- a/conf/containers_conda_lock_files_arm64.config +++ b/conf/containers_conda_lock_files_arm64.config @@ -1 +1 @@ -process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt' } } +process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt' } } diff --git a/conf/containers_docker_amd64.config b/conf/containers_docker_amd64.config index 01b59df58..ea18c3f94 100644 --- a/conf/containers_docker_amd64.config +++ b/conf/containers_docker_amd64.config @@ -1 +1 @@ -process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.34--db7c73dae76bc9e6' } } +process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc' } } diff --git a/conf/containers_docker_arm64.config b/conf/containers_docker_arm64.config index 7785cb132..369f743a8 100644 --- a/conf/containers_docker_arm64.config +++ b/conf/containers_docker_arm64.config @@ -1 +1 @@ -process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.34--d167b8012595a136' } } +process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.35--5c84a5000a226ab5' } } diff --git a/conf/containers_singularity_https_amd64.config b/conf/containers_singularity_https_amd64.config index 754821b37..932fc7c0f 100644 --- a/conf/containers_singularity_https_amd64.config +++ b/conf/containers_singularity_https_amd64.config @@ -1 +1 @@ -process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/1b/1bef8af6be88c5733461959c46ac8ef73d18f65277f62a1695d0e1633054f9c2/data' } } +process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data' } } diff --git a/conf/containers_singularity_https_arm64.config b/conf/containers_singularity_https_arm64.config index 93071de88..4f795323c 100644 --- a/conf/containers_singularity_https_arm64.config +++ b/conf/containers_singularity_https_arm64.config @@ -1 +1 @@ -process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9a/9a1fec9662a152683e6fcae440d0ce20920b3b89dc62d1e3a52e73f92eba0969/data' } } +process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e4/e48aa28aebc881254a499b24c3e1ce77b8df1b85a5432699ed6f72eb17ac7fb5/data' } } diff --git a/conf/containers_singularity_oras_amd64.config b/conf/containers_singularity_oras_amd64.config index 952881d8b..2fa065b33 100644 --- a/conf/containers_singularity_oras_amd64.config +++ b/conf/containers_singularity_oras_amd64.config @@ -1 +1 @@ -process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.34--4fc8657c816047c0' } } +process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c680f2aea25ccec2' } } diff --git a/conf/containers_singularity_oras_arm64.config b/conf/containers_singularity_oras_arm64.config index 498ec506a..84f079246 100644 --- a/conf/containers_singularity_oras_arm64.config +++ b/conf/containers_singularity_oras_arm64.config @@ -1 +1 @@ -process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.34--7fbd82d945c06726' } } +process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c0468833d65b2f81' } } diff --git a/conf/modules.config b/conf/modules.config index 6a84a2ebc..724219484 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -44,7 +44,7 @@ process { } withName: 'MULTIQC' { - ext.prefix = { "${meta.model}" } + ext.prefix = { "${meta.model}_multiqc_report" } ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ path: { "${params.outdir}/multiqc" }, @@ -53,6 +53,12 @@ process { ] } + withName: 'GENERATE_MULTIQC_CONTENTS' { + publishDir = [ + enabled: false + ] + } + withName: 'GENERATE_REPORT' { publishDir = [ path: { "${params.outdir}/reports" }, diff --git a/conf/modules_alphafold2.config b/conf/modules_alphafold2.config index d9ee58c62..340a2e19e 100644 --- a/conf/modules_alphafold2.config +++ b/conf/modules_alphafold2.config @@ -120,8 +120,6 @@ process { saveAs: { filename -> if(filename.endsWith('_pae.tsv')){ "paes/$filename" - } else if(filename.endsWith('_plddt_mqc.tsv')){ - filename.replaceAll(/_plddt_mqc\.tsv$/, '_plddt.tsv') } else { filename } }, pattern: '*.tsv' diff --git a/conf/modules_alphafold3.config b/conf/modules_alphafold3.config index 91da0f845..af8942d87 100644 --- a/conf/modules_alphafold3.config +++ b/conf/modules_alphafold3.config @@ -101,8 +101,7 @@ process { [ path: { "${params.outdir}/alphafold3/${meta.id}" }, mode: 'copy', - saveAs: { filename -> filename.replaceAll(/_plddt_mqc\.tsv$/, '_plddt.tsv') }, - pattern: '*_plddt_mqc.tsv' + pattern: '*_plddt.tsv' ], [ path: { "${params.outdir}/alphafold3/${meta.id}" }, @@ -128,7 +127,7 @@ process { [ path: { "${params.outdir}/alphafold3/${meta.id}" }, mode: 'copy', - pattern: '*_alphafold3_msa.tsv' + pattern: '*_msa.tsv' ], [ enabled: params.save_intermediates, diff --git a/conf/modules_boltz.config b/conf/modules_boltz.config index 75f1fa0a9..ef909f45f 100644 --- a/conf/modules_boltz.config +++ b/conf/modules_boltz.config @@ -2,7 +2,6 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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). @@ -79,13 +78,12 @@ process { [ path: { "${params.outdir}/boltz/${meta.id}" }, mode: 'copy', - saveAs: { filename -> filename.replaceAll(/_plddt_mqc\.tsv$/, '_plddt.tsv') }, - pattern: '*_plddt_mqc.tsv' + pattern: '*_plddt.tsv' ], [ path: { "${params.outdir}/boltz/${meta.id}" }, mode: 'copy', - pattern: '*_boltz_msa.tsv' + pattern: '*_msa.tsv' ], [ path: { "${params.outdir}/boltz/${meta.id}" }, @@ -95,7 +93,7 @@ process { [ path: { "${params.outdir}/boltz/${meta.id}/paes" }, mode: 'copy', - pattern: '*_[0-5]_pae.tsv' + pattern: '*_pae.tsv' ], [ path: { "${params.outdir}/boltz/top_ranked_structures" }, diff --git a/conf/modules_colabfold.config b/conf/modules_colabfold.config index 2382cb975..0df887596 100644 --- a/conf/modules_colabfold.config +++ b/conf/modules_colabfold.config @@ -41,14 +41,43 @@ process { [ path: { "${params.outdir}/colabfold/${meta.id}/" }, mode: 'copy', - saveAs: { filename -> - if(filename.endsWith('_pae.tsv')){ - "paes/$filename" - } else if(filename.endsWith('_plddt_mqc.tsv')){ - filename.replaceAll(/_plddt_mqc\.tsv$/, '_plddt.tsv') - } else { filename } - }, - pattern: '*.tsv' + pattern: '*_msa.tsv' + ], + [ + path: { "${params.outdir}/colabfold/${meta.id}/" }, + mode: 'copy', + pattern: '*_plddt.tsv' + ], + [ + path: { "${params.outdir}/colabfold/${meta.id}/" }, + mode: 'copy', + pattern: '*_ptm.tsv' + ], + [ + path: { "${params.outdir}/colabfold/${meta.id}/" }, + mode: 'copy', + pattern: '*_iptm.tsv' + ], + [ + path: { "${params.outdir}/colabfold/${meta.id}/" }, + mode: 'copy', + pattern: '*_ipsae.tsv' + ], + [ + path: { "${params.outdir}/colabfold/${meta.id}/" }, + mode: 'copy', + pattern: '*_chainwise_iptm.tsv' + ], + [ + path: { "${params.outdir}/colabfold/${meta.id}/" }, + mode: 'copy', + pattern: '*_chainwise_ipsae.tsv' + ], + [ + path: { "${params.outdir}/colabfold/${meta.id}/" }, + mode: 'copy', + saveAs: { filename -> "paes/$filename" }, + pattern: '*_pae.tsv' ], [ enabled: params.save_intermediates, diff --git a/conf/modules_esmfold.config b/conf/modules_esmfold.config index 77c54ecaf..7832b6398 100644 --- a/conf/modules_esmfold.config +++ b/conf/modules_esmfold.config @@ -30,8 +30,7 @@ process { [ path: { "${params.outdir}/esmfold/${meta.id}" }, mode: 'copy', - saveAs: { filename -> filename.replaceAll(/_plddt_mqc\.tsv$/, '_plddt.tsv') }, - pattern: '*_plddt_mqc.tsv' + pattern: '*_plddt.tsv' ], [ path: { "${params.outdir}/esmfold/top_ranked_structures" }, diff --git a/main.nf b/main.nf index 2c9186631..b63b20d5d 100644 --- a/main.nf +++ b/main.nf @@ -119,7 +119,7 @@ workflow NFCORE_PROTEINFOLD { PREPARE_ALPHAFOLD2_DBS.out.pdb_seqres, PREPARE_ALPHAFOLD2_DBS.out.uniprot ) - ch_multiqc = ch_multiqc.mix(ALPHAFOLD2.out.multiqc_report.collect()) + ch_multiqc = ch_multiqc.mix(ALPHAFOLD2.out.multiqc_metrics) ch_report_input = ch_report_input .mix(ALPHAFOLD2 .out @@ -197,7 +197,7 @@ workflow NFCORE_PROTEINFOLD { PREPARE_ALPHAFOLD3_DBS.out.rnacentral ) - ch_multiqc = ch_multiqc.mix(ALPHAFOLD3.out.multiqc_report) + ch_multiqc = ch_multiqc.mix(ALPHAFOLD3.out.multiqc_metrics) ch_report_input = ch_report_input .mix( ALPHAFOLD3 @@ -258,7 +258,7 @@ workflow NFCORE_PROTEINFOLD { params.colabfold_num_recycles ) - ch_multiqc = ch_multiqc.mix(COLABFOLD.out.multiqc_report) + ch_multiqc = ch_multiqc.mix(COLABFOLD.out.multiqc_metrics) ch_report_input = ch_report_input .mix(COLABFOLD.out.pdb.map { it -> [ it[0], @@ -309,7 +309,7 @@ workflow NFCORE_PROTEINFOLD { params.esmfold_num_recycles ) - ch_multiqc = ch_multiqc.mix(ESMFOLD.out.multiqc_report.collect()) + ch_multiqc = ch_multiqc.mix(ESMFOLD.out.multiqc_metrics) ch_report_input = ch_report_input.mix( ESMFOLD.out.pdb .combine(ch_dummy_file) @@ -363,7 +363,7 @@ workflow NFCORE_PROTEINFOLD { PREPARE_COLABFOLD_DBS_BOLTZ.out.uniref30, params.use_msa_server ) - ch_multiqc = ch_multiqc.mix(BOLTZ.out.multiqc_report) + ch_multiqc = ch_multiqc.mix(BOLTZ.out.multiqc_metrics) ch_report_input = ch_report_input.mix( BOLTZ.out.pdb .join(BOLTZ.out.msa) @@ -378,22 +378,19 @@ workflow NFCORE_PROTEINFOLD { // // POST PROCESSING: generate visualisation reports // + ch_multiqc_config = channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true).first() + ch_multiqc_custom_config = params.multiqc_config ? channel.fromPath( params.multiqc_config, checkIfExists: true ).first() : channel.empty() + ch_multiqc_logo = params.multiqc_logo ? channel.fromPath( params.multiqc_logo ).first() : channel.empty() + ch_multiqc_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) ch_report_template = channel.value(file("$projectDir/assets/report_template.html", checkIfExists: true)) ch_comparison_template = channel.value(file("$projectDir/assets/comparison_template.html", checkIfExists: true)) - ch_multiqc_config = channel.of(file("$projectDir/assets/multiqc_config.yml", checkIfExists: true)) - ch_multiqc_custom_config = params.multiqc_config ? channel.of(file(params.multiqc_config, checkIfExists: true)) : channel.empty() - ch_multiqc_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - // Inject msa_tool into meta based on selected model for report provenance. def msaToolMap = [ alphafold2: 'jackhmmer', alphafold3: 'jackhmmer', colabfold: 'mmseqs2', boltz: 'mmseqs2', - helixfold3: 'jackhmmer', - rosettafold2na: 'hhblits', - rosettafold_all_atom: 'hhblits', esmfold: 'None', ] ch_report_input = ch_report_input.map { tupleData -> @@ -403,6 +400,18 @@ workflow NFCORE_PROTEINFOLD { [m] + tupleData.drop(1) } + def ch_software_versions = channel.topic('versions') + .unique() + .map { process_name, tool_name, version -> + "\"${process_name}:${tool_name}\": ${version}" + } + .collectFile( + storeDir: "${params.outdir}/pipeline_info", + name: 'nf_core_proteinfold_software_mqc_versions.yml', + newLine: true, + sort: true + ) + POST_PROCESSING( params.skip_visualisation, requested_modes_size, @@ -419,26 +428,12 @@ workflow NFCORE_PROTEINFOLD { ch_multiqc_custom_config, params.multiqc_logo, ch_multiqc_methods_description, + ch_software_versions, ch_top_ranked_model ) - // Collect all version tuples emitted to the topic channel into the - // conventional pipeline-info report. This replaces the old explicit - // versions-channel plumbing while retaining the MultiQC-compatible file. - channel.topic('versions') - .unique() - .map { process_name, tool_name, version -> - "\"${process_name}:${tool_name}\": ${version}" - } - .collectFile( - storeDir: "${params.outdir}/pipeline_info", - name: 'nf_core_proteinfold_software_mqc_versions.yml', - newLine: true, - sort: true - ) - emit: - multiqc_report = ch_multiqc + multiqc_report = POST_PROCESSING.out.multiqc_report } /* diff --git a/modules.json b/modules.json index 28ef686db..213a2b5ad 100644 --- a/modules.json +++ b/modules.json @@ -34,9 +34,8 @@ }, "multiqc": { "branch": "master", - "git_sha": "008f9d3e61209bf995edac3ba531f54e269e1215", - "installed_by": ["modules"], - "patch": "modules/nf-core/multiqc/multiqc.diff" + "git_sha": "98403d15b0e50edae1f3fec5eae5e24982f1fade", + "installed_by": ["modules"] }, "untar": { "branch": "master", diff --git a/modules/local/colabfold_batch/main.nf b/modules/local/colabfold_batch/main.nf index 16a0031e4..b2e565ade 100644 --- a/modules/local/colabfold_batch/main.nf +++ b/modules/local/colabfold_batch/main.nf @@ -14,7 +14,7 @@ process COLABFOLD_BATCH { tuple val(meta), path ("${meta.id}_colabfold.pdb") , emit: top_ranked_pdb tuple val(meta), path ("raw/*relaxed_rank_*.pdb") , emit: pdb tuple val(meta), path ("${meta.id}_colabfold_msa.tsv") , emit: msa - tuple val(meta), path ("${meta.id}_plddt_mqc.tsv") , emit: multiqc + tuple val(meta), path ("${meta.id}_plddt.tsv") , emit: plddt tuple val(meta), path ("${meta.id}_*_pae.tsv") , optional: true, emit: paes tuple val(meta), path ("${meta.id}_1_pae.tsv") , optional: true, emit: pae tuple val(meta), path ("${meta.id}_ptm.tsv") , optional: true, emit: ptms @@ -96,7 +96,7 @@ process COLABFOLD_BATCH { touch ./${meta.id}_ipsae.tsv touch ./${meta.id}_chainwise_iptm.tsv touch ./${meta.id}_chainwise_ipsae.tsv - touch ./${meta.id}_plddt_mqc.tsv + touch ./${meta.id}_plddt.tsv touch ./${meta.id}_colabfold_msa.tsv """ } diff --git a/modules/local/colabfold_batch/meta.yml b/modules/local/colabfold_batch/meta.yml index 538ccbc27..7fef2ff38 100644 --- a/modules/local/colabfold_batch/meta.yml +++ b/modules/local/colabfold_batch/meta.yml @@ -44,14 +44,14 @@ output: type: file description: ColabFold multiple sequence alignment metrics. pattern: "*_colabfold_msa.tsv" - multiqc: + plddt: - - meta: type: map description: Groovy Map containing sample information. - - "${meta.id}_plddt_mqc.tsv": + - "${meta.id}_plddt.tsv": type: file description: pLDDT metrics formatted for MultiQC. - pattern: "*_plddt_mqc.tsv" + pattern: "*_plddt.tsv" paes: - - meta: type: map diff --git a/modules/local/combine_uniprot/main.nf b/modules/local/combine_uniprot/main.nf index 7328eb84e..edc8c90fd 100644 --- a/modules/local/combine_uniprot/main.nf +++ b/modules/local/combine_uniprot/main.nf @@ -12,7 +12,7 @@ process COMBINE_UNIPROT { output: path ('uniprot.fasta'), emit: ch_db - tuple val("${task.process}"), val('sed'), eval('sed --version 2>&1 | sed "s/^.*GNU sed) //; s/ .*$//"'), emit: versions_sed, topic: versions + tuple val("${task.process}"), val('sed'), eval('sed --version 2>&1 | sed -n "s/^.*GNU sed) //p"'), emit: versions_sed, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/generate_multiqc_contents/environment.yml b/modules/local/generate_multiqc_contents/environment.yml new file mode 100644 index 000000000..451d9e166 --- /dev/null +++ b/modules/local/generate_multiqc_contents/environment.yml @@ -0,0 +1,5 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge +dependencies: + - conda-forge::python=3.12 diff --git a/modules/local/generate_multiqc_contents/generate_multiqc_contents.py b/modules/local/generate_multiqc_contents/generate_multiqc_contents.py new file mode 100755 index 000000000..4766d0a94 --- /dev/null +++ b/modules/local/generate_multiqc_contents/generate_multiqc_contents.py @@ -0,0 +1,381 @@ +#!/usr/bin/env python3 +"""Generate MultiQC custom content for one prediction mode. + +Reads the routed metric TSVs and writes proteinfold__generalstats_mqc.json +and proteinfold__plddt_lineplot_mqc.json for the stock MULTIQC module. +""" + +import argparse +import csv +import json +import math +import re +import sys +from pathlib import Path + +MODE_LABELS = { + "alphafold2": "AlphaFold2", + "alphafold3": "AlphaFold3", + "colabfold": "ColabFold", + "esmfold": "ESMFold", + "boltz": "Boltz", +} + +ROUTED_SUFFIXES = ("_plddt", "_msa", "_iptm", "_ptm") + +RANK_COLUMN_RE = re.compile(r"^rank_(\d+)$") + + + + +def warn(message): + """Print a warning to stderr; warnings never abort the report.""" + print(f"WARNING: {message}", file=sys.stderr) + + +def fail(message): + """Print an error and exit non-zero (pipeline wiring problems only).""" + print(f"ERROR: {message}", file=sys.stderr) + sys.exit(2) + + +def clean_float(value): + """Return a finite float, or None for missing/NaN/infinite values.""" + try: + number = float(value) + except (TypeError, ValueError): + return None + return number if math.isfinite(number) else None + + +def classify_metric(filename): + """Map a metric file name to a routed metric, or None if not summarised.""" + is_chainwise = "_chainwise_" in filename + if filename.endswith("_plddt.tsv"): + return None if is_chainwise else "plddt" + if filename.endswith("_msa.tsv"): + return None if is_chainwise else "msa" + if filename.endswith("_iptm.tsv") and not filename.endswith("_chainwise_iptm.tsv"): + return "iptm" + if filename.endswith("_ptm.tsv") and not filename.endswith("_chainwise_ptm.tsv"): + return "ptm" + return None + + +def sample_id_from_fn(filename, model_key): + """Derive the sample id from a routed metric file name. + + Strips the metric suffix and, for MSA files, the prediction-mode infix the + extractors bake into ``__msa.tsv``. The result is the sample id + shared by every metric of one prediction. + """ + stem = filename[:-4] if filename.lower().endswith(".tsv") else filename + for suffix in ROUTED_SUFFIXES: + if stem.endswith(suffix): + stem = stem[: -len(suffix)] + break + else: + return None + if filename.endswith("_msa.tsv"): + infix = f"_{model_key}" + if stem.endswith(infix): + stem = stem[: -len(infix)] + return stem + + +def set_metric(rows, sample_name, column, value, source): + """Set a metric, warning on duplicate-id collapse (the samplesheet does not enforce unique ids).""" + if column in rows.setdefault(sample_name, {}): + warn( + f"Duplicate sample data: '{sample_name}' already has '{column}' values; " + f"values from {Path(source).name} overwrite the earlier file. " + "The input samplesheet schema does not enforce unique ids." + ) + rows[sample_name][column] = value + + +def parse_plddt(filepath, sample_name, rows, line_series): + """Per-rank mean pLDDT plus per-residue series; the parent row is the top-ranked model.""" + with open(filepath, newline="") as handle: + table = [row for row in csv.reader(handle, delimiter="\t") if row] + if not table: + warn(f"pLDDT file {filepath.name} is empty; skipping") + return + header, data_rows = table[0], table[1:] + if len(header) < 2 or str(header[0]).strip().lower() != "positions": + warn(f"pLDDT file {filepath.name} has no 'Positions' header column; skipping") + return + + rank_cols = [] + seen_ranks = set() + for index, column in enumerate(header[1:]): + match = RANK_COLUMN_RE.match(str(column).strip()) + if match and match.group(1) not in seen_ranks: + rank_cols.append((index + 1, match.group(1))) + seen_ranks.add(match.group(1)) + elif match: + warn(f"pLDDT file {filepath.name}: ignoring duplicate column '{column}'") + else: + warn(f"pLDDT file {filepath.name}: ignoring unexpected column '{column}'") + if not rank_cols: + warn(f"pLDDT file {filepath.name} has no rank_ columns; skipping") + return + + rank_means = {} + rank_points = {} + bad_positions = 0 + for index, rank_num in rank_cols: + points = [] + values = [] + for row in data_rows: + if index >= len(row): + continue + try: + position = int(str(row[0]).strip()) + except (TypeError, ValueError): + bad_positions += 1 + continue + value = clean_float(row[index]) + if value is None: + continue # drop NaN/inf: they must not reach the JSON output + points.append([position, value]) + values.append(value) + if points: + points.sort(key=lambda point: point[0]) + rank_points[rank_num] = points + if values: + rank_means[rank_num] = sum(values) / len(values) + if bad_positions: + warn(f"pLDDT file {filepath.name}: ignored {bad_positions} row(s) with non-integer positions") + + if not rank_means: + warn(f"pLDDT file {filepath.name} yielded no usable rank values; skipping") + return + + top_rank = min(rank_means, key=int) + set_metric(rows, sample_name, "mean_plddt", rank_means[top_rank], filepath) + for rank_num, mean in rank_means.items(): + if rank_num == top_rank: + continue + set_metric(rows, f"{sample_name}_rank_{rank_num}", "mean_plddt", mean, filepath) + if rank_points: + line_series.setdefault(sample_name, {}) + for rank_num, points in rank_points.items(): + line_series[sample_name][f"rank_{rank_num}"] = points + + +def parse_ranked_score(filepath, sample_name, metric, rows): + """Header-less two-column (rank, value) score files such as ipTM / pTM. + + The parent row carries the top-ranked (numerically lowest) model's score; + every other rank becomes a ``_rank_N`` sub-sample row. + """ + scores = {} + with open(filepath, newline="") as handle: + for fields in csv.reader(handle, delimiter="\t"): + if len(fields) < 2: + continue + value = clean_float(fields[1]) + if value is None: + continue + try: + rank = int(str(fields[0]).strip()) + except (TypeError, ValueError): + continue # non-integer rows are not rank rows + scores[rank] = value + if not scores: + warn(f"{metric} file {filepath.name} yielded no usable values; skipping") + return + + top_rank = min(scores) + set_metric(rows, sample_name, metric, scores[top_rank], filepath) + for rank, value in scores.items(): + if rank == top_rank: + continue + set_metric(rows, f"{sample_name}_rank_{rank}", metric, value, filepath) + + +def parse_msa(filepath, sample_name, rows): + """MSA depth: the number of sequence rows in ``[_]_msa.tsv``.""" + with open(filepath) as handle: + depth = sum(1 for line in handle if line.strip()) + if depth == 0: + warn(f"MSA file {filepath.name} is empty; skipping") + return + set_metric(rows, sample_name, "msa_depth", depth, filepath) + + +GENERALSTATS_HEADERS = { + "msa_depth": { + "title": "Related sequence depth (MSA)", + "description": "The number of related sequences (across the whole protein) that could be retrieved from the " + "MSA (Multiple Sequence Alignment) stage", + "namespace": "proteinfold", + "format": "{:,.0f}", + }, + "mean_plddt": { + "title": "Structure confidence (average pLDDT)", + "description": "Structure prediction confidence score across all residues in the top ranked protein " + "structure - from the mean pLDDT (predicted Local Distance Difference Test) value", + "namespace": "proteinfold", + "max": 100, + "min": 0, + "cond_formatting_rules": { + "very-low": [{"lt": 50}], + "low": [{"gt": 50}, {"lt": 70}], + "high": [{"gt": 70}, {"lt": 90}], + "very-high": [{"gt": 90}], + }, + "cond_formatting_colours": [ + {"very-low": "#f0743e"}, + {"low": "#f9d613"}, + {"high": "#60c2e8"}, + {"very-high": "#014ecc"}, + ], + }, + "iptm": { + "title": "Interface accuracy (ipTM)", + "description": "Accuracy of the relative positions of two protein subunits from a multimer calculation - " + "from the ipTM (interface predicted Template Modelling) score", + "namespace": "proteinfold", + "max": 1, + "min": 0, + "format": "{:,.2f}", + "scale": "Purples", + }, + "ptm": { + "title": "Global accuracy (TM)", + "description": "Global accuracy of the protein folded, less sensitive to localised inaccuracies than raw 3D " + "atomic deviations (RMSD) - from the pTM (predicted Template Modelling) score", + "namespace": "proteinfold", + "max": 1, + "min": 0, + "format": "{:,.2f}", + "scale": "Blues", + }, +} + +LINEGRAPH_PCONFIG = { + "id": "proteinfold_plddt_lineplot", + "title": "ProteinFold: pLDDT by Position", + "xlab": "Residue Position", + "ylab": "pLDDT Score", + "ymin": 0, + "ymax": 100, +} + + +def dump_json(path, payload): + """Write JSON, refusing to emit NaN/Infinity tokens (allow_nan=False).""" + with open(path, "w") as handle: + json.dump(payload, handle, indent=2, allow_nan=False, sort_keys=False) + handle.write("\n") + + +def main(argv=None): + parser = argparse.ArgumentParser( + description="Generate MultiQC custom-content JSON from proteinfold metric TSVs." + ) + parser.add_argument( + "--model", + required=True, + help="Prediction-mode key from the pipeline meta map (e.g. alphafold2, boltz); " + "sample names are qualified with this mode, never with 'UNKNOWN'.", + ) + parser.add_argument("--output-dir", default=".", help="Directory to write the *_mqc.json files into") + parser.add_argument("metric_files", nargs="+", help="Routed metric TSVs (_plddt/_msa/_ptm/_iptm)") + args = parser.parse_args(argv) + + model_key = (args.model or "").strip() + if not model_key: + fail("No prediction mode given (--model); refusing to emit '_UNKNOWN' sample names") + mode_label = MODE_LABELS.get(model_key, model_key) + + rows = {} + line_series = {} + parsed_files = 0 + for raw_path in args.metric_files: + filepath = Path(raw_path) + metric = classify_metric(filepath.name) + if metric is None: + warn( + f"{filepath.name}: not a summarised metric (PAE/ipSAE/chainwise or unknown); " + "it stays in the detailed GENERATE_REPORT viewer and produces no bulk rows" + ) + continue + sample_id = sample_id_from_fn(filepath.name, model_key) + if not sample_id: + warn(f"Could not derive a sample id from {filepath.name}; skipping") + continue + sample_name = f"{sample_id}_{mode_label}" + if metric == "plddt": + parse_plddt(filepath, sample_name, rows, line_series) + elif metric == "msa": + parse_msa(filepath, sample_name, rows) + else: + parse_ranked_score(filepath, sample_name, metric, rows) + parsed_files += 1 + + if not args.metric_files: + fail("No metric files were passed; the MULTIQC input channel is miswired") + if parsed_files == 0: + fail("None of the input files matched a routed metric (_plddt/_msa/_ptm/_iptm); the MULTIQC input channel is miswired") + + metrics_seen = {column for data in rows.values() for column in data} + headers = {column: dict(GENERALSTATS_HEADERS[column]) for column in GENERALSTATS_HEADERS if column in metrics_seen} + generalstats = { + "id": "proteinfold", + "section_name": "ProteinFold", + "description": "Summary metrics for protein structure prediction " + "(average pLDDT, MSA depth, pTM and ipTM per prediction)", + "plot_type": "generalstats", + "headers": headers, + "data": rows, + } + + datasets = [] + data_labels = [] + for sample_name in sorted(line_series): + if not line_series[sample_name]: + continue + datasets.append(line_series[sample_name]) + data_labels.append({"name": sample_name, "ylab": "pLDDT score"}) + + output_dir = Path(args.output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + generalstats_path = output_dir / f"proteinfold_{model_key}_generalstats_mqc.json" + dump_json(generalstats_path, generalstats) + + linegraph_path = None + if datasets: + pconfig = dict(LINEGRAPH_PCONFIG) + pconfig["data_labels"] = data_labels + linegraph = { + "id": "proteinfold_plddt_lineplot", + "section_name": "ProteinFold: pLDDT by Position", + "description": "Per-residue confidence scores across all predicted ranks " + "(switch between predictions with the tabs above the plot)", + "plot_type": "linegraph", + "pconfig": pconfig, + "data": datasets, + } + linegraph_path = output_dir / f"proteinfold_{model_key}_plddt_lineplot_mqc.json" + dump_json(linegraph_path, linegraph) + + if linegraph_path is None: + print( + f"Generated {generalstats_path.name} from {parsed_files} metric file(s): " + f"{len(rows)} sample row(s), no per-residue pLDDT series" + ) + else: + print( + f"Generated {generalstats_path.name} and {linegraph_path.name} " + f"from {parsed_files} metric file(s): {len(rows)} sample row(s), " + f"{len(datasets)} pLDDT dataset(s), " + f"metrics seen: {', '.join(sorted(metrics_seen)) or 'none'}" + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/modules/local/generate_multiqc_contents/main.nf b/modules/local/generate_multiqc_contents/main.nf new file mode 100644 index 000000000..eed272fd9 --- /dev/null +++ b/modules/local/generate_multiqc_contents/main.nf @@ -0,0 +1,42 @@ +process GENERATE_MULTIQC_CONTENTS { + tag "$meta.model" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/de/deb97ccf27bd258b3f42fccf4fbc19e5cefe8582359699e12a808bdedb2cc5a8/data' : + 'community.wave.seqera.io/library/pip_pyyaml:c2bd49f8575c1263' }" + + input: + tuple val(meta), path(metric_files) + path(generator_script) + + output: + tuple val(meta), path("*_mqc.json"), emit: mqc_json + tuple val("${task.process}"), val('python'), eval("python3 --version | sed 's/Python //g'"), emit: versions_python, topic: versions + tuple val("${task.process}"), val('generate_multiqc_contents.py'), eval("python3 --version | sed 's/Python //g'"), emit: versions_generator, topic: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + """ + python3 ${generator_script} \\ + --model ${meta.model} \\ + --output-dir ./ \\ + ${metric_files.join(' ')} \\ + $args + """ + + stub: + """ + touch proteinfold_${meta.model}_generalstats_mqc.json proteinfold_${meta.model}_plddt_lineplot_mqc.json + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python3 --version | sed 's/Python //g') + generate_multiqc_contents.py: \$(python3 --version) + END_VERSIONS + """ +} diff --git a/modules/local/generate_multiqc_contents/meta.yml b/modules/local/generate_multiqc_contents/meta.yml new file mode 100644 index 000000000..4421fc3f8 --- /dev/null +++ b/modules/local/generate_multiqc_contents/meta.yml @@ -0,0 +1,69 @@ +name: generate_multiqc_contents +description: Generate MultiQC custom-content JSON (general statistics and per-residue pLDDT line plot) from proteinfold metric TSVs +keywords: + - multiqc + - custom content + - quality control +tools: + - python: + description: | + The Python standard library is used to convert the pipeline metric TSVs + into self-contained MultiQC custom-content JSON files. + homepage: https://www.python.org/ + documentation: https://docs.python.org/3/library/index.html + licence: + - "PSF-2.0" +input: + - - meta: + type: map + description: | + Groovy map with `id` and `model` set to the prediction mode. The + `model` value (e.g. alphafold2, boltz) qualifies every sample name. + - metric_files: + type: file + description: | + Routed metric TSVs written by bin/extract_metrics.py for one + prediction mode: `_plddt.tsv`, `[_]_msa.tsv`, + `_ptm.tsv` and `_iptm.tsv`. PAE, ipSAE and chainwise files + are deliberately not routed here. + - generator_script: + type: file + description: The generate_multiqc_contents.py script to execute. +output: + - mqc_json: + - - meta: + type: map + description: | + Groovy map with the prediction-mode provenance (passthrough). + - "*_mqc.json": + type: file + description: | + Self-contained MultiQC custom-content JSON files: a generalstats + file (mean pLDDT, MSA depth, pTM, ipTM) and a linegraph file + (per-residue pLDDT with one switcher dataset per prediction and + one series per ranked model). + - versions_python: + - - ${task.process}: + type: string + description: The process the versions were collected from + - python: + type: string + description: The tool name + - python3 --version | sed 's/Python //g': + type: eval + description: The expression to obtain the version of the tool + - versions_generator: + - - ${task.process}: + type: string + description: The process the versions were collected from + - generate_multiqc_contents.py: + type: string + description: The tool name + - python3 --version | sed 's/Python //g': + type: eval + description: The expression to obtain the version of the tool +authors: + - "@keiran-rowell-unsw" +maintainers: + - "@keiran-rowell-unsw" + - "@jscgh" diff --git a/modules/local/generate_multiqc_contents/tests/main.nf.test b/modules/local/generate_multiqc_contents/tests/main.nf.test new file mode 100644 index 000000000..cc7e2adf8 --- /dev/null +++ b/modules/local/generate_multiqc_contents/tests/main.nf.test @@ -0,0 +1,110 @@ +nextflow_process { + + name "Test Process GENERATE_MULTIQC_CONTENTS" + script "../main.nf" + process "GENERATE_MULTIQC_CONTENTS" + + tag "modules" + tag "modules_local" + tag "generate_multiqc_contents" + tag "multiqc" + profile "test_nostub" + + test("generates mode-qualified general stats and rank rows (boltz shape)") { + + when { + process { + """ + input[0] = [ + [ model: 'boltz' ], + [ + file(params.pipelines_testdata_base_path + 'testdata/metrics/S2_plddt.tsv', checkIfExists: true), + file(params.pipelines_testdata_base_path + 'testdata/metrics/S2_boltz_msa.tsv', checkIfExists: true), + file(params.pipelines_testdata_base_path + 'testdata/metrics/S2_ptm.tsv', checkIfExists: true), + file(params.pipelines_testdata_base_path + 'testdata/metrics/S2_iptm.tsv', checkIfExists: true), + file(params.pipelines_testdata_base_path + 'testdata/metrics/S2_0_pae.tsv', checkIfExists: true), + file(params.pipelines_testdata_base_path + 'testdata/metrics/S2_chainwise_iptm.tsv', checkIfExists: true) + ], + ] + input[1] = file("${projectDir}/modules/local/generate_multiqc_contents/generate_multiqc_contents.py", checkIfExists: true) + """ + } + } + + then { + def jsonSlurper = new groovy.json.JsonSlurper() + def outs = process.out.mqc_json[0][1] +def files = (outs instanceof List ? outs : [outs]).collect { file(it) } + def generalstats = jsonSlurper.parse(files.find { it.toString().contains('generalstats') }) + def linegraph = jsonSlurper.parse(files.find { it.toString().contains('plddt_lineplot') }) + def near = { value, expected -> Math.abs(value - expected) < 1e-9 } + assertAll( + { assert process.success }, + { assert snapshot(process.out.mqc_json).match() }, + { + assert generalstats.data.keySet() == + ['S2_Boltz', 'S2_Boltz_rank_1', 'S2_Boltz_rank_2'] as Set + assert near(generalstats.data['S2_Boltz'].mean_plddt, 88.23333333333333) + assert generalstats.data['S2_Boltz'].msa_depth == 3 + assert near(generalstats.data['S2_Boltz'].iptm, 0.83) + assert near(generalstats.data['S2_Boltz_rank_1'].mean_plddt, 80.76666666666667) + assert generalstats.headers.keySet() == ['msa_depth', 'mean_plddt', 'iptm', 'ptm'] as Set + }, + { + assert files.size() == 2 + assert linegraph.plot_type == 'linegraph' + assert linegraph.pconfig.ymax == 100 + assert linegraph.pconfig.data_labels == [[name: 'S2_Boltz', ylab: 'pLDDT score']] + assert linegraph.data.size() == 1 + assert linegraph.data[0].keySet() == ['rank_0', 'rank_1', 'rank_2'] as Set + assert linegraph.data[0]['rank_0'] == [[1, 88.0], [2, 87.5], [3, 89.2]] + assert linegraph.data[0]['rank_2'] == [[1, 71.5], [2, 72.3]] + assert !files.find { it.toString().contains('generalstats') }.text.contains('NaN') + assert !files.find { it.toString().contains('generalstats') }.text.contains('Infinity') + }, + { + def raw = (files.collect { it.text }).join('\n') + assert !raw.contains('pae') + assert !raw.contains('chainwise') + assert !raw.contains('UNKNOWN') + } + ) + } + } + + test("generates a single-rank row without extra columns (esmfold shape)") { + + when { + process { + """ + input[0] = [ + [ model: 'esmfold' ], + [ file(params.pipelines_testdata_base_path + 'testdata/metrics/S1_plddt.tsv', checkIfExists: true) ], + ] + input[1] = file("${projectDir}/modules/local/generate_multiqc_contents/generate_multiqc_contents.py", checkIfExists: true) + """ + } + } + + then { + def jsonSlurper = new groovy.json.JsonSlurper() + def outs = process.out.mqc_json[0][1] +def files = (outs instanceof List ? outs : [outs]).collect { file(it) } + def generalstats = jsonSlurper.parse(files.find { it.toString().contains('generalstats') }) + def linegraph = jsonSlurper.parse(files.find { it.toString().contains('plddt_lineplot') }) + assertAll( + { assert process.success }, + { + assert generalstats.data.keySet() == ['S1_ESMFold'] as Set + assert Math.abs(generalstats.data['S1_ESMFold'].mean_plddt - 92.33333333333333) < 1e-9 + assert generalstats.headers.keySet() == ['mean_plddt'] as Set + assert !generalstats.data['S1_ESMFold'].containsKey('msa_depth') + assert files.size() == 2 + assert linegraph.data.size() == 1 + assert linegraph.pconfig.data_labels[0].name == 'S1_ESMFold' + assert linegraph.data[0]['rank_0'] == [[1, 92.2], [2, 91.8], [3, 93.0]] + } + ) + } + } +} diff --git a/modules/local/generate_multiqc_contents/tests/main.nf.test.snap b/modules/local/generate_multiqc_contents/tests/main.nf.test.snap new file mode 100644 index 000000000..ecc97a64e --- /dev/null +++ b/modules/local/generate_multiqc_contents/tests/main.nf.test.snap @@ -0,0 +1,22 @@ +{ + "generates mode-qualified general stats and rank rows (boltz shape)": { + "content": [ + [ + [ + { + "model": "boltz" + }, + [ + "proteinfold_boltz_generalstats_mqc.json:md5,ddcc57c69e643b124bfe9a204a8e9cb5", + "proteinfold_boltz_plddt_lineplot_mqc.json:md5,894362b85cc84679cfeb5244d8677c3f" + ] + ] + ] + ], + "timestamp": "2026-09-30T14:37:23.40929661", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/local/generate_report/tests/main.nf.test b/modules/local/generate_report/tests/main.nf.test new file mode 100644 index 000000000..b41b145fd --- /dev/null +++ b/modules/local/generate_report/tests/main.nf.test @@ -0,0 +1,56 @@ +nextflow_process { + name "Test Process GENERATE_REPORT" + script "../main.nf" + process "GENERATE_REPORT" + tag "modules" + tag "modules_local" + tag "generate_report" + tag "security" + + profile "test_nostub" + + test("report generation carries full config, injection-safe blob, and clean download naming") { + when { + process { + """ + input[0] = tuple( + [id: 'S1', model: 'boltz'], + [file(params.pipelines_testdata_base_path + 'testdata/models/rank_0.pdb', checkIfExists: true), file(params.pipelines_testdata_base_path + 'testdata/models/rank_1.pdb', checkIfExists: true)], + [file("${projectDir}/assets/NO_FILE")], + [file("${projectDir}/assets/NO_FILE")], + [file(params.pipelines_testdata_base_path + 'testdata/metrics/S1_scalar.tsv', checkIfExists: true)], + [file(params.pipelines_testdata_base_path + 'testdata/metrics/S1_scalar.tsv', checkIfExists: true)], + [file(params.pipelines_testdata_base_path + 'testdata/metrics/S1_chainwise.tsv', checkIfExists: true)], + [file(params.pipelines_testdata_base_path + 'testdata/metrics/S1_chainwise.tsv', checkIfExists: true)] + ) + input[1] = file("${projectDir}/assets/report_template.html", checkIfExists: true) + """ + } + } + then { + assert process.success + def html = path(process.out.report[0][1]).text + def matcher = html =~ /(?s)" + assert config.chainwise_iptm[0].chains.contains(payload) && config.chainwise_ipsae[0].chains.contains(payload) + assert !html.contains("") + assert !((html =~ /(?s)const renderScoreMatrix = .*?const updatePairScoreTables/)[0]).contains("innerHTML") + assert html.contains('onclick="downloadStructure()"') && !html.contains("downloadPdb") + assert html.contains('id="structure-download-label"') && html.contains('structure-download-label").textContent') + assert (html =~ /image\.id =/).count == 1 + def downloader = (html =~ /(?s)const downloadStructure = .*?const makeDownload/)[0] + assert downloader.contains("MODELS[state.model]") + assert !downloader.contains(".cif.cif") && !downloader.contains("SAMPLE_NAME") + assert html.contains("const modelLabel = ") + } + } +} diff --git a/modules/local/mmseqs_colabfoldsearch/main.nf b/modules/local/mmseqs_colabfoldsearch/main.nf index a05c79ea4..e87b6acd1 100644 --- a/modules/local/mmseqs_colabfoldsearch/main.nf +++ b/modules/local/mmseqs_colabfoldsearch/main.nf @@ -14,7 +14,7 @@ process MMSEQS_COLABFOLDSEARCH { tuple val(meta), path("**.a3m"), emit: a3m tuple val(meta), path("**.json"), emit: json tuple val("${task.process}"), val('colabfold_search'), eval("pip list | grep \"^colabfold\" | awk '{print \\\$2}' 2>/dev/null || echo \"unknown\""), emit: versions_colabfold_search, topic: versions - tuple val("${task.process}"), val('mmseqs'), eval("mmseqs version"), emit: versions_mmseqs, topic: versions + tuple val("${task.process}"), val('mmseqs'), eval("mmseqs version 2>/dev/null | head -1"), emit: versions_mmseqs, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/multifasta_to_csv/main.nf b/modules/local/multifasta_to_csv/main.nf index 44dbaa268..42ec63d14 100644 --- a/modules/local/multifasta_to_csv/main.nf +++ b/modules/local/multifasta_to_csv/main.nf @@ -12,7 +12,7 @@ process MULTIFASTA_TO_CSV { output: tuple val(meta), path("input.csv"), emit: input_csv - tuple val("${task.process}"), val('sed'), eval('sed --version 2>&1 | sed "s/^.*GNU sed) //; s/ .*$//"'), emit: versions_sed, topic: versions + tuple val("${task.process}"), val('sed'), eval('sed --version 2>&1 | sed -n "s/^.*GNU sed) //p"'), emit: versions_sed, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/multifasta_to_singlefasta/main.nf b/modules/local/multifasta_to_singlefasta/main.nf index b223fbbd8..5f490ce73 100644 --- a/modules/local/multifasta_to_singlefasta/main.nf +++ b/modules/local/multifasta_to_singlefasta/main.nf @@ -12,7 +12,7 @@ process MULTIFASTA_TO_SINGLEFASTA { output: tuple val(meta), path("${meta.id}.fasta"), emit: input_fasta - tuple val("${task.process}"), val('sed'), eval('sed --version 2>&1 | sed "s/^.*GNU sed) //; s/ .*$//"'), emit: versions_sed, topic: versions + tuple val("${task.process}"), val('sed'), eval('sed --version 2>&1 | sed -n "s/^.*GNU sed) //p"'), emit: versions_sed, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/run_alphafold2_pred/main.nf b/modules/local/run_alphafold2_pred/main.nf index e955052e5..2ce9a54c9 100644 --- a/modules/local/run_alphafold2_pred/main.nf +++ b/modules/local/run_alphafold2_pred/main.nf @@ -27,7 +27,7 @@ process RUN_ALPHAFOLD2_PRED { tuple val(meta), path ("${meta.id}_alphafold2.pdb") , emit: top_ranked_pdb tuple val(meta), path ("raw/ranked*.pdb") , emit: pdb tuple val(meta), path ("${meta.id}_alphafold2_msa.tsv"), emit: msa - tuple val(meta), path ("${meta.id}_plddt_mqc.tsv") , emit: multiqc + tuple val(meta), path ("${meta.id}_plddt.tsv") , emit: plddt //Note: alphafold2_model_preset == "monomer" the pae file won't exist. tuple val(meta), path ("${meta.id}_*_pae.tsv") , optional: true, emit: paes tuple val(meta), path ("${meta.id}_0_pae.tsv") , optional: true, emit: pae @@ -77,7 +77,7 @@ process RUN_ALPHAFOLD2_PRED { stub: """ touch "${meta.id}_alphafold2.pdb" - touch "${meta.id}_plddt_mqc.tsv" + touch "${meta.id}_plddt.tsv" touch "${meta.id}_alphafold2_msa.tsv" touch "${meta.id}_0_pae.tsv" touch "${meta.id}_ptm.tsv" diff --git a/modules/local/run_alphafold2_pred/meta.yml b/modules/local/run_alphafold2_pred/meta.yml index f916a2331..0a88cf7c9 100644 --- a/modules/local/run_alphafold2_pred/meta.yml +++ b/modules/local/run_alphafold2_pred/meta.yml @@ -82,11 +82,11 @@ output: - "${meta.id}_alphafold2_msa.tsv": type: file description: Multiple sequence alignment metrics. - multiqc: + plddt: - - meta: type: map description: Groovy Map containing sample information. - - "${meta.id}_plddt_mqc.tsv": + - "${meta.id}_plddt.tsv": type: file description: pLDDT metrics for MultiQC. paes: diff --git a/modules/local/run_alphafold2_pred/tests/main.nf.test b/modules/local/run_alphafold2_pred/tests/main.nf.test index 5bec17496..b2763355e 100644 --- a/modules/local/run_alphafold2_pred/tests/main.nf.test +++ b/modules/local/run_alphafold2_pred/tests/main.nf.test @@ -36,7 +36,9 @@ nextflow_process { def paramsPattern = db.startsWith('s3://') ? db + '/params/alphafold_params_2022-12-06/*' : - db + '/params/alphafold_params/*' + (file(db + '/params/alphafold_params_2022-12-06').exists() ? + db + '/params/alphafold_params_2022-12-06/*' : + db + '/params/alphafold_params/*') input[0] = [[id: 'T1026'], file(params.pipelines_testdata_base_path + 'testdata/sequences/T1026.fasta', checkIfExists: true), features, 'monomer_ptm'] input[1] = files(paramsPattern, checkIfExists: true) @@ -56,14 +58,14 @@ nextflow_process { then { def topRanked = path(process.out.top_ranked_pdb[0][1]) - def plddt = path(process.out.multiqc[0][1]) + def plddt = path(process.out.plddt[0][1]) assertAll( { assert process.success }, { assert process.out.top_ranked_pdb[0][0].id == 'T1026' }, { assert topRanked.size() > 0 }, { assert topRanked.text.contains('ATOM') }, { assert plddt.size() > 0 }, - { assert process.out.versions } + { assert process.out.versions_alphafold2 } ) } } diff --git a/modules/local/run_alphafold3_inference/main.nf b/modules/local/run_alphafold3_inference/main.nf index 5fe1eea0a..340879c44 100644 --- a/modules/local/run_alphafold3_inference/main.nf +++ b/modules/local/run_alphafold3_inference/main.nf @@ -15,7 +15,7 @@ process RUN_ALPHAFOLD3_INFERENCE { path ("raw/**") , emit: raw tuple val(meta), path ("${meta.id}_alphafold3.cif") , emit: top_ranked_cif tuple val(meta), path ("raw/*ranked_*.cif") , emit: cif - tuple val(meta), path ("${meta.id}_plddt_mqc.tsv") , emit: multiqc + tuple val(meta), path ("${meta.id}_plddt.tsv") , emit: plddt tuple val(meta), path ("${meta.id}_alphafold3_msa.tsv") , emit: msa tuple val(meta), path ("${meta.id}_0_pae.tsv") , emit: pae tuple val(meta), path ("${meta.id}_ptm.tsv") , emit: ptms @@ -103,7 +103,7 @@ process RUN_ALPHAFOLD3_INFERENCE { touch raw/ranked_2_${prefix}.cif touch raw/ranked_3_${prefix}.cif touch raw/ranked_4_${prefix}.cif - touch ${prefix}_plddt_mqc.tsv + touch ${prefix}_plddt.tsv touch ${prefix}_alphafold3_msa.tsv touch ${prefix}_0_pae.tsv touch ${prefix}_ptm.tsv diff --git a/modules/local/run_alphafold3_inference/tests/main.nf.test b/modules/local/run_alphafold3_inference/tests/main.nf.test index be35a1bc3..ff80e3613 100644 --- a/modules/local/run_alphafold3_inference/tests/main.nf.test +++ b/modules/local/run_alphafold3_inference/tests/main.nf.test @@ -37,7 +37,7 @@ nextflow_process { then { def topRanked = path(process.out.top_ranked_cif[0][1]) - def plddt = path(process.out.multiqc[0][1]) + def plddt = path(process.out.plddt[0][1]) def pae = path(process.out.pae[0][1]) assertAll( { assert process.success }, diff --git a/modules/local/run_boltz/main.nf b/modules/local/run_boltz/main.nf index 26a74bf67..ee05662ca 100644 --- a/modules/local/run_boltz/main.nf +++ b/modules/local/run_boltz/main.nf @@ -19,20 +19,19 @@ process RUN_BOLTZ { output: tuple val(meta), path ("boltz_results_${meta.id}") , optional: true, emit: intermediates tuple val(meta), path ("boltz_results_${meta.id}/predictions/${meta.id}/confidence*.json") , emit: confidence - tuple val(meta), path ("${meta.id}_plddt_mqc.tsv") , emit: multiqc + tuple val(meta), path ("${meta.id}_plddt.tsv") , emit: plddt tuple val(meta), path ("${meta.id}_boltz.cif") , emit: top_ranked_pdb tuple val(meta), path ("boltz_results_${meta.id}/predictions/${meta.id}/*.cif") , emit: pdb - tuple val(meta), path ("boltz_results_${meta.id}/predictions/${meta.id}/plddt_*model_0.npz"), emit: plddt - tuple val(meta), path ("boltz_results_${meta.id}/predictions/${meta.id}/pae_*model_0.npz") , emit: pae - tuple val(meta), path ("${meta.id}_plddt_mqc.tsv") , emit: plddt_raw - tuple val(meta), path ("${meta.id}_boltz_msa.tsv") , emit: msa_raw - tuple val(meta), path ("${meta.id}_*_pae.tsv") , emit: pae_raw - tuple val(meta), path ("${meta.id}_ptm.tsv") , emit: ptm_raw - tuple val(meta), path ("${meta.id}_iptm.tsv") , optional: true, emit: iptm_raw - tuple val(meta), path ("${meta.id}_ipsae.tsv") , optional: true, emit: ipsae_raw - tuple val(meta), path ("${meta.id}_chainwise_ptm.tsv") , emit: summary_chainwise_ptm_raw - tuple val(meta), path ("${meta.id}_chainwise_iptm.tsv") , optional: true, emit: chainwise_iptm_raw - tuple val(meta), path ("${meta.id}_chainwise_ipsae.tsv") , optional: true, emit: chainwise_ipsae_raw + tuple val(meta), path ("boltz_results_${meta.id}/predictions/${meta.id}/plddt_*model_0.npz"), emit: plddt_npz + tuple val(meta), path ("boltz_results_${meta.id}/predictions/${meta.id}/pae_*model_0.npz") , emit: pae_npz + tuple val(meta), path ("${meta.id}_boltz_msa.tsv") , emit: msa + tuple val(meta), path ("${meta.id}_*_pae.tsv") , emit: pae + tuple val(meta), path ("${meta.id}_ptm.tsv") , emit: ptm + tuple val(meta), path ("${meta.id}_iptm.tsv") , optional: true, emit: iptm + tuple val(meta), path ("${meta.id}_ipsae.tsv") , optional: true, emit: ipsae + tuple val(meta), path ("${meta.id}_chainwise_ptm.tsv") , emit: chainwise_ptm + tuple val(meta), path ("${meta.id}_chainwise_iptm.tsv") , optional: true, emit: chainwise_iptm + tuple val(meta), path ("${meta.id}_chainwise_ipsae.tsv") , optional: true, emit: chainwise_ipsae tuple val("${task.process}"), val('boltz'), eval("pip list | grep -i boltz | awk '{print \\\$2}' 2>/dev/null || echo \"unknown\""), emit: versions_boltz, topic: versions when: @@ -92,7 +91,7 @@ process RUN_BOLTZ { touch boltz_results_${meta.id}/predictions/${meta.id}/pae_${meta.id}_model_0.npz touch "${meta.id}_boltz.cif" - touch "${meta.id}_plddt_mqc.tsv" + touch "${meta.id}_plddt.tsv" touch "${meta.id}_boltz_msa.tsv" touch "${meta.id}_0_pae.tsv" touch "${meta.id}_ptm.tsv" diff --git a/modules/local/run_esmfold/main.nf b/modules/local/run_esmfold/main.nf index 08edd09f0..9c28ed31e 100644 --- a/modules/local/run_esmfold/main.nf +++ b/modules/local/run_esmfold/main.nf @@ -13,7 +13,7 @@ process RUN_ESMFOLD { output: tuple val(meta), path ("${meta.id}_esmfold.pdb") , emit: top_ranked_pdb tuple val(meta), path ("*.pdb") , emit: pdb - tuple val(meta), path ("${meta.id}_plddt_mqc.tsv"), emit: multiqc + tuple val(meta), path ("${meta.id}_plddt.tsv"), emit: plddt tuple val("${task.process}"), val('esm-fold'), val('1.0.3'), emit: versions_esmfold, topic: versions tuple val("${task.process}"), val('python'), eval("python3 --version | sed 's/Python //g'"), emit: versions_python, topic: versions tuple val("${task.process}"), val('pytorch'), eval("python3 -c \"import torch; print(torch.__version__)\" 2>/dev/null || echo \"unknown\""), emit: versions_pytorch, topic: versions @@ -48,6 +48,6 @@ process RUN_ESMFOLD { stub: """ touch "${meta.id}_esmfold.pdb" - touch "${meta.id}_plddt_mqc.tsv" + touch "${meta.id}_plddt.tsv" """ } diff --git a/modules/local/run_esmfold/meta.yml b/modules/local/run_esmfold/meta.yml index b9a2ec564..05cade207 100644 --- a/modules/local/run_esmfold/meta.yml +++ b/modules/local/run_esmfold/meta.yml @@ -31,11 +31,11 @@ output: - "*.pdb": type: file description: Predicted PDB structure files. - multiqc: + plddt: - - meta: type: map description: Groovy Map containing sample information. - - "${meta.id}_plddt_mqc.tsv": + - "${meta.id}_plddt.tsv": type: file description: pLDDT metrics for MultiQC. versions_esmfold: diff --git a/modules/local/run_esmfold/tests/main.nf.test b/modules/local/run_esmfold/tests/main.nf.test index e09ce25e4..afe41f45c 100644 --- a/modules/local/run_esmfold/tests/main.nf.test +++ b/modules/local/run_esmfold/tests/main.nf.test @@ -27,14 +27,14 @@ nextflow_process { then { def topRanked = path(process.out.top_ranked_pdb[0][1]) - def plddt = path(process.out.multiqc[0][1]) + def plddt = path(process.out.plddt[0][1]) assertAll( { assert process.success }, { assert process.out.top_ranked_pdb[0][0].id == 'T1026' }, { assert topRanked.size() > 0 }, { assert topRanked.text.contains('ATOM') }, { assert plddt.size() > 0 }, - { assert process.out.versions } + { assert process.out.versions_esmfold } ) } } diff --git a/modules/local/zstd_decompress/main.nf b/modules/local/zstd_decompress/main.nf index c43017526..3094edfa0 100644 --- a/modules/local/zstd_decompress/main.nf +++ b/modules/local/zstd_decompress/main.nf @@ -12,7 +12,7 @@ process ZSTD_DECOMPRESS { output: tuple val(meta), path("$prefix"), emit: decompressed - tuple val("${task.process}"), val('zstd'), eval('zstd --version 2>&1 | grep -oP "v\\d+\\.\\d+\\.\\d+"'), emit: versions_zstd, topic: versions + tuple val("${task.process}"), val('zstd'), eval('zstd --version 2>&1 | grep -oP "v\\d+\\.\\d+\\.\\d+" | head -1'), emit: versions_zstd, topic: versions when: task.ext.when == null || task.ext.when 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-c17fb751507e9dfc_1.txt similarity index 75% rename from modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt rename to modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt index 761903040..2a91c22d6 100644 --- a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c1f4a7982b743963_1.txt +++ b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt @@ -14,120 +14,118 @@ linux-64: - 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/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.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/ca-certificates-2026.5.20-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.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/cpython-3.14.5-py314hd8ed1ab_100.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.8.1-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.0-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/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/idna-3.15-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-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/libblas-3.11.0-7_h4a7cf45_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_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/libgcc-15.2.0-he0feb66_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.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/libopenblas-0.3.33-pthreads_h94d23a6_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda -- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.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/linux-64/openssl-3.6.2-h35e630c_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.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/noarch/polars-1.41.0-pyh58ad624_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.41.0-py310h49dadd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.41.0-py310hcbd6021_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.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/pydantic-2.13.4-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.4-py314h2e6c369_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.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/linux-64/regex-2026.5.9-py314h5bd0f2a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda packages: @@ -174,15 +172,15 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda noarch: generic -sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 -md5: a2ac7763a9ac75055b68f325d3255265 +sha256: a1c97297e867776760489537bc5ae36fa83a154be30e3b79385a39ca4cb058fe +md5: 1133126d840e75287d83947be3fc3e71 depends: - python >=3.14 license: BSD-3-Clause AND MIT AND EPL-2.0 -size: 7514 -timestamp: 1767044983590 +size: 7533 +timestamp: 1778594057496 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 md5: 8910d2c46f7e7b519129f486e0fe927a @@ -208,42 +206,42 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda +sha256: 9812a303a1395e1dafbd92e5bc8a1ff6013bcbba0a09c7f03a8d23e43560aa9b +md5: 489b8e97e666c93f68fdb35c3c9b957f depends: - __unix license: ISC -size: 147413 -timestamp: 1772006283803 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda -sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 -md5: 765c4d97e877cdbbb88ff33152b86125 +size: 129868 +timestamp: 1779289852439 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda +sha256: 645655a3510e38e625da136595f3f16f2130c3263630cc3bc8f60f619ddbe490 +md5: 9fefff2f745ea1cc2ef15211a20c054a depends: - python >=3.10 license: ISC -size: 151445 -timestamp: 1772001170301 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda -sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 -md5: 49ee13eb9b8f44d63879c69b8a40a74b +size: 134201 +timestamp: 1779285131141 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda +sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 +md5: a9167b9571f3baa9d448faa2139d1089 depends: - python >=3.10 license: MIT license_family: MIT -size: 58510 -timestamp: 1773660086450 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda -sha256: 38cfe1ee75b21a8361c8824f5544c3866f303af1762693a178266d7f198e8715 -md5: ea8a6c3256897cc31263de9f455e25d9 +size: 58872 +timestamp: 1775127203018 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda +sha256: 99ab8ef815c4520cce3a7482c2513f377c14348206857661d84c76a55e030f97 +md5: 003767c47f1f0a474c4de268b57839c3 depends: -- python >=3.10 - __unix - python +- python >=3.10 license: BSD-3-Clause license_family: BSD -size: 97676 -timestamp: 1764518652276 +size: 104631 +timestamp: 1779108494556 - conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 md5: b866ff7007b934d564961066c8195983 @@ -265,27 +263,27 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda noarch: generic -sha256: 91b06300879df746214f7363d6c27c2489c80732e46a369eb2afc234bcafb44c -md5: 3bb89e4f795e5414addaa531d6b1500a +sha256: 777882d2685f368417f31bbe1b28f73687fc6c8f6a5768bda20ffeefa6b07f5b +md5: a749029ce5d0632a913db19d17f944ab 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 +size: 50212 +timestamp: 1779236682725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.8.1-hecca717_0.conda +sha256: 29a10599d56d93bd750914888ebe6822d47722070762b4647b34d12df9f4476e +md5: d0757fd84af06f065eba49d39af6c546 depends: - __glibc >=2.17,<3.0.a0 -- libexpat 2.7.4 hecca717_0 +- libexpat 2.8.1 hecca717_0 - libgcc >=14 license: MIT license_family: MIT -size: 145274 -timestamp: 1771259434699 +size: 148238 +timestamp: 1779278694477 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b md5: 0c96522c6bdaed4b1566d11387caaf45 @@ -314,21 +312,21 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.0-h27c8c51_0.conda +sha256: e798086d8a65d55dc4c51f5746705639c9a5f2eeb0b8fc50e6152cfc0d69a4e8 +md5: 06965b2f9854d0b15e0443ee81fe83dc depends: - __glibc >=2.17,<3.0.a0 -- libexpat >=2.7.4,<3.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 +- libexpat >=2.8.1,<3.0a0 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 - libgcc >=14 -- libuuid >=2.41.3,<3.0a0 -- libzlib >=1.3.1,<2.0a0 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 license: MIT license_family: MIT -size: 270705 -timestamp: 1771382710863 +size: 280882 +timestamp: 1779421631622 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 md5: a7970cd949a077b7cb9696379d338681 @@ -390,37 +388,26 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda +sha256: 3d25f9f6f7ab3e1ce6429fc8c8aae0335cf446692e715068488536d220cc43de +md5: 1b9083b7f00609605d1483dbc6071a81 depends: - python >=3.10 +- python license: BSD-3-Clause license_family: BSD -size: 50721 -timestamp: 1760286526795 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda -sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 -md5: 080594bf4493e6bae2607e65390c520a +size: 62642 +timestamp: 1779294335905 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda +sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8 +md5: ffc17e785d64e12fc311af9184221839 depends: - python >=3.10 - zipp >=3.20 - python license: Apache-2.0 -license_family: APACHE -size: 34387 -timestamp: 1773931568510 +size: 34766 +timestamp: 1779714582554 - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b md5: 04558c96691bed63104678757beb4f8d @@ -474,18 +461,18 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda +sha256: eb89c6c39f2f6a93db55723dbb2f6bba8c8e63e6312bf1abf13e6e9ff45849c8 +md5: f92f984b558e6e6204014b16d212b271 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 -- libjpeg-turbo >=3.1.2,<4.0a0 +- libjpeg-turbo >=3.1.4.1,<4.0a0 - libtiff >=4.7.1,<4.8.0a0 license: MIT license_family: MIT -size: 249959 -timestamp: 1768184673131 +size: 251086 +timestamp: 1778079286384 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c md5: 18335a698559cdbcd86150a48bf54ba6 @@ -509,37 +496,37 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda +build_number: 7 +sha256: 081c850f99bc355821fac9c6e3727d40b3f8ce3beb50a5437cf03726b611ff39 +md5: 955b44e8b00b7f7ef4ce0130cef12394 depends: -- libopenblas >=0.3.30,<0.3.31.0a0 -- libopenblas >=0.3.30,<1.0a0 +- libopenblas >=0.3.33,<0.3.34.0a0 +- libopenblas >=0.3.33,<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 +- libcblas 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapack 3.11.0 7*_openblas +- liblapacke 3.11.0 7*_openblas +- mkl <2027 license: BSD-3-Clause license_family: BSD -size: 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 +size: 18716 +timestamp: 1778489854108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda +build_number: 7 +sha256: 956ae0bb1ec8b0c3663d75b151aceb0521b54e513bf97f621a035f9c87037970 +md5: 0675639dc24cb0032f199e7ff68e4633 +depends: +- libblas 3.11.0 7_h4a7cf45_openblas constrains: -- liblapacke 3.11.0 5*_openblas -- blas 2.305 openblas -- liblapack 3.11.0 5*_openblas +- liblapacke 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapack 3.11.0 7*_openblas license: BSD-3-Clause license_family: BSD -size: 18194 -timestamp: 1765818837135 +size: 18675 +timestamp: 1778489861559 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 md5: 6c77a605a7a689d17d4819c0f8ac9a00 @@ -550,18 +537,18 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda +sha256: 363018b25fdb5534c79783d912bd4b685a3547f4fc5996357ad548899b0ee8e7 +md5: 93764a5ca80616e9c10106cdaec92f74 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: -- expat 2.7.4.* +- expat 2.8.1.* license: MIT license_family: MIT -size: 76798 -timestamp: 1771259418166 +size: 77294 +timestamp: 1779278686680 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 md5: a360c33a5abe61c07959e449fa1453eb @@ -593,42 +580,42 @@ constrains: 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda +sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 +md5: 57736f29cc2b0ec0b6c2952d3f101b6a depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 constrains: -- libgcc-ng ==15.2.0=*_18 -- libgomp 15.2.0 he0feb66_18 +- libgcc-ng ==15.2.0=*_19 +- libgomp 15.2.0 he0feb66_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL -size: 1041788 -timestamp: 1771378212382 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda -sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 -md5: d5e96b1ed75ca01906b3d2469b4ce493 +size: 1041084 +timestamp: 1778269013026 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda +sha256: 9dcf54adfaa5e861123c2da4f2f0451a685464ea7e5a41ad91cf67b31d658d98 +md5: 331ee9b72b9dff570d56b1302c5ab37d depends: -- libgcc 15.2.0 he0feb66_18 +- libgcc 15.2.0 he0feb66_19 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 +size: 27694 +timestamp: 1778269016987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda +sha256: 561a42758ef25b9ce308c4e2cf56daee4f06138385a17e29a492cd928e00be6f +md5: 42bf7eca1a951735fa06c0e3c0d5c8e6 depends: -- libgfortran5 15.2.0 h68bc16d_18 +- libgfortran5 15.2.0 h68bc16d_19 constrains: -- libgfortran-ng ==15.2.0=*_18 +- libgfortran-ng ==15.2.0=*_19 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 +size: 27655 +timestamp: 1778269042954 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda +sha256: 057978bb69fea29ed715a9b98adf71015c31baecc4aeb2bfc20d4fd5d83579d4 +md5: 85072b0ad177c966294f129b7c04a2d5 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=15.2.0 @@ -636,53 +623,53 @@ 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 +size: 2483673 +timestamp: 1778269025089 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda +sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b +md5: faac990cb7aedc7f3a2224f2c9b0c26c depends: - __glibc >=2.17,<3.0.a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL -size: 603262 -timestamp: 1771378117851 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda -sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 -md5: 8397539e3a0bbd1695584fb4f927485a +size: 603817 +timestamp: 1778268942614 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda +sha256: 10056646c28115b174de81a44e23e3a0a3b95b5347d2e6c45cc6d49d35294256 +md5: 6178c6f2fb254558238ef4e6c56fb782 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib -size: 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 +size: 633831 +timestamp: 1775962768273 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda +build_number: 7 +sha256: 96962084921f197c9ad13fb7f8b324f2351d50ff3d8d962148751ad532f54a01 +md5: 6569b4f273740e25dc0dc7e3232c2a6c +depends: +- libblas 3.11.0 7_h4a7cf45_openblas constrains: -- blas 2.305 openblas -- liblapacke 3.11.0 5*_openblas -- libcblas 3.11.0 5*_openblas +- liblapacke 3.11.0 7*_openblas +- libcblas 3.11.0 7*_openblas +- blas 2.307 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 +size: 18694 +timestamp: 1778489869038 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda +sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d +md5: b88d90cad08e6bc8ad540cb310a761fb depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: -- xz 5.8.2.* +- xz 5.8.3.* license: 0BSD -size: 113207 -timestamp: 1768752626120 +size: 113478 +timestamp: 1775825492909 - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 md5: 2c21e66f50753a083cbe6b80f38268fa @@ -693,53 +680,52 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda +sha256: 3d9aa85648e5e18a6d66db98b8c4317cc426721ad7a220aa86330d1ccedc8903 +md5: 2d3278b721e40468295ca755c3b84070 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 constrains: -- openblas >=0.3.30,<0.3.31.0a0 +- openblas >=0.3.33,<0.3.34.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 +size: 5931919 +timestamp: 1776993658641 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda +sha256: 377cfe037f3eeb3b1bf3ad333f724a64d32f315ee1958581fc671891d63d3f89 +md5: eba48a68a1a2b9d3c0d9511548db85db depends: -- libgcc >=14 - __glibc >=2.17,<3.0.a0 -- libzlib >=1.3.1,<2.0a0 +- libgcc >=14 +- libzlib >=1.3.2,<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 +size: 317729 +timestamp: 1776315175087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda +sha256: 54cdcd3214313b62c2a8ee277e6f42150d9b748264c1b70d958bf735e420ef8d +md5: 7dc38adcbf71e6b38748e919e16e0dce depends: - __glibc >=2.17,<3.0.a0 -- icu >=78.2,<79.0a0 - libgcc >=14 -- libzlib >=1.3.1,<2.0a0 +- libzlib >=1.3.2,<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 +size: 954962 +timestamp: 1777986471789 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda +sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc +md5: 5794b3bdc38177caf969dabd3af08549 depends: - __glibc >=2.17,<3.0.a0 -- libgcc 15.2.0 he0feb66_18 +- libgcc 15.2.0 he0feb66_19 constrains: -- libstdcxx-ng ==15.2.0=*_18 +- libstdcxx-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL -size: 5852330 -timestamp: 1771378262446 +size: 5852044 +timestamp: 1778269036376 - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 md5: cd5a90476766d53e901500df9215e927 @@ -757,16 +743,16 @@ depends: 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda +sha256: 3f0edf1280e2f6684a986f821eaa3e123d2694a00b31b96ca0d4a4c12c129231 +md5: 7d0a66598195ef00b6efc55aefc7453b depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: BSD-3-Clause license_family: BSD -size: 40311 -timestamp: 1766271528534 +size: 40163 +timestamp: 1779118517630 - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b md5: aea31d2e5b1091feca96fcfe945c3cf9 @@ -814,16 +800,16 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f +md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 depends: - mdurl >=0.1,<1 - python >=3.10 license: MIT license_family: MIT -size: 64736 -timestamp: 1754951288511 +size: 69017 +timestamp: 1778169663339 - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf md5: 9a17c4307d23318476d7fbf0fedc0cde @@ -854,9 +840,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 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +sha256: e86033aa55a9e915e2d0957e770bdb81e3feb26a227d1adb17f9d6c528da6a71 +md5: cdb20309681ba3ce8f52c110e214d4f3 depends: - click - coloredlogs @@ -870,10 +856,11 @@ depends: - packaging - pillow >=10.2.0 - plotly >=5.18 -- polars-lts-cpu +- polars >=1.34.0 +- polars-runtime-compat >=1.34.0 - pyaml-env - pydantic >=2.7.1 -- python >=3.8,!=3.14.1 +- python >=3.9,!=3.14.1 - python-dotenv - python-kaleido 0.2.1 - pyyaml >=4 @@ -883,20 +870,21 @@ depends: - spectra >=0.0.10 - tiktoken - tqdm -- typeguard +- typeguard >=4 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 +size: 4282188 +timestamp: 1779465338806 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda +sha256: 70f43d62450927d51673eecd8823e14f5b3cfebdb43cda1d502eba97162bab42 +md5: 6687827c332121727ce383919e1ec8c2 depends: - python >=3.10 - python license: MIT -size: 280459 -timestamp: 1774380620329 +license_family: MIT +size: 284323 +timestamp: 1778929680962 - conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 md5: e941e85e273121222580723010bd4fa2 @@ -907,15 +895,15 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda +sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 +md5: fc21868a1a5aacc937e7a18747acb8a5 depends: - __glibc >=2.17,<3.0.a0 -- libgcc >=13 +- libgcc >=14 license: X11 AND BSD-3-Clause -size: 891641 -timestamp: 1738195959188 +size: 918956 +timestamp: 1777422145199 - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 md5: a2c1eeadae7a309daed9d62c96012a2b @@ -956,24 +944,24 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda +sha256: bc61ae892973751a6b0e6ecea57ed6d7053224bddcb007165d6ceb1d7344ad47 +md5: f49b5f950379e0b97c35ca97682f7c6a depends: - python - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 -- python_abi 3.14.* *_cp314 -- libcblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 +- python_abi 3.14.* *_cp314 - libblas >=3.9.0,<4.0a0 +- libcblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD -size: 8927860 -timestamp: 1773839233468 +size: 8928909 +timestamp: 1779169198391 - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d md5: 11b3379b191f63139e29c0d19dee24cd @@ -988,48 +976,48 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda +sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb +md5: da1b85b6a87e141f5140bb9924cecab0 depends: - __glibc >=2.17,<3.0.a0 - ca-certificates - libgcc >=14 license: Apache-2.0 license_family: Apache -size: 3164551 -timestamp: 1769555830639 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda -sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 -md5: b76541e68fea4d511b1ac46a28dcd2c6 +size: 3167099 +timestamp: 1775587756857 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda +sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 +md5: 4c06a92e74452cfa53623a81592e8934 depends: - python >=3.8 - python license: Apache-2.0 license_family: APACHE -size: 72010 -timestamp: 1769093650580 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda -sha256: 9e6ec8f3213e8b7d64b0ad45f84c51a2c9eba4398efda31e196c9a56186133ee -md5: 79678378ae235e24b3aa83cee1b38207 +size: 91574 +timestamp: 1777103621679 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda +sha256: 123d8a7c16c88658b4f29e9f115a047598c941708dade74fbaff373a32dbec5e +md5: 76c4757c0ec9d11f969e8eb44899307b depends: - python - libgcc >=14 - __glibc >=2.17,<3.0.a0 +- libtiff >=4.7.1,<4.8.0a0 +- openjpeg >=2.5.4,<3.0a0 +- libxcb >=1.17.0,<2.0a0 - libwebp-base >=1.6.0,<2.0a0 - zlib-ng >=2.3.3,<2.4.0a0 -- 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 +- python_abi 3.14.* *_cp314 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 - lcms2 >=2.18,<3.0a0 -- libtiff >=4.7.1,<4.8.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 +- tk >=8.6.13,<8.7.0a0 license: HPND -size: 1073026 -timestamp: 1770794002408 +size: 1082797 +timestamp: 1775060059882 - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 md5: 3e9427ee186846052e81fadde8ebe96a @@ -1043,11 +1031,11 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +sha256: 70fc56877c4a095ee658d61924d8019768fbae4a48437058d181fc94b0a7c4d8 +md5: 25a883fed9f1f3f21ff317a3e7c92ac4 depends: -- polars-runtime-32 ==1.39.3 +- polars-runtime-32 ==1.41.0 - python >=3.10 - python constrains: @@ -1061,57 +1049,44 @@ constrains: - 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 +- polars-runtime-32 ==1.41.0 +- polars-runtime-64 ==1.41.0 +- polars-runtime-compat ==1.41.0 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 +size: 539656 +timestamp: 1779630790562 +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.41.0-py310h49dadd8_0.conda noarch: python -sha256: 9744f8086bb0832998f5b01076f57ddc9efbe460e493b14303c3567dc4f401e7 -md5: f9327f9f2cfc4215f55b613e64afd3ba +sha256: e51ee3fe5259f2e115b2f78f8fbe3554e419c7c82b0c110878e12a5ff95ce3ab +md5: 7682765a1588e5ac887c99736d297c93 depends: - python +- __glibc >=2.17,<3.0.a0 - 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 +size: 42578921 +timestamp: 1779630790562 +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.41.0-py310hcbd6021_0.conda noarch: python -sha256: bf0b932713f0f27924f42159c98426e0073bb6145ed796eaa4cec79ca05363c7 -md5: 4b9b312453eebd6fbdbbe2a88fa1b5c4 +sha256: 29c3831c92394af11d9f7d04882dda9479ffbb76a3d36ba155d52159d67805fa +md5: cb0b620c9914a07a9022cb8b183ea9ee depends: - python -- libgcc >=14 - 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: 37224264 -timestamp: 1774207985377 +size: 41864944 +timestamp: 1779630722548 - conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda sha256: 4ce2e1ee31a6217998f78c31ce7dc0a3e0557d9238b51d49dd20c52d467a126d md5: f2c23a77b25efcad57d377b34bd84941 @@ -1143,24 +1118,23 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +sha256: 69700e31165df070e9716315e042196aa92525dae5deb5107785847ab9f4189f +md5: 729843edafc0899b3348bd3f19525b9d depends: - typing-inspection >=0.4.2 - typing_extensions >=4.14.1 - python >=3.10 -- typing-extensions >=4.6.1 - annotated-types >=0.6.0 -- pydantic-core ==2.41.5 +- pydantic-core ==2.46.4 - 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 +size: 346511 +timestamp: 1778103405862 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.4-py314h2e6c369_0.conda +sha256: 802e216c39f1359aed60823b6e11d8ccd812b0ae1c81ae5ac1c81f99446409ab +md5: 0c96993dbeadf3a277cf757b9f1c9412 depends: - python - typing-extensions >=4.6.0,!=4.7.0 @@ -1171,17 +1145,17 @@ 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 +size: 1895020 +timestamp: 1778084229247 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda +sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 +md5: 16c18772b340887160c79a6acc022db0 depends: -- python >=3.9 +- python >=3.10 license: BSD-2-Clause license_family: BSD -size: 889287 -timestamp: 1750615908735 +size: 893031 +timestamp: 1774796815820 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 md5: 461219d1a5bd61342293efa2c0c90eac @@ -1192,32 +1166,32 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda +build_number: 100 +sha256: 55eed9bf2a3f6e90311276f0834737fe7c2d9ec3e5e2e557507858df4c7521e6 +md5: da92e59ff92f2d5ede4f612af20f583f depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 -- libexpat >=2.7.3,<3.0a0 +- libexpat >=2.8.0,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 -- liblzma >=5.8.2,<6.0a0 +- liblzma >=5.8.3,<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 +- libsqlite >=3.53.1,<4.0a0 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 +- openssl >=3.5.6,<4.0a0 - python_abi 3.14.* *_cp314 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 -size: 36702440 -timestamp: 1770675584356 +size: 36745188 +timestamp: 1779236923603 python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 @@ -1228,15 +1202,15 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda +sha256: 41dd7da285d71d519257fa7dacb1cae060d5ebfaa5f92cba5994899d2978e943 +md5: 41954747ba952ec4b01e16c2c9e8d8ff depends: -- cpython 3.14.3.* +- cpython 3.14.5.* - python_abi * *_cp314 license: Python-2.0 -size: 50062 -timestamp: 1770674497152 +size: 50212 +timestamp: 1779236703009 - conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 sha256: e17bf63a30aec33432f1ead86e15e9febde9fc40a7f869c0e766be8d2db44170 md5: 310259a5b03ff02289d7705f39e2b1d2 @@ -1294,9 +1268,9 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.5.9-py314h5bd0f2a_0.conda +sha256: c7a4aca4977c15c82d053b06cbc676460974c1b25757cfeea8a9a2497ac911f8 +md5: 9dd235b6ac69a0198080dac39f9891aa depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -1304,27 +1278,27 @@ depends: - 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 +size: 413611 +timestamp: 1778374155646 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da +md5: 4a85203c1d80c1059086ae860836ffb9 depends: - python >=3.10 -- certifi >=2017.4.17 +- certifi >=2023.5.7 - charset-normalizer >=2,<4 - idna >=2.5,<4 -- urllib3 >=1.21.1,<3 +- urllib3 >=1.26,<3 - python constrains: -- chardet >=3.0.2,<6 +- chardet >=3.0.2,<8 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 +size: 68709 +timestamp: 1778851103479 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a +md5: 0242025a3c804966bf71aa04eee82f66 depends: - markdown-it-py >=2.2.0 - pygments >=2.13.0,<3.0.0 @@ -1333,8 +1307,8 @@ depends: - python license: MIT license_family: MIT -size: 208472 -timestamp: 1771572730357 +size: 208577 +timestamp: 1775991661559 - conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 md5: 0c20a8ebcddb24a45da89d5e917e6cb9 @@ -1373,20 +1347,19 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda +sha256: d167fa92781bcdcd3b9aaa6bb1cd50c5b108f6190c170098a118b5cf5df2f881 +md5: 8e0b8654ead18e50af552e54b5a08a61 depends: - __glibc >=2.17,<3.0.a0 -- icu >=78.2,<79.0a0 - libgcc >=14 -- libsqlite 3.52.0 hf4e2dac_0 -- libzlib >=1.3.1,<2.0a0 -- ncurses >=6.5,<7.0a0 +- libsqlite 3.53.1 h0c1763c_0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 - readline >=8.3,<9.0a0 license: blessing -size: 203641 -timestamp: 1772818888368 +size: 205399 +timestamp: 1777986477546 - conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda sha256: 7e395d67fd249d901beb1ae269057763c0d8c3ee5f7a348694bdb16d158a37d9 md5: d705f9d8a1185a2b01cced191177a028 @@ -1427,20 +1400,20 @@ depends: 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +sha256: 59d7851d32fddb5b510272e6557aa982edeb927d349648dac27f5bf01d18bb26 +md5: 4460f039b7dedf15f7df086446ca75ae depends: -- importlib-metadata >=3.6 -- python >=3.10 -- typing-extensions >=4.10.0 - typing_extensions >=4.14.0 +- python >=3.10 +- importlib-metadata >=3.6 +- python constrains: - pytest >=7 license: MIT license_family: MIT -size: 36838 -timestamp: 1771532971545 +size: 38297 +timestamp: 1778779291237 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c md5: edd329d7d3a4ab45dcf905899a7a6115 @@ -1450,16 +1423,17 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +sha256: 8b90d2f19f9458b8c58a55e1fcdc1d90c1603a847a47654d8a454549413ba60a +md5: 53f5409c5cfd6c5a66417d68e3f0a864 depends: - python >=3.10 - typing_extensions >=4.12.0 +- python license: MIT license_family: MIT -size: 18923 -timestamp: 1764158430324 +size: 20935 +timestamp: 1777105465795 - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 md5: 0caa1af407ecff61170c9437a808404d @@ -1476,9 +1450,9 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda +sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 +md5: cbb88288f74dbe6ada1c6c7d0a97223e depends: - backports.zstd >=1.0.0 - brotli-python >=1.2.0 @@ -1487,8 +1461,8 @@ depends: - python >=3.10 license: MIT license_family: MIT -size: 103172 -timestamp: 1767817860341 +size: 103560 +timestamp: 1778188657149 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b md5: b2895afaf55bf96a8c8282a2e47a5de0 @@ -1519,16 +1493,16 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 +md5: ba3dcdc8584155c97c648ae9c044b7a3 depends: - python >=3.10 - python license: MIT license_family: MIT -size: 24194 -timestamp: 1764460141901 +size: 24190 +timestamp: 1779159948016 - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f md5: 2aadb0d17215603a82a2a6b0afd9a4cb 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 a55a4d49d..000000000 --- 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-5c84a5000a226ab5_1.txt similarity index 74% rename from modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt rename to modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt index a58231a01..3d5b93db9 100644 --- a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-40bf3b435e89dc22_1.txt +++ b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt @@ -14,120 +14,118 @@ linux-aarch64: - 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/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.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/ca-certificates-2026.5.20-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.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/cpython-3.14.5-py314hd8ed1ab_100.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.8.1-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.0-hba86a56_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/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/idna-3.15-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-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/libblas-3.11.0-7_haddc8a3_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-7_hd72aa62_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_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/libgcc-15.2.0-h8acb6b2_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-7_h88aeb00_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.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/libopenblas-0.3.33-pthreads_h9d3fd7e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.1-h1022ec0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda -- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.33-pyhdfd78af_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.1-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py314haac167e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py314he1698a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.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/linux-aarch64/openssl-3.6.2-h546c87b_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.2.0-py314hac3e5ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.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/noarch/polars-1.41.0-pyh58ad624_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.41.0-py310h32c7c23_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.41.0-py310hc0e61be_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.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/pydantic-2.13.4-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.46.4-py314h451b6cc_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.3-hb06a95a_101_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.5-hfd9ac0a_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.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/linux-aarch64/regex-2026.5.9-py314h51f160d_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.52.0-hf1c7be2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.1-he8854b5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda packages: @@ -173,15 +171,15 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda noarch: generic -sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 -md5: a2ac7763a9ac75055b68f325d3255265 +sha256: a1c97297e867776760489537bc5ae36fa83a154be30e3b79385a39ca4cb058fe +md5: 1133126d840e75287d83947be3fc3e71 depends: - python >=3.14 license: BSD-3-Clause AND MIT AND EPL-2.0 -size: 7514 -timestamp: 1767044983590 +size: 7533 +timestamp: 1778594057496 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda sha256: 5a5b0cdcd7ed89c6a8fb830924967f6314a2b71944bc1ebc2c105781ba97aa75 md5: a1b5c571a0923a205d663d8678df4792 @@ -206,42 +204,42 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda +sha256: 9812a303a1395e1dafbd92e5bc8a1ff6013bcbba0a09c7f03a8d23e43560aa9b +md5: 489b8e97e666c93f68fdb35c3c9b957f depends: - __unix license: ISC -size: 147413 -timestamp: 1772006283803 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda -sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 -md5: 765c4d97e877cdbbb88ff33152b86125 +size: 129868 +timestamp: 1779289852439 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda +sha256: 645655a3510e38e625da136595f3f16f2130c3263630cc3bc8f60f619ddbe490 +md5: 9fefff2f745ea1cc2ef15211a20c054a depends: - python >=3.10 license: ISC -size: 151445 -timestamp: 1772001170301 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda -sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 -md5: 49ee13eb9b8f44d63879c69b8a40a74b +size: 134201 +timestamp: 1779285131141 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda +sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 +md5: a9167b9571f3baa9d448faa2139d1089 depends: - python >=3.10 license: MIT license_family: MIT -size: 58510 -timestamp: 1773660086450 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda -sha256: 38cfe1ee75b21a8361c8824f5544c3866f303af1762693a178266d7f198e8715 -md5: ea8a6c3256897cc31263de9f455e25d9 +size: 58872 +timestamp: 1775127203018 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda +sha256: 99ab8ef815c4520cce3a7482c2513f377c14348206857661d84c76a55e030f97 +md5: 003767c47f1f0a474c4de268b57839c3 depends: -- python >=3.10 - __unix - python +- python >=3.10 license: BSD-3-Clause license_family: BSD -size: 97676 -timestamp: 1764518652276 +size: 104631 +timestamp: 1779108494556 - conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 md5: b866ff7007b934d564961066c8195983 @@ -263,26 +261,26 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda noarch: generic -sha256: 91b06300879df746214f7363d6c27c2489c80732e46a369eb2afc234bcafb44c -md5: 3bb89e4f795e5414addaa531d6b1500a +sha256: 777882d2685f368417f31bbe1b28f73687fc6c8f6a5768bda20ffeefa6b07f5b +md5: a749029ce5d0632a913db19d17f944ab 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 +size: 50212 +timestamp: 1779236682725 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.8.1-hfae3067_0.conda +sha256: a9cd5eb1700e11cc39acc36630a2d72a4e317943bd7c5695cd8804419f04ff42 +md5: 89f0247b3cea528d8ad1a6664a313153 depends: -- libexpat 2.7.4 hfae3067_0 +- libexpat 2.8.1 hfae3067_0 - libgcc >=14 license: MIT license_family: MIT -size: 137701 -timestamp: 1771259543650 +size: 140114 +timestamp: 1779278679081 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b md5: 0c96522c6bdaed4b1566d11387caaf45 @@ -311,20 +309,20 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.0-hba86a56_0.conda +sha256: 1805f4ab3d9e1734a5a17abccc2cb0fdade51d4d5f29bdc410600ea0115ec050 +md5: b660d59a9d0fb3297327418624acaec3 depends: -- libexpat >=2.7.4,<3.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 +- libexpat >=2.8.1,<3.0a0 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 - libgcc >=14 -- libuuid >=2.41.3,<3.0a0 -- libzlib >=1.3.1,<2.0a0 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 license: MIT license_family: MIT -size: 279044 -timestamp: 1771382728182 +size: 293348 +timestamp: 1779421661332 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 md5: a7970cd949a077b7cb9696379d338681 @@ -386,36 +384,26 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda +sha256: 3d25f9f6f7ab3e1ce6429fc8c8aae0335cf446692e715068488536d220cc43de +md5: 1b9083b7f00609605d1483dbc6071a81 depends: - python >=3.10 +- python license: BSD-3-Clause license_family: BSD -size: 50721 -timestamp: 1760286526795 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda -sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 -md5: 080594bf4493e6bae2607e65390c520a +size: 62642 +timestamp: 1779294335905 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda +sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8 +md5: ffc17e785d64e12fc311af9184221839 depends: - python >=3.10 - zipp >=3.20 - python license: Apache-2.0 -license_family: APACHE -size: 34387 -timestamp: 1773931568510 +size: 34766 +timestamp: 1779714582554 - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b md5: 04558c96691bed63104678757beb4f8d @@ -469,17 +457,17 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_0.conda +sha256: 1e5f68e4b36a0e1a278c6dc026bc3d7775518a15832cbc9d7fc1c0e4c47784b1 +md5: b1f8bee3c53a6d2c103fb4a1ae44f5c4 depends: - libgcc >=14 -- libjpeg-turbo >=3.1.2,<4.0a0 +- libjpeg-turbo >=3.1.4.1,<4.0a0 - libtiff >=4.7.1,<4.8.0a0 license: MIT license_family: MIT -size: 293039 -timestamp: 1768184778398 +size: 296899 +timestamp: 1778079402392 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda sha256: 7abd913d81a9bf00abb699e8987966baa2065f5132e37e815f92d90fc6bba530 md5: a21644fc4a83da26452a718dc9468d5f @@ -501,37 +489,37 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-7_haddc8a3_openblas.conda +build_number: 7 +sha256: f27ba323c2f1e1731b5e880fe520f178f55047f25be94f77e649605b2343c066 +md5: e8d07b777f6ff1fab69665336561910b depends: -- libopenblas >=0.3.30,<0.3.31.0a0 -- libopenblas >=0.3.30,<1.0a0 +- libopenblas >=0.3.33,<0.3.34.0a0 +- libopenblas >=0.3.33,<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 +- liblapack 3.11.0 7*_openblas +- libcblas 3.11.0 7*_openblas +- mkl <2027 +- blas 2.307 openblas +- liblapacke 3.11.0 7*_openblas license: BSD-3-Clause license_family: BSD -size: 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 +size: 18696 +timestamp: 1778489796402 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-7_hd72aa62_openblas.conda +build_number: 7 +sha256: c8f0192362966df0828419f042d6f94c079e5df00ad6bd05b5e84c12b42f8cc7 +md5: 90ac57b82c055faa9be25031864b7d8f +depends: +- libblas 3.11.0 7_haddc8a3_openblas constrains: -- liblapack 3.11.0 5*_openblas -- liblapacke 3.11.0 5*_openblas -- blas 2.305 openblas +- liblapack 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapacke 3.11.0 7*_openblas license: BSD-3-Clause license_family: BSD -size: 18371 -timestamp: 1765818618899 +size: 18664 +timestamp: 1778489802790 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda sha256: 48814b73bd462da6eed2e697e30c060ae16af21e9fbed30d64feaf0aad9da392 md5: a9138815598fe6b91a1d6782ca657b0c @@ -541,17 +529,17 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_0.conda +sha256: 1fc392b997c6ee2bd3226a7cd870d0edbcbb367e25f9f18dd4a7025fced6efc0 +md5: 513dd884361dfb8a554298ed69b58823 depends: - libgcc >=14 constrains: -- expat 2.7.4.* +- expat 2.8.1.* license: MIT license_family: MIT -size: 76564 -timestamp: 1771259530958 +size: 77140 +timestamp: 1779278671302 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 md5: 2f364feefb6a7c00423e80dcb12db62a @@ -581,90 +569,90 @@ constrains: 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda +sha256: 4592b096e553f67799ae70d4b6167eeda3ec74587d68c7aecbf4e7b1df136681 +md5: f35b3f52d0a2ec4ffe3c89ba135cdb9a depends: - _openmp_mutex >=4.5 constrains: -- libgcc-ng ==15.2.0=*_18 -- libgomp 15.2.0 h8acb6b2_18 +- libgomp 15.2.0 h8acb6b2_19 +- libgcc-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL -size: 622900 -timestamp: 1771378128706 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda -sha256: 83bb0415f59634dccfa8335d4163d1f6db00a27b36666736f9842b650b92cf2f -md5: 4feebd0fbf61075a1a9c2e9b3936c257 +size: 622462 +timestamp: 1778268755949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_19.conda +sha256: 1137f93f477f56199ded24117430045a0c02cbe8b10031beac3b9ad2138539d3 +md5: 770cf892e5530f43e63cadc673e85653 depends: -- libgcc 15.2.0 h8acb6b2_18 +- libgcc 15.2.0 h8acb6b2_19 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 +size: 27738 +timestamp: 1778268759211 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_19.conda +sha256: e5ad94be72634233510b33ba792a3339921bd468f0b8bc6961ea05eded251d9b +md5: c7a5b5decf969ead5ecada83654164cf depends: -- libgfortran5 15.2.0 h1b7bec0_18 +- libgfortran5 15.2.0 h1b7bec0_19 constrains: -- libgfortran-ng ==15.2.0=*_18 +- libgfortran-ng ==15.2.0=*_19 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 +size: 27728 +timestamp: 1778268784621 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_19.conda +sha256: af8e9bdcaa77f133a8ee4c1ef57ef564d9c45aa262abf9f5ef9b50eb99d96407 +md5: 779dbb494de6d3d6477cab52eb34285a depends: - libgcc >=15.2.0 constrains: - libgfortran 15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL -size: 1486341 -timestamp: 1771378148102 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda -sha256: fc716f11a6a8525e27a5d332ef6a689210b0d2a4dd1133edc0f530659aa9faa6 -md5: 4faa39bf919939602e594253bd673958 +size: 1487244 +timestamp: 1778268767295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda +sha256: 2370ef0ffcbae5bede3c4bf136add4abc257245eb91f724c99bb4a43116c5a83 +md5: c5e8a379c4a2ec2aea4ba22758c001d9 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL -size: 588060 -timestamp: 1771378040807 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda -sha256: 84064c7c53a64291a585d7215fe95ec42df74203a5bf7615d33d49a3b0f08bb6 -md5: 5109d7f837a3dfdf5c60f60e311b041f +size: 587387 +timestamp: 1778268674393 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda +sha256: e97ec2af5f09f8f6ea8ecd550055c95ae80fae22015fcfadaa94eafe025c9ccc +md5: a85ba48648f6868016f2741fd9170250 depends: - libgcc >=14 constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib -size: 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 +size: 693143 +timestamp: 1775962625956 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-7_h88aeb00_openblas.conda +build_number: 7 +sha256: 20b38a0156200ac65f597bf0a93914c565435f2cc58b1042581854231a99ac35 +md5: 5899cbd743cc74fd655c1ed2af7120f3 +depends: +- libblas 3.11.0 7_haddc8a3_openblas constrains: -- liblapacke 3.11.0 5*_openblas -- blas 2.305 openblas -- libcblas 3.11.0 5*_openblas +- libcblas 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapacke 3.11.0 7*_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 +size: 18685 +timestamp: 1778489809140 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda +sha256: d61962b9cd54c3554361550203c64d5b65b71e3058a285b66e4b04b9769f0a5c +md5: 76298a9e6d71ee6e832a8d0d7373b261 depends: - libgcc >=14 constrains: -- xz 5.8.2.* +- xz 5.8.3.* license: 0BSD -size: 125916 -timestamp: 1768754941722 +size: 126102 +timestamp: 1775828008518 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda sha256: 57c0dd12d506e84541c4e877898bd2a59cca141df493d34036f18b2751e0a453 md5: 7b9813e885482e3ccb1fa212b86d7fd0 @@ -674,49 +662,48 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.33-pthreads_h9d3fd7e_0.conda +sha256: b018ecfb05e75a8eea3f21f6b5c5c2a54b5178bdcf19e2e2df2735740214a8c8 +md5: 58a66cd95e9692f08abe89f55a6f3f12 depends: - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 constrains: -- openblas >=0.3.30,<0.3.31.0a0 +- openblas >=0.3.33,<0.3.34.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 +size: 5121336 +timestamp: 1776993423004 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda +sha256: 483eaa53da40a6a3e558709d9f7b1ca388735364ae21a1ba58cf942514649c92 +md5: f51503ac45a4888bce71af9027a2ecc9 depends: - libgcc >=14 -- libzlib >=1.3.1,<2.0a0 +- libzlib >=1.3.2,<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 +size: 341202 +timestamp: 1776315188425 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda +sha256: ad03b7d8e4d08001f0df88ee7a56108bb35bae4795a42b9a04cc1abfa822bd07 +md5: 2ec1119217d8f0d086e9a62f3cb0e5ea depends: -- icu >=78.2,<79.0a0 - libgcc >=14 -- libzlib >=1.3.1,<2.0a0 +- libzlib >=1.3.2,<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 +size: 955361 +timestamp: 1777986487553 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda +sha256: 1dadc45e599f510dd5f97141dddcdbb9844d9f1430c1f3a38075cf1c58f87b4e +md5: 543fbc8d71f2a0baf04cf88ce96cb8bb depends: -- libgcc 15.2.0 h8acb6b2_18 +- libgcc 15.2.0 h8acb6b2_19 constrains: -- libstdcxx-ng ==15.2.0=*_18 +- libstdcxx-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL -size: 5541411 -timestamp: 1771378162499 +size: 5546559 +timestamp: 1778268777463 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda sha256: 7ff79470db39e803e21b8185bc8f19c460666d5557b1378d1b1e857d929c6b39 md5: 8c6fd84f9c87ac00636007c6131e457d @@ -733,15 +720,15 @@ depends: 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.1-h1022ec0_0.conda +sha256: 1628839b062e98b2192857d4da8496ac9ac6b0dbb77aa040c34efc9192c440ee +md5: 0f42f9fedd2a32d798de95a7f65c456f depends: - libgcc >=14 license: BSD-3-Clause license_family: BSD size: 43453 -timestamp: 1766271546875 +timestamp: 1779118526838 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda sha256: b03700a1f741554e8e5712f9b06dd67e76f5301292958cd3cb1ac8c6fdd9ed25 md5: 24e92d0942c799db387f5c9d7b81f1af @@ -785,16 +772,16 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f +md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 depends: - mdurl >=0.1,<1 - python >=3.10 license: MIT license_family: MIT -size: 64736 -timestamp: 1754951288511 +size: 69017 +timestamp: 1778169663339 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda sha256: 383c188496d13a55658c06e61e7d4cdff2c9f9d5a0648769fca8250bece7e0ef md5: e5de3c36dd548b35ff2a8aa49208dcb3 @@ -824,9 +811,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 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +sha256: e86033aa55a9e915e2d0957e770bdb81e3feb26a227d1adb17f9d6c528da6a71 +md5: cdb20309681ba3ce8f52c110e214d4f3 depends: - click - coloredlogs @@ -840,10 +827,11 @@ depends: - packaging - pillow >=10.2.0 - plotly >=5.18 -- polars-lts-cpu +- polars >=1.34.0 +- polars-runtime-compat >=1.34.0 - pyaml-env - pydantic >=2.7.1 -- python >=3.8,!=3.14.1 +- python >=3.9,!=3.14.1 - python-dotenv - python-kaleido 0.2.1 - pyyaml >=4 @@ -853,20 +841,21 @@ depends: - spectra >=0.0.10 - tiktoken - tqdm -- typeguard +- typeguard >=4 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 +size: 4282188 +timestamp: 1779465338806 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda +sha256: 70f43d62450927d51673eecd8823e14f5b3cfebdb43cda1d502eba97162bab42 +md5: 6687827c332121727ce383919e1ec8c2 depends: - python >=3.10 - python license: MIT -size: 280459 -timestamp: 1774380620329 +license_family: MIT +size: 284323 +timestamp: 1778929680962 - conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 md5: e941e85e273121222580723010bd4fa2 @@ -877,14 +866,14 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda +sha256: 369db85c5cd8d99dde364ce70725d76511d9c8199e5b820c740414091bf5bcca +md5: b2a43456aa56fe80c2477a5094899eff depends: -- libgcc >=13 +- libgcc >=14 license: X11 AND BSD-3-Clause -size: 926034 -timestamp: 1738196018799 +size: 960036 +timestamp: 1777422174534 - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 md5: a2c1eeadae7a309daed9d62c96012a2b @@ -923,24 +912,23 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py314he1698a1_0.conda +sha256: 04af718b911f8a3a0095481c7e283aa081a175fe626eccbc2c5644bcb2aba9a1 +md5: 8b173772deea177b45d2a133b509b3f7 depends: - python -- libgcc >=14 -- python 3.14.* *_cp314 - libstdcxx >=14 -- libcblas >=3.9.0,<4.0a0 -- liblapack >=3.9.0,<4.0a0 +- libgcc >=14 - python_abi 3.14.* *_cp314 - libblas >=3.9.0,<4.0a0 +- liblapack >=3.9.0,<4.0a0 +- libcblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD -size: 8008045 -timestamp: 1773839355275 +size: 8002900 +timestamp: 1779169206742 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda sha256: bd1bc8bdde5e6c5cbac42d462b939694e40b59be6d0698f668515908640c77b8 md5: cea962410e327262346d48d01f05936c @@ -954,47 +942,47 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda +sha256: 348cb74c1530ac241215d047ef65d134cf797af935c97a68655319362b7e6a01 +md5: 3b129669089e4d6a5c6871dbb4669b99 depends: - ca-certificates - libgcc >=14 license: Apache-2.0 license_family: Apache -size: 3692030 -timestamp: 1769557678657 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda -sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 -md5: b76541e68fea4d511b1ac46a28dcd2c6 +size: 3706406 +timestamp: 1775589602258 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda +sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 +md5: 4c06a92e74452cfa53623a81592e8934 depends: - python >=3.8 - python license: Apache-2.0 license_family: APACHE -size: 72010 -timestamp: 1769093650580 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.1.1-py314hac3e5ec_0.conda -sha256: 1ca2d1616baad9bccb7ebc425ef2dcd6cebe742fbe91edf226fb606ad371ca0f -md5: d3c959c7efe560b2d7da459d69121fe9 +size: 91574 +timestamp: 1777103621679 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.2.0-py314hac3e5ec_0.conda +sha256: 96b26c2657275ffe84ab510edf0865e21999d791485d12794edd4a71b837beb6 +md5: 87d58d103b47c4a8567b3d7666647684 depends: - python -- python 3.14.* *_cp314 - libgcc >=14 -- zlib-ng >=2.3.3,<2.4.0a0 +- python 3.14.* *_cp314 +- openjpeg >=2.5.4,<3.0a0 +- libxcb >=1.17.0,<2.0a0 - libwebp-base >=1.6.0,<2.0a0 +- zlib-ng >=2.3.3,<2.4.0a0 +- python_abi 3.14.* *_cp314 +- lcms2 >=2.18,<3.0a0 - tk >=8.6.13,<8.7.0a0 -- 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 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 license: HPND -size: 1051828 -timestamp: 1770794010335 +size: 1062080 +timestamp: 1775060067775 - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 md5: 3e9427ee186846052e81fadde8ebe96a @@ -1008,11 +996,11 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +sha256: 70fc56877c4a095ee658d61924d8019768fbae4a48437058d181fc94b0a7c4d8 +md5: 25a883fed9f1f3f21ff317a3e7c92ac4 depends: -- polars-runtime-32 ==1.39.3 +- polars-runtime-32 ==1.41.0 - python >=3.10 - python constrains: @@ -1026,27 +1014,16 @@ constrains: - 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 +- polars-runtime-32 ==1.41.0 +- polars-runtime-64 ==1.41.0 +- polars-runtime-compat ==1.41.0 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 +size: 539656 +timestamp: 1779630790562 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.41.0-py310h32c7c23_0.conda noarch: python -sha256: c070be507c5a90df397a47ae0299660be437d5546d68f1bc0fa4402c9f07d59e -md5: 3c1a7c6b4ba8b9fb773ace9723f8a5db +sha256: d903b774ec09189e164207328aac157eee82fed8cc5c9ace46aeb5d1c15cb5b3 +md5: 8c08c506ed1ea8ce0ca37af5e918c58d depends: - python - libgcc >=14 @@ -1056,25 +1033,23 @@ depends: 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 +size: 38704429 +timestamp: 1779630794932 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.41.0-py310hc0e61be_0.conda noarch: python -sha256: 683315f1a49e47ce72bf9462419733b40b588b2b3106552d95fd4cd994e174de -md5: dd3464e2132dc3a783e76e5078870c76 +sha256: 101696adff43a654146376c62ef9611bf7946b95fa46f604fe247d77eefc6267 +md5: 65b73e4260677ee5162bdbb252e28e06 depends: - python -- libgcc >=14 - libstdcxx >=14 +- libgcc >=14 - _python_abi3_support 1.* - cpython >=3.10 constrains: - __glibc >=2.17 license: MIT -license_family: MIT -size: 34652491 -timestamp: 1774207996879 +size: 38651498 +timestamp: 1779630714016 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda sha256: e9cbcbc94e151ada3d6dc365380aaaf591f65012c16d9a2abaea4b9b90adc402 md5: ab7288cc39545556d1bc5e71ab2df9a9 @@ -1104,24 +1079,23 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +sha256: 69700e31165df070e9716315e042196aa92525dae5deb5107785847ab9f4189f +md5: 729843edafc0899b3348bd3f19525b9d depends: - typing-inspection >=0.4.2 - typing_extensions >=4.14.1 - python >=3.10 -- typing-extensions >=4.6.1 - annotated-types >=0.6.0 -- pydantic-core ==2.41.5 +- pydantic-core ==2.46.4 - 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 +size: 346511 +timestamp: 1778103405862 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.46.4-py314h451b6cc_0.conda +sha256: 1a7c6b18e404c13c4d959888ecb48a9ed9de0e41be2872932b83a35278088df0 +md5: 9c3ace6aba6df14b943256095ac1281e depends: - python - typing-extensions >=4.6.0,!=4.7.0 @@ -1132,17 +1106,17 @@ 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 +size: 1780773 +timestamp: 1778084251775 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda +sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 +md5: 16c18772b340887160c79a6acc022db0 depends: -- python >=3.9 +- python >=3.10 license: BSD-2-Clause license_family: BSD -size: 889287 -timestamp: 1750615908735 +size: 893031 +timestamp: 1774796815820 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 md5: 461219d1a5bd61342293efa2c0c90eac @@ -1153,31 +1127,31 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.5-hfd9ac0a_100_cp314.conda +build_number: 100 +sha256: d37bad5447365346166c72950ea8f49689aa49cecc1b0623d00458427627b8df +md5: d956e09feb806f5974675ce92ad81d45 depends: - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-aarch64 >=2.36.1 -- libexpat >=2.7.3,<3.0a0 +- libexpat >=2.8.0,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 -- liblzma >=5.8.2,<6.0a0 +- liblzma >=5.8.3,<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 +- libsqlite >=3.53.1,<4.0a0 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 +- openssl >=3.5.6,<4.0a0 - python_abi 3.14.* *_cp314 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 -size: 37305578 -timestamp: 1770674395875 +size: 37510439 +timestamp: 1779236267040 python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 @@ -1188,15 +1162,15 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda +sha256: 41dd7da285d71d519257fa7dacb1cae060d5ebfaa5f92cba5994899d2978e943 +md5: 41954747ba952ec4b01e16c2c9e8d8ff depends: -- cpython 3.14.3.* +- cpython 3.14.5.* - python_abi * *_cp314 license: Python-2.0 -size: 50062 -timestamp: 1770674497152 +size: 50212 +timestamp: 1779236703009 - conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 sha256: e17bf63a30aec33432f1ead86e15e9febde9fc40a7f869c0e766be8d2db44170 md5: 310259a5b03ff02289d7705f39e2b1d2 @@ -1253,9 +1227,9 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.5.9-py314h51f160d_0.conda +sha256: 05ef55f09f31eabd0a205f6b065e13fc746675f41924620977692ef0ffe5aad8 +md5: 34ed7bc9febeca70f55b757ca09c354d depends: - libgcc >=14 - python >=3.14,<3.15.0a0 @@ -1263,27 +1237,27 @@ depends: - 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 +size: 409780 +timestamp: 1778374195988 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da +md5: 4a85203c1d80c1059086ae860836ffb9 depends: - python >=3.10 -- certifi >=2017.4.17 +- certifi >=2023.5.7 - charset-normalizer >=2,<4 - idna >=2.5,<4 -- urllib3 >=1.21.1,<3 +- urllib3 >=1.26,<3 - python constrains: -- chardet >=3.0.2,<6 +- chardet >=3.0.2,<8 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 +size: 68709 +timestamp: 1778851103479 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a +md5: 0242025a3c804966bf71aa04eee82f66 depends: - markdown-it-py >=2.2.0 - pygments >=2.13.0,<3.0.0 @@ -1292,8 +1266,8 @@ depends: - python license: MIT license_family: MIT -size: 208472 -timestamp: 1771572730357 +size: 208577 +timestamp: 1775991661559 - conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 md5: 0c20a8ebcddb24a45da89d5e917e6cb9 @@ -1331,19 +1305,18 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.1-he8854b5_0.conda +sha256: 27467e4bfb0681546f149718c33b806fec078185fbaa6a4d17d440bc8f56185c +md5: 46009bdca2315a99e0a3a7d0ba1af3b9 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 +- libsqlite 3.53.1 h022381a_0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 - readline >=8.3,<9.0a0 license: blessing -size: 209416 -timestamp: 1772818891689 +size: 209964 +timestamp: 1777986493350 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda sha256: c1da41c79262b27efa168407cfecc47b20270e5fc071a8307f95a2c85fb94170 md5: 55bf7b559202236157b14323b40f19e6 @@ -1382,20 +1355,20 @@ depends: 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +sha256: 59d7851d32fddb5b510272e6557aa982edeb927d349648dac27f5bf01d18bb26 +md5: 4460f039b7dedf15f7df086446ca75ae depends: -- importlib-metadata >=3.6 -- python >=3.10 -- typing-extensions >=4.10.0 - typing_extensions >=4.14.0 +- python >=3.10 +- importlib-metadata >=3.6 +- python constrains: - pytest >=7 license: MIT license_family: MIT -size: 36838 -timestamp: 1771532971545 +size: 38297 +timestamp: 1778779291237 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c md5: edd329d7d3a4ab45dcf905899a7a6115 @@ -1405,16 +1378,17 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +sha256: 8b90d2f19f9458b8c58a55e1fcdc1d90c1603a847a47654d8a454549413ba60a +md5: 53f5409c5cfd6c5a66417d68e3f0a864 depends: - python >=3.10 - typing_extensions >=4.12.0 +- python license: MIT license_family: MIT -size: 18923 -timestamp: 1764158430324 +size: 20935 +timestamp: 1777105465795 - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 md5: 0caa1af407ecff61170c9437a808404d @@ -1431,9 +1405,9 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda +sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 +md5: cbb88288f74dbe6ada1c6c7d0a97223e depends: - backports.zstd >=1.0.0 - brotli-python >=1.2.0 @@ -1442,8 +1416,8 @@ depends: - python >=3.10 license: MIT license_family: MIT -size: 103172 -timestamp: 1767817860341 +size: 103560 +timestamp: 1778188657149 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda sha256: e9f6e931feeb2f40e1fdbafe41d3b665f1ab6cb39c5880a1fcf9f79a3f3c84a5 md5: 1c246e1105000c3660558459e2fd6d43 @@ -1471,16 +1445,16 @@ 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 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 +md5: ba3dcdc8584155c97c648ae9c044b7a3 depends: - python >=3.10 - python license: MIT license_family: MIT -size: 24194 -timestamp: 1764460141901 +size: 24190 +timestamp: 1779159948016 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda sha256: 638a3a41a4fbfed52d3c60c8ef5a3693b3f12a5b1a3f58fa29f5698d0a0702e2 md5: f731af71c723065d91b4c01bb822641b 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 f787dbe1e..000000000 --- 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 index 37e7612d4..7a970e2bb 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.34 + - bioconda::multiqc=1.35 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index f6cd6bdf3..c4bc715e2 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -1,11 +1,11 @@ process MULTIQC { tag "${meta.id}" label 'process_single' - tag "$meta.model" + 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'}" + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data' + : 'community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc'}" input: tuple val(meta), path(multiqc_files, stageAs: "?/*"), path(multiqc_config, stageAs: "?/*"), path(multiqc_logo), path(replace_names), path(sample_names) diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index 2facc627b..27ce18d8d 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -110,24 +110,24 @@ maintainers: containers: conda: linux/amd64: - lock_file: modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt + lock_file: modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt linux/arm64: - lock_file: modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt + lock_file: modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt docker: linux/amd64: - name: community.wave.seqera.io/library/multiqc:1.34--db7c73dae76bc9e6 - build_id: bd-db7c73dae76bc9e6_1 - scan_id: sc-66fc7138dbf1cf48_1 + name: community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc + build_id: bd-c17fb751507e9dfc_1 + scan_id: sc-3b1b3932f9846892_1 linux/arm64: - name: community.wave.seqera.io/library/multiqc:1.34--d167b8012595a136 - build_id: bd-d167b8012595a136_1 - scan_id: sc-ac701dfa631a2af9_1 + name: community.wave.seqera.io/library/multiqc:1.35--5c84a5000a226ab5 + build_id: bd-5c84a5000a226ab5_1 + scan_id: sc-0d39df41e9737bbd_1 singularity: linux/amd64: - name: oras://community.wave.seqera.io/library/multiqc:1.34--4fc8657c816047c0 - build_id: bd-4fc8657c816047c0_1 - https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/1b/1bef8af6be88c5733461959c46ac8ef73d18f65277f62a1695d0e1633054f9c2/data + name: oras://community.wave.seqera.io/library/multiqc:1.35--c680f2aea25ccec2 + build_id: bd-c680f2aea25ccec2_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data linux/arm64: - name: oras://community.wave.seqera.io/library/multiqc:1.34--7fbd82d945c06726 - build_id: bd-7fbd82d945c06726_1 - https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9a/9a1fec9662a152683e6fcae440d0ce20920b3b89dc62d1e3a52e73f92eba0969/data + name: oras://community.wave.seqera.io/library/multiqc:1.35--c0468833d65b2f81 + build_id: bd-c0468833d65b2f81_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e4/e48aa28aebc881254a499b24c3e1ce77b8df1b85a5432699ed6f72eb17ac7fb5/data diff --git a/modules/nf-core/multiqc/multiqc.diff b/modules/nf-core/multiqc/multiqc.diff deleted file mode 100644 index d1b0c7d1c..000000000 --- a/modules/nf-core/multiqc/multiqc.diff +++ /dev/null @@ -1,272 +0,0 @@ -Changes in module 'nf-core/multiqc' ---- modules/nf-core/multiqc/meta.yml -+++ modules/nf-core/multiqc/meta.yml -@@ -1,5 +1,6 @@ - name: multiqc --description: Aggregate results from bioinformatics analyses across many samples into a single report -+description: Aggregate results from bioinformatics analyses across many samples into -+ a single report - keywords: - - QC - - bioinformatics tools -@@ -12,40 +13,59 @@ - homepage: https://multiqc.info/ - documentation: https://multiqc.info/docs/ - licence: ["GPL-3.0-or-later"] -+ identifier: biotools:multiqc - input: -- - multiqc_files: -- type: file -- description: | -- List of reports / files recognised by MultiQC, for example the html and zip output of FastQC -- - multiqc_config: -- type: file -- description: Optional config yml for MultiQC -- pattern: "*.{yml,yaml}" -- - extra_multiqc_config: -- type: file -- description: Second optional config yml for MultiQC. Will override common sections in multiqc_config. -- pattern: "*.{yml,yaml}" -- - multiqc_logo: -- type: file -- description: Optional logo file for MultiQC -- pattern: "*.{png}" -+ - - multiqc_files: -+ type: file -+ description: | -+ List of reports / files recognised by MultiQC, for example the html and zip output of FastQC -+ - - multiqc_config: -+ type: file -+ description: Optional config yml for MultiQC -+ pattern: "*.{yml,yaml}" -+ - - extra_multiqc_config: -+ type: file -+ description: Second optional config yml for MultiQC. Will override common sections -+ in multiqc_config. -+ pattern: "*.{yml,yaml}" -+ - - multiqc_logo: -+ type: file -+ description: Optional logo file for MultiQC -+ pattern: "*.{png}" -+ - - replace_names: -+ type: file -+ description: | -+ Optional two-column sample renaming file. First column a set of -+ patterns, second column a set of corresponding replacements. Passed via -+ MultiQC's `--replace-names` option. -+ pattern: "*.{tsv}" -+ - - sample_names: -+ type: file -+ description: | -+ Optional TSV file with headers, passed to the MultiQC --sample_names -+ argument. -+ pattern: "*.{tsv}" - output: - - report: -- type: file -- description: MultiQC report file -- pattern: "multiqc_report.html" -+ - "*multiqc_report.html": -+ type: file -+ description: MultiQC report file -+ pattern: "multiqc_report.html" - - data: -- type: directory -- description: MultiQC data dir -- pattern: "multiqc_data" -+ - "*_data": -+ type: directory -+ description: MultiQC data dir -+ pattern: "multiqc_data" - - plots: -- type: file -- description: Plots created by MultiQC -- pattern: "*_data" -+ - "*_plots": -+ type: file -+ description: Plots created by MultiQC -+ pattern: "*_data" - - versions: -- type: file -- description: File containing software versions -- pattern: "versions.yml" -+ - versions.yml: -+ type: file -+ description: File containing software versions -+ pattern: "versions.yml" - authors: - - "@abhi18av" - - "@bunop" - ---- modules/nf-core/multiqc/main.nf -+++ modules/nf-core/multiqc/main.nf -@@ -3,14 +3,16 @@ - - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://depot.galaxyproject.org/singularity/multiqc:1.21--pyhdfd78af_0' : -- 'biocontainers/multiqc:1.21--pyhdfd78af_0' }" -+ 'https://depot.galaxyproject.org/singularity/multiqc:1.25.1--pyhdfd78af_0' : -+ 'biocontainers/multiqc:1.25.1--pyhdfd78af_0' }" - - input: -- path multiqc_files, stageAs: "?/*" -+ tuple val(meta), path(multiqc_files) - path(multiqc_config) - path(extra_multiqc_config) - path(multiqc_logo) -+ path(replace_names) -+ path(sample_names) - - output: - path "*multiqc_report.html", emit: report -@@ -23,16 +25,22 @@ - - script: - def args = task.ext.args ?: '' -+ def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : "--filename ${meta.model}_multiqc_report.html" - def config = multiqc_config ? "--config $multiqc_config" : '' - def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' -- def logo = multiqc_logo ? /--cl-config 'custom_logo: "${multiqc_logo}"'/ : '' -+ def logo = multiqc_logo ? "--cl-config 'custom_logo: \"${multiqc_logo}\"'" : '' -+ def replace = replace_names ? "--replace-names ${replace_names}" : '' -+ def samples = sample_names ? "--sample-names ${sample_names}" : '' - """ - multiqc \\ - --force \\ - $args \\ - $config \\ -+ $prefix \\ - $extra_config \\ - $logo \\ -+ $replace \\ -+ $samples \\ - . - - cat <<-END_VERSIONS > versions.yml -@@ -44,7 +52,7 @@ - stub: - """ - mkdir multiqc_data -- touch multiqc_plots -+ mkdir multiqc_plots - touch multiqc_report.html - - cat <<-END_VERSIONS > versions.yml - ---- modules/nf-core/multiqc/environment.yml -+++ modules/nf-core/multiqc/environment.yml -@@ -1,7 +1,5 @@ --name: multiqc - channels: - - conda-forge - - bioconda -- - defaults - dependencies: -- - bioconda::multiqc=1.21 -+ - bioconda::multiqc=1.25.1 - ---- modules/nf-core/multiqc/tests/main.nf.test.snap -+++ modules/nf-core/multiqc/tests/main.nf.test.snap -@@ -2,14 +2,14 @@ - "multiqc_versions_single": { - "content": [ - [ -- "versions.yml:md5,21f35ee29416b9b3073c28733efe4b7d" -+ "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" - ] - ], - "meta": { -- "nf-test": "0.8.4", -- "nextflow": "23.10.1" -+ "nf-test": "0.9.0", -+ "nextflow": "24.04.4" - }, -- "timestamp": "2024-02-29T08:48:55.657331" -+ "timestamp": "2024-10-02T17:51:46.317523" - }, - "multiqc_stub": { - "content": [ -@@ -17,25 +17,25 @@ - "multiqc_report.html", - "multiqc_data", - "multiqc_plots", -- "versions.yml:md5,21f35ee29416b9b3073c28733efe4b7d" -+ "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" - ] - ], - "meta": { -- "nf-test": "0.8.4", -- "nextflow": "23.10.1" -+ "nf-test": "0.9.0", -+ "nextflow": "24.04.4" - }, -- "timestamp": "2024-02-29T08:49:49.071937" -+ "timestamp": "2024-10-02T17:52:20.680978" - }, - "multiqc_versions_config": { - "content": [ - [ -- "versions.yml:md5,21f35ee29416b9b3073c28733efe4b7d" -+ "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" - ] - ], - "meta": { -- "nf-test": "0.8.4", -- "nextflow": "23.10.1" -+ "nf-test": "0.9.0", -+ "nextflow": "24.04.4" - }, -- "timestamp": "2024-02-29T08:49:25.457567" -+ "timestamp": "2024-10-02T17:52:09.185842" - } - } ---- modules/nf-core/multiqc/tests/main.nf.test -+++ modules/nf-core/multiqc/tests/main.nf.test -@@ -8,6 +8,8 @@ - tag "modules_nfcore" - tag "multiqc" - -+ config "./nextflow.config" -+ - test("sarscov2 single-end [fastqc]") { - - when { -@@ -17,6 +19,8 @@ - input[1] = [] - input[2] = [] - input[3] = [] -+ input[4] = [] -+ input[5] = [] - """ - } - } -@@ -41,6 +45,8 @@ - input[1] = Channel.of(file("https://github.com/nf-core/tools/raw/dev/nf_core/pipeline-template/assets/multiqc_config.yml", checkIfExists: true)) - input[2] = [] - input[3] = [] -+ input[4] = [] -+ input[5] = [] - """ - } - } -@@ -66,6 +72,8 @@ - input[1] = [] - input[2] = [] - input[3] = [] -+ input[4] = [] -+ input[5] = [] - """ - } - } - ---- /dev/null -+++ modules/nf-core/multiqc/tests/nextflow.config -@@ -0,0 +1,5 @@ -+process { -+ withName: 'MULTIQC' { -+ ext.prefix = null -+ } -+} - -************************************************************ diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index a48d34ac4..448992160 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -81,7 +81,7 @@ [ "MULTIQC", "multiqc", - "1.34" + "1.35" ] ] } @@ -175,7 +175,7 @@ [ "MULTIQC", "multiqc", - "1.34" + "1.35" ] ] } @@ -221,7 +221,7 @@ [ "MULTIQC", "multiqc", - "1.34" + "1.35" ] ] } @@ -314,7 +314,7 @@ [ "MULTIQC", "multiqc", - "1.34" + "1.35" ] ] } @@ -408,7 +408,7 @@ [ "MULTIQC", "multiqc", - "1.34" + "1.35" ] ] } @@ -419,4 +419,4 @@ "nextflow": "25.10.4" } } -} +} \ No newline at end of file diff --git a/subworkflows/local/post_processing.nf b/subworkflows/local/post_processing.nf index 88eeac9b4..ca61d7160 100644 --- a/subworkflows/local/post_processing.nf +++ b/subworkflows/local/post_processing.nf @@ -10,6 +10,7 @@ include { paramsSummaryMultiqc } from '../nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from './utils_nfcore_proteinfold_pipeline' include { GENERATE_REPORT } from '../../modules/local/generate_report' +include { GENERATE_MULTIQC_CONTENTS } from '../../modules/local/generate_multiqc_contents' include { COMPARE_STRUCTURES } from '../../modules/local/compare_structures' include { FOLDSEEK_EASYSEARCH } from '../../modules/nf-core/foldseek/easysearch/main' include { MULTIQC } from '../../modules/nf-core/multiqc/main' @@ -33,6 +34,7 @@ workflow POST_PROCESSING { ch_multiqc_custom_config multiqc_logo ch_multiqc_methods_description + ch_software_versions ch_top_ranked_model main: @@ -115,23 +117,33 @@ workflow POST_PROCESSING { ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_methods_description = channel.value(methodsDescriptionText(ch_multiqc_methods_description)) ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml', sort: true)) + ch_multiqc_files = ch_multiqc_files.mix(ch_software_versions) + + def mqc_generator_script = file("${projectDir}/modules/local/generate_multiqc_contents/generate_multiqc_contents.py", checkIfExists: true) + GENERATE_MULTIQC_CONTENTS( + ch_multiqc_rep, + mqc_generator_script + ) + MULTIQC ( - ch_multiqc_rep - .combine(ch_multiqc_files.collect()) - .combine(ch_multiqc_config.collect().ifEmpty([])) - .combine(ch_multiqc_custom_config.collect().ifEmpty([])) - .map { meta, report_files, methods_file, workflow_file, config_file -> + GENERATE_MULTIQC_CONTENTS.out.mqc_json + .combine(ch_multiqc_files.collect().map { [it] }) + .combine(ch_multiqc_config.collect().ifEmpty([]).map { [it] }) + .combine(ch_multiqc_custom_config.collect().ifEmpty([]).map { [it] }) + .map { meta, mqc_json, extra_files, config_files, custom_config_files -> + // A single-file glob output arrives as a bare java.nio.file.Path, which is Iterable: `path + list` would splice its name components into the list. + def mqc_json_files = mqc_json instanceof List ? mqc_json : [mqc_json] [ meta, - report_files + [methods_file, workflow_file], // All multiqc input files - config_file, + mqc_json_files + extra_files, + (config_files ?: []) + (custom_config_files ?: []), multiqc_logo ? file(multiqc_logo, checkIfExists: true) : [], [], [] ] } ) - ch_multiqc_report = MULTIQC.out.report.toList() + ch_multiqc_report = MULTIQC.out.report.map { _meta, report -> report } } emit: diff --git a/subworkflows/local/utils_nfcore_proteinfold_pipeline/main.nf b/subworkflows/local/utils_nfcore_proteinfold_pipeline/main.nf index e56622341..bcb8adcaf 100644 --- a/subworkflows/local/utils_nfcore_proteinfold_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_proteinfold_pipeline/main.nf @@ -210,6 +210,32 @@ def modeChannel(ch, mode) { } } +// +// Collect the per-model metric TSVs that the MultiQC custom content consumes. +// `metric_channels` is a List of [name, channel] pairs. Each channel yields a +// tuple whose [1] and [2] fields are the meta map and the metric file; pinning +// that position is what makes this safe for emits with extra trailing fields +// (boltz emits 5, alphafold2 4). The first non-empty channel seeds the fold and +// the rest are mixed in one at a time, because mix() is a channel operator -- it +// does not exist on ArrayList. +// +def collectMultiqcMetrics(model, metric_channels) { + def acc = null + metric_channels.each { entry -> + def ch = entry[1].map { it -> [ [id: model, model: model], it[1] ] } + acc = acc == null ? ch : acc.mix(ch) + } + if (acc == null) { + return channel.empty() + } + return acc + .unique { entry -> entry[1] } + .groupTuple() + .map { _model, paths -> + [ [id: model, model: model], paths.flatten() ] + } +} + def countMolecularEntitiesInFasta(fasta) { return fasta.text .readLines() diff --git a/subworkflows/local/utils_nfcore_proteinfold_pipeline/tests/collect_multiqc_metrics_probe.nf b/subworkflows/local/utils_nfcore_proteinfold_pipeline/tests/collect_multiqc_metrics_probe.nf new file mode 100644 index 000000000..ee38e78a7 --- /dev/null +++ b/subworkflows/local/utils_nfcore_proteinfold_pipeline/tests/collect_multiqc_metrics_probe.nf @@ -0,0 +1,39 @@ +nextflow.enable.dsl=2 + +include { collectMultiqcMetrics } from '../main' + +process MAKE_PROBE_METRICS { + input: + tuple val(meta), val(sample_id) + + output: + tuple val(meta), path("${sample_id}_plddt.tsv"), emit: plddt + tuple val(meta), path("${sample_id}_msa.tsv"), path("${sample_id}_coverage.png"), emit: msa + tuple val(meta), path("${sample_id}_ptm.tsv"), emit: ptm + tuple val(meta), path("${sample_id}_iptm.tsv"), emit: iptm + + script: + """ + printf 'Positions\\trank_0\\trank_1\\n1\\t90.0\\t80.0\\n' > ${sample_id}_plddt.tsv + printf '12\\n' > ${sample_id}_msa.tsv + touch ${sample_id}_coverage.png + printf '0\\t0.40\\n1\\t0.30\\n' > ${sample_id}_ptm.tsv + printf '0\\t0.80\\n1\\t0.70\\n' > ${sample_id}_iptm.tsv + """ +} + +workflow COLLECT_MULTIQC_METRICS_PROBE { + + main: + MAKE_PROBE_METRICS(channel.of([ [ id: 'S1' ], 'S1' ], [ [ id: 'S2' ], 'S2' ])) + + out_metrics = collectMultiqcMetrics(params.probe_mode, [ + [ 'plddt', MAKE_PROBE_METRICS.out.plddt ], + [ 'msa', MAKE_PROBE_METRICS.out.msa ], + [ 'ptm', MAKE_PROBE_METRICS.out.ptm ], + [ 'iptm', MAKE_PROBE_METRICS.out.iptm ], + ]) + + emit: + metrics = out_metrics +} diff --git a/subworkflows/local/utils_nfcore_proteinfold_pipeline/tests/main.nf.test b/subworkflows/local/utils_nfcore_proteinfold_pipeline/tests/main.nf.test new file mode 100644 index 000000000..3b718bfda --- /dev/null +++ b/subworkflows/local/utils_nfcore_proteinfold_pipeline/tests/main.nf.test @@ -0,0 +1,35 @@ +nextflow_workflow { + + name "Test collectMultiqcMetrics reporting channel" + script "subworkflows/local/utils_nfcore_proteinfold_pipeline/tests/collect_multiqc_metrics_probe.nf" + workflow "COLLECT_MULTIQC_METRICS_PROBE" + tag "pipeline" + tag "multiqc" + tag "channel_shape" + + test("folds metric emits into one non-empty tuple per prediction mode") { + + when { + params { + probe_mode = "boltz" + } + } + + then { + def metrics = workflow.out.metrics + assert metrics != null: "collectMultiqcMetrics emitted nothing - MULTIQC would receive no input" + assert metrics.size() == 1: "expected exactly one tuple for the mode, got ${metrics.size()}" + + def meta = metrics[0][0] + def files = metrics[0][1] + assert meta == [id: "boltz", model: "boltz"]: "unexpected task meta: ${meta}" + + def names = files.collect { it.toString().tokenize('/').last() }.sort() + assert names == [ + "S1_iptm.tsv", "S1_msa.tsv", "S1_plddt.tsv", "S1_ptm.tsv", + "S2_iptm.tsv", "S2_msa.tsv", "S2_plddt.tsv", "S2_ptm.tsv", + ], "unexpected metric files: ${names}" + assert !names.any { it.endsWith(".png") }, "trailing emit fields must not leak into the MultiQC input" + } + } +} diff --git a/tests/alphafold2_download.nf.test b/tests/alphafold2_download.nf.test index 1516960a9..50dcec6f6 100644 --- a/tests/alphafold2_download.nf.test +++ b/tests/alphafold2_download.nf.test @@ -21,6 +21,7 @@ nextflow_pipeline { def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') // Early failure no need to test the rest of snapshots assert workflow.success + assert file("${params.outdir}/multiqc/multiqc_report.html").exists(): "MultiQC report missing - the reporting channel went empty" assertAll( { assert snapshot( // Number of successful tasks diff --git a/tests/alphafold2_download.nf.test.snap b/tests/alphafold2_download.nf.test.snap index 7c2b454e0..8c070f637 100644 --- a/tests/alphafold2_download.nf.test.snap +++ b/tests/alphafold2_download.nf.test.snap @@ -1,7 +1,7 @@ { "-profile test_alphafold2_download": { "content": [ - 27, + 28, [ "DBs", "DBs/alphafold2", @@ -112,7 +112,7 @@ "T1026_alphafold2_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "timestamp": "2026-09-22T16:36:59.767429602", + "timestamp": "2026-09-29T16:28:09.771504003", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.6" diff --git a/tests/alphafold2_split.nf.test b/tests/alphafold2_split.nf.test index 1611b1cbe..34580881f 100644 --- a/tests/alphafold2_split.nf.test +++ b/tests/alphafold2_split.nf.test @@ -21,6 +21,7 @@ nextflow_pipeline { def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') // Early failure no need to test the rest of snapshots assert workflow.success + assert file("${params.outdir}/multiqc/multiqc_report.html").exists(): "MultiQC report missing - the reporting channel went empty" assertAll( { assert snapshot( // Number of successful tasks diff --git a/tests/alphafold2_split.nf.test.snap b/tests/alphafold2_split.nf.test.snap index 6ac9b42df..3d7374833 100644 --- a/tests/alphafold2_split.nf.test.snap +++ b/tests/alphafold2_split.nf.test.snap @@ -1,7 +1,7 @@ { "-profile test_alphafold2_split": { "content": [ - 7, + 8, [ "alphafold2", "alphafold2/split_msa_prediction", @@ -71,7 +71,7 @@ "T1026_alphafold2_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "timestamp": "2026-09-22T16:37:17.591423215", + "timestamp": "2026-09-29T16:28:32.933271577", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.6" diff --git a/tests/alphafold3.nf.test b/tests/alphafold3.nf.test index b74393d3f..0e554cf49 100644 --- a/tests/alphafold3.nf.test +++ b/tests/alphafold3.nf.test @@ -22,6 +22,7 @@ nextflow_pipeline { def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') // Early failure no need to test the rest of snapshots assert workflow.success + assert file("${params.outdir}/multiqc/multiqc_report.html").exists(): "MultiQC report missing - the reporting channel went empty" assertAll( { assert snapshot( // Number of successful tasks diff --git a/tests/alphafold3.nf.test.snap b/tests/alphafold3.nf.test.snap index d108f23be..4936a38db 100644 --- a/tests/alphafold3.nf.test.snap +++ b/tests/alphafold3.nf.test.snap @@ -1,8 +1,10 @@ { "-profile test_alphafold3_standard": { "content": [ - 9, + 10, { + "NFCORE_PROTEINFOLD:POST_PROCESSING:GENERATE_MULTIQC_CONTENTS:generate_multiqc_contents.py": "3.14.0", + "NFCORE_PROTEINFOLD:POST_PROCESSING:GENERATE_MULTIQC_CONTENTS:python": "3.14.0", "NFCORE_PROTEINFOLD:POST_PROCESSING:GENERATE_REPORT:generate_report.py": "3.12.7", "NFCORE_PROTEINFOLD:POST_PROCESSING:GENERATE_REPORT:python": "3.12.7" }, @@ -77,7 +79,7 @@ "T1026_alphafold3_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "timestamp": "2026-09-22T16:37:39.0411434", + "timestamp": "2026-09-29T16:28:56.426251898", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.6" diff --git a/tests/alphafold3_download.nf.test b/tests/alphafold3_download.nf.test index 0372d7cab..030a78511 100644 --- a/tests/alphafold3_download.nf.test +++ b/tests/alphafold3_download.nf.test @@ -18,6 +18,7 @@ nextflow_pipeline { def stableName = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) def stableContent = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assert workflow.success + assert file("${params.outdir}/multiqc/multiqc_report.html").exists(): "MultiQC report missing - the reporting channel went empty" assert snapshot( workflow.trace.succeeded().size(), removeNextflowVersion("$outputDir/pipeline_info/nf_core_proteinfold_software_mqc_versions.yml"), diff --git a/tests/alphafold3_download.nf.test.snap b/tests/alphafold3_download.nf.test.snap index 22b7e2d2b..0b0136c55 100644 --- a/tests/alphafold3_download.nf.test.snap +++ b/tests/alphafold3_download.nf.test.snap @@ -1,8 +1,10 @@ { "-profile test_alphafold3_download": { "content": [ - 28, + 29, { + "NFCORE_PROTEINFOLD:POST_PROCESSING:GENERATE_MULTIQC_CONTENTS:generate_multiqc_contents.py": "3.14.0", + "NFCORE_PROTEINFOLD:POST_PROCESSING:GENERATE_MULTIQC_CONTENTS:python": "3.14.0", "NFCORE_PROTEINFOLD:POST_PROCESSING:GENERATE_REPORT:generate_report.py": "3.12.7", "NFCORE_PROTEINFOLD:POST_PROCESSING:GENERATE_REPORT:python": "3.12.7", "NFCORE_PROTEINFOLD:PREPARE_ALPHAFOLD3_DBS:ARIA2_MGNIFY:ZSTD_DECOMPRESS:zstd": "v1.5.6", @@ -120,7 +122,7 @@ "T1026_alphafold3_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "timestamp": "2026-09-22T16:38:01.291309068", + "timestamp": "2026-09-29T16:29:20.110512797", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.6" diff --git a/tests/boltz.nf.test b/tests/boltz.nf.test index 304836f64..e071d0c0b 100644 --- a/tests/boltz.nf.test +++ b/tests/boltz.nf.test @@ -21,6 +21,7 @@ nextflow_pipeline { def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') // Early failure no need to test the rest of snapshots assert workflow.success + assert file("${params.outdir}/multiqc/multiqc_report.html").exists(): "MultiQC report missing - the reporting channel went empty" assertAll( { assert snapshot( // Number of successful tasks diff --git a/tests/boltz.nf.test.snap b/tests/boltz.nf.test.snap index 8f5d4bf2d..110b28160 100644 --- a/tests/boltz.nf.test.snap +++ b/tests/boltz.nf.test.snap @@ -1,7 +1,7 @@ { "-profile test_boltz": { "content": [ - 13, + 14, [ "boltz", "boltz/T1024", @@ -96,7 +96,7 @@ "T1026.yaml:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "timestamp": "2026-09-22T16:38:22.951149423", + "timestamp": "2026-09-29T16:30:07.049216251", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.6" diff --git a/tests/colabfold_download.nf.test b/tests/colabfold_download.nf.test index 3047f3d97..2fc5e5e29 100644 --- a/tests/colabfold_download.nf.test +++ b/tests/colabfold_download.nf.test @@ -21,6 +21,7 @@ nextflow_pipeline { def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') // Early failure no need to test the rest of snapshots assert workflow.success + assert file("${params.outdir}/multiqc/multiqc_report.html").exists(): "MultiQC report missing - the reporting channel went empty" assertAll( { assert snapshot( // Number of successful tasks diff --git a/tests/colabfold_download.nf.test.snap b/tests/colabfold_download.nf.test.snap index 3e8f73717..a2dddfe29 100644 --- a/tests/colabfold_download.nf.test.snap +++ b/tests/colabfold_download.nf.test.snap @@ -1,7 +1,7 @@ { "-profile test_colabfold_download": { "content": [ - 9, + 10, [ "DBs", "DBs/colabfold", @@ -90,7 +90,7 @@ "T1026_colabfold_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "timestamp": "2026-09-22T16:38:47.152902009", + "timestamp": "2026-09-29T16:30:33.926875172", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.6" diff --git a/tests/colabfold_local.nf.test b/tests/colabfold_local.nf.test index 59ff85240..8bcc63abe 100644 --- a/tests/colabfold_local.nf.test +++ b/tests/colabfold_local.nf.test @@ -21,6 +21,7 @@ nextflow_pipeline { def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') // Early failure no need to test the rest of snapshots assert workflow.success + assert file("${params.outdir}/multiqc/multiqc_report.html").exists(): "MultiQC report missing - the reporting channel went empty" assertAll( { assert snapshot( // Number of successful tasks diff --git a/tests/colabfold_local.nf.test.snap b/tests/colabfold_local.nf.test.snap index aa29b1aab..1fe9193c9 100644 --- a/tests/colabfold_local.nf.test.snap +++ b/tests/colabfold_local.nf.test.snap @@ -1,7 +1,7 @@ { "-profile test_colabfold_local": { "content": [ - 9, + 10, [ "colabfold", "colabfold/T1024", @@ -83,7 +83,7 @@ "T1026_colabfold_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "timestamp": "2026-09-22T16:39:07.753890514", + "timestamp": "2026-09-29T16:31:01.406598299", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.6" diff --git a/tests/colabfold_webserver.nf.test b/tests/colabfold_webserver.nf.test index 0498b56d7..49e0982db 100644 --- a/tests/colabfold_webserver.nf.test +++ b/tests/colabfold_webserver.nf.test @@ -21,6 +21,7 @@ nextflow_pipeline { def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') // Early failure no need to test the rest of snapshots assert workflow.success + assert file("${params.outdir}/multiqc/multiqc_report.html").exists(): "MultiQC report missing - the reporting channel went empty" assertAll( { assert snapshot( // Number of successful tasks diff --git a/tests/colabfold_webserver.nf.test.snap b/tests/colabfold_webserver.nf.test.snap index 645ed32e4..52aeead42 100644 --- a/tests/colabfold_webserver.nf.test.snap +++ b/tests/colabfold_webserver.nf.test.snap @@ -1,7 +1,7 @@ { "-profile test_colabfold_webserver": { "content": [ - 7, + 8, [ "colabfold", "colabfold/T1024", @@ -83,7 +83,7 @@ "T1026_colabfold_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "timestamp": "2026-09-22T16:39:23.660588799", + "timestamp": "2026-09-29T16:31:22.604107862", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.6" diff --git a/tests/default.nf.test b/tests/default.nf.test index e4f51fe8f..0a961fa2a 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -18,6 +18,7 @@ nextflow_pipeline { // stable_content: All files in ${params.outdir}/ with stable content def stable_content = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assert workflow.success + assert file("${params.outdir}/multiqc/multiqc_report.html").exists(): "MultiQC report missing - the reporting channel went empty" assertAll( { assert snapshot( // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions diff --git a/tests/esmfold.nf.test b/tests/esmfold.nf.test index d087d975a..a440f4540 100644 --- a/tests/esmfold.nf.test +++ b/tests/esmfold.nf.test @@ -21,6 +21,7 @@ nextflow_pipeline { def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') // Early failure no need to test the rest of snapshots assert workflow.success + assert file("${params.outdir}/multiqc/multiqc_report.html").exists(): "MultiQC report missing - the reporting channel went empty" assertAll( { assert snapshot( // Number of successful tasks @@ -35,4 +36,17 @@ nextflow_pipeline { ) } } + + test("-profile test_esmfold --skip_multiqc") { + when { + params { + outdir = "$outputDir" + skip_multiqc = true + } + } + then { + assert workflow.success + assert !file("${params.outdir}/multiqc").exists() + } + } } diff --git a/tests/esmfold.nf.test.snap b/tests/esmfold.nf.test.snap index 1fbbf38d0..c84da28cc 100644 --- a/tests/esmfold.nf.test.snap +++ b/tests/esmfold.nf.test.snap @@ -1,7 +1,7 @@ { "-profile test_esmfold": { "content": [ - 5, + 6, [ "esmfold", "esmfold/T1024", @@ -34,7 +34,7 @@ "T1026_esmfold_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "timestamp": "2026-09-22T16:40:19.264747803", + "timestamp": "2026-09-29T16:29:44.465261472", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.6" diff --git a/tests/scientific/validate_outputs.py b/tests/scientific/validate_outputs.py index ab47a2174..0a6740676 100644 --- a/tests/scientific/validate_outputs.py +++ b/tests/scientific/validate_outputs.py @@ -3,7 +3,9 @@ import argparse import csv +import json import math +import re import tempfile import urllib.request import warnings @@ -102,6 +104,71 @@ def validate_pae(path: Path) -> tuple[int, int]: return len(rows), len(rows[0]) +def validate_multiqc_report(outdir: Path, mode: str, identifiers: list[str]) -> None: + """Validate the rendered custom-content report and its exported data.""" + multiqc_dir = outdir / "multiqc" + report = multiqc_dir / f"{mode}_multiqc_report.html" + data_dir = multiqc_dir / f"{mode}_multiqc_report_data" + plots_dir = multiqc_dir / f"{mode}_multiqc_report_plots" + assert report.is_file(), f"MultiQC report missing: {report}" + assert data_dir.is_dir(), f"MultiQC data directory missing: {data_dir}" + assert plots_dir.is_dir(), f"MultiQC plots directory missing: {plots_dir}" + + data_path = data_dir / "multiqc_data.json" + assert data_path.is_file(), f"MultiQC data JSON missing: {data_path}" + data = json.loads(data_path.read_text()) + stats = data.get("report_general_stats_data", {}).get("custom_content", {}) + assert stats, "MultiQC general stats contain no ProteinFold custom content" + sample_names = [name for name, row in stats.items() if row] + for identifier in identifiers: + assert any(name.startswith(f"{identifier}_") for name in sample_names), ( + f"No ProteinFold general-stats row for {identifier}; found {sample_names}" + ) + assert not any("UNKNOWN" in name for name in sample_names), f"Unlabelled MultiQC rows: {sample_names}" + + rank_rows = [name for name in sample_names if re.search(r"[ _]rank_\d+$", name)] + grouped_containers = [name for name, row in stats.items() if not row and "(grouped)" in name] + if rank_rows: + assert grouped_containers, ( + "MultiQC general stats contain rank rows but no nested groups; " + "the table_sample_merge rank labels in assets/multiqc_config.yml are not taking effect" + ) + + plots = data.get("report_plot_data", {}) + lineplot = next((plot for plot in plots.values() if plot.get("id") == "proteinfold_plddt_lineplot"), None) + assert lineplot is not None, "MultiQC data contain no ProteinFold pLDDT line plot" + datasets = lineplot.get("datasets", []) + assert datasets, "ProteinFold pLDDT line plot has no switcher datasets" + dataset_labels = [dataset.get("label") for dataset in datasets] + assert not any(label and "_rank_" in label for label in dataset_labels), ( + f"The pLDDT line-plot switcher must be per prediction, not per rank: {dataset_labels}" + ) + for dataset in datasets: + series_names = [line.get("name", "") for line in dataset.get("lines", [])] + assert series_names, f"Empty pLDDT switcher dataset: {dataset.get('label')}" + assert all(re.fullmatch(r"rank_\d+", name) for name in series_names), ( + f"pLDDT dataset {dataset.get('label')} must nest one rank_N series per ranked model, " + f"got {series_names}" + ) + print(f"Validated MultiQC: {report.name} ({len(sample_names)} ProteinFold rows, {len(datasets)} pLDDT datasets)") + + +def validate_detailed_report(outdir: Path, identifier: str) -> None: + """Validate the embedded configuration of a per-protein report.""" + reports = sorted((outdir / "reports").glob(f"{identifier}_*_report.html")) + assert reports, f"No detailed report for {identifier} in {outdir / 'reports'}" + html = reports[0].read_text() + match = re.search(r'', html, re.DOTALL) + assert match, f"report-config JSON blob missing from {reports[0].name}" + config = json.loads(match.group(1)) + assert config.get("sampleName") == identifier + for key in ("programName", "models", "models_data", "lddt_averages"): + assert config.get(key), f"report config is missing {key}" + for key in ("iptm_scores", "ipsae_scores", "chainwise_iptm", "chainwise_ipsae"): + assert key in config, f"report config is missing {key}" + print(f"Validated detailed report: {reports[0].name}") + + def main() -> None: parser = argparse.ArgumentParser() parser.add_argument("--mode", required=True) @@ -146,6 +213,10 @@ def main() -> None: row_count, column_count = validate_pae(path) print(f"Validated PAE: {path.name} ({row_count}x{column_count} matrix)") + validate_multiqc_report(args.outdir, args.mode, ids) + for identifier in ids: + validate_detailed_report(args.outdir, identifier) + print( f"Validated {args.display_name}: {len(ids)} inputs, {len(structures)} structures, " f"{len(plddt_files)} pLDDT files, {len(pae_files)} PAE matrices" diff --git a/tests/split_fasta.nf.test b/tests/split_fasta.nf.test index 2edbe9bb3..233a27c70 100644 --- a/tests/split_fasta.nf.test +++ b/tests/split_fasta.nf.test @@ -21,6 +21,7 @@ nextflow_pipeline { def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') // Early failure no need to test the rest of snapshots assert workflow.success + assert file("${params.outdir}/multiqc/multiqc_report.html").exists(): "MultiQC report missing - the reporting channel went empty" assertAll( { assert snapshot( // Number of successful tasks diff --git a/tests/split_fasta.nf.test.snap b/tests/split_fasta.nf.test.snap index a49ba1dbf..42dfebfbe 100644 --- a/tests/split_fasta.nf.test.snap +++ b/tests/split_fasta.nf.test.snap @@ -1,7 +1,7 @@ { "-profile test_split_fasta": { "content": [ - 9, + 10, [ "colabfold", "colabfold/H1065_H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_1_127_residues", @@ -83,7 +83,7 @@ "H1065_H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_2_98_residues_colabfold_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "timestamp": "2026-09-22T16:40:41.466544202", + "timestamp": "2026-09-29T16:31:50.313991708", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.6" diff --git a/workflows/alphafold2.nf b/workflows/alphafold2.nf index a8acd8e87..0221a9c0a 100644 --- a/workflows/alphafold2.nf +++ b/workflows/alphafold2.nf @@ -10,6 +10,7 @@ include { RUN_ALPHAFOLD2_MSA } from '../modules/local/run_alphafold2_msa' include { RUN_ALPHAFOLD2_PRED } from '../modules/local/run_alphafold2_pred' include { resolveModelPresetByFastaEntities } from '../subworkflows/local/utils_nfcore_proteinfold_pipeline' +include { collectMultiqcMetrics } from '../subworkflows/local/utils_nfcore_proteinfold_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -51,7 +52,7 @@ workflow ALPHAFOLD2 { ch_ipsae = channel.empty() ch_chainwise_iptm = channel.empty() ch_chainwise_ipsae = channel.empty() - ch_multiqc_report = channel.empty() + ch_multiqc_metrics = channel.empty() ch_samplesheet .map { meta, fasta -> @@ -103,15 +104,13 @@ workflow ALPHAFOLD2 { ch_uniprot ) - RUN_ALPHAFOLD2_PRED - .out - .multiqc - .map { it -> it[1] } - .toSortedList() - .map { it -> - [ [ "model": "alphafold2" ], it.flatten() ] - } - .set { ch_multiqc_report } + // Hand MultiQC every metric this model actually produces, not just pLDDT. + ch_multiqc_metrics = collectMultiqcMetrics("alphafold2", [ + [ 'plddt', RUN_ALPHAFOLD2_PRED.out.plddt ], + [ 'msa', RUN_ALPHAFOLD2_PRED.out.msa ], + [ 'ptms', RUN_ALPHAFOLD2_PRED.out.ptms ], + [ 'iptms', RUN_ALPHAFOLD2_PRED.out.iptms ] + ]) ch_top_ranked_pdb = ch_top_ranked_pdb.mix(RUN_ALPHAFOLD2_PRED.out.top_ranked_pdb) ch_pdb = ch_pdb.mix(RUN_ALPHAFOLD2_PRED.out.pdb) @@ -195,7 +194,7 @@ workflow ALPHAFOLD2 { ipsae = ch_ipsae_final // channel: [ meta, /path/to/*_ipsae.tsv ] chainwise_iptm = ch_chainwise_iptm_final // channel: [ meta, /path/to/*_chainwise_iptm.tsv ] chainwise_ipsae = ch_chainwise_ipsae_final // channel: [ meta, /path/to/*_chainwise_ipsae.tsv ] - multiqc_report = ch_multiqc_report // channel: /path/to/multiqc_report.html + multiqc_metrics = ch_multiqc_metrics // channel: [ [id:..., model:...], [metric tsvs] ] } /* diff --git a/workflows/alphafold3.nf b/workflows/alphafold3.nf index 38f32c41e..6b30e158c 100644 --- a/workflows/alphafold3.nf +++ b/workflows/alphafold3.nf @@ -10,6 +10,7 @@ include { FASTA_TO_ALPHAFOLD3_JSON } from '../modules/local/fasta_to_alphafold3_json' include { RUN_ALPHAFOLD3_DATAPIPELINE } from '../modules/local/run_alphafold3_datapipeline' include { RUN_ALPHAFOLD3_INFERENCE } from '../modules/local/run_alphafold3_inference' +include { collectMultiqcMetrics } from '../subworkflows/local/utils_nfcore_proteinfold_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -43,7 +44,7 @@ workflow ALPHAFOLD3 { ch_structure_final = channel.empty() ch_top_ranked_structure = channel.empty() ch_msa_final = channel.empty() - ch_multiqc_report = channel.empty() + ch_multiqc_metrics = channel.empty() ch_samplesheet .branch { it -> @@ -117,16 +118,13 @@ workflow ALPHAFOLD3 { } .set { ch_msa_final } - // Prepare multiqc input - RUN_ALPHAFOLD3_INFERENCE - .out - .multiqc - .map { it -> it[1] } - .toSortedList() - .map { it -> - [ [ "model": "alphafold3" ], it.flatten() ] - } - .set { ch_multiqc_report } + // Prepare multiqc input: every metric this model produces, not just pLDDT. + ch_multiqc_metrics = collectMultiqcMetrics("alphafold3", [ + [ 'plddt', RUN_ALPHAFOLD3_INFERENCE.out.plddt ], + [ 'msa', RUN_ALPHAFOLD3_INFERENCE.out.msa ], + [ 'ptms', RUN_ALPHAFOLD3_INFERENCE.out.ptms ], + [ 'iptms', RUN_ALPHAFOLD3_INFERENCE.out.iptms ] + ]) // Prepare pae input RUN_ALPHAFOLD3_INFERENCE @@ -188,7 +186,7 @@ workflow ALPHAFOLD3 { ipsae = ch_ipsae_final // channel: [ meta, path/to/*_ipsae.tsv ] chainwise_iptm = ch_chainwise_iptm_final // channel: [ meta, path/to/*_chainwise_iptm.tsv ] chainwise_ipsae = ch_chainwise_ipsae_final // channel: [ meta, path/to/*_chainwise_ipsae.tsv ] - multiqc_report = ch_multiqc_report // channel: /path/to/multiqc_report.html + multiqc_metrics = ch_multiqc_metrics // channel: [ [id:..., model:...], [metric tsvs] ] versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/workflows/boltz.nf b/workflows/boltz.nf index 2da680189..44aa6ba09 100644 --- a/workflows/boltz.nf +++ b/workflows/boltz.nf @@ -27,6 +27,7 @@ include { MMSEQS_COLABFOLDSEARCH } from '../modules/local/mmseqs_colabfoldsearch // MODULE: Boltz // include { RUN_BOLTZ } from '../modules/local/run_boltz' +include { collectMultiqcMetrics } from '../subworkflows/local/utils_nfcore_proteinfold_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -124,7 +125,7 @@ workflow BOLTZ { RUN_BOLTZ .out - .msa_raw + .msa .map { it -> def meta = it[0].clone(); meta.model = "boltz" @@ -134,7 +135,7 @@ workflow BOLTZ { RUN_BOLTZ .out - .pae_raw + .pae .map { it -> def meta = it[0].clone(); meta.model = "boltz" @@ -144,7 +145,7 @@ workflow BOLTZ { RUN_BOLTZ .out - .iptm_raw + .iptm .map { it -> def meta = it[0].clone(); meta.model = "boltz" @@ -154,7 +155,7 @@ workflow BOLTZ { RUN_BOLTZ .out - .ipsae_raw + .ipsae .map { it -> def meta = it[0].clone(); meta.model = "boltz" @@ -164,7 +165,7 @@ workflow BOLTZ { RUN_BOLTZ .out - .chainwise_iptm_raw + .chainwise_iptm .map { it -> def meta = it[0].clone(); meta.model = "boltz" @@ -174,7 +175,7 @@ workflow BOLTZ { RUN_BOLTZ .out - .chainwise_ipsae_raw + .chainwise_ipsae .map { it -> def meta = it[0].clone(); meta.model = "boltz" @@ -182,18 +183,18 @@ workflow BOLTZ { } .set { ch_chainwise_ipsae } - RUN_BOLTZ - .out - .multiqc - .map { it -> it[1] } - .collect(sort: true) - .map { it -> [ [ "model": "boltz"], it.flatten() ] } - .set { ch_multiqc_report } + // Hand MultiQC every metric this model actually produces, not just pLDDT. + ch_multiqc_metrics = collectMultiqcMetrics("boltz", [ + [ 'plddt', RUN_BOLTZ.out.plddt ], + [ 'msa', RUN_BOLTZ.out.msa ], + [ 'ptm', RUN_BOLTZ.out.ptm ], + [ 'iptm', RUN_BOLTZ.out.iptm ] + ]) emit: msa = ch_msa confidence = RUN_BOLTZ.out.confidence - multiqc_report = ch_multiqc_report + multiqc_metrics = ch_multiqc_metrics top_ranked_pdb = ch_top_ranked_pdb pdb = ch_pdb pae = ch_pae diff --git a/workflows/colabfold.nf b/workflows/colabfold.nf index 2042f22e3..eb3411349 100644 --- a/workflows/colabfold.nf +++ b/workflows/colabfold.nf @@ -12,6 +12,7 @@ include { MMSEQS_COLABFOLDSEARCH } from '../modules/local/mmseqs_colabfoldsearch include { MULTIFASTA_TO_CSV } from '../modules/local/multifasta_to_csv' include { modeChannel } from '../subworkflows/local/utils_nfcore_proteinfold_pipeline' +include { collectMultiqcMetrics } from '../subworkflows/local/utils_nfcore_proteinfold_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -35,7 +36,7 @@ workflow COLABFOLD { num_recycles // int: Number of recycles for colabfold main: - ch_multiqc_report = channel.empty() + ch_multiqc_metrics = channel.empty() if (params.use_msa_server) { // @@ -103,15 +104,13 @@ workflow COLABFOLD { modeChannel(COLABFOLD_BATCH.out.chainwise_iptms, "colabfold").set { ch_chainwise_iptm_final } modeChannel(COLABFOLD_BATCH.out.chainwise_ipsaes, "colabfold").set { ch_chainwise_ipsae_final } - COLABFOLD_BATCH - .out - .multiqc - .map { it -> it[1] } - .toSortedList() - .map { it -> - [ [ "model":"colabfold"], it.flatten() ] - } - .set { ch_multiqc_report } + // Hand MultiQC every metric this model actually produces, not just pLDDT. + ch_multiqc_metrics = collectMultiqcMetrics("colabfold", [ + [ 'plddt', COLABFOLD_BATCH.out.plddt ], + [ 'msa', COLABFOLD_BATCH.out.msa ], + [ 'ptms', COLABFOLD_BATCH.out.ptms ], + [ 'iptms', COLABFOLD_BATCH.out.iptms ] + ]) emit: top_ranked_pdb = ch_top_ranked_pdb // channel: [ meta, /path/to/*.pdb ] @@ -122,7 +121,7 @@ workflow COLABFOLD { ipsae = ch_ipsae_final // channel: [ id, /path/to/*_ipsae.tsv ] chainwise_iptm = ch_chainwise_iptm_final // channel: [ id, /path/to/*_chainwise_iptm.tsv ] chainwise_ipsae = ch_chainwise_ipsae_final // channel: [ id, /path/to/*_chainwise_ipsae.tsv ] - multiqc_report = ch_multiqc_report // channel: /path/to/multiqc_report.html + multiqc_metrics = ch_multiqc_metrics // channel: [ [id:..., model:...], [metric tsvs] ] } /* diff --git a/workflows/esmfold.nf b/workflows/esmfold.nf index 1361e977c..0ddccf913 100644 --- a/workflows/esmfold.nf +++ b/workflows/esmfold.nf @@ -12,6 +12,7 @@ include { MULTIFASTA_TO_SINGLEFASTA } from '../modules/local/multifasta_to_singl include { countMolecularEntitiesInFasta } from '../subworkflows/local/utils_nfcore_proteinfold_pipeline' include { modeChannel } from '../subworkflows/local/utils_nfcore_proteinfold_pipeline' +include { collectMultiqcMetrics } from '../subworkflows/local/utils_nfcore_proteinfold_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -61,21 +62,15 @@ workflow ESMFOLD { ch_num_recycles ) - RUN_ESMFOLD - .out - .multiqc - .map { it -> it[1] } - .toSortedList() - .map { it -> - [ [ "model": "esmfold"], it.flatten() ] - } - .set { ch_multiqc_report } + ch_multiqc_metrics = collectMultiqcMetrics("esmfold", [ + [ 'plddt', RUN_ESMFOLD.out.plddt ] + ]) modeChannel(RUN_ESMFOLD.out.pdb, "esmfold").set { ch_pdb_final } emit: - pdb = ch_pdb_final // channel: [ id, /path/to/*.pdb ] - multiqc_report = ch_multiqc_report // channel: /path/to/multiqc_report.html + pdb = ch_pdb_final // channel: [ id, /path/to/*.pdb ] + multiqc_metrics = ch_multiqc_metrics // channel: [ [id:..., model:...], [metric tsvs] ] } /*