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 +}