From 9897e69c5b47e68b2adb051a2eedf7632efcbe4d Mon Sep 17 00:00:00 2001 From: Anabella Trigila <18577080+atrigila@users.noreply.github.com> Date: Fri, 6 Sep 2024 19:53:32 -0300 Subject: [PATCH] Add module and subworkflow mirtop (#6587) * add mirtop gff module * add mirtop/counts module * add mirtop/export module * add mirtop/stats module * update yml * add bam_stats_mirna_mirtop subworkflow * add required dependencies * update test * update subworkflow test * update yml and output files * fix tag linting issue? * fix linting * run prettier * try to solve conda issue * add a compatible pandas * fix linting * update failing ci mirtop/gff test --- modules/nf-core/mirtop/counts/environment.yml | 9 ++ modules/nf-core/mirtop/counts/main.nf | 53 +++++++++ modules/nf-core/mirtop/counts/meta.yml | 57 ++++++++++ .../nf-core/mirtop/counts/tests/main.nf.test | 97 +++++++++++++++++ .../mirtop/counts/tests/main.nf.test.snap | 47 ++++++++ .../mirtop/counts/tests/nextflow.config | 5 + modules/nf-core/mirtop/export/environment.yml | 10 ++ modules/nf-core/mirtop/export/main.nf | 57 ++++++++++ modules/nf-core/mirtop/export/meta.yml | 65 +++++++++++ .../nf-core/mirtop/export/tests/main.nf.test | 92 ++++++++++++++++ .../mirtop/export/tests/main.nf.test.snap | 102 ++++++++++++++++++ modules/nf-core/mirtop/gff/environment.yml | 8 ++ modules/nf-core/mirtop/gff/main.nf | 55 ++++++++++ modules/nf-core/mirtop/gff/meta.yml | 61 +++++++++++ modules/nf-core/mirtop/gff/tests/main.nf.test | 81 ++++++++++++++ .../mirtop/gff/tests/main.nf.test.snap | 67 ++++++++++++ modules/nf-core/mirtop/stats/environment.yml | 8 ++ modules/nf-core/mirtop/stats/main.nf | 51 +++++++++ modules/nf-core/mirtop/stats/meta.yml | 46 ++++++++ .../nf-core/mirtop/stats/tests/main.nf.test | 81 ++++++++++++++ .../mirtop/stats/tests/main.nf.test.snap | 100 +++++++++++++++++ .../nf-core/bam_stats_mirna_mirtop/main.nf | 36 +++++++ .../nf-core/bam_stats_mirna_mirtop/meta.yml | 61 +++++++++++ .../bam_stats_mirna_mirtop/tests/main.nf.test | 49 +++++++++ .../tests/main.nf.test.snap | 41 +++++++ .../tests/nextflow.config | 5 + 26 files changed, 1344 insertions(+) create mode 100644 modules/nf-core/mirtop/counts/environment.yml create mode 100644 modules/nf-core/mirtop/counts/main.nf create mode 100644 modules/nf-core/mirtop/counts/meta.yml create mode 100644 modules/nf-core/mirtop/counts/tests/main.nf.test create mode 100644 modules/nf-core/mirtop/counts/tests/main.nf.test.snap create mode 100644 modules/nf-core/mirtop/counts/tests/nextflow.config create mode 100644 modules/nf-core/mirtop/export/environment.yml create mode 100644 modules/nf-core/mirtop/export/main.nf create mode 100644 modules/nf-core/mirtop/export/meta.yml create mode 100644 modules/nf-core/mirtop/export/tests/main.nf.test create mode 100644 modules/nf-core/mirtop/export/tests/main.nf.test.snap create mode 100644 modules/nf-core/mirtop/gff/environment.yml create mode 100644 modules/nf-core/mirtop/gff/main.nf create mode 100644 modules/nf-core/mirtop/gff/meta.yml create mode 100644 modules/nf-core/mirtop/gff/tests/main.nf.test create mode 100644 modules/nf-core/mirtop/gff/tests/main.nf.test.snap create mode 100644 modules/nf-core/mirtop/stats/environment.yml create mode 100644 modules/nf-core/mirtop/stats/main.nf create mode 100644 modules/nf-core/mirtop/stats/meta.yml create mode 100644 modules/nf-core/mirtop/stats/tests/main.nf.test create mode 100644 modules/nf-core/mirtop/stats/tests/main.nf.test.snap create mode 100644 subworkflows/nf-core/bam_stats_mirna_mirtop/main.nf create mode 100644 subworkflows/nf-core/bam_stats_mirna_mirtop/meta.yml create mode 100644 subworkflows/nf-core/bam_stats_mirna_mirtop/tests/main.nf.test create mode 100644 subworkflows/nf-core/bam_stats_mirna_mirtop/tests/main.nf.test.snap create mode 100644 subworkflows/nf-core/bam_stats_mirna_mirtop/tests/nextflow.config diff --git a/modules/nf-core/mirtop/counts/environment.yml b/modules/nf-core/mirtop/counts/environment.yml new file mode 100644 index 00000000000..ed1198d8260 --- /dev/null +++ b/modules/nf-core/mirtop/counts/environment.yml @@ -0,0 +1,9 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::mirtop=0.4.25" + - "conda-forge::r-base=4.1.1" + - "conda-forge::r-data.table=1.14.2" diff --git a/modules/nf-core/mirtop/counts/main.nf b/modules/nf-core/mirtop/counts/main.nf new file mode 100644 index 00000000000..9b623bff8f3 --- /dev/null +++ b/modules/nf-core/mirtop/counts/main.nf @@ -0,0 +1,53 @@ +process MIRTOP_COUNTS { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-0c13ef770dd7cc5c76c2ce23ba6669234cf03385:63be019f50581cc5dfe4fc0f73ae50f2d4d661f7-0' : + 'biocontainers/mulled-v2-0c13ef770dd7cc5c76c2ce23ba6669234cf03385:63be019f50581cc5dfe4fc0f73ae50f2d4d661f7-0' }" + + input: + tuple val(meta), path(mirtop_gff) + tuple val(meta2), path(hairpin) + tuple val(meta3), path(gtf), val(species) + + output: + tuple val(meta), path("counts/*.tsv"), emit: tsv + 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}" + """ + mirtop \\ + counts \\ + $args \\ + --hairpin $hairpin \\ + --gtf $gtf \\ + --sps $species \\ + --gff $mirtop_gff \\ + -o counts + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mirtop: \$(echo \$(mirtop --version 2>&1) | sed 's/^.*mirtop //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + mkdir counts + touch counts/mirtop.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mirtop: \$(echo \$(mirtop --version 2>&1) | sed 's/^.*mirtop //') + END_VERSIONS + """ +} diff --git a/modules/nf-core/mirtop/counts/meta.yml b/modules/nf-core/mirtop/counts/meta.yml new file mode 100644 index 00000000000..904dbd3102f --- /dev/null +++ b/modules/nf-core/mirtop/counts/meta.yml @@ -0,0 +1,57 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "mirtop_counts" +description: mirtop counts generates a file with the minimal information about each sequence and the count data in columns for each samples. +keywords: + - mirna + - isomir + - gff +tools: + - "mirtop": + description: "Small RNA-seq annotation" + homepage: "https://github.com/miRTop/mirtop" + documentation: "https://mirtop.readthedocs.io/en/latest/" + tool_dev_url: "https://github.com/miRTop/mirtop" + licence: ["MIT License"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - mirtop_gff: + type: file + description: GFF file + pattern: "*.{gff}" + - hairpin: + type: file + description: Hairpin file + pattern: "*.{fa,fasta}" + - gtf: + type: file + description: GTF file + pattern: "*.{gtf}" + - species: + type: string + description: Species name of the GTF file + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - tsv: + type: file + description: TSV file + pattern: "*.{tsv}" + +authors: + - "@atrigila" +maintainers: + - "@atrigila" diff --git a/modules/nf-core/mirtop/counts/tests/main.nf.test b/modules/nf-core/mirtop/counts/tests/main.nf.test new file mode 100644 index 00000000000..8283d5b489b --- /dev/null +++ b/modules/nf-core/mirtop/counts/tests/main.nf.test @@ -0,0 +1,97 @@ +nextflow_process { + + name "Test Process MIRTOP_COUNTS" + script "../main.nf" + config "./nextflow.config" + process "MIRTOP_COUNTS" + + tag "modules" + tag "modules_nfcore" + tag "mirtop" + tag "mirtop/gff" + tag "mirtop/counts" + + setup { + run("MIRTOP_GFF") { + script "../../gff/main.nf" + process { + """ + input[0] = [ + [ id:'sample_sim_isomir_bam'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/sim_isomir_sort.bam", checkIfExists: true), + ] + input[1] = [ + [ id:'hairpin'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hairpin_mirtop.fa", checkIfExists: true), + ] + input[2] = [ + [ id:'hsa' ], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hsa.gff3", checkIfExists: true), + "hsa"] + """ + } + } + } + + test("isomir - bam") { + + when { + process { + """ + input[0] = MIRTOP_GFF.out.mirtop_gff + input[1] = [ + [ id:'hairpin'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hairpin_mirtop.fa", checkIfExists: true), + ] + input[2] = [ + [ id:'hsa' ], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hsa.gff3", checkIfExists: true), + "hsa"] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.versions + ).match() + }, + // md5sum is not stable, order of elements in column "variant" change + { assert file(process.out.tsv[0][1]).readLines().findAll { it.contains("iso-22-I0S21NSLN") }} + ) + } + + } + + test("isomir - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = MIRTOP_GFF.out.mirtop_gff + input[1] = [ + [ id:'hairpin'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hairpin_mirtop.fa", checkIfExists: true), + ] + input[2] = [ + [ id:'hsa' ], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hsa.gff3", checkIfExists: true), + "hsa"] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/mirtop/counts/tests/main.nf.test.snap b/modules/nf-core/mirtop/counts/tests/main.nf.test.snap new file mode 100644 index 00000000000..d05798b0bb6 --- /dev/null +++ b/modules/nf-core/mirtop/counts/tests/main.nf.test.snap @@ -0,0 +1,47 @@ +{ + "isomir - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "mirtop.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,16430682c2080d67387e7d5e9caf69a7" + ], + "tsv": [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "mirtop.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,16430682c2080d67387e7d5e9caf69a7" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-03T13:24:41.148536938" + }, + "isomir - bam": { + "content": [ + [ + "versions.yml:md5,16430682c2080d67387e7d5e9caf69a7" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-04T18:39:50.607483472" + } +} \ No newline at end of file diff --git a/modules/nf-core/mirtop/counts/tests/nextflow.config b/modules/nf-core/mirtop/counts/tests/nextflow.config new file mode 100644 index 00000000000..83d77e209c2 --- /dev/null +++ b/modules/nf-core/mirtop/counts/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'MIRTOP_COUNTS' { + ext.args = '--add-extra' + } +} diff --git a/modules/nf-core/mirtop/export/environment.yml b/modules/nf-core/mirtop/export/environment.yml new file mode 100644 index 00000000000..4b5ae03a45a --- /dev/null +++ b/modules/nf-core/mirtop/export/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::mirtop=0.4.25" + - "bioconda::samtools=1.15.1" + - "conda-forge::r-base=4.1.1" + - "conda-forge::r-data.table=1.14.2" diff --git a/modules/nf-core/mirtop/export/main.nf b/modules/nf-core/mirtop/export/main.nf new file mode 100644 index 00000000000..33f6c303262 --- /dev/null +++ b/modules/nf-core/mirtop/export/main.nf @@ -0,0 +1,57 @@ +process MIRTOP_EXPORT { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-0c13ef770dd7cc5c76c2ce23ba6669234cf03385:63be019f50581cc5dfe4fc0f73ae50f2d4d661f7-0' : + 'biocontainers/mulled-v2-0c13ef770dd7cc5c76c2ce23ba6669234cf03385:63be019f50581cc5dfe4fc0f73ae50f2d4d661f7-0' }" + + input: + tuple val(meta), path(mirtop_gff) + tuple val(meta2), path(hairpin) + tuple val(meta3), path(gtf), val(species) + + output: + tuple val(meta), path("export/*_rawData.tsv") , emit: tsv, optional: true + tuple val(meta), path("export/*.fasta") , emit: fasta, optional: true + tuple val(meta), path("export/*.vcf*") , emit: vcf , optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '--format isomir' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + mirtop \\ + export \\ + $args \\ + --hairpin $hairpin\\ + --gtf $gtf \\ + --sps $species \\ + -o export \\ + $mirtop_gff + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mirtop: \$(echo \$(mirtop --version 2>&1) | sed 's/^.*mirtop //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + mkdir export + touch export/${prefix}.fasta + touch export/${prefix}.vcf + touch export/${prefix}.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mirtop: \$(echo \$(mirtop --version 2>&1) | sed 's/^.*mirtop //') + END_VERSIONS + """ +} diff --git a/modules/nf-core/mirtop/export/meta.yml b/modules/nf-core/mirtop/export/meta.yml new file mode 100644 index 00000000000..d797f78373d --- /dev/null +++ b/modules/nf-core/mirtop/export/meta.yml @@ -0,0 +1,65 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "mirtop_export" +description: mirtop export generates files such as fasta, vcf or compatible with isomiRs bioconductor package +keywords: + - mirna + - isomir + - gff +tools: + - "mirtop": + description: "Small RNA-seq annotation" + homepage: "https://github.com/miRTop/mirtop" + documentation: "https://mirtop.readthedocs.io/en/latest/" + tool_dev_url: "https://github.com/miRTop/mirtop" + licence: ["MIT License"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - mirtop_gff: + type: file + description: GFF file + pattern: "*.{gff}" + - hairpin: + type: file + description: Hairpin file + pattern: "*.{fa,fasta}" + - gtf: + type: file + description: GTF file + pattern: "*.{gtf}" + - species: + type: string + description: Species name of the GTF file + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - tsv: + type: file + description: TSV file + pattern: "*.{tsv}" + - fasta: + type: file + description: FASTA file + pattern: "*.{fasta,fa}" + - vcf: + type: file + description: VCF file + pattern: "*.{vcf,vcf.gz}" + +authors: + - "@atrigila" +maintainers: + - "@atrigila" diff --git a/modules/nf-core/mirtop/export/tests/main.nf.test b/modules/nf-core/mirtop/export/tests/main.nf.test new file mode 100644 index 00000000000..0a7f80710b7 --- /dev/null +++ b/modules/nf-core/mirtop/export/tests/main.nf.test @@ -0,0 +1,92 @@ +nextflow_process { + + name "Test Process MIRTOP_EXPORT" + script "../main.nf" + process "MIRTOP_EXPORT" + + tag "modules" + tag "modules_nfcore" + tag "mirtop" + tag "mirtop/gff" + tag "mirtop/export" + + setup { + run("MIRTOP_GFF") { + script "../../gff/main.nf" + process { + """ + input[0] = [ + [ id:'sample_sim_isomir_bam'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/sim_isomir_sort.bam", checkIfExists: true), + ] + input[1] = [ + [ id:'hairpin'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hairpin_mirtop.fa", checkIfExists: true), + ] + input[2] = [ + [ id:'hsa' ], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hsa.gff3", checkIfExists: true), + "hsa"] + """ + } + } + } + + test("isomir - bam") { + + when { + process { + """ + input[0] = MIRTOP_GFF.out.mirtop_gff + input[1] = [ + [ id:'hairpin'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hairpin_mirtop.fa", checkIfExists: true), + ] + input[2] = [ + [ id:'hsa' ], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hsa.gff3", checkIfExists: true), + "hsa"] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("isomir - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = MIRTOP_GFF.out.mirtop_gff + input[1] = [ + [ id:'hairpin'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hairpin_mirtop.fa", checkIfExists: true), + ] + input[2] = [ + [ id:'hsa' ], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hsa.gff3", checkIfExists: true), + "hsa"] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + +} diff --git a/modules/nf-core/mirtop/export/tests/main.nf.test.snap b/modules/nf-core/mirtop/export/tests/main.nf.test.snap new file mode 100644 index 00000000000..1a7784b08d1 --- /dev/null +++ b/modules/nf-core/mirtop/export/tests/main.nf.test.snap @@ -0,0 +1,102 @@ +{ + "isomir - bam - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "sample_sim_isomir_bam.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "sample_sim_isomir_bam.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,2dbbe262efcd19a681b803812d0e4c8c" + ], + "fasta": [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "sample_sim_isomir_bam.fasta:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tsv": [ + + ], + "vcf": [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "sample_sim_isomir_bam.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,2dbbe262efcd19a681b803812d0e4c8c" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-03T15:25:40.531010949" + }, + "isomir - bam": { + "content": [ + { + "0": [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "mirtop_rawData.tsv:md5,efbcbe67716a4a56f89e538af2251dcc" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,2dbbe262efcd19a681b803812d0e4c8c" + ], + "fasta": [ + + ], + "tsv": [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "mirtop_rawData.tsv:md5,efbcbe67716a4a56f89e538af2251dcc" + ] + ], + "vcf": [ + + ], + "versions": [ + "versions.yml:md5,2dbbe262efcd19a681b803812d0e4c8c" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-03T15:25:24.528528611" + } +} \ No newline at end of file diff --git a/modules/nf-core/mirtop/gff/environment.yml b/modules/nf-core/mirtop/gff/environment.yml new file mode 100644 index 00000000000..6e57308ae1c --- /dev/null +++ b/modules/nf-core/mirtop/gff/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::mirtop=0.4.25" + - "bioconda::samtools=1.15.1" diff --git a/modules/nf-core/mirtop/gff/main.nf b/modules/nf-core/mirtop/gff/main.nf new file mode 100644 index 00000000000..1f951e2fada --- /dev/null +++ b/modules/nf-core/mirtop/gff/main.nf @@ -0,0 +1,55 @@ +process MIRTOP_GFF { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-0c13ef770dd7cc5c76c2ce23ba6669234cf03385:63be019f50581cc5dfe4fc0f73ae50f2d4d661f7-0' : + 'biocontainers/mulled-v2-0c13ef770dd7cc5c76c2ce23ba6669234cf03385:63be019f50581cc5dfe4fc0f73ae50f2d4d661f7-0' }" + + input: + tuple val(meta), path(bam) + tuple val(meta2), path(hairpin) + tuple val(meta3), path(gtf), val(species) + + output: + tuple val(meta), path("mirtop/${bam.baseName}.gff") , emit: sample_gff + tuple val(meta), path("mirtop/mirtop.gff") , emit: mirtop_gff + 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}" + """ + mirtop \\ + gff \\ + $args \\ + --sps $species \\ + --hairpin $hairpin \\ + --gtf $gtf \\ + -o mirtop \\ + $bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mirtop: \$(echo \$(mirtop --version 2>&1) | sed 's/^.*mirtop //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + mkdir mirtop + touch mirtop/mirtop.gff + touch mirtop/sim_isomir_sort.gff + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mirtop: \$(echo \$(mirtop --version 2>&1) | sed 's/^.*mirtop //') + END_VERSIONS + """ +} diff --git a/modules/nf-core/mirtop/gff/meta.yml b/modules/nf-core/mirtop/gff/meta.yml new file mode 100644 index 00000000000..9d593210d2e --- /dev/null +++ b/modules/nf-core/mirtop/gff/meta.yml @@ -0,0 +1,61 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "mirtop_gff" +description: mirtop gff generates the GFF3 adapter format to capture miRNA variations +keywords: + - mirna + - isomir + - gff +tools: + - "mirtop": + description: "Small RNA-seq annotation" + homepage: "https://github.com/miRTop/mirtop" + documentation: "https://mirtop.readthedocs.io/en/latest/" + tool_dev_url: "https://github.com/miRTop/mirtop" + licence: ["MIT License"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - hairpin: + type: file + description: Hairpin file + pattern: "*.{fa,fasta}" + - gtf: + type: file + description: GTF file + pattern: "*.{gtf}" + - species: + type: string + description: Species name of the GTF file + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - mirtop_gff: + type: file + description: GFF file + pattern: "*.{gff}" + - sample_gff: + type: file + description: GFF file + pattern: "*.{gff}" + +authors: + - "@atrigila" +maintainers: + - "@atrigila" diff --git a/modules/nf-core/mirtop/gff/tests/main.nf.test b/modules/nf-core/mirtop/gff/tests/main.nf.test new file mode 100644 index 00000000000..67b7ef3cf86 --- /dev/null +++ b/modules/nf-core/mirtop/gff/tests/main.nf.test @@ -0,0 +1,81 @@ +nextflow_process { + + name "Test Process MIRTOP_GFF" + script "../main.nf" + process "MIRTOP_GFF" + + tag "modules" + tag "modules_nfcore" + tag "mirtop" + tag "mirtop/gff" + + test("isomir - bam") { + + when { + process { + """ + input[0] = [ + [ id:'sample_sim_isomir_bam'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/sim_isomir_sort.bam", checkIfExists: true), + ] + input[1] = [ + [ id:'hairpin'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hairpin_mirtop.fa", checkIfExists: true), + ] + input[2] = [ + [ id:'hsa' ], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hsa.gff3", checkIfExists: true), + "hsa"] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.bam, + file(process.out.sample_gff[0][1]).readLines().findAll { it.contains("hsa-let-7a-2 miRBasev21 isomiR 3 25 0 + . Read TTGAGGTAGTAGGTTGTATAGTT; UID iso-23-Z0S31NSL0E; Name hsa-let-7a-5p;Parent hsa-let-7a-2; Variant iso_5p:-1; Cigar 23M;Expression 0; Filter Pass; Hits 1;") }, + process.out.versions, + ).match() + }, + // md5sum is not stable, order of elements in section "variant" may change + { assert file(process.out.mirtop_gff[0][1]).readLines().findAll { it.contains("iso-24-5URPV39QFB") }} + ) + } + + } + + test("isomir - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'sample_sim_isomir_bam'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/sim_isomir_sort.bam", checkIfExists: true), + ] + input[1] = [ + [ id:'hairpin'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hairpin_mirtop.fa", checkIfExists: true), + ] + input[2] = [ + [ id:'hsa' ], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hsa.gff3", checkIfExists: true), + "hsa"] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/mirtop/gff/tests/main.nf.test.snap b/modules/nf-core/mirtop/gff/tests/main.nf.test.snap new file mode 100644 index 00000000000..8283d5ad2ab --- /dev/null +++ b/modules/nf-core/mirtop/gff/tests/main.nf.test.snap @@ -0,0 +1,67 @@ +{ + "isomir - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "sim_isomir_sort.gff:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "mirtop.gff:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,d16ade25d46f8d12e200e124205afefc" + ], + "mirtop_gff": [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "mirtop.gff:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sample_gff": [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "sim_isomir_sort.gff:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,d16ade25d46f8d12e200e124205afefc" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-03T12:47:11.610449763" + }, + "isomir - bam": { + "content": [ + null, + [ + "hsa-let-7a-2\tmiRBasev21\tisomiR\t3\t25\t0\t+\t.\tRead TTGAGGTAGTAGGTTGTATAGTT; UID iso-23-Z0S31NSL0E; Name hsa-let-7a-5p;Parent hsa-let-7a-2; Variant iso_5p:-1; Cigar 23M;Expression 0; Filter Pass; Hits 1;" + ], + [ + "versions.yml:md5,d16ade25d46f8d12e200e124205afefc" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-06T21:42:47.26306174" + } +} \ No newline at end of file diff --git a/modules/nf-core/mirtop/stats/environment.yml b/modules/nf-core/mirtop/stats/environment.yml new file mode 100644 index 00000000000..3c24c43e805 --- /dev/null +++ b/modules/nf-core/mirtop/stats/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::mirtop=0.4.25" + - "conda-forge::pandas=1.3.5" diff --git a/modules/nf-core/mirtop/stats/main.nf b/modules/nf-core/mirtop/stats/main.nf new file mode 100644 index 00000000000..51d33019a99 --- /dev/null +++ b/modules/nf-core/mirtop/stats/main.nf @@ -0,0 +1,51 @@ + +process MIRTOP_STATS { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-0c13ef770dd7cc5c76c2ce23ba6669234cf03385:63be019f50581cc5dfe4fc0f73ae50f2d4d661f7-0' : + 'biocontainers/mulled-v2-0c13ef770dd7cc5c76c2ce23ba6669234cf03385:63be019f50581cc5dfe4fc0f73ae50f2d4d661f7-0' }" + + input: + tuple val(meta), path(mirtop_gff) + + output: + tuple val(meta), path("stats/*.txt") , emit: txt + tuple val(meta), path("stats/*_stats.log") , emit: log + 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}" + """ + mirtop \\ + stats \\ + $args \\ + --out stats \\ + $mirtop_gff + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mirtop: \$(echo \$(mirtop --version 2>&1) | sed 's/^.*mirtop //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + mkdir stats + touch stats/${prefix}.txt + touch stats/${prefix}_stats.log + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mirtop: \$(echo \$(mirtop --version 2>&1) | sed 's/^.*mirtop //') + END_VERSIONS + """ +} diff --git a/modules/nf-core/mirtop/stats/meta.yml b/modules/nf-core/mirtop/stats/meta.yml new file mode 100644 index 00000000000..7df0f7bca04 --- /dev/null +++ b/modules/nf-core/mirtop/stats/meta.yml @@ -0,0 +1,46 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "mirtop_stats" +description: mirtop gff gets the number of isomiRs and miRNAs annotated in the GFF file by isomiR category. +keywords: + - mirna + - isomir + - gff +tools: + - "mirtop": + description: "Small RNA-seq annotation" + homepage: "https://github.com/miRTop/mirtop" + documentation: "https://mirtop.readthedocs.io/en/latest/" + tool_dev_url: "https://github.com/miRTop/mirtop" + licence: ["MIT License"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - mirtop_gff: + type: file + description: Mirtop GFF file obtained with mirtop_gff + pattern: "*.{gff}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - txt: + type: file + description: TXT file with stats + pattern: "*.{txt}" + +authors: + - "@atrigila" +maintainers: + - "@atrigila" diff --git a/modules/nf-core/mirtop/stats/tests/main.nf.test b/modules/nf-core/mirtop/stats/tests/main.nf.test new file mode 100644 index 00000000000..0309885fa12 --- /dev/null +++ b/modules/nf-core/mirtop/stats/tests/main.nf.test @@ -0,0 +1,81 @@ + +nextflow_process { + + name "Test Process MIRTOP_STATS" + script "../main.nf" + process "MIRTOP_STATS" + + tag "modules" + tag "modules_nfcore" + tag "mirtop" + tag "mirtop/gff" + tag "mirtop/stats" + + setup { + run("MIRTOP_GFF") { + script "../../gff/main.nf" + process { + """ + input[0] = [ + [ id:'sample_sim_isomir_bam'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/sim_isomir_sort.bam", checkIfExists: true), + ] + input[1] = [ + [ id:'hairpin'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hairpin_mirtop.fa", checkIfExists: true), + ] + input[2] = [ + [ id:'hsa' ], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/mirtop/hsa.gff3", checkIfExists: true), + "hsa"] + """ + } + } + } + + test("isomir - bam") { + + when { + process { + """ + input[0] = [ + [ id:'mirtop_gff_sample1'], // meta map + file("https://github.com/miRTop/mirtop/raw/master/data/examples/gff/correct_file.gff", checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("isomir - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'mirtop_gff_sample1'], // meta map + file("https://github.com/miRTop/mirtop/raw/master/data/examples/gff/correct_file.gff", checkIfExists: true), + ] """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/mirtop/stats/tests/main.nf.test.snap b/modules/nf-core/mirtop/stats/tests/main.nf.test.snap new file mode 100644 index 00000000000..ba9633d12a2 --- /dev/null +++ b/modules/nf-core/mirtop/stats/tests/main.nf.test.snap @@ -0,0 +1,100 @@ +{ + "isomir - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "mirtop_gff_sample1" + }, + "mirtop_gff_sample1.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "mirtop_gff_sample1" + }, + "mirtop_gff_sample1_stats.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,53f4ce15bd9c3321676f960d89a30aca" + ], + "log": [ + [ + { + "id": "mirtop_gff_sample1" + }, + "mirtop_gff_sample1_stats.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "txt": [ + [ + { + "id": "mirtop_gff_sample1" + }, + "mirtop_gff_sample1.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,53f4ce15bd9c3321676f960d89a30aca" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-03T17:49:32.73944037" + }, + "isomir - bam": { + "content": [ + { + "0": [ + [ + { + "id": "mirtop_gff_sample1" + }, + "mirtop_stats.txt:md5,952f4face50f16ae54bc17eeba787535" + ] + ], + "1": [ + [ + { + "id": "mirtop_gff_sample1" + }, + "mirtop_stats.log:md5,c5ecfb62e732021795df17306a0fb99b" + ] + ], + "2": [ + "versions.yml:md5,53f4ce15bd9c3321676f960d89a30aca" + ], + "log": [ + [ + { + "id": "mirtop_gff_sample1" + }, + "mirtop_stats.log:md5,c5ecfb62e732021795df17306a0fb99b" + ] + ], + "txt": [ + [ + { + "id": "mirtop_gff_sample1" + }, + "mirtop_stats.txt:md5,952f4face50f16ae54bc17eeba787535" + ] + ], + "versions": [ + "versions.yml:md5,53f4ce15bd9c3321676f960d89a30aca" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-03T17:47:39.121648755" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/bam_stats_mirna_mirtop/main.nf b/subworkflows/nf-core/bam_stats_mirna_mirtop/main.nf new file mode 100644 index 00000000000..17c2695fa9b --- /dev/null +++ b/subworkflows/nf-core/bam_stats_mirna_mirtop/main.nf @@ -0,0 +1,36 @@ +include { MIRTOP_GFF } from '../../../modules/nf-core/mirtop/gff' +include { MIRTOP_COUNTS } from '../../../modules/nf-core/mirtop/counts' +include { MIRTOP_EXPORT } from '../../../modules/nf-core/mirtop/export' +include { MIRTOP_STATS } from '../../../modules/nf-core/mirtop/stats' + + +workflow BAM_STATS_MIRNA_MIRTOP { + + take: + ch_bam // channel: [ val(meta), [ bam ] ] + ch_hairpin // channel: [ val(meta), [ hairpin ] ] + ch_gtf_species // channel: [ val(meta), [ gtf ], val(species) ] + + main: + + ch_versions = Channel.empty() + + MIRTOP_GFF ( ch_bam, ch_hairpin, ch_gtf_species ) + ch_versions = ch_versions.mix(MIRTOP_GFF.out.versions.first()) + + MIRTOP_COUNTS ( MIRTOP_GFF.out.mirtop_gff, ch_hairpin, ch_gtf_species ) + ch_versions = ch_versions.mix(MIRTOP_COUNTS.out.versions.first()) + + MIRTOP_EXPORT ( MIRTOP_GFF.out.mirtop_gff, ch_hairpin, ch_gtf_species ) + ch_versions = ch_versions.mix(MIRTOP_EXPORT.out.versions.first()) + + MIRTOP_STATS ( MIRTOP_GFF.out.mirtop_gff ) + ch_versions = ch_versions.mix(MIRTOP_STATS.out.versions.first()) + + emit: + rawdata_tsv = MIRTOP_EXPORT.out.tsv // channel: [ val(meta), [ tsv ] ] + stats_txt = MIRTOP_STATS.out.txt // channel: [ val(meta), [ txt ] ] + stats_log = MIRTOP_STATS.out.log // channel: [ val(meta), [ log ] ] + versions = ch_versions // channel: [ versions.yml ] +} + diff --git a/subworkflows/nf-core/bam_stats_mirna_mirtop/meta.yml b/subworkflows/nf-core/bam_stats_mirna_mirtop/meta.yml new file mode 100644 index 00000000000..e7cf4e733c1 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_mirna_mirtop/meta.yml @@ -0,0 +1,61 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "bam_stats_mirna_mirtop" +description: mirtop is a command line tool to annotate miRNAs and isomiRs and compute general statistics using the mirGFF3 format. +keywords: + - miRNA + - isomirs + - bam + - stats +components: + - mirtop/gff + - mirtop/counts + - mirtop/export + - mirtop/stats +input: + - ch_bam: + type: file + description: | + The input channel containing the BAM/CRAM/SAM files + Structure: [ val(meta), path(bam) ] + pattern: "*.{bam/cram/sam}" + - ch_hairpin: + type: file + description: | + Input channel containing the hairpin fasta file + Structure: [ val(meta), path(fasta) ] + pattern: "*.{fasta,fa}" + - ch_gtf_species: + type: file + description: | + Input channel containing the species gtf and the name of species in miRbase format + Structure: [ val(meta), path(gtf), val(species)] + pattern: "*.{gtf}" +output: + - rawdata_tsv: + type: file + description: | + Channel containing isomiRs compatible files + Structure: [ val(meta), path(tsv) ] + pattern: "*.tsv" + - stats_txt: + type: file + description: | + Channel containing TXT file with a table with different statistics for each type of isomiRs: total counts, average counts, total sequences. + Structure: [ val(meta), path(txt) ] + pattern: "*.txt" + - stats_log: + type: file + description: | + Channel containing log files in JSON format with the same information as stats_txt + Structure: [ val(meta), path(log) ] + pattern: "*.log" + - versions: + type: file + description: | + File containing software versions + Structure: [ path(versions.yml) ] + pattern: "versions.yml" +authors: + - "@atrigila" +maintainers: + - "@atrigila" diff --git a/subworkflows/nf-core/bam_stats_mirna_mirtop/tests/main.nf.test b/subworkflows/nf-core/bam_stats_mirna_mirtop/tests/main.nf.test new file mode 100644 index 00000000000..064fd654756 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_mirna_mirtop/tests/main.nf.test @@ -0,0 +1,49 @@ + +nextflow_workflow { + + name "Test Subworkflow BAM_STATS_MIRNA_MIRTOP" + script "../main.nf" + workflow "BAM_STATS_MIRNA_MIRTOP" + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/bam_stats_mirna_mirtop" + tag "mirtop" + tag "mirtop/gff" + tag "mirtop/export" + tag "mirtop/stats" + tag "mirtop/counts" + + test("isomir - bam") { + + when { + workflow { + """ + input[0] = [ + [ id:'sample_sim_isomir_bam'], // meta map + file("https://github.com/nf-core/test-datasets/raw/smrnaseq/nf-test_data/mirtop/SRX8195117_SRR11631013_seqcluster.bam", checkIfExists: true), + ] + input[1] = [ + [ id:'hairpin'], // meta map + file("https://github.com/nf-core/test-datasets/raw/smrnaseq/reference/hairpin.fa", checkIfExists: true), + ] + input[2] = [ + [ id:'hsa' ], // meta map + file("https://github.com/nf-core/test-datasets/raw/smrnaseq/reference/hsa.gff3", checkIfExists: true), + "hsa"] + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.rawdata_tsv, + workflow.out.stats_txt, + workflow.out.stats_log, + workflow.out.versions).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/bam_stats_mirna_mirtop/tests/main.nf.test.snap b/subworkflows/nf-core/bam_stats_mirna_mirtop/tests/main.nf.test.snap new file mode 100644 index 00000000000..02a07ab1b18 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_mirna_mirtop/tests/main.nf.test.snap @@ -0,0 +1,41 @@ +{ + "isomir - bam": { + "content": [ + [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "mirtop_rawData.tsv:md5,4a065e444c54b0e816352bf1640594dd" + ] + ], + [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "mirtop_stats.txt:md5,e89c014047ffffed65f1ec4fb328e3bc" + ] + ], + [ + [ + { + "id": "sample_sim_isomir_bam" + }, + "mirtop_stats.log:md5,49b85517828253858cc60a0390567585" + ] + ], + [ + "versions.yml:md5,04fed9539a0164a116d37bf090613d42", + "versions.yml:md5,13a50e3cef16f8bb981197bbc9a46d8e", + "versions.yml:md5,5f6bea8a46cdfec82b3d8f1b6c906ac7", + "versions.yml:md5,976382d50b05cded89483e2415fde415" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-04T21:31:21.204039357" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/bam_stats_mirna_mirtop/tests/nextflow.config b/subworkflows/nf-core/bam_stats_mirna_mirtop/tests/nextflow.config new file mode 100644 index 00000000000..83d77e209c2 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_mirna_mirtop/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'MIRTOP_COUNTS' { + ext.args = '--add-extra' + } +}