diff --git a/modules/nf-core/regenie/runl1/environment.yml b/modules/nf-core/regenie/runl1/environment.yml new file mode 100644 index 000000000000..98fe8277cc05 --- /dev/null +++ b/modules/nf-core/regenie/runl1/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::regenie=4.1.2" diff --git a/modules/nf-core/regenie/runl1/main.nf b/modules/nf-core/regenie/runl1/main.nf new file mode 100644 index 000000000000..88391a5aaba7 --- /dev/null +++ b/modules/nf-core/regenie/runl1/main.nf @@ -0,0 +1,55 @@ +process REGENIE_RUNL1 { + tag "${meta.id}" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/7a/7a05bf71ea09adc5ebf9f0c656c9b326c0f16ba8e4966914972e58313469a466/data' + : 'community.wave.seqera.io/library/regenie:4.1.2--5d361f9fcb2f85cf'}" + + input: + tuple val(meta), path(plink_genotype_file), path(plink_variant_file), path(plink_sample_file) + tuple val(meta2), path(master), path(snplists), path(l0_predictions) + tuple val(meta3), path(pheno) + tuple val(meta4), path(covar) + val bsize + + output: + tuple val(meta), path("*_pred.list"), emit: predictions + tuple val(meta), path("*.loco.gz"), emit: loco + tuple val(meta), path("*.log"), emit: log + tuple val("${task.process}"), val('regenie'), eval('regenie --version 2>&1 | sed -n "1{s/^v//;s/\\.gz$//;p}"'), topic: versions, emit: versions_regenie + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def input_prefix = plink_genotype_file.baseName + def prefix = task.ext.prefix ?: input_prefix + def genotype_flag = plink_genotype_file.name.endsWith('.pgen') ? '--pgen' : '--bed' + def covar_arg = covar ? "--covarFile ${covar}" : '' + def bsize_arg = bsize ?: 1000 + """ + regenie \\ + --step 1 \\ + ${genotype_flag} ${input_prefix} \\ + --phenoFile ${pheno} \\ + ${covar_arg} \\ + --bsize ${bsize_arg} \\ + --gz \\ + --threads ${task.cpus} \\ + ${args} \\ + --out ${prefix} \\ + --run-l1 ${master} + """ + + stub: + def input_prefix = plink_genotype_file.baseName + def prefix = task.ext.prefix ?: input_prefix + """ + echo "Y1 ${prefix}_1.loco.gz" > ${prefix}_pred.list + echo "" | gzip > ${prefix}_1.loco.gz + touch ${prefix}.log + """ +} diff --git a/modules/nf-core/regenie/runl1/meta.yml b/modules/nf-core/regenie/runl1/meta.yml new file mode 100644 index 000000000000..012458cbf253 --- /dev/null +++ b/modules/nf-core/regenie/runl1/meta.yml @@ -0,0 +1,172 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "regenie_runl1" +description: Finish REGENIE step 1 from split level-0 prediction files +keywords: + - regenie + - gwas + - genome-wide association study + - association + - genomics + - parallel +tools: + - "regenie": + description: "Regenie is a C++ program for whole genome regression modelling of large genome-wide association studies (GWAS)." + homepage: "https://rgcgithub.github.io/regenie/" + documentation: "https://rgcgithub.github.io/regenie/options/" + tool_dev_url: "https://github.com/rgcgithub/regenie" + doi: "10.1038/s41588-021-00870-7" + licence: ["MIT"] + identifier: "biotools:regenie" + +input: + - - meta: + type: map + description: | + Groovy Map containing genotype information + Keep only the genotype analysis identifier in this map + REGENIE consumes the staged basename of `plink_genotype_file` as the `--bed` or `--pgen` prefix, so the `.bed/.bim/.fam` or `.pgen/.pvar/.psam` files must share one basename + e.g. `[ id:'cohort' ]` + - plink_genotype_file: + type: file + description: PLINK primary genotype file in BED or PGEN format + pattern: "*.{bed,pgen}" + ontologies: + - edam: "http://edamontology.org/format_3003" # BED + - plink_variant_file: + type: file + description: PLINK variant metadata file in BIM or PVAR format + pattern: "*.{bim,pvar,zst}" + ontologies: [] + - plink_sample_file: + type: file + description: PLINK sample metadata file in FAM or PSAM format + pattern: "*.{fam,psam}" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing split level-0 output information + e.g. `[ id:'plink_simulated' ]` + - master: + type: file + description: REGENIE split level-0 master file from `regenie/splitl0` + pattern: "*.master" + ontologies: + - edam: "http://edamontology.org/format_2330" # Text + - snplists: + type: file + description: All per-job variant list files referenced by the master file, staged so `--run-l1` can resolve them + pattern: "*_job*.snplist" + ontologies: + - edam: "http://edamontology.org/format_2330" # Text + - l0_predictions: + type: file + description: All level-0 prediction files referenced by the master file, staged so `--run-l1` can resolve them + pattern: "*_l0_Y*" + ontologies: [] + - - meta3: + type: map + description: | + Groovy Map containing genotype/sample information associated with the phenotype file input + Use the same phenotype file and phenotype-selection arguments for all `regenie/splitl0`, `regenie/runl0`, and `regenie/runl1` jobs in the same chunked step 1 analysis + e.g. `[ id:'plink_simulated' ]` + - pheno: + type: file + description: Phenotype file passed to `--phenoFile` + pattern: "*.{phe,pheno,txt,tsv}" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + - - meta4: + type: map + description: | + Groovy Map containing genotype/sample information associated with the covariate input + Use compatible covariate inputs for all stages in the same chunked step 1 analysis + e.g. `[ id:'plink_simulated' ]` + - covar: + type: file + optional: true + description: Optional covariate file passed to `--covarFile`; provide `[]` when absent + pattern: "*.{covar,cov,txt,tsv}" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + - bsize: + type: integer + description: Optional block size passed to `--bsize`; pass `[]` to use the module default of `1000` + +output: + predictions: + - - meta: + type: map + description: | + Groovy Map containing genotype/sample information + e.g. `[ id:'plink_simulated' ]` + - "*_pred.list": + type: file + description: REGENIE prediction list file + pattern: "*_pred.list" + ontologies: [] + loco: + - - meta: + type: map + description: | + Groovy Map containing genotype/sample information + e.g. `[ id:'plink_simulated' ]` + - "*.loco.gz": + type: file + description: REGENIE LOCO prediction files + pattern: "*.loco.gz" + ontologies: + - edam: "http://edamontology.org/format_3987" # GZIP + log: + - - meta: + type: map + description: | + Groovy Map containing genotype information + e.g. `[ id:'plink_simulated' ]` + - "*.log": + type: file + description: REGENIE run level-1 log file + pattern: "*.log" + ontologies: + - edam: "http://edamontology.org/format_2330" # Text + versions_regenie: + - - "${task.process}": + type: string + description: The process the versions were collected from + - "regenie": + type: string + description: The tool name + - 'regenie --version 2>&1 | sed -n "1{s/^v//;s/\.gz$//;p}"': + type: eval + description: The command used to generate the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - regenie: + type: string + description: The tool name + - 'regenie --version 2>&1 | sed -n "1{s/^v//;s/\.gz$//;p}"': + type: eval + description: The command used to generate the version of the tool + +notes: | + `task.ext.args` is passed directly to REGENIE and can be used for stage-consistent options such as `--phenoColList`, `--bt`, `--loocv`, `--keep-l0`, or `--l1-phenoList`. + The same phenotype file, phenotype-selection arguments, trait mode arguments such as `--bt`, and compatible genotype/covariate inputs must be used across `regenie/splitl0`, every matching `regenie/runl0` job, and `regenie/runl1`. +authors: + - "@lyh970817" +maintainers: + - "@lyh970817" +containers: + docker: + linux_amd64: + build_id: "bd-5d361f9fcb2f85cf_1" + name: "community.wave.seqera.io/library/regenie:4.1.2--5d361f9fcb2f85cf" + scanId: "sc-cc9eb5ed5eb381dd_2" + singularity: + linux_amd64: + build_id: "bd-7c121fb4ecd57890_1" + name: "oras://community.wave.seqera.io/library/regenie:4.1.2--7c121fb4ecd57890" + https: "https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/7a/7a05bf71ea09adc5ebf9f0c656c9b326c0f16ba8e4966914972e58313469a466/data" diff --git a/modules/nf-core/regenie/runl1/tests/main.nf.test b/modules/nf-core/regenie/runl1/tests/main.nf.test new file mode 100644 index 000000000000..e561eadd7cca --- /dev/null +++ b/modules/nf-core/regenie/runl1/tests/main.nf.test @@ -0,0 +1,376 @@ +nextflow_process { + + name "Test Process REGENIE_RUNL1" + script "../main.nf" + process "REGENIE_RUNL1" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "regenie" + tag "regenie/splitl0" + tag "regenie/runl0" + tag "regenie/runl1" + + setup { + run("REGENIE_SPLITL0") { + script "../../splitl0/main.nf" + process { + """ + input[0] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.bed', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.bim', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.fam', checkIfExists: true) + ] + + input[1] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated_quantitative_phenoname.phe', checkIfExists: true) + ] + + input[2] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated_covariates.txt', checkIfExists: true) + ] + + input[3] = 100 + input[4] = 2 + """ + } + } + + run("REGENIE_RUNL0") { + script "../../runl0/main.nf" + process { + """ + input[0] = Channel.of( + [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.bed', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.bim', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.fam', checkIfExists: true) + ], + [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.bed', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.bim', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.fam', checkIfExists: true) + ] + ) + + input[1] = REGENIE_SPLITL0.out.master + .combine(REGENIE_SPLITL0.out.snplists) + .flatMap { master_meta, master, snplist_meta, snplists -> + (1..2).collect { job -> + [master_meta, master, snplists, job] + } + } + + input[2] = Channel.of( + [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated_quantitative_phenoname.phe', checkIfExists: true) + ], + [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated_quantitative_phenoname.phe', checkIfExists: true) + ] + ) + + input[3] = Channel.of( + [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated_covariates.txt', checkIfExists: true) + ], + [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated_covariates.txt', checkIfExists: true) + ] + ) + + input[4] = Channel.of(100, 100) + """ + } + } + + run("REGENIE_SPLITL0", alias: "REGENIE_SPLITL0_PLINK2") { + script "../../splitl0/main.nf" + process { + """ + input[0] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.pgen', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.pvar', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.psam', checkIfExists: true) + ] + + input[1] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated_quantitative_phenoname.phe', checkIfExists: true) + ] + + input[2] = [[:], []] + input[3] = [] + input[4] = 2 + """ + } + } + + run("REGENIE_RUNL0", alias: "REGENIE_RUNL0_PLINK2") { + script "../../runl0/main.nf" + process { + """ + input[0] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.pgen', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.pvar', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.psam', checkIfExists: true) + ] + + input[1] = REGENIE_SPLITL0_PLINK2.out.master + .combine(REGENIE_SPLITL0_PLINK2.out.snplists) + .map { master_meta, master, snplist_meta, snplists -> + [master_meta, master, snplists, 1] + } + + input[2] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated_quantitative_phenoname.phe', checkIfExists: true) + ] + + input[3] = [[:], []] + input[4] = [] + """ + } + } + } + + test("homo_sapiens popgen - quantitative plink1 with covariates") { + + when { + params { + module_args = "--phenoColList QuantitativeTrait" + } + process { + """ + input[0] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.bed', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.bim', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.fam', checkIfExists: true) + ] + + input[1] = REGENIE_SPLITL0.out.master + .combine(REGENIE_SPLITL0.out.snplists) + .combine(REGENIE_RUNL0.out.l0_predictions.map { it[1] }.collect()) + .map { values -> + [ values[0], values[1], values[3], values.drop(4).flatten() ] + } + + input[2] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated_quantitative_phenoname.phe', checkIfExists: true) + ] + + input[3] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated_covariates.txt', checkIfExists: true) + ] + + input[4] = 100 + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.predictions.size() == 1 }, + { assert process.out.loco.size() == 1 }, + { assert process.out.log.size() == 1 }, + { assert process.out.predictions.get(0).get(0).id == 'plink_simulated' }, + { assert process.out.loco.get(0).get(0).id == 'plink_simulated' }, + { assert process.out.log.get(0).get(0).id == 'plink_simulated' }, + { assert path(process.out.log.get(0).get(1)).exists() }, + { + def command = path(process.out.predictions.get(0).get(1)).parent.resolve('.command.sh').text.replaceAll(/\s+/, ' ') + assert command.contains('--run-l1 plink_simulated.master') + assert command.contains('--bed plink_simulated') + assert command.contains('--covarFile plink_simulated_covariates.txt') + assert command.contains('--bsize 100') + assert !command.contains('--pgen') + }, + { + def predList = path(process.out.predictions.get(0).get(1)) + def locoFile = path(process.out.loco.get(0).get(1)) + def predListLines = predList.text.readLines().findAll { it } + assert predList.exists() + assert predListLines.size() == 1 + def predListFields = predListLines[0].split(/\s+/) + assert predListFields.size() == 2 + assert predListFields[0] == 'QuantitativeTrait' + assert predListFields[1] == locoFile.toString() + }, + { + def stablePredictions = process.out.predictions.collect { prediction -> + [prediction[0], path(prediction[1]).getFileName().toString()] + } + def stableLoco = process.out.loco.collect { loco -> + [loco[0], path(loco[1]).getFileName().toString()] + } + def stableLogs = process.out.log.collect { log -> + [log[0], path(log[1]).getFileName().toString()] + } + assert snapshot([ + predictions: stablePredictions, + loco: stableLoco, + log: stableLogs, + versions_regenie: process.out.versions_regenie + ]).match() + } + ) + } + + } + + test("homo_sapiens popgen - quantitative plink2 without covariates") { + + when { + params { + module_args = "--phenoColList QuantitativeTrait" + } + process { + """ + input[0] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.pgen', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.pvar', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.psam', checkIfExists: true) + ] + + input[1] = REGENIE_SPLITL0_PLINK2.out.master + .combine(REGENIE_SPLITL0_PLINK2.out.snplists) + .combine(REGENIE_RUNL0_PLINK2.out.l0_predictions.map { it[1] }.collect()) + .map { values -> + [ values[0], values[1], values[3], values.drop(4).flatten() ] + } + + input[2] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated_quantitative_phenoname.phe', checkIfExists: true) + ] + + input[3] = [ + [ id:'plink_simulated' ], + [] + ] + + input[4] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.predictions.size() == 1 }, + { assert process.out.loco.size() == 1 }, + { assert process.out.log.size() == 1 }, + { assert process.out.predictions.get(0).get(0).id == 'plink_simulated' }, + { assert process.out.loco.get(0).get(0).id == 'plink_simulated' }, + { assert process.out.log.get(0).get(0).id == 'plink_simulated' }, + { + def command = path(process.out.predictions.get(0).get(1)).parent.resolve('.command.sh').text.replaceAll(/\s+/, ' ') + assert command.contains('--run-l1 plink_simulated.master') + assert command.contains('--pgen plink_simulated') + assert command.contains('--bsize 1000') + assert command.contains('--out plink_simulated') + assert !command.contains('--bed') + assert !command.contains('--covarFile') + assert command.contains('--phenoColList QuantitativeTrait') + }, + { + def stablePredictions = process.out.predictions.collect { prediction -> + [prediction[0], path(prediction[1]).getFileName().toString()] + } + def stableLoco = process.out.loco.collect { loco -> + [loco[0], path(loco[1]).getFileName().toString()] + } + def stableLogs = process.out.log.collect { log -> + [log[0], path(log[1]).getFileName().toString()] + } + assert snapshot([ + predictions: stablePredictions, + loco: stableLoco, + log: stableLogs, + versions_regenie: process.out.versions_regenie + ]).match() + } + ) + } + + } + + test("homo_sapiens popgen - plink1 - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.bed', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.bim', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.fam', checkIfExists: true) + ] + + input[1] = REGENIE_SPLITL0.out.master + .combine(REGENIE_SPLITL0.out.snplists) + .combine(REGENIE_RUNL0.out.l0_predictions.map { it[1] }.collect()) + .map { values -> + [ values[0], values[1], values[3], values.drop(4).flatten() ] + } + + input[2] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated_quantitative_phenoname.phe', checkIfExists: true) + ] + + input[3] = [ + [ id:'plink_simulated' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated_covariates.txt', checkIfExists: true) + ] + + input[4] = 100 + """ + } + } + + then { + assertAll( + { assert process.success }, + { + def stablePredictions = process.out.predictions.collect { prediction -> + [prediction[0], path(prediction[1]).getFileName().toString()] + } + def stableLoco = process.out.loco.collect { loco -> + [loco[0], path(loco[1]).getFileName().toString()] + } + def stableLogs = process.out.log.collect { log -> + [log[0], path(log[1]).getFileName().toString()] + } + assert snapshot([ + predictions: stablePredictions, + loco: stableLoco, + log: stableLogs, + versions_regenie: process.out.versions_regenie + ]).match() + } + ) + } + + } + +} diff --git a/modules/nf-core/regenie/runl1/tests/main.nf.test.snap b/modules/nf-core/regenie/runl1/tests/main.nf.test.snap new file mode 100644 index 000000000000..28de6e2d4aac --- /dev/null +++ b/modules/nf-core/regenie/runl1/tests/main.nf.test.snap @@ -0,0 +1,128 @@ +{ + "homo_sapiens popgen - quantitative plink1 with covariates": { + "content": [ + { + "predictions": [ + [ + { + "id": "plink_simulated" + }, + "plink_simulated_pred.list" + ] + ], + "loco": [ + [ + { + "id": "plink_simulated" + }, + "plink_simulated_1.loco.gz" + ] + ], + "log": [ + [ + { + "id": "plink_simulated" + }, + "plink_simulated.log" + ] + ], + "versions_regenie": [ + [ + "REGENIE_RUNL1", + "regenie", + "4.1.2" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-06-08T00:58:56.144945786" + }, + "homo_sapiens popgen - plink1 - stub": { + "content": [ + { + "predictions": [ + [ + { + "id": "plink_simulated" + }, + "plink_simulated_pred.list" + ] + ], + "loco": [ + [ + { + "id": "plink_simulated" + }, + "plink_simulated_1.loco.gz" + ] + ], + "log": [ + [ + { + "id": "plink_simulated" + }, + "plink_simulated.log" + ] + ], + "versions_regenie": [ + [ + "REGENIE_RUNL1", + "regenie", + "4.1.2" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-05-27T18:59:13.646476959" + }, + "homo_sapiens popgen - quantitative plink2 without covariates": { + "content": [ + { + "predictions": [ + [ + { + "id": "plink_simulated" + }, + "plink_simulated_pred.list" + ] + ], + "loco": [ + [ + { + "id": "plink_simulated" + }, + "plink_simulated_1.loco.gz" + ] + ], + "log": [ + [ + { + "id": "plink_simulated" + }, + "plink_simulated.log" + ] + ], + "versions_regenie": [ + [ + "REGENIE_RUNL1", + "regenie", + "4.1.2" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-06-08T00:59:23.869025925" + } +} diff --git a/modules/nf-core/regenie/runl1/tests/nextflow.config b/modules/nf-core/regenie/runl1/tests/nextflow.config new file mode 100644 index 000000000000..fe3704faf1d9 --- /dev/null +++ b/modules/nf-core/regenie/runl1/tests/nextflow.config @@ -0,0 +1,9 @@ +params { + module_args = "" +} + +process { + withName: "REGENIE_SPLITL0|REGENIE_RUNL0|REGENIE_RUNL1|REGENIE_SPLITL0_PLINK2|REGENIE_RUNL0_PLINK2" { + ext.args = { params.module_args ?: "" } + } +}