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'
',
)
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] ]
}
/*