diff --git a/CHANGELOG.md b/CHANGELOG.md index e98482ef..4b2619cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,13 +13,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#484](https://github.com/nf-core/taxprofiler/pull/484) Improved input validation to immediately fail if run accession IDs within a given sample ID are not unique (❤️ to @sofstam for reporting, fixed by @jfy133) - [#491](https://github.com/nf-core/taxprofiler/pull/491) Added flag to publish intermediate bracken files (❤️ to @ewissel for reporting, fixed by @sofstam and @jfy133) -- [489](https://github.com/nf-core/taxprofiler/pull/489) Fix KrakenUniq classified reads output format mismatch (❤️ to @SannaAb for reporting, fixed by @jfy133) +- [#489](https://github.com/nf-core/taxprofiler/pull/489) Fix KrakenUniq classified reads output format mismatch (❤️ to @SannaAb for reporting, fixed by @jfy133) +- [#495](https://github.com/nf-core/taxprofiler/pull/495) Stop TAXPASTA failures when profiles do not have exact compositionality (fixes by @Midnighter, @jfy133) ### `Dependencies` -| Tool | Previous version | New version | -| ---- | ---------------- | ----------- | -| KMCP | 0.9.1 | 0.9.4 | +| Tool | Previous version | New version | +| -------- | ---------------- | ----------- | +| KMCP | 0.9.1 | 0.9.4 | +| TAXPASTA | 0.6.1 | 0.7.0 | ### `Deprecated` diff --git a/conf/modules.config b/conf/modules.config index 2148b69f..ee0bd5b5 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -754,15 +754,14 @@ process { withName: TAXPASTA_MERGE { tag = { "${meta.tool}|${meta.id}" } + ext.prefix = { "${meta.tool}_${meta.id}" } ext.args = { [ - "-p ${meta.tool} -o ${meta.tool}_${meta.id}.${params.standardisation_taxpasta_format}", params.taxpasta_add_name ? "--add-name" : "", params.taxpasta_add_rank ? "--add-rank" : "", params.taxpasta_add_lineage ? "--add-lineage" : "", params.taxpasta_add_idlineage ? "--add-id-lineage" : "", params.taxpasta_add_ranklineage ? "--add-rank-lineage" : "", - params.taxpasta_ignore_errors ? "--ignore-errors" : "" ].join(' ').trim() } publishDir = [ @@ -774,14 +773,15 @@ process { withName: TAXPASTA_STANDARDISE { tag = { "${meta.tool}|${meta.id}" } + ext.prefix = { "${meta.tool}_${meta.id}" } ext.args = { - [ - "-p ${meta.tool} -o ${meta.tool}_${meta.id}.${params.standardisation_taxpasta_format}", - params.taxpasta_add_name ? "--add-name" : "", - params.taxpasta_add_rank ? "--add-rank" : "", - params.taxpasta_add_lineage ? "--add-lineage" : "", - params.taxpasta_add_idlineage ? "--add-id-lineage" : "" - ].join(' ').trim() + [ + params.taxpasta_add_name ? "--add-name" : "", + params.taxpasta_add_rank ? "--add-rank" : "", + params.taxpasta_add_lineage ? "--add-lineage" : "", + params.taxpasta_add_idlineage ? "--add-id-lineage" : "", + params.taxpasta_add_ranklineage ? "--add-rank-lineage" : "" + ].join(' ').trim() } publishDir = [ path: { "${params.outdir}/taxpasta/" }, diff --git a/modules.json b/modules.json index 04001af6..b7fc0290 100644 --- a/modules.json +++ b/modules.json @@ -228,12 +228,12 @@ }, "taxpasta/merge": { "branch": "master", - "git_sha": "48019785051ba491e82dce910273c2eca61bd5b7", + "git_sha": "4fd9089d3cf904e0b870d5a6a7ab903ee5e1004d", "installed_by": ["modules"] }, "taxpasta/standardise": { "branch": "master", - "git_sha": "48019785051ba491e82dce910273c2eca61bd5b7", + "git_sha": "4fd9089d3cf904e0b870d5a6a7ab903ee5e1004d", "installed_by": ["modules"] }, "untar": { diff --git a/modules/nf-core/taxpasta/merge/environment.yml b/modules/nf-core/taxpasta/merge/environment.yml new file mode 100644 index 00000000..ca1a10b7 --- /dev/null +++ b/modules/nf-core/taxpasta/merge/environment.yml @@ -0,0 +1,7 @@ +name: taxpasta_merge +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::taxpasta=0.7.0 diff --git a/modules/nf-core/taxpasta/merge/main.nf b/modules/nf-core/taxpasta/merge/main.nf index de135221..662f6e79 100644 --- a/modules/nf-core/taxpasta/merge/main.nf +++ b/modules/nf-core/taxpasta/merge/main.nf @@ -2,14 +2,16 @@ process TAXPASTA_MERGE { tag "$meta.id" label 'process_single' - conda "bioconda::taxpasta=0.6.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/taxpasta:0.6.1--pyhdfd78af_0': - 'biocontainers/taxpasta:0.6.1--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/taxpasta:0.7.0--pyhdfd78af_0': + 'biocontainers/taxpasta:0.7.0--pyhdfd78af_0' }" input: tuple val(meta), path(profiles) + val profiler + val format path taxonomy path samplesheet @@ -21,24 +23,34 @@ process TAXPASTA_MERGE { task.ext.when == null || task.ext.when script: - // N.B.: Taxpasta requires a --profiler option and will fail without it. - // This must be specified via a `nextflow.config` or `modules.config`, for - // example, as "--profiler kraken2". Additionally, it requires a --output - // option with the output file name. The desired format will be parsed from - // the name and should correspond to the output pattern specified above, - // e.g., "--output ${task.ext.prefix}.tsv". def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def taxonomy_option = taxonomy ? "--taxonomy ${taxonomy}" : '' def samplesheet_input = samplesheet ? "-s ${samplesheet}" : '' """ taxpasta merge \\ + --profiler $profiler \\ + --output ${prefix}.${format} \\ $args \\ $taxonomy_option \\ $samplesheet_input \\ $profiles + cat <<-END_VERSIONS > versions.yml + "${task.process}": + taxpasta: \$(taxpasta --version) + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def taxonomy_option = taxonomy ? "--taxonomy ${taxonomy}" : '' + def samplesheet_input = samplesheet ? "-s ${samplesheet}" : '' + """ + touch ${prefix}.${format} + cat <<-END_VERSIONS > versions.yml "${task.process}": taxpasta: \$(taxpasta --version) diff --git a/modules/nf-core/taxpasta/merge/meta.yml b/modules/nf-core/taxpasta/merge/meta.yml index ed89e62c..a4cbed94 100644 --- a/modules/nf-core/taxpasta/merge/meta.yml +++ b/modules/nf-core/taxpasta/merge/meta.yml @@ -14,9 +14,7 @@ tools: homepage: "https://taxpasta.readthedocs.io/" documentation: "https://taxpasta.readthedocs.io/" tool_dev_url: "https://github.com/taxprofiler/taxpasta" - - licence: "['Apache-2.0']" - + licence: ["Apache-2.0"] input: - meta: type: map @@ -27,17 +25,22 @@ input: type: file description: A list of taxonomic profiler output files (typically in text format, mandatory) pattern: "*.{tsv,csv,arrow,parquet,biom}" - - samplesheet: - type: file - description: - A samplesheet describing the sample name and a filepath to a taxonomic abundance profile that needs to be relative - from the work environment. The profiles must be provided even if you give a samplesheet as argument (optional) - pattern: "*.{tsv,csv,ods,xlsx,arrow,parquet}" + - profiler: + type: string + description: Name of the profiler used to generate the profile (mandatory) + pattern: "bracken|centrifuge|diamond|ganon|kaiju|kmcp|kraken2|krakenuniq|megan6|metaphlan|motus" + - format: + type: string + description: Type of output file to be generated + pattern: "tsv|csv|ods|xlsx|arrow|parquet|biom" - taxonomy: type: directory description: Directory containing at a minimum nodes.dmp and names.dmp files (optional) pattern: "*/" - + - samplesheet: + type: file + description: A samplesheet describing the sample name and a filepath to a taxonomic abundance profile that needs to be relative from the Nextflow work directory of the executed process. The profiles must be provided even if you give a samplesheet as argument (optional) + pattern: "*.{tsv,csv,ods,xlsx,arrow,parquet}" output: - meta: type: map @@ -52,7 +55,9 @@ output: type: file description: Output file with standardised multiple profiles in one go and have all profiles combined into a single table. pattern: "*.{tsv,csv,ods,xlsx,arrow,parquet,biom}" - authors: - "@sofstam" - "@jfy133" +maintainers: + - "@sofstam" + - "@jfy133" diff --git a/modules/nf-core/taxpasta/merge/tests/main.nf.test b/modules/nf-core/taxpasta/merge/tests/main.nf.test new file mode 100644 index 00000000..886e93b9 --- /dev/null +++ b/modules/nf-core/taxpasta/merge/tests/main.nf.test @@ -0,0 +1,111 @@ +nextflow_process { + + name "Test Process TAXPASTA_MERGE" + script "../main.nf" + process "TAXPASTA_MERGE" + tag "modules" + tag "modules_nfcore" + tag "taxpasta" + tag "taxpasta/merge" + + test("sarscov2 - metagenome - kraken report") { + + when { + process { + """ + ch_test1_kraken = Channel.fromPath(params.modules_testdata_base_path + 'genomics/sarscov2/metagenome/test_1.kraken2.report.txt', checkIfExists: true).collectFile(name: 'test_1.kraken2.report.txt') + ch_test2_kraken = Channel.fromPath(params.modules_testdata_base_path + 'genomics/sarscov2/metagenome/test_1.kraken2.report.txt', checkIfExists: true).collectFile(name: 'test_2.kraken2.report.txt') + + input[0] = ch_test1_kraken.mix ( ch_test2_kraken ) + .collect() + .map { files -> + def meta = [:] + meta['id'] = 'kraken2' + meta['profiler'] = 'kraken2' + [meta, files.sort()] + + } + input[1] = 'kraken2' + input[2] = 'tsv' + input[3] = [] + input[4] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.merged_profiles[0][1]).readLines().any { it.contains('2697049 100 100') }, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - metagenome - kraken report - samplesheet") { + + when { + process { + """ + ch_test1_kraken = Channel.fromPath(params.modules_testdata_base_path + 'genomics/sarscov2/metagenome/test_1.kraken2.report.txt', checkIfExists: true).collectFile(name: 'test_1.kraken2.report.txt') + ch_test2_kraken = Channel.fromPath(params.modules_testdata_base_path + 'genomics/sarscov2/metagenome/test_1.kraken2.report.txt', checkIfExists: true).collectFile(name: 'test_2.kraken2.report.txt') + + input[0] = ch_test1_kraken.mix ( ch_test2_kraken ) + .collect() + .map { files -> + def meta = [:] + meta['id'] = 'kraken2' + meta['profiler'] = 'kraken2' + [meta, files.sort()] + } + input[1] = 'kraken2' + input[2] = 'tsv' + input[3] = [] + input[4] = Channel.of( + 'sample\tprofile', + 'test_1\t"test_1.kraken2.report.txt"', + 'test_2\t"test_2.kraken2.report.txt"' + ) + .collectFile(name: 'samplesheet.tsv', newLine: true, sort: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - metagenome - kraken report - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [[id:'test'], file(params.modules_testdata_base_path + 'genomics/sarscov2/metagenome/test_1.kraken2.report.txt', checkIfExists: true)] + input[1] = 'kraken2' + input[2] = 'tsv' + input[3] = [] + input[4] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/taxpasta/merge/tests/main.nf.test.snap b/modules/nf-core/taxpasta/merge/tests/main.nf.test.snap new file mode 100644 index 00000000..afb7e491 --- /dev/null +++ b/modules/nf-core/taxpasta/merge/tests/main.nf.test.snap @@ -0,0 +1,83 @@ +{ + "sarscov2 - metagenome - kraken report": { + "content": [ + true, + [ + "versions.yml:md5,35ebf4cc0297b6601cef13c6a3ab157d" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-11T06:13:35.985987277" + }, + "sarscov2 - metagenome - kraken report - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,35ebf4cc0297b6601cef13c6a3ab157d" + ], + "merged_profiles": [ + [ + { + "id": "test" + }, + "test.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,35ebf4cc0297b6601cef13c6a3ab157d" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T22:04:59.08186623" + }, + "sarscov2 - metagenome - kraken report - samplesheet": { + "content": [ + { + "0": [ + [ + { + "id": "kraken2", + "profiler": "kraken2" + }, + "kraken2.tsv:md5,3a31a2bbff49f6e03083a2e03f4f6563" + ] + ], + "1": [ + "versions.yml:md5,35ebf4cc0297b6601cef13c6a3ab157d" + ], + "merged_profiles": [ + [ + { + "id": "kraken2", + "profiler": "kraken2" + }, + "kraken2.tsv:md5,3a31a2bbff49f6e03083a2e03f4f6563" + ] + ], + "versions": [ + "versions.yml:md5,35ebf4cc0297b6601cef13c6a3ab157d" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T22:25:57.576974385" + } +} \ No newline at end of file diff --git a/modules/nf-core/taxpasta/merge/tests/tags.yml b/modules/nf-core/taxpasta/merge/tests/tags.yml new file mode 100644 index 00000000..5d17220c --- /dev/null +++ b/modules/nf-core/taxpasta/merge/tests/tags.yml @@ -0,0 +1,2 @@ +taxpasta/merge: + - "modules/nf-core/taxpasta/merge/**" diff --git a/modules/nf-core/taxpasta/standardise/environment.yml b/modules/nf-core/taxpasta/standardise/environment.yml new file mode 100644 index 00000000..a48f08e0 --- /dev/null +++ b/modules/nf-core/taxpasta/standardise/environment.yml @@ -0,0 +1,7 @@ +name: taxpasta_standardise +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::taxpasta=0.7.0 diff --git a/modules/nf-core/taxpasta/standardise/main.nf b/modules/nf-core/taxpasta/standardise/main.nf index 7822912a..7b393517 100644 --- a/modules/nf-core/taxpasta/standardise/main.nf +++ b/modules/nf-core/taxpasta/standardise/main.nf @@ -2,13 +2,15 @@ process TAXPASTA_STANDARDISE { tag "$meta.id" label 'process_single' - conda "bioconda::taxpasta=0.6.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/taxpasta:0.6.1--pyhdfd78af_0': - 'biocontainers/taxpasta:0.6.1--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/taxpasta:0.7.0--pyhdfd78af_0': + 'biocontainers/taxpasta:0.7.0--pyhdfd78af_0' }" input: tuple val(meta), path(profile) + val profiler + val format path taxonomy output: @@ -19,17 +21,13 @@ process TAXPASTA_STANDARDISE { task.ext.when == null || task.ext.when script: - // N.B.: Taxpasta requires a --profiler option and will fail without it. - // This must be specified via a `nextflow.config` or `modules.config`, for - // example, as "--profiler kraken2". Additionally, it requires a --output - // option with the output file name. The desired format will be parsed from - // the name and should correspond to the output pattern specified above, - // e.g., "--output ${task.ext.prefix}.tsv". def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def taxonomy_option = taxonomy ? "--taxonomy ${taxonomy}" : '' """ taxpasta standardise \\ + --profiler $profiler \\ + --output ${prefix}.${format} \\ $args \\ $taxonomy_option \\ $profile @@ -39,4 +37,17 @@ process TAXPASTA_STANDARDISE { taxpasta: \$(taxpasta --version) END_VERSIONS """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def taxonomy_option = taxonomy ? "--taxonomy ${taxonomy}" : '' + """ + touch ${prefix}.${format} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + taxpasta: \$(taxpasta --version) + END_VERSIONS + """ } diff --git a/modules/nf-core/taxpasta/standardise/meta.yml b/modules/nf-core/taxpasta/standardise/meta.yml index 81df6e2c..b855905a 100644 --- a/modules/nf-core/taxpasta/standardise/meta.yml +++ b/modules/nf-core/taxpasta/standardise/meta.yml @@ -14,9 +14,7 @@ tools: homepage: "https://taxpasta.readthedocs.io/" documentation: "https://taxpasta.readthedocs.io/" tool_dev_url: "https://github.com/taxprofiler/taxpasta" - - licence: "['Apache-2.0']" - + licence: ["Apache-2.0"] input: - meta: type: map @@ -27,11 +25,18 @@ input: type: file description: profiler output file (mandatory) pattern: "*" + - profiler: + type: string + description: Name of the profiler used to generate the profile (mandatory) + pattern: "bracken|centrifuge|diamond|ganon|kaiju|kmcp|kraken2|krakenuniq|megan6|metaphlan|motus" + - format: + type: string + description: Type of output file to be generated + pattern: "tsv|csv|ods|xlsx|arrow|parquet|biom" - taxonomy: type: directory description: Directory containing at a minimum nodes.dmp and names.dmp files (optional) pattern: "*/" - output: - meta: type: map @@ -46,6 +51,7 @@ output: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@Midnighter" +maintainers: + - "@Midnighter" diff --git a/modules/nf-core/taxpasta/standardise/tests/main.nf.test b/modules/nf-core/taxpasta/standardise/tests/main.nf.test new file mode 100644 index 00000000..e06ca7d6 --- /dev/null +++ b/modules/nf-core/taxpasta/standardise/tests/main.nf.test @@ -0,0 +1,58 @@ +nextflow_process { + + name "Test Process TAXPASTA_STANDARDISE" + script "../main.nf" + process "TAXPASTA_STANDARDISE" + tag "modules" + tag "modules_nfcore" + tag "taxpasta" + tag "taxpasta/standardise" + + test("sarscov2 - metagenome - kraken report") { + + + when { + process { + """ + input[0] = [[id: 'test'], file(params.modules_testdata_base_path + 'genomics/sarscov2/metagenome/test_1.kraken2.report.txt', checkIfExists: true)] + input[1] = "kraken2" + input[2] = 'tsv' + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - metagenome - kraken report - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [[id: 'test'], file(params.modules_testdata_base_path + 'genomics/sarscov2/metagenome/test_1.kraken2.report.txt', checkIfExists: true)] + input[1] = "kraken2" + input[2] = 'tsv' + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/taxpasta/standardise/tests/main.nf.test.snap b/modules/nf-core/taxpasta/standardise/tests/main.nf.test.snap new file mode 100644 index 00000000..498711e3 --- /dev/null +++ b/modules/nf-core/taxpasta/standardise/tests/main.nf.test.snap @@ -0,0 +1,68 @@ +{ + "sarscov2 - metagenome - kraken report": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.tsv:md5,6b62032ed403f431eeb0e17464ccc69b" + ] + ], + "1": [ + "versions.yml:md5,bf00feb66945aab46a78efafac5a261f" + ], + "standardised_profile": [ + [ + { + "id": "test" + }, + "test.tsv:md5,6b62032ed403f431eeb0e17464ccc69b" + ] + ], + "versions": [ + "versions.yml:md5,bf00feb66945aab46a78efafac5a261f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-11T12:35:34.381682299" + }, + "sarscov2 - metagenome - kraken report - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,bf00feb66945aab46a78efafac5a261f" + ], + "standardised_profile": [ + [ + { + "id": "test" + }, + "test.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,bf00feb66945aab46a78efafac5a261f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-11T12:35:41.579178159" + } +} \ No newline at end of file diff --git a/modules/nf-core/taxpasta/standardise/tests/tags.yml b/modules/nf-core/taxpasta/standardise/tests/tags.yml new file mode 100644 index 00000000..43ec42dd --- /dev/null +++ b/modules/nf-core/taxpasta/standardise/tests/tags.yml @@ -0,0 +1,2 @@ +taxpasta/standardise: + - "modules/nf-core/taxpasta/standardise/**" diff --git a/subworkflows/local/standardisation_profiles.nf b/subworkflows/local/standardisation_profiles.nf index 95cd9d3f..ac204497 100644 --- a/subworkflows/local/standardisation_profiles.nf +++ b/subworkflows/local/standardisation_profiles.nf @@ -93,11 +93,23 @@ workflow STANDARDISATION_PROFILES { standardise: true } + ch_input_for_taxpasta_merge = ch_input_for_taxpasta.merge + .multiMap{ meta, profiles -> + profiles: [meta, profiles] + tool: meta.tool + } - TAXPASTA_MERGE (ch_input_for_taxpasta.merge , ch_taxpasta_tax_dir, []) + ch_input_for_taxpasta_standardise = ch_input_for_taxpasta.standardise + .multiMap{ meta, profiles -> + profiles: [meta, profiles] + tool: meta.tool + } + + + TAXPASTA_MERGE ( ch_input_for_taxpasta_merge.profiles , ch_input_for_taxpasta_merge.tool , params.standardisation_taxpasta_format, ch_taxpasta_tax_dir, [] ) + TAXPASTA_STANDARDISE ( ch_input_for_taxpasta_standardise.profiles, ch_input_for_taxpasta_standardise.tool, params.standardisation_taxpasta_format, ch_taxpasta_tax_dir ) ch_versions = ch_versions.mix( TAXPASTA_MERGE.out.versions.first() ) - TAXPASTA_STANDARDISE (ch_input_for_taxpasta.standardise, ch_taxpasta_tax_dir ) - ch_version = ch_versions.mix( TAXPASTA_STANDARDISE.out.versions.first() ) + ch_versions = ch_versions.mix( TAXPASTA_STANDARDISE.out.versions.first() )