diff --git a/CHANGELOG.md b/CHANGELOG.md
index dd69548d..b1788070 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,10 +3,11 @@
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## dev - [unreleased]
+## v1.3.0dev [unreleased]
### `Added`
+- [#682](https://github.com/nf-core/taxprofiler/pull/682) Added metacache classifier and improved nf-tests (added by @sofstam)
- [#559](https://github.com/nf-core/taxprofiler/pull/559) Profiling of long reads with motus (added by @LilyAnderssonLee and @sofstam )
- [#595](https://github.com/nf-core/taxprofiler/pull/595) **New classifier** [sylph](https://github.com/bluenote-1577/sylph) (added by @sofstam)
- [#608](https://github.com/nf-core/taxprofiler/pull/608) **New classifier** [melon](https://github.com/xinehc/melon) (added by @parisis and @sofstam)
diff --git a/CITATIONS.md b/CITATIONS.md
index 7ee292d9..09736b7a 100644
--- a/CITATIONS.md
+++ b/CITATIONS.md
@@ -133,6 +133,10 @@
> Shaw, J., & Yu, Y. W. (2024). Rapid species-level metagenome profiling and containment estimation with Sylph. Nature Biotechnology. https://doi.org/10.1038/s41587-024-02412-y
+- [MetaCachae](https://doi.org/10.1093/bioinformatics/btx520)
+
+ > Müller, A., Hundt, C., Hildebrandt, A., Hankeln, T., & Schmidt, B.(2017). MetaCache: context-aware classification of metagenomic reads using minhashing. Bioinformatics, 33(23), 3740–3748. https://doi.org/10.1093/bioinformatics/btx520
+
## Software packaging/containerisation tools
- [Anaconda](https://anaconda.com)
diff --git a/README.md b/README.md
index 5f6c6473..05a909b7 100644
--- a/README.md
+++ b/README.md
@@ -49,6 +49,7 @@
- [ganon](https://pirovc.github.io/ganon/)
- [sylph](https://github.com/bluenote-1577/sylph)
- [Melon](https://github.com/xinehc/melon)
+ - [MetaCache](https://github.com/muellan/metacache)
5. Perform optional post-processing with:
- [bracken](https://ccb.jhu.edu/software/bracken/)
6. Standardises output tables ([`Taxpasta`](https://taxpasta.readthedocs.io))
diff --git a/conf/modules.config b/conf/modules.config
index d40f0d0a..56375f05 100644
--- a/conf/modules.config
+++ b/conf/modules.config
@@ -920,6 +920,19 @@ process {
]
}
+
+ withName: METACACHE_QUERY {
+ tag = { "${meta.db_name}|${meta.id}" }
+ ext.args = { "${meta.db_params}" }
+ ext.prefix = { params.perform_runmerging ? "${meta.id}_${meta.db_name}" : "${meta.id}_${meta.run_accession}_${meta.db_name}" }
+ publishDir = [
+ path: { "${params.outdir}/metacache/${meta.db_name}/" },
+ mode: params.publish_dir_mode,
+ pattern: '*.txt'
+ ]
+ }
+
+
withName: TAXPASTA_MERGE {
tag = { "${meta.tool}|${meta.id}" }
ext.prefix = { "${meta.tool}_${meta.id}" }
diff --git a/conf/test.config b/conf/test.config
index 8f83d780..47ba29b7 100644
--- a/conf/test.config
+++ b/conf/test.config
@@ -48,6 +48,7 @@ params {
run_kmcp = true
run_sylph = true
run_melon = true
+ run_metacache = true
sylph_taxonomy = params.pipelines_testdata_base_path + 'taxprofiler/data/database/sylph/test_taxonomy.tsv.gz'
krona_taxonomy_directory = params.pipelines_testdata_base_path + 'modules/data/genomics/sarscov2/metagenome/krona_taxonomy.tab'
malt_save_reads = true
diff --git a/conf/test_alternativepreprocessing.config b/conf/test_alternativepreprocessing.config
index bb958ca0..92f7c3d4 100644
--- a/conf/test_alternativepreprocessing.config
+++ b/conf/test_alternativepreprocessing.config
@@ -49,6 +49,7 @@ params {
run_kmcp = false
run_sylph = false
run_melon = false
+ run_metacache = false
}
process {
diff --git a/conf/test_bbduk.config b/conf/test_bbduk.config
index 2ad2c371..bdb9bbb7 100644
--- a/conf/test_bbduk.config
+++ b/conf/test_bbduk.config
@@ -47,6 +47,7 @@ params {
run_kmcp = false
run_sylph = false
run_melon = false
+ run_metacache = false
}
process {
diff --git a/conf/test_falco.config b/conf/test_falco.config
index 7e11e230..ad65ca3e 100644
--- a/conf/test_falco.config
+++ b/conf/test_falco.config
@@ -47,6 +47,7 @@ params {
run_kmcp = false
run_sylph = false
run_melon = false
+ run_metacache = false
}
process {
diff --git a/conf/test_fastp.config b/conf/test_fastp.config
index 18dcb03d..c5c25788 100644
--- a/conf/test_fastp.config
+++ b/conf/test_fastp.config
@@ -49,6 +49,7 @@ params {
run_kmcp = false
run_sylph = false
run_melon = false
+ run_metacache = false
}
process {
diff --git a/conf/test_full.config b/conf/test_full.config
index 6c049c43..e8f9086f 100644
--- a/conf/test_full.config
+++ b/conf/test_full.config
@@ -76,6 +76,9 @@ params {
run_sylph = true
sylph_taxonomy = params.pipelines_testdata_base_path + 'taxprofiler/data/database/sylph/sylph_taxonomy.tsv.gz'
+ run_metacache = true
+ metacache_abundances = true
+
run_profile_standardisation = true
run_krona = true
run_melon = true
diff --git a/conf/test_krakenuniq.config b/conf/test_krakenuniq.config
index e3d64906..ddea66eb 100644
--- a/conf/test_krakenuniq.config
+++ b/conf/test_krakenuniq.config
@@ -52,6 +52,7 @@ params {
run_ganon = false
run_sylph = false
run_melon = false
+ run_metacache = false
run_krona = true
krona_taxonomy_directory = params.pipelines_testdata_base_path + 'modules/data/genomics/sarscov2/metagenome/krona_taxonomy.tab'
malt_save_reads = false
diff --git a/conf/test_malt.config b/conf/test_malt.config
index 8ffd122d..d22c674a 100644
--- a/conf/test_malt.config
+++ b/conf/test_malt.config
@@ -51,6 +51,7 @@ params {
run_kmcp = false
run_sylph = false
run_melon = false
+ run_metacache = false
}
process {
diff --git a/conf/test_minimal.config b/conf/test_minimal.config
index 88010c7b..6beeeb7a 100644
--- a/conf/test_minimal.config
+++ b/conf/test_minimal.config
@@ -47,6 +47,7 @@ params {
run_ganon = false
run_sylph = false
run_melon = false
+ run_metacache = false
}
process {
diff --git a/conf/test_motus.config b/conf/test_motus.config
index 02a1e631..be7ba195 100644
--- a/conf/test_motus.config
+++ b/conf/test_motus.config
@@ -28,32 +28,35 @@ params {
config_profile_description = 'Minimal test to check mOTUs function'
// Input data
- input = params.pipelines_testdata_base_path + 'taxprofiler/samplesheet.csv'
- databases = 'database_motus.csv'
- perform_shortread_qc = false
- perform_longread_qc = false
- perform_shortread_redundancyestimation = false
- perform_shortread_complexityfilter = false
- perform_shortread_hostremoval = false
- perform_longread_hostremoval = false
- perform_runmerging = false
- hostremoval_reference = params.pipelines_testdata_base_path + 'modules/data/genomics/homo_sapiens/genome/genome.fasta'
- run_kaiju = false
- run_kraken2 = false
- run_bracken = false
- run_malt = false
- run_metaphlan = false
- run_centrifuge = false
- run_diamond = false
- run_krakenuniq = false
- run_motus = true
- run_kmcp = false
- run_ganon = false
- motus_save_mgc_read_counts = false
- motus_remove_ncbi_ids = false
- motus_use_relative_abundance = false
- motus_save_splitlong_reads = false
- run_profile_standardisation = true
+ input = params.pipelines_testdata_base_path + 'taxprofiler/samplesheet.csv'
+ databases = 'database_motus.csv'
+ perform_shortread_qc = false
+ perform_longread_qc = false
+ perform_shortread_redundancyestimation = false
+ perform_shortread_complexityfilter = false
+ perform_shortread_hostremoval = false
+ perform_longread_hostremoval = false
+ perform_runmerging = false
+ hostremoval_reference = params.pipelines_testdata_base_path + 'modules/data/genomics/homo_sapiens/genome/genome.fasta'
+ run_kaiju = false
+ run_kraken2 = false
+ run_bracken = false
+ run_malt = false
+ run_metaphlan = false
+ run_centrifuge = false
+ run_diamond = false
+ run_krakenuniq = false
+ run_motus = true
+ run_kmcp = false
+ run_ganon = false
+ run_sylph = false
+ run_melon = false
+ run_metacache = false
+ motus_save_mgc_read_counts = false
+ motus_remove_ncbi_ids = false
+ motus_use_relative_abundance = false
+ motus_save_splitlong_reads = false
+ run_profile_standardisation = true
}
process {
diff --git a/conf/test_nopreprocessing.config b/conf/test_nopreprocessing.config
index 18a85e2d..87ba5da2 100644
--- a/conf/test_nopreprocessing.config
+++ b/conf/test_nopreprocessing.config
@@ -49,6 +49,7 @@ params {
run_krona = true
run_sylph = true
run_melon = true
+ run_metacache = true
sylph_taxonomy = params.pipelines_testdata_base_path + 'taxprofiler/data/database/sylph/test_taxonomy.tsv.gz'
}
diff --git a/conf/test_noprofiling.config b/conf/test_noprofiling.config
index d361b5be..4ec0ae42 100644
--- a/conf/test_noprofiling.config
+++ b/conf/test_noprofiling.config
@@ -48,6 +48,7 @@ params {
run_ganon = false
run_sylph = false
run_melon = false
+ run_metacache = false
}
process {
diff --git a/conf/test_prinseqplusplus.config b/conf/test_prinseqplusplus.config
index 8662a83d..1eb862c4 100644
--- a/conf/test_prinseqplusplus.config
+++ b/conf/test_prinseqplusplus.config
@@ -48,6 +48,7 @@ params {
run_kmcp = false
run_sylph = false
run_melon = false
+ run_metacache = false
}
process {
diff --git a/docs/output.md b/docs/output.md
index 0fba5b45..cda007fd 100644
--- a/docs/output.md
+++ b/docs/output.md
@@ -40,6 +40,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d
- [ganon](#ganon) - Taxonomic classifier and profile that uses Interleaved Bloom Filters as indices based on k-mers/minimizers.
- [sylph](#sylph) - Taxonomic classifier that performs ultrafast average nucleotide identity (ANI) querying or metagenomic profiling for metagenomic shotgun samples.
- [Melon](#Melon) - Taxonomic classifier that uses ribosomal marker genes to classify and quantify long-read metagenomic data.
+- [MetaCache](#metacache) - Taxonomic classifier using minhashing
- [TAXPASTA](#taxpasta) - Tool to standardise taxonomic profiles as well as merge profiles across samples from the same database and classifier/profiler.
- [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline
- [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution
@@ -655,6 +656,25 @@ For further descriptions of the contents of each file, see the [sylph documentat
The main taxonomic classification files from melon are the `*.tsv` and `*.json` files.
For further descriptions of the contents of each file, see the [melon documentation](https://github.com/xinehc/melon#run-melon).
+### MetaCache
+
+[MetaCache](https://github.com/muellan/metacache) is a taxonomic classifier that minhashing for the classification of reads
+
+
+Output files
+
+- `metacache/`
+ - `/`
+ - `.abundances.txt`: Absolute and relative abundance of each taxon on each rank in .txt format
+ - `.mspping.txt`: Mapping outout in .txt format
+
+
+
+MetaCache's default read mapping output format is:
+`read_header | rank:taxon_name`
+
+For further description see [MetaCache documentation](https://github.com/muellan/metacache/blob/d7646eca4c4dc131262b16d2910923fce3f5d4fc/docs/output.md#classification-output).
+
### Krona
[Krona](https://github.com/marbl/Krona) allows the exploration of (metagenomic) hierarchical data with interactive zooming, multi-layered pie charts.
diff --git a/docs/usage.md b/docs/usage.md
index d66dfab4..dc444fbd 100644
--- a/docs/usage.md
+++ b/docs/usage.md
@@ -147,6 +147,7 @@ ganon,db1,,///ganon/test-db-ganon.tar.gz
kmcp,db1,;-I 20,///kmcp/test-db-kmcp.tar.gz
sylph,db1,-m 80,///sylph/test-db-sylph.tar.gz
melon,db1,,///melon/test-db-melon.tar.gz
+metacache,db1,,///metacache/test-db-metacache.tar.gz
```
```csv
@@ -163,6 +164,7 @@ ganon,db1,,short,///ganon/test-db-ganon.tar.gz
kmcp,db1,;-I 20,short,///kmcp/test-db-kmcp.tar.gz
sylph,db1,-m 80,long,///sylph/test-db-sylph.tar.gz
melon,db1,,long,///melon/test-db-melon.tar.gz
+metacache,db1,,long,///metacache/test-db-metacache.tar.gz
```
:::warning
@@ -215,6 +217,7 @@ The (uncompressed) database paths (`db_path`) for each tool are expected to cont
- [**KMCP**:](usage/tutorials.md#kmcp-custom-database) output of `kmcp index`. Note: `kmcp index` uses the output of an upstream `kmcp compute` step.
- [**sylph**:](usage/tutotials.md#sylph-custom-database) output of `sylph sketch` command.
- [**Melon**:](usage/tutorials.md#melon-custom-database) output of `diamond makedb` and `minimap2`.
+- [**MetaCache**:](usage/tutorials.md#metacache-custom-database) output of `metacache build` command
## Running the pipeline
@@ -506,6 +509,10 @@ Currently, no specific tips or suggestions.
Melon is only suitable for long-read metagenomic profiling.
Therefore, nf-core/taxprofiler does not currently run Melon on data specified as being sequenced with `Illumina` or any other short-read platform in the input samplesheet.
+##### MetaCache
+
+Currently, no specific tips or suggestions.
+
#### Post Processing
##### Visualisation
diff --git a/docs/usage/tutorials.md b/docs/usage/tutorials.md
index eb3683fa..e2165a8f 100644
--- a/docs/usage/tutorials.md
+++ b/docs/usage/tutorials.md
@@ -740,3 +740,22 @@ You can then add the path to `/` to your nf-core/taxprofiler datab
More information on the Melon database can be found [here](https://github.com/xinehc/melon#database-setup).
+
+#### MetaCache custom database
+
+To build a custom MetaCache database, you need download the NCBI taxonomy. The fasta files can either be combined into a singile file or you can put them all together within a directory
+
+```bash
+download-ncbi-taxonomy ncbi_taxonomy
+metacache build metacache all_genomes.fasta -taxonomy ncbi_taxonomy
+```
+
+
+Expected files in database directory
+
+- `metacache`
+ - `database/.meta`
+ - `database/.cache0`
+
+
+More information on custom MetaCache database construction can be found [here](https://github.com/muellan/metacache/blob/d7646eca4c4dc131262b16d2910923fce3f5d4fc/docs/building.md).
diff --git a/modules.json b/modules.json
index 2fe56419..26eb2fb6 100644
--- a/modules.json
+++ b/modules.json
@@ -165,6 +165,11 @@
"git_sha": "83fe5c85a83aae68a6eb0561e04cbba1e153ac5a",
"installed_by": ["modules"]
},
+ "metacache/query": {
+ "branch": "master",
+ "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46",
+ "installed_by": ["modules"]
+ },
"metaphlan/mergemetaphlantables": {
"branch": "master",
"git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46",
diff --git a/modules/nf-core/metacache/query/environment.yml b/modules/nf-core/metacache/query/environment.yml
new file mode 100644
index 00000000..1cbf6257
--- /dev/null
+++ b/modules/nf-core/metacache/query/environment.yml
@@ -0,0 +1,7 @@
+---
+# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json
+channels:
+ - conda-forge
+ - bioconda
+dependencies:
+ - "bioconda::metacache=2.5.0"
diff --git a/modules/nf-core/metacache/query/main.nf b/modules/nf-core/metacache/query/main.nf
new file mode 100644
index 00000000..c6422345
--- /dev/null
+++ b/modules/nf-core/metacache/query/main.nf
@@ -0,0 +1,60 @@
+process METACACHE_QUERY {
+ tag "$meta.id"
+ label 'process_medium'
+
+
+ conda "${moduleDir}/environment.yml"
+ container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
+ 'https://depot.galaxyproject.org/singularity/metacache:2.5.0--h077b44d_0':
+ 'biocontainers/metacache:2.5.0--h077b44d_0' }"
+
+ input:
+ tuple val(meta), path(reads)
+ path db, stageAs: 'db/*'
+ val(do_abundances)
+
+ output:
+ tuple val(meta), path("*mapping.txt") , emit: mapping_results
+ tuple val(meta), path("*abundances.txt"), emit: abundances, optional: true
+ path "versions.yml" , emit: versions
+
+ when:
+ task.ext.when == null || task.ext.when
+
+ script:
+ def args = task.ext.args ?: ''
+ def prefix = task.ext.prefix ?: "${meta.id}"
+ def input_file = meta.single_end ? reads : "${reads[0]} ${reads[1]} -pairfiles"
+ def abundance_opt = do_abundances ? "-abundances ${prefix}.abundances.txt" : ''
+ """
+ dbmeta=`find -L db/ -name "*.meta" | head -n 1`
+ [ -n "\$dbmeta" ] || { echo 'Database file "*.meta" not found!' >&2 ; exit 1 ; }
+ metacache \\
+ query \\
+ \$dbmeta \\
+ ${input_file} \\
+ $abundance_opt \\
+ $args \\
+ -out ${prefix}.mapping.txt
+
+ cat <<-END_VERSIONS > versions.yml
+ "${task.process}":
+ metacache: \$(metacache info |& sed -n 's/^MetaCache version \\+\\([0-9.]\\+\\).*\$/\\1/p')
+ END_VERSIONS
+ """
+
+ stub:
+ def args = task.ext.args ?: ''
+ def prefix = task.ext.prefix ?: "${meta.id}"
+ def input_file = meta.single_end ? reads : "${reads[0]} ${reads[1]} -pairfiles"
+ def abundance_opt = do_abundances ? "-abundances ${prefix}.abundances.txt" : ''
+ """
+ touch ${prefix}.mapping.txt
+ [ -n "$abundance_opt" ] && touch ${prefix}.abundances.txt
+
+ cat <<-END_VERSIONS > versions.yml
+ "${task.process}":
+ metacache: \$(metacache info |& sed -n 's/^MetaCache version \\+\\([0-9.]\\+\\).*\$/\\1/p')
+ END_VERSIONS
+ """
+}
diff --git a/modules/nf-core/metacache/query/meta.yml b/modules/nf-core/metacache/query/meta.yml
new file mode 100644
index 00000000..fb5cbd5b
--- /dev/null
+++ b/modules/nf-core/metacache/query/meta.yml
@@ -0,0 +1,76 @@
+# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json
+name: "metacache_query"
+description: Metacache query command for taxonomic classification
+keywords:
+ - metagenomics
+ - classification
+ - metacache
+tools:
+ - "metacache":
+ description: MetaCache is a classification system for mapping genomic sequences
+ (short reads, long reads, contigs, ...) from metagenomic samples to their most
+ likely taxon of origin.
+ homepage: https://github.com/muellan/metacache
+ documentation: https://muellan.github.io/metacache/
+ tool_dev_url: https://github.com/muellan/metacache
+ doi: 10.1093/bioinformatics/btx520
+ licence: ["GPL-3.0 license"]
+ identifier: ""
+
+input:
+ - - meta:
+ type: map
+ description: |
+ Groovy Map containing sample information
+ e.g. `[ id:'sample1', single_end:false ]`
+ - reads:
+ type: file
+ description: FASTA or FASTQ files
+ pattern: "*.{fasta,fa,fastq,fq}"
+ ontologies:
+ - edam: http://edamontology.org/format_1930 # FASTQ
+ - db:
+ type: directory
+ description: A MetaCache database contains taxonomic information and min-hash
+ signatures of reference sequences (complete genomes, scaffolds, contigs, ...).
+ - do_abundances:
+ type: boolean
+ description: Flag indicating whether to produce the abundance table.
+output:
+ mapping_results:
+ - - meta:
+ type: map
+ description: |
+ Groovy Map containing sample information
+ e.g. `[ id:'sample1', single_end:false ]`
+ - "*mapping.txt":
+ type: file
+ description: Output file containing mapping results
+ pattern: "*mapping.txt"
+ ontologies: []
+ abundances:
+ - - meta:
+ type: map
+ description: |
+ Groovy Map containing sample information
+ e.g. `[ id:'sample1', single_end:false ]`
+ - "*abundances.txt":
+ type: file
+ description: Output file showing absolute and relative abundance of each taxon
+ pattern: "*abundances.txt"
+
+ ontologies: []
+ versions:
+ - versions.yml:
+ type: file
+ description: File containing software versions
+ pattern: "versions.yml"
+
+ ontologies:
+ - edam: http://edamontology.org/format_3750 # YAML
+authors:
+ - "@sofstam"
+ - "@Gullumluvl"
+maintainers:
+ - "@sofstam"
+ - "@Gullumluvl"
diff --git a/modules/nf-core/metacache/query/tests/main.nf.test b/modules/nf-core/metacache/query/tests/main.nf.test
new file mode 100644
index 00000000..e2354515
--- /dev/null
+++ b/modules/nf-core/metacache/query/tests/main.nf.test
@@ -0,0 +1,111 @@
+nextflow_process {
+
+ name "Test Process METACACHE_QUERY"
+ script "../main.nf"
+ process "METACACHE_QUERY"
+ tag "modules"
+ tag "modules_nfcore"
+ tag "metacache"
+ tag "metacache/build"
+ tag "metacache/query"
+ tag "untar"
+
+ setup {
+ run("METACACHE_BUILD") {
+ script "../../build/main.nf"
+ process {
+ """
+ input[0] = [
+ [ id:'test' ], // meta map
+ [file(params.modules_testdata_base_path + "genomics/sarscov2/genome/genome.fasta", checkIfExists: true),
+ file(params.modules_testdata_base_path + "genomics/homo_sapiens/genome/transcriptome.fasta", checkIfExists: true)]
+ ]
+ input[1] = []
+ input[2] = []
+ """
+ }
+ }
+ }
+
+
+ test("sarscov2 nanopore [fastq_gz]") {
+
+ when {
+ process {
+ """
+ input[0] = [
+ [ id:'test', single_end:true ], // meta map
+ file(params.modules_testdata_base_path + 'genomics/sarscov2/nanopore/fastq/test_2.fastq.gz', checkIfExists: true),
+ ]
+ input[1] = METACACHE_BUILD.out.db.map { meta, meta_file, cache_files -> [meta_file, cache_files].flatten() }
+ input[2] = false
+ """
+ }
+ }
+
+ then {
+ assert process.success
+ assert snapshot(
+ process.out.versions,
+ file(process.out.mapping_results[0][1]).readLines()[0]
+ ).match()
+ }
+
+ }
+
+ test("sarscov2 nanopore [fastq_gz] stub") {
+
+ options "-stub"
+
+ when {
+ process {
+ """
+ input[0] = [
+ [ id:'test', single_end:true ], // meta map
+ file(params.modules_testdata_base_path + 'genomics/sarscov2/nanopore/fastq/test_2.fastq.gz', checkIfExists: true),
+ ]
+ input[1] = METACACHE_BUILD.out.db.map { meta, meta_file, cache_files -> [meta_file, cache_files].flatten() }
+ input[2] = false
+ """
+ }
+ }
+
+ then {
+ assertAll(
+ { assert process.success },
+ { assert snapshot(process.out).match() }
+ )
+ }
+ }
+
+
+ test("sarscov2 nanopore [fastq_gz] abundance") {
+
+ when {
+ process {
+ """
+ input[0] = [
+ [ id:'test', single_end:true ], // meta map
+ file(params.modules_testdata_base_path + 'genomics/sarscov2/nanopore/fastq/test_2.fastq.gz', checkIfExists: true),
+ ]
+ input[1] = METACACHE_BUILD.out.db.map { meta, meta_file, cache_files -> [meta_file, cache_files].flatten() }
+ input[2] = true
+ """
+ }
+ }
+
+ then {
+ assert process.success
+ assert snapshot(
+ process.out.versions,
+ file(process.out.mapping_results[0][1]).readLines()[0],
+ file(process.out.abundances[0][1]).readLines()[0]
+ ).match()
+ }
+
+ }
+
+
+
+
+}
diff --git a/modules/nf-core/metacache/query/tests/main.nf.test.snap b/modules/nf-core/metacache/query/tests/main.nf.test.snap
new file mode 100644
index 00000000..df6d464e
--- /dev/null
+++ b/modules/nf-core/metacache/query/tests/main.nf.test.snap
@@ -0,0 +1,70 @@
+{
+ "sarscov2 nanopore [fastq_gz] stub": {
+ "content": [
+ {
+ "0": [
+ [
+ {
+ "id": "test",
+ "single_end": true
+ },
+ "test.mapping.txt:md5,d41d8cd98f00b204e9800998ecf8427e"
+ ]
+ ],
+ "1": [
+
+ ],
+ "2": [
+ "versions.yml:md5,803de66366edd7630306fc5b6a2b9cf3"
+ ],
+ "abundances": [
+
+ ],
+ "mapping_results": [
+ [
+ {
+ "id": "test",
+ "single_end": true
+ },
+ "test.mapping.txt:md5,d41d8cd98f00b204e9800998ecf8427e"
+ ]
+ ],
+ "versions": [
+ "versions.yml:md5,803de66366edd7630306fc5b6a2b9cf3"
+ ]
+ }
+ ],
+ "meta": {
+ "nf-test": "0.9.2",
+ "nextflow": "25.04.3"
+ },
+ "timestamp": "2025-06-10T10:49:30.789756102"
+ },
+ "sarscov2 nanopore [fastq_gz]": {
+ "content": [
+ [
+ "versions.yml:md5,669526a447b62c30b8bce10f24d149b0"
+ ],
+ "# Reporting per-read mappings (non-mapping lines start with '# ')."
+ ],
+ "meta": {
+ "nf-test": "0.9.2",
+ "nextflow": "25.04.3"
+ },
+ "timestamp": "2025-06-10T10:49:18.566698159"
+ },
+ "sarscov2 nanopore [fastq_gz] abundance": {
+ "content": [
+ [
+ "versions.yml:md5,669526a447b62c30b8bce10f24d149b0"
+ ],
+ "# Reporting per-read mappings (non-mapping lines start with '# ').",
+ "# query summary: number of queries mapped per taxon"
+ ],
+ "meta": {
+ "nf-test": "0.9.2",
+ "nextflow": "25.04.3"
+ },
+ "timestamp": "2025-06-10T10:49:43.725651952"
+ }
+}
\ No newline at end of file
diff --git a/nextflow.config b/nextflow.config
index e0cdfd84..3df77faa 100644
--- a/nextflow.config
+++ b/nextflow.config
@@ -194,6 +194,7 @@ params {
// metacache
run_metacache = false
+ metacache_abundances = false
// krona
run_krona = false
diff --git a/nextflow_schema.json b/nextflow_schema.json
index 4b807f9a..402b55f8 100644
--- a/nextflow_schema.json
+++ b/nextflow_schema.json
@@ -704,8 +704,14 @@
},
"run_metacache": {
"type": "boolean",
- "description": "Turn on profiling with metacache. Requires database to be present CSV file passed to --databases",
- "fa_icon": "fas fa-toggle-on"
+ "fa_icon": "fas fa-toggle-on",
+ "description": "Turn on profiling with metacache. Requires database to be present CSV file passed to --databases"
+ },
+ "metacache_abundances": {
+ "type": "boolean",
+ "fa_icon": "fas fa-percent",
+ "description": "Print all mapping information in separate columns (rank, taxon name, taxon ids).",
+ "help_text": "Modifies tool parameter(s):\n- metacache: `-abundances`"
}
},
"fa_icon": "fas fa-align-center"
diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json
index 22424fcc..e80c0974 100644
--- a/ro-crate-metadata.json
+++ b/ro-crate-metadata.json
@@ -1,3 +1,4 @@
+
{
"@context": [
"https://w3id.org/ro/crate/1.1/context",
@@ -370,4 +371,4 @@
"name": "Lili Andersson-Li"
}
]
-}
\ No newline at end of file
+}
diff --git a/subworkflows/local/profiling.nf b/subworkflows/local/profiling.nf
index 70d3a313..b2cdd1ee 100644
--- a/subworkflows/local/profiling.nf
+++ b/subworkflows/local/profiling.nf
@@ -23,6 +23,8 @@ include { GANON_REPORT } from '../../modules/nf
include { SYLPH_PROFILE } from '../../modules/nf-core/sylph/profile/main'
include { SYLPHTAX_TAXPROF } from '../../modules/nf-core/sylphtax/taxprof/main'
include { MELON } from '../../modules/nf-core/melon/main'
+include { METACACHE_QUERY } from '../../modules/nf-core/metacache/query/main'
+
workflow PROFILING {
take:
@@ -78,6 +80,7 @@ workflow PROFILING {
ganon: db_meta.tool == 'ganon'
sylph: db_meta.tool == 'sylph'
melon: db_meta.tool == 'melon'
+ metacache: db_meta.tool == 'metacache'
unknown: true
}
@@ -612,6 +615,18 @@ workflow PROFILING {
ch_raw_profiles = ch_raw_profiles.mix(MELON.out.tsv_output)
}
+ if (params.run_metacache) {
+
+ ch_input_for_metacache = ch_input_for_profiling.metacache.multiMap { it ->
+ reads: [it[0] + it[2], it[1]]
+ db: it[3]
+ }
+
+ METACACHE_QUERY(ch_input_for_metacache.reads, ch_input_for_metacache.db, params.metacache_abundances)
+ ch_versions = ch_versions.mix(METACACHE_QUERY.out.versions.first())
+ ch_raw_profiles = ch_raw_profiles.mix(METACACHE_QUERY.out.mapping_results)
+ }
+
emit:
classifications = ch_raw_classifications
profiles = ch_raw_profiles // channel: [ val(meta), [ reads ] ] - should be text files or biom
diff --git a/subworkflows/local/standardisation_profiles.nf b/subworkflows/local/standardisation_profiles.nf
index 7953d138..6c79cc61 100644
--- a/subworkflows/local/standardisation_profiles.nf
+++ b/subworkflows/local/standardisation_profiles.nf
@@ -51,14 +51,14 @@ workflow STANDARDISATION_PROFILES {
}
ch_input_for_taxpasta_merge = ch_input_for_taxpasta.merge
- .filter { meta, _input_profiles -> !(meta.tool in ['sylph', 'melon']) }
+ .filter { meta, _input_profiles -> !(meta.tool in ['sylph', 'melon', 'metacache']) }
.multiMap { meta, input_profiles ->
profiles: [meta, input_profiles]
tool: meta.tool
}
ch_input_for_taxpasta_standardise = ch_input_for_taxpasta.standardise
- .filter { meta, _input_profiles -> !(meta.tool in ['sylph', 'melon']) }
+ .filter { meta, _input_profiles -> !(meta.tool in ['sylph', 'melon', 'metacache']) }
.multiMap { meta, input_profiles ->
profiles: [meta, input_profiles]
tool: meta.tool
@@ -85,6 +85,8 @@ workflow STANDARDISATION_PROFILES {
motus: entry[0]['tool'] == 'motus'
melon: entry[0]['tool'] == 'melon'
sylph: entry[0]['tool'] == 'sylph'
+ metacache: entry[0]['tool'] == 'sylph'
+
unknown: true
}
@@ -227,8 +229,9 @@ def combineProfilesWithDatabase(ch_profiles, ch_database) {
return ch_profiles
.map { meta, profile -> [meta.id, meta, profile] }
.combine(ch_database.map { db_meta, db -> [db_meta.db_name, db] }, by: 0)
- .multiMap { _key, meta, profile, db ->
- profile: [meta, profile]
- db: db
+ .multiMap {
+ key, meta, profile, db ->
+ profile: [meta, profile]
+ db: db
}
}
diff --git a/subworkflows/local/utils_nfcore_taxprofiler_pipeline/main.nf b/subworkflows/local/utils_nfcore_taxprofiler_pipeline/main.nf
index fa185442..104f68f8 100644
--- a/subworkflows/local/utils_nfcore_taxprofiler_pipeline/main.nf
+++ b/subworkflows/local/utils_nfcore_taxprofiler_pipeline/main.nf
@@ -294,21 +294,22 @@ def toolCitationText() {
def text_classification = [
- "Taxonomic classification or profiling was carried out with:",
- params.run_bracken ? "Bracken (Lu et al. 2017)," : "",
- params.run_kraken2 ? "Kraken2 (Wood et al. 2019)," : "",
- params.run_krakenuniq ? "KrakenUniq (Breitwieser et al. 2018)," : "",
- params.run_metaphlan ? "MetaPhlAn (Blanco-Míguez et al. 2023)," : "",
- params.run_malt ? "MALT (Vågene et al. 2018) and MEGAN6 CE (Huson et al. 2016)," : "",
- params.run_diamond ? "DIAMOND (Buchfink et al. 2015)," : "",
- params.run_centrifuge ? "Centrifuge (Kim et al. 2016)," : "",
- params.run_kaiju ? "Kaiju (Menzel et al. 2016)," : "",
- params.run_motus ? "mOTUs (Ruscheweyh et al. 2022)," : "",
- params.run_ganon ? "ganon (Piro et al. 2020)" : "",
- params.run_kmcp ? "KMCP (Shen et al. 2023)" : "",
- params.run_sylph ? "sylph (Shaw et al. 2024)," : "",
- params.run_melon ? "melon (Chen et al. 2024)," : "",
- ".",
+ "Taxonomic classification or profiling was carried out with:",
+ params.run_bracken ? "Bracken (Lu et al. 2017)," : "",
+ params.run_kraken2 ? "Kraken2 (Wood et al. 2019)," : "",
+ params.run_krakenuniq ? "KrakenUniq (Breitwieser et al. 2018)," : "",
+ params.run_metaphlan ? "MetaPhlAn (Blanco-Míguez et al. 2023)," : "",
+ params.run_malt ? "MALT (Vågene et al. 2018) and MEGAN6 CE (Huson et al. 2016)," : "",
+ params.run_diamond ? "DIAMOND (Buchfink et al. 2015)," : "",
+ params.run_centrifuge ? "Centrifuge (Kim et al. 2016)," : "",
+ params.run_kaiju ? "Kaiju (Menzel et al. 2016)," : "",
+ params.run_motus ? "mOTUs (Ruscheweyh et al. 2022)," : "",
+ params.run_ganon ? "ganon (Piro et al. 2020)," : "",
+ params.run_kmcp ? "KMCP (Shen et al. 2023)," : "",
+ params.run_sylph ? "sylph (Shaw et al. 2024),":"",
+ params.run_melon ? "melon (Chen et al. 2024)," : "",
+ params.run_metacache ? "MetaCache (Müller et al. 2017)," : "",
+ "."
].join(' ').trim()
def text_visualisation = [
@@ -322,18 +323,17 @@ def toolCitationText() {
def citation_text = [
"Tools used in the workflow included:",
text_seq_qc,
- params.perform_shortread_qc ? text_shortread_qc : "",
- params.perform_shortread_redundancyestimation ? text_shortread_redundancy : "",
- params.perform_longread_qc ? text_longread_qc : "",
- params.perform_shortread_complexityfilter ? text_shortreadcomplexity : "",
- params.perform_shortread_hostremoval ? text_shortreadhostremoval : "",
- params.perform_longread_hostremoval ? text_longreadhostremoval : "",
- [params.run_bracken, params.run_kraken2, params.run_krakenuniq, params.run_metaphlan, params.run_malt, params.run_diamond, params.run_centrifuge, params.run_kaiju, params.run_motus, params.run_ganon, params.run_kmcp, params.run_sylph, params.run_melon].any()
- ? text_classification
- : "",
- params.run_krona ? text_visualisation : "",
- params.run_profile_standardisation ? text_postprocessing : "",
- "Pipeline results statistics were summarised with MultiQC (Ewels et al. 2016).",
+ params.perform_shortread_qc ? text_shortread_qc : "",
+ params.perform_shortread_redundancyestimation ? text_shortread_redundancy : "",
+ params.perform_longread_qc ? text_longread_qc : "",
+ params.perform_shortread_complexityfilter ? text_shortreadcomplexity : "",
+ params.perform_shortread_hostremoval ? text_shortreadhostremoval : "",
+ params.perform_longread_hostremoval ? text_longreadhostremoval : "",
+ [params.run_bracken, params.run_kraken2, params.run_krakenuniq, params.run_metaphlan, params.run_malt, params.run_diamond, params.run_centrifuge, params.run_kaiju, params.run_motus, params.run_ganon, params.run_kmcp, params.run_sylph, params.run_melon, params.run_metacache].any() ?
+ text_classification : "",
+ params.run_krona ? text_visualisation : "",
+ params.run_profile_standardisation ? text_postprocessing : "",
+ "Pipeline results statistics were summarised with MultiQC (Ewels et al. 2016)."
].join(' ').trim().replaceAll("[,|.] +\\.", ".")
return citation_text
@@ -384,12 +384,14 @@ def toolBibliographyText() {
params.run_malt ? "Huson, D. H., Beier, S., Flade, I., Górska, A., El-Hadidi, M., Mitra, S., Ruscheweyh, H.-J., & Tappu, R. (2016). MEGAN Community Edition - Interactive Exploration and Analysis of Large-Scale Microbiome Sequencing Data. PLoS Computational Biology, 12(6), e1004957. 10.1371/journal.pcbi.1004957" : "",
params.run_diamond ? "Buchfink, B., Xie, C., & Huson, D. H. (2015). Fast and sensitive protein alignment using DIAMOND. Nature Methods, 12(1), 59–60. 10.1038/nmeth.3176" : "",
params.run_centrifuge ? "Kim, D., Song, L., Breitwieser, F. P., & Salzberg, S. L. (2016). Centrifuge: rapid and sensitive classification of metagenomic sequences. Genome Research, 26(12), 1721–1729. 10.1101/gr.210641.116" : "",
- params.run_kaiju ? "Menzel, P., Ng, K. L., & Krogh, A. (2016). Fast and sensitive taxonomic classification for metagenomics with Kaiju. Nature Communications, 7, 11257. 10.1038/ncomms11257" : "",
- params.run_motus ? "Ruscheweyh, H.-J., Milanese, A., Paoli, L., Karcher, N., Clayssen, Q., Keller, M. I., Wirbel, J., Bork, P., Mende, D. R., Zeller, G., & Sunagawa, S. (2022). Cultivation-independent genomes greatly expand taxonomic-profiling capabilities of mOTUs across various environments. Microbiome, 10(1), 212. 10.1186/s40168-022-01410-z" : "",
- params.run_ganon ? "Piro, V. C., Dadi, T. H., Seiler, E., Reinert, K., & Renard, B. Y. (2020). Ganon: Precise metagenomics classification against large and up-to-date sets of reference sequences. Bioinformatics (Oxford, England), 36(Suppl_1), i12–i20. 10.1093/bioinformatics/btaa458" : "",
- params.run_kmcp ? "Shen, W., Xiang, H., Huang, T., Tang, H., Peng, M., Cai, D., Hu, P., & Ren, H. (2023). KMCP: accurate metagenomic profiling of both prokaryotic and viral populations by pseudo-mapping. Bioinformatics (Oxford, England), 39(1). 10.1093/bioinformatics/btac845" : "",
- params.run_sylph ? "Shaw, J. & Yu, Y. W. (2024). Rapid species-level metagenome profiling and containment estimation with sylph. Nature Biotechnology. 10.1038/s41587-024-02412-y" : "",
- params.run_melon ? "Chen, X., Yin, X., Shi, X., Yan, W., Yang, Y., Liu, L., & Zhang, T. (2024). Melon: metagenomic long-read-based taxonomic identification and quantification using marker genes. Genome Biology, 25(1), 226. 10.1186/s13059-024-03363-y" : "",
+ params.run_kaiju ? "Menzel, P., Ng, K. L., & Krogh, A. (2016). Fast and sensitive taxonomic classification for metagenomics with Kaiju. Nature Communications, 7, 11257. 10.1038/ncomms11257" : "",
+ params.run_motus ? "Ruscheweyh, H.-J., Milanese, A., Paoli, L., Karcher, N., Clayssen, Q., Keller, M. I., Wirbel, J., Bork, P., Mende, D. R., Zeller, G., & Sunagawa, S. (2022). Cultivation-independent genomes greatly expand taxonomic-profiling capabilities of mOTUs across various environments. Microbiome, 10(1), 212. 10.1186/s40168-022-01410-z" : "",
+ params.run_ganon ? "Piro, V. C., Dadi, T. H., Seiler, E., Reinert, K., & Renard, B. Y. (2020). Ganon: Precise metagenomics classification against large and up-to-date sets of reference sequences. Bioinformatics (Oxford, England), 36(Suppl_1), i12–i20. 10.1093/bioinformatics/btaa458" : "",
+ params.run_kmcp ? "Shen, W., Xiang, H., Huang, T., Tang, H., Peng, M., Cai, D., Hu, P., & Ren, H. (2023). KMCP: accurate metagenomic profiling of both prokaryotic and viral populations by pseudo-mapping. Bioinformatics (Oxford, England), 39(1). 10.1093/bioinformatics/btac845" : "",
+ params.run_sylph ? "Shaw, J. & Yu, Y. W. (2024). Rapid species-level metagenome profiling and containment estimation with sylph. Nature Biotechnology. 10.1038/s41587-024-02412-y" : "",
+ params.run_melon ? "Chen, X., Yin, X., Shi, X., Yan, W., Yang, Y., Liu, L., & Zhang, T. (2024). Melon: metagenomic long-read-based taxonomic identification and quantification using marker genes. Genome Biology, 25(1), 226. 10.1186/s13059-024-03363-y" : "",
+ params.run_metacache ? "Müller, A., Hundt, C., Hildebrandt, A., Hankeln, T., & Schmidt, B. (2017). MetaCache: context-aware classification of metagenomic reads using minhashing. Bioinformatics, 33(23), 3740–3748. 10.1093/bioinformatics/btx520" : "",
+
].join(' ').trim()
def text_visualisation = [
diff --git a/tests/default.nf.test b/tests/default.nf.test
index 7767d7ee..72d06364 100644
--- a/tests/default.nf.test
+++ b/tests/default.nf.test
@@ -48,6 +48,9 @@ nextflow_pipeline {
//krona
def stable_content_krona = getAllFilesFromDir("$outputDir/krona", relative: true, includeDir: false, ignore: null, ignoreFile: 'tests/.nftignore', include: ['*','**/*'])
+ //metacache
+ def stable_content_metacache = getAllFilesFromDir("$outputDir/metacache", relative: true, includeDir: false, ignore: null, ignoreFile: 'tests/.nftignore', include: ['*','**/*'])
+
//metaphlan
def stable_content_metaphlan = getAllFilesFromDir("$outputDir/metaphlan", relative: true, includeDir: false, ignore: null, ignoreFile: 'tests/.nftignore', include: ['*','**/*'])
def sam_files = getAllFilesFromDir("$outputDir/metaphlan", include: ['**/*.sam'])
@@ -64,15 +67,15 @@ nextflow_pipeline {
//samtools
def stable_content_samtools = getAllFilesFromDir("$outputDir/samtools", relative: false, includeDir: false, ignore: null, ignoreFile: 'tests/.nftignore', include: ['*','**/*'])
+ //sylph
+ def stable_content_sylph = getAllFilesFromDir("$outputDir/sylph", relative: false, includeDir: false, ignore: null, ignoreFile: 'tests/.nftignore', include: ['*','**/*'])
+
//taxpasta
def stable_content_taxpasta = getAllFilesFromDir("$outputDir/taxpasta", relative: true, includeDir: false, ignore: null, ignoreFile: 'tests/.nftignore', include: ['*','**/*'])
// melon
def stable_content_melon = getAllFilesFromDir("$outputDir/melon", relative: false, includeDir: false, ignore: null, ignoreFile: 'tests/.nftignore', include: ['*','**/*'])
- // sylph
- def stable_content_sylph = getAllFilesFromDir("$outputDir/sylph", relative: false, includeDir: false, ignore: null, ignoreFile: 'tests/.nftignore', include: ['*','**/*'])
-
assertAll(
{ assert workflow.success},
@@ -152,6 +155,8 @@ nextflow_pipeline {
file("$outputDir/kraken2/kraken2_db2_combined_reports.txt").getName() + " contains string:'Saccharomyces cerevisiae S288C':" + file("$outputDir/kraken2/kraken2_db2_combined_reports.txt").text.contains("Saccharomyces cerevisiae S288C"),
stable_content_kraken2).match("kraken2") },
{ assert snapshot(getAllFilesFromDir("$outputDir/krona", include: ['*.html']).collect { file -> file.getName() + " exists:"+ file.exists() }, stable_content_krona).match("krona") },
+ { assert snapshot (getAllFilesFromDir("$outputDir/metacache", include: ['**/*.txt']).collect { file -> file.getName() + ' contains string:' + file.text.contains("Penicillium roqueforti")},
+ stable_content_metacache).match("metacache")},
{ assert snapshot(getAllFilesFromDir("$outputDir/metaphlan", include: ['**/*.metaphlan.biom']).collect { file -> file.getName() + ' contains string:' + file.text.contains("generated_by")},
getAllFilesFromDir("$outputDir/metaphlan", include: ['**/*.metaphlan.bowtie2out.txt']).collect { file -> file.getName() + ' contains string:' + file.text.contains("avg_read_length")},
getAllFilesFromDir("$outputDir/metaphlan", include: ['**/*_profile.txt']).collect { file -> file.getName() + ' contains string:' + file.text.contains("clade_name")},
@@ -180,6 +185,8 @@ nextflow_pipeline {
{ assert snapshot (file("$outputDir/porechop_abi/ERR3201952_ERR3201952_porechop_abi.log").getName() + " contains string: 'Looking for known adapter':" + file("$outputDir/porechop_abi/ERR3201952_ERR3201952_porechop_abi.log").text.contains("Looking for known adapter"),
stable_content_porechopabi).match("porechop_abi")},
{ assert snapshot (stable_content_samtools).match("samtools")},
+ { assert snapshot (file("$outputDir/sylph/sylph_db1_combined_reports.tsv").getName() + " contains string:'Penicillium roqueforti':" + file("$outputDir/sylph/sylph_db1_combined_reports.tsv").text.contains("Penicillium roqueforti"),
+ stable_content_sylph).match("sylph")},
{ assert snapshot(file("$outputDir/taxpasta/bracken_db1.tsv").getName() + " contains string:'9606':" + file("$outputDir/taxpasta/bracken_db1.tsv").text.contains("9606"),
file("$outputDir/taxpasta/centrifuge_db3.tsv").getName() + " contains string:'131567':" + file("$outputDir/taxpasta/centrifuge_db3.tsv").text.contains("131567"),
file("$outputDir/taxpasta/diamond_db1.tsv").getName() + " contains string:'8058':" + file("$outputDir/taxpasta/diamond_db1.tsv").text.contains("8058"),
@@ -196,7 +203,6 @@ nextflow_pipeline {
file("$outputDir/taxpasta/metaphlan_metaphlan4.tsv").getName() + " contains string:'1239':" + file("$outputDir/taxpasta/metaphlan_metaphlan4.tsv").text.contains("1239"),
stable_content_taxpasta).match("taxpasta") },
{ assert snapshot (stable_content_melon).match("melon")},
- { assert snapshot (stable_content_sylph).match("sylph") },
)
}
}
diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap
index 618a7acf..af4badca 100644
--- a/tests/default.nf.test.snap
+++ b/tests/default.nf.test.snap
@@ -177,6 +177,10 @@
"melon/db1/ERR3201952_db1",
"melon/db1/ERR3201952_db1/ERR3201952_ERR3201952.unmapped_other.json",
"melon/db1/ERR3201952_db1/ERR3201952_ERR3201952.unmapped_other.tsv",
+ "metacache",
+ "metacache/db1",
+ "metacache/db1/2614_db1.mapping.txt",
+ "metacache/db1/ERR3201952_db1.mapping.txt",
"metaphlan",
"metaphlan/metaphlan3",
"metaphlan/metaphlan3/2611_metaphlan3.metaphlan.biom",
@@ -572,7 +576,7 @@
"multiqc/multiqc_plots/png/samtools_alignment_plot-cnt.png",
"multiqc/multiqc_plots/png/samtools_alignment_plot-pct.png",
"multiqc/multiqc_plots/svg",
- "multiqc/multiqc_plots/svg/bbduk-filtered-barplot_Bases-cnt.svg",
+ "multiqc/multiqc_plots/svg/bbduk-filtered-barplot_Bases-cnt.svg",
"multiqc/multiqc_plots/svg/bbduk-filtered-barplot_Bases-pct.svg",
"multiqc/multiqc_plots/svg/bbduk-filtered-barplot_Reads-cnt.svg",
"multiqc/multiqc_plots/svg/bbduk-filtered-barplot_Reads-pct.svg",
@@ -763,10 +767,10 @@
]
],
"meta": {
- "nf-test": "0.9.2",
- "nextflow": "25.10.4"
+ "nf-test": "0.9.3",
+ "nextflow": "25.04.8"
},
- "timestamp": "2026-02-19T10:08:59.368334792"
+ "timestamp": "2026-03-19T13:01:04.70189172"
},
"krona": {
"content": [
@@ -791,7 +795,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:24.210307271"
+ "timestamp": "2026-03-19T13:01:14.793699377"
},
"bowtie2": {
"content": [
@@ -806,7 +810,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:15.101200677"
+ "timestamp": "2026-03-19T13:01:04.780736199"
},
"nanoq": {
"content": [
@@ -818,7 +822,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:24.280527311"
+ "timestamp": "2026-03-19T13:01:14.928623929"
},
"samtools": {
"content": [
@@ -834,7 +838,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:24.381476776"
+ "timestamp": "2026-03-19T13:01:15.028344526"
},
"taxpasta": {
"content": [
@@ -873,7 +877,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:24.442180374"
+ "timestamp": "2026-03-19T13:01:15.188461855"
},
"bbduk": {
"content": [
@@ -894,7 +898,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:15.08245804"
+ "timestamp": "2026-03-19T13:01:04.761591285"
},
"ganon": {
"content": [
@@ -937,7 +941,24 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:19.57247613"
+ "timestamp": "2026-03-19T13:01:09.37693826"
+ },
+ "metacache": {
+ "content": [
+ [
+ "2614_db1.mapping.txt contains string:true",
+ "ERR3201952_db1.mapping.txt contains string:true"
+ ],
+ [
+ "db1/2614_db1.mapping.txt",
+ "db1/ERR3201952_db1.mapping.txt"
+ ]
+ ],
+ "meta": {
+ "nf-test": "0.9.3",
+ "nextflow": "25.04.8"
+ },
+ "timestamp": "2026-03-19T13:01:14.855620504"
},
"kaiju": {
"content": [
@@ -969,7 +990,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:19.930657058"
+ "timestamp": "2026-03-19T13:01:10.530146615"
},
"bracken": {
"content": [
@@ -987,7 +1008,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:15.12463315"
+ "timestamp": "2026-03-19T13:01:04.804436372"
},
"diamond": {
"content": [
@@ -1040,7 +1061,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:19.491100272"
+ "timestamp": "2026-03-19T13:01:09.264275172"
},
"metaphlan": {
"content": [
@@ -1103,7 +1124,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:24.255641571"
+ "timestamp": "2026-03-19T13:01:14.905095979"
},
"porechop_abi": {
"content": [
@@ -1116,10 +1137,11 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:24.359920904"
+ "timestamp": "2026-03-19T13:01:15.006663323"
},
"sylph": {
"content": [
+ "sylph_db1_combined_reports.tsv contains string:'Penicillium roqueforti':true",
[
"2612_db1.sylph.tsv:md5,a84853a9ea0e88e62f3caa13f28ef945",
"2612_db1.sylphmpa:md5,a0832fc0d249a96e5c22afaa63e0bba8",
@@ -1130,10 +1152,10 @@
]
],
"meta": {
- "nf-test": "0.9.2",
- "nextflow": "25.10.4"
+ "nf-test": "0.9.3",
+ "nextflow": "25.04.8"
},
- "timestamp": "2026-03-03T09:09:18.106750907"
+ "timestamp": "2026-03-19T13:01:15.092875334"
},
"kraken2": {
"content": [
@@ -1166,7 +1188,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:24.183676934"
+ "timestamp": "2026-03-19T13:01:14.767722336"
},
"-profile test": {
"content": [
@@ -1258,6 +1280,9 @@
"MERGE_RUNS": {
"cat": 9.5
},
+ "METACACHE_QUERY": {
+ "metacache": "2.5.0"
+ },
"METAPHLAN_MERGEMETAPHLANTABLES": {
"metaphlan": "4.1.1"
},
@@ -1322,10 +1347,10 @@
}
],
"meta": {
- "nf-test": "0.9.2",
- "nextflow": "25.10.3"
+ "nf-test": "0.9.3",
+ "nextflow": "25.04.8"
},
- "timestamp": "2026-02-17T13:50:59.49393654"
+ "timestamp": "2026-03-19T13:01:04.615510602"
},
"centrifuge": {
"content": [
@@ -1360,7 +1385,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:19.435972225"
+ "timestamp": "2026-03-19T13:01:09.114119677"
},
"nonpareil": {
"content": [
@@ -1427,7 +1452,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:24.32971159"
+ "timestamp": "2026-03-19T13:01:14.978131667"
},
"melon": {
"content": [
@@ -1439,10 +1464,10 @@
]
],
"meta": {
- "nf-test": "0.9.2",
- "nextflow": "25.10.4"
+ "nf-test": "0.9.3",
+ "nextflow": "25.04.8"
},
- "timestamp": "2026-02-19T09:39:54.822703698"
+ "timestamp": "2026-03-19T13:01:15.244729751"
},
"kmcp": {
"content": [
@@ -1456,7 +1481,7 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:19.954799738"
+ "timestamp": "2026-03-19T13:01:10.554211743"
},
"fastp": {
"content": [
@@ -1491,6 +1516,6 @@
"nf-test": "0.9.3",
"nextflow": "25.04.8"
},
- "timestamp": "2026-01-28T16:46:19.535068755"
+ "timestamp": "2026-03-19T13:01:09.327042303"
}
-}
\ No newline at end of file
+}