diff --git a/CHANGELOG.md b/CHANGELOG.md index a327c2c..e214fe8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,29 @@ Initial release of Clinical-Genomics/oncoflow, created with the [nf-core](https: ### `Added` +- [#2](https://github.com/Clinical-Genomics/oncoflow/pull/2) Added `NEXTFLOW_RUN` local module based on `mahesh-panchal/nf-cascade`. +- [#3](https://github.com/Clinical-Genomics/oncoflow/pull/3) Added `NFCORE_ONCOANALYSER` using the `NEXTFLOW_RUN` local module to run the `nf-core/oncoanalyser` pipeline in `ONCOFLOW` workflow. +- [#3](https://github.com/Clinical-Genomics/oncoflow/pull/3) Added input parameters for running `nf-core/oncoanalyser`: `oncoanalyser_config`, `oncoanalyser_nextflow_opts` and `oncoanalyser_samplesheet`. +- [#5](https://github.com/Clinical-Genomics/oncoflow/pull/5) and [#10](https://github.com/Clinical-Genomics/oncoflow/pull/10) Added `CREATE_PARAMS_FILE` local module. +- [#9](https://github.com/Clinical-Genomics/oncoflow/pull/9) `CREATE_ONCOANALYSER_PARAMS_FILE` using `CREATE_PARAMS_FILE` to `ONCOFLOW` workflow. +- [#9](https://github.com/Clinical-Genomics/oncoflow/pull/9) Added input parameters `oncoanalyser_create_stub_placeholders`, `oncoanalyser_genome` and `oncoanalyser_mode` necessary for creating the `oncoanalyser` params file using the `CREATE_ONCOANALYSER_PARAMS_FILE` local module. +- [#9](https://github.com/Clinical-Genomics/oncoflow/pull/9) `getOncoanalyserParamsList` function to produce the list of parameters necessary for `CREATE_ONCOANALYSER_PARAMS_FILE`. +- [#5](https://github.com/Clinical-Genomics/oncoflow/pull/5) and [#10](https://github.com/Clinical-Genomics/oncoflow/pull/10) Added `CREATE_ONCOREFINER_PARAMS_FILE` using `CREATE_PARAMS_FILE` to `ONCOFLOW` workflow. +- [#5](https://github.com/Clinical-Genomics/oncoflow/pull/5) Added metadata parameters `case_id`, `sample_id_tumor`, `sample_id_normal`, `subject_id` and `sex`, necessary for creating the `oncorefiner` params file using the `CREATE_ONCOREFINER_PARAMS_FILE` local module. +- [#10](https://github.com/Clinical-Genomics/oncoflow/pull/10) Added `getOncorefinerParamsList` function to produce the list of parameters necessary for `CREATE_ONCOREFINER_PARAMS_FILE`. +- [#4](https://github.com/Clinical-Genomics/oncoflow/pull/4) Added `CLINICAL_GENOMICS_ONCOREFINER` using the `NEXTFLOW_RUN` local module to run the `Clinical-Genomics/oncorefiner` pipeline in `ONCOFLOW` workflow. +- [#4](https://github.com/Clinical-Genomics/oncoflow/pull/4) Added input parameters for running `Clinical-Genomics/oncorefiner`: `oncorefiner_config` and `oncorefiner_nextflow_opts`. + +### `Changed` + +- [#3](https://github.com/Clinical-Genomics/oncoflow/pull/3) Changed default test to not capture `pipeline_info` files for all pipelines. +- [#3](https://github.com/Clinical-Genomics/oncoflow/pull/3) and [#4](https://github.com/Clinical-Genomics/oncoflow/pull/4) Updated `.nftignore` to ignore `pipeline_info`, `multiqc` and `vep` files for all pipelines. +- [#3](https://github.com/Clinical-Genomics/oncoflow/pull/3) Updated `.nftignore` to ignore gzipped output files from `oncoanalyser` due to https://github.com/nf-core/oncoanalyser/issues/299. +- [#3](https://github.com/Clinical-Genomics/oncoflow/pull/3) Updated `.nftignore` to ignore `*.command.*` output files from `oncoanalyser` since several files include the run directory and platform information which changes for each run and therefore cannot be snapshot. +- [#8](https://github.com/Clinical-Genomics/oncoflow/pull/8) Changed `NFCORE_ONCOANALYSER` to run forked fixed `Clinical-Genomics/oncoanalyser` instead, due to bug https://github.com/nf-core/oncoanalyser/issues/301. +- [#8](https://github.com/Clinical-Genomics/oncoflow/pull/8) Changed test config to run the above with revision `2.2.0-with-purple-tbi-fix` which includes the fix for https://github.com/nf-core/oncoanalyser/issues/301 and `nf-core/oncoanalyser` version 2.2.0 since this was the version used for previous test runs. +- [#11](https://github.com/Clinical-Genomics/oncoflow/pull/11) Set `process.errorStrategy = 'finish'` for all processes to allow for resuming runs after there is an error while running a pipeline. + ### `Fixed` ### `Dependencies` diff --git a/conf/base.config b/conf/base.config index c68e995..2d8e19b 100644 --- a/conf/base.config +++ b/conf/base.config @@ -15,7 +15,7 @@ process { memory = { 6.GB * task.attempt } time = { 4.h * task.attempt } - errorStrategy = { task.exitStatus in ((130..145) + 104 + (175..177)) ? 'retry' : 'finish' } + errorStrategy = 'finish' // Important! Prevents generation of lock file in case of error in concurrent pipeline runs. Allows for resuming runs. maxRetries = 1 maxErrors = '-1' diff --git a/conf/modules.config b/conf/modules.config index 527389e..aa1039a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -12,4 +12,12 @@ process { + withName: 'CREATE_ONCOANALYSER_PARAMS_FILE' { + ext.prefix = { "oncoanalyser" } + } + + withName: 'CREATE_ONCOREFINER_PARAMS_FILE' { + ext.prefix = { "oncorefiner" } + } + } diff --git a/conf/test.config b/conf/test.config index 74c7407..66513de 100644 --- a/conf/test.config +++ b/conf/test.config @@ -19,11 +19,22 @@ process { } params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function' + config_profile_name = 'Test profile (stub runs for all pipelines)' + config_profile_description = 'Minimal test where all pipelines are run in stub mode to check that pipelines are run sequentially' - // Input data - // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets - // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' + // Metadata + case_id = 'test_case_id' + sample_id_tumor = 'test_sample_id_tumor' + sample_id_normal = 'test_sample_id_normal' + subject_id = 'subject_a' // matches the subject_id in the samplesheet of the test data of the oncoanalyser pipeline + sex = 'female' + + // Oncoanalyser input parameters + oncoanalyser_create_stub_placeholders = true // matches the test_stub profile + oncoanalyser_genome = "GRCh38_hmf" // matches the test_stub profile + oncoanalyser_mode = "wgts" // matches the test_stub profile + oncoanalyser_nextflow_opts = '-profile test_stub,docker -stub -revision 2.2.0-with-purple-tbi-fix' + + // Oncorefiner input parameters + oncorefiner_nextflow_opts = '-profile test,docker -revision dev -stub' } diff --git a/docs/parameters.md b/docs/parameters.md index 3892a92..009d361 100644 --- a/docs/parameters.md +++ b/docs/parameters.md @@ -2,6 +2,40 @@ Pipeline cascade of nf-core/oncoanalyser + Clinical-Genomics/oncorefiner, written in Nextflow. +## Metadata + + + +| Parameter | Description | Type | Default | Required | Hidden | +|-----------|-----------|-----------|-----------|-----------|-----------| +| `case_id` | Case ID. | `string` | | True | | +| `sample_id_tumor` | Sample id of the tumor sample. | `string` | | True | | +| `sample_id_normal` | Sample id of the normal sample. | `string` | | True | | +| `subject_id` | Subject ID of the patient. | `string` | | True | | +| `sex` | Sex of the patient. (accepted: `female`\|`male`\|`unknown`) | `string` | | True | | + +## Oncoanalyser + +Input files and nextflow options for running nf-core/oncoanlyser. + +| Parameter | Description | Type | Default | Required | Hidden | +|-----------|-----------|-----------|-----------|-----------|-----------| +| `oncoanalyser_config` | Path to config file for nf-core/oncoanlyser (optional). | `string` | | | | +| `oncoanalyser_create_stub_placeholders` | Create placeholders for reference data during stub run. Used for creating the params file for oncoanalyser. | `boolean` | False | | | +| `oncoanalyser_genome` | Name of genome reference. Used for creating the params file for oncoanalyser. | `string` | | True | | +| `oncoanalyser_mode` | Workflow run mode. Used for creating the params file for oncoanalyser. | `string` | | True | | +| `oncoanalyser_nextflow_opts` | Nextflow options for running nf-core/oncoanlyser. | `string` | | True | | +| `oncoanalyser_samplesheet` | Path to csv samplesheet file for nf-core/oncoanalyser. | `string` | | | | + +## Oncorefiner + +Input files and nextflow options for running Clinical-Genomics/oncorefiner. + +| Parameter | Description | Type | Default | Required | Hidden | +|-----------|-----------|-----------|-----------|-----------|-----------| +| `oncorefiner_config` | Path to config file for Clinical-Genomics/oncorefiner (optional). | `string` | | | | +| `oncorefiner_nextflow_opts` | Nextflow options for running Clinical-Genomics/oncorefiner. | `string` | | True | | + ## Input/output options Define where the pipeline should find input data and save output data. diff --git a/main.nf b/main.nf index fb25380..2f5e311 100644 --- a/main.nf +++ b/main.nf @@ -12,8 +12,7 @@ IMPORT FUNCTIONS / MODULES / SUBWORKFLOWS / WORKFLOWS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -include { ONCOFLOW } from './workflows/oncoflow' +include { ONCOFLOW } from './workflows/oncoflow' include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_oncoflow_pipeline' include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_oncoflow_pipeline' /* @@ -28,7 +27,20 @@ include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_onco workflow CLINICALGENOMICS_ONCOFLOW { take: - outdir // string: The output directory where the results will be saved + val_case_id // string: [mandatory] Case ID + val_oncoanalyser_config // string: [optional] Config file for oncoanalyser pipeline + val_oncoanalyser_create_stub_placeholders // bool: [mandatory] Create stub placeholders for oncoanalyser pipeline + val_oncoanalyser_genome // string: [mandatory] Genome for oncoanalyser pipeline + val_oncoanalyser_mode // string: [mandatory] Mode for oncoanalyser pipeline + val_oncoanalyser_nextflow_opts // string: [mandatory] Nextflow options for oncoanalyser pipeline + val_oncoanalyser_samplesheet // string: [mandatory] Samplesheet file for oncoanalyser pipeline + val_oncorefiner_config // string: [optional] Config file for oncorefiner pipeline + val_oncorefiner_nextflow_opts // string: [mandatory] Nextflow options for oncorefiner pipeline + val_outdir // string: [mandatory] The output directory where the results will be saved + val_sample_id_tumor // string: [mandatory] Sample ID of the tumor sample + val_sample_id_normal // string: [mandatory] Sample ID of the normal sample + val_subject_id // string: [mandatory] Subject ID + val_sex // string: [mandatory] Sex of the patient main: @@ -36,8 +48,27 @@ workflow CLINICALGENOMICS_ONCOFLOW { // WORKFLOW: Run pipeline // ONCOFLOW ( - outdir, + val_case_id, + val_oncoanalyser_config, + val_oncoanalyser_create_stub_placeholders, + val_oncoanalyser_genome, + val_oncoanalyser_mode, + val_oncoanalyser_nextflow_opts, + val_oncoanalyser_samplesheet, + val_oncorefiner_config, + val_oncorefiner_nextflow_opts, + val_outdir, + val_sample_id_tumor, + val_sample_id_normal, + val_subject_id, + val_sex ) + + emit: + oncoanalyser_output = ONCOFLOW.out.oncoanalyser_output // channel: [path(analysis_output_directory)] + oncoanalyser_params_file = ONCOFLOW.out.oncoanalyser_params_file // channel: [path(yaml)] + oncorefiner_output = ONCOFLOW.out.oncorefiner_output // channel: [path(analysis_output_directory)] + oncorefiner_params_file = ONCOFLOW.out.oncorefiner_params_file // channel: [path(yaml)] } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -66,7 +97,20 @@ workflow { // WORKFLOW: Run main workflow // CLINICALGENOMICS_ONCOFLOW ( - params.outdir + params.case_id, + params.oncoanalyser_config, + params.oncoanalyser_create_stub_placeholders, + params.oncoanalyser_genome, + params.oncoanalyser_mode, + params.oncoanalyser_nextflow_opts, + params.oncoanalyser_samplesheet, + params.oncorefiner_config, + params.oncorefiner_nextflow_opts, + params.outdir, + params.sample_id_tumor, + params.sample_id_normal, + params.subject_id, + params.sex ) // @@ -79,6 +123,27 @@ workflow { params.outdir, params.monochrome_logs, ) + + publish: + oncoanalyser_output = CLINICALGENOMICS_ONCOFLOW.out.oncoanalyser_output + oncoanalyser_params_file = CLINICALGENOMICS_ONCOFLOW.out.oncoanalyser_params_file + oncorefiner_output = CLINICALGENOMICS_ONCOFLOW.out.oncorefiner_output + oncorefiner_params_file = CLINICALGENOMICS_ONCOFLOW.out.oncorefiner_params_file +} + +output { + oncoanalyser_params_file { + path "oncoanalyser" + } + oncoanalyser_output { + path "oncoanalyser" + } + oncorefiner_params_file { + path "oncorefiner" + } + oncorefiner_output { + path "oncorefiner" + } } /* diff --git a/modules/local/createparamsfile/main.nf b/modules/local/createparamsfile/main.nf new file mode 100644 index 0000000..f329cd3 --- /dev/null +++ b/modules/local/createparamsfile/main.nf @@ -0,0 +1,32 @@ +process CREATE_PARAMS_FILE { + tag 'params_file' + label 'process_single' + + input: + val params_list + + output: + + path "${prefix}_params.yaml", emit: params_file + // WARN: Please update version string when the module is updated. + tuple val("${task.process}"), val('createparamsfile'), val('1.0'), topic: versions, emit: versions_createparamsfile + + when: + task.ext.when == null || task.ext.when + + script: + prefix = task.ext.prefix ?: "pipeline" + + def params_file_content = params_list.join("\\n") + + """ + printf "$params_file_content" > ${prefix}_params.yaml + """ + + stub: + prefix = task.ext.prefix ?: "pipeline" + + """ + touch ${prefix}_params.yaml + """ +} diff --git a/modules/local/createparamsfile/meta.yml b/modules/local/createparamsfile/meta.yml new file mode 100644 index 0000000..3429983 --- /dev/null +++ b/modules/local/createparamsfile/meta.yml @@ -0,0 +1,51 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "createparamsfile" +description: Generate a parameters file based on the provided parameters list. +keywords: + - params_file + - create + - parameters + +input: + - params_list: + type: list + description: | + A list of parameters for the pipeline, with format: + ``` + [ + "param1: value1", + "param2: value2", + ... + ] + ``` +output: + parameters_file: + - "${prefix}_params.yaml": + type: file + description: Parameters file + pattern: "${prefix}_params.yaml" + versions_createparamsfile: + - - ${task.process}: + type: string + description: The name of the process + - createparamsfile: + type: string + description: The name of the tool + - "1.0": + type: string + description: The version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - createparamsfile: + type: string + description: The name of the tool + - "1.0": + type: string + description: The version of the tool +authors: + - "@beatrizsavinhas" +maintainers: + - "@beatrizsavinhas" diff --git a/modules/local/createparamsfile/tests/main.nf.test b/modules/local/createparamsfile/tests/main.nf.test new file mode 100644 index 0000000..a91b219 --- /dev/null +++ b/modules/local/createparamsfile/tests/main.nf.test @@ -0,0 +1,56 @@ +nextflow_process { + + name "Test Process CREATE_PARAMS_FILE" + script "../main.nf" + process "CREATE_PARAMS_FILE" + + tag "modules" + tag "create_params_file" + + test("With test params list") { + + when { + process { + """ + input[0] = [ + "param1: value1", + "param2: value2", + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match() } + ) + } + + } + + test("With test params list -stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + "param1: value1", + "param2: value2", + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/local/createparamsfile/tests/main.nf.test.snap b/modules/local/createparamsfile/tests/main.nf.test.snap new file mode 100644 index 0000000..b8db6ab --- /dev/null +++ b/modules/local/createparamsfile/tests/main.nf.test.snap @@ -0,0 +1,64 @@ +{ + "With test params list": { + "content": [ + { + "0": [ + "pipeline_params.yaml:md5,fee731cd040d1f00fbd4fc1185f035e4" + ], + "1": [ + [ + "CREATE_PARAMS_FILE", + "createparamsfile", + "1.0" + ] + ], + "params_file": [ + "pipeline_params.yaml:md5,fee731cd040d1f00fbd4fc1185f035e4" + ], + "versions_createparamsfile": [ + [ + "CREATE_PARAMS_FILE", + "createparamsfile", + "1.0" + ] + ] + } + ], + "timestamp": "2026-07-09T11:56:31.355167", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "With test params list -stub": { + "content": [ + { + "0": [ + "pipeline_params.yaml:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "1": [ + [ + "CREATE_PARAMS_FILE", + "createparamsfile", + "1.0" + ] + ], + "params_file": [ + "pipeline_params.yaml:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "versions_createparamsfile": [ + [ + "CREATE_PARAMS_FILE", + "createparamsfile", + "1.0" + ] + ] + } + ], + "timestamp": "2026-07-09T11:56:35.702258", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/local/nextflow/run/main.nf b/modules/local/nextflow/run/main.nf new file mode 100644 index 0000000..fc9fe0c --- /dev/null +++ b/modules/local/nextflow/run/main.nf @@ -0,0 +1,46 @@ +process NEXTFLOW_RUN { + + // directives: + tag "$pipeline_name" + + input: + val pipeline_name // String + val nextflow_opts // String + val params_file // pipeline params-file + val samplesheet // pipeline samplesheet + val additional_config // custom configs + val cache_dir // cache directory + + output: + path "results", emit: output + val stdout, emit: log + + when: + task.ext.when == null || task.ext.when + + exec: + // Set cache directory so workflow can `-resume` + def cache_path = file(cache_dir) + assert cache_path.mkdirs() + // Construct nextflow command + def nxf_cmd = [ + 'nextflow run', + pipeline_name, + nextflow_opts, + params_file ? "-params-file $params_file" : '', + additional_config ? "-c $additional_config" : '', + samplesheet ? "--input $samplesheet" : '', + "--outdir ${task.workDir}/results", + ].join(" ") + // Copy command to shell script in work dir for reference/debugging. + file("$task.workDir/nf-cmd.sh").text = nxf_cmd + // Run nextflow command locally in cache directory + def process = nxf_cmd.execute(null, cache_path.toFile()) + // Print process output to stdout and stderr + process.consumeProcessOutput(System.out, System.err) + process.waitFor() + stdout = process.text + // Copy nextflow log to work directory + cache_path.resolve(".nextflow.log").copyTo("${task.workDir}/nextflow.log") + assert process.exitValue() == 0: stdout +} diff --git a/modules/local/nextflow/run/tests/main.nf.test b/modules/local/nextflow/run/tests/main.nf.test new file mode 100644 index 0000000..5380bb0 --- /dev/null +++ b/modules/local/nextflow/run/tests/main.nf.test @@ -0,0 +1,42 @@ +nextflow_process { + + name "Test Process NEXTFLOW_RUN" + script "modules/local/nextflow/run/main.nf" + process "NEXTFLOW_RUN" + + test("Nextflow run nf-core/demo -revision 1.2.0 -profile docker,test -stub") { + + when { + process { + """ + input[0] = 'nf-core/demo' + input[1] = '-ansi-log false -profile docker,test -revision 1.2.0 -stub' + input[2] = '' + input[3] = '' + input[4] = '' + input[5] = workflow.workDir.resolve('nf-core/demo').toUriString() + """ + } + } + + then { + def outdir = process.out.output[0] + // stable_path: All files + folders in outdir with a stable path (including file name) + def stable_path = getAllFilesFromDir(outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_content: All files in outdir with stable content + def stable_content = getAllFilesFromDir(outdir, ignore: ['pipeline_info/**', 'multiqc/**']) + + assert process.success + assert snapshot( + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("${outdir}/pipeline_info/nf_core_demo_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_path, + // All files with stable contents + stable_content, + ).match() + } + + } + +} diff --git a/modules/local/nextflow/run/tests/main.nf.test.snap b/modules/local/nextflow/run/tests/main.nf.test.snap new file mode 100644 index 0000000..13a0c8c --- /dev/null +++ b/modules/local/nextflow/run/tests/main.nf.test.snap @@ -0,0 +1,67 @@ +{ + "Nextflow run nf-core/demo -revision 1.2.0 -profile docker,test -stub": { + "content": [ + { + "COWPY": { + "cowpy": "1.1.5" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "SEQTK_TRIM": { + "seqtk": "1.4-r122" + }, + "Workflow": { + "nf-core/demo": "v1.2.0-g32893af" + } + }, + [ + "", + "cowpy", + "cowpy/cowpy.txt", + "fastqc", + "fastqc/SAMPLE1_PE", + "fastqc/SAMPLE1_PE/SAMPLE1_PE.html", + "fastqc/SAMPLE2_PE", + "fastqc/SAMPLE2_PE/SAMPLE2_PE.html", + "fastqc/SAMPLE3_SE", + "fastqc/SAMPLE3_SE/SAMPLE3_SE.html", + "fq", + "fq/SAMPLE1_PE", + "fq/SAMPLE1_PE/SAMPLE1_PE_sample1_R1.fastq.gz", + "fq/SAMPLE1_PE/SAMPLE1_PE_sample1_R2.fastq.gz", + "fq/SAMPLE2_PE", + "fq/SAMPLE2_PE/SAMPLE2_PE_sample2_R1.fastq.gz", + "fq/SAMPLE2_PE/SAMPLE2_PE_sample2_R2.fastq.gz", + "fq/SAMPLE3_SE", + "fq/SAMPLE3_SE/SAMPLE3_SE_sample1_R1.fastq.gz", + "fq/SAMPLE3_SE/SAMPLE3_SE_sample2_R1.fastq.gz", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/.stub", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/.stub", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_demo_software_mqc_versions.yml" + ], + [ + "cowpy.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "SAMPLE1_PE.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "SAMPLE2_PE.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "SAMPLE3_SE.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "SAMPLE1_PE_sample1_R1.fastq.gz:md5,7dd2fd0d542d9259d9aed53550907fae", + "SAMPLE1_PE_sample1_R2.fastq.gz:md5,1995fe8488384d801807805f26ceca8a", + "SAMPLE2_PE_sample2_R1.fastq.gz:md5,05dba9c26396cbdbe0e6da26f037106e", + "SAMPLE2_PE_sample2_R2.fastq.gz:md5,63d5e4ac37927c2ecec4b74d2ff99a10", + "SAMPLE3_SE_sample1_R1.fastq.gz:md5,7dd2fd0d542d9259d9aed53550907fae", + "SAMPLE3_SE_sample2_R1.fastq.gz:md5,05dba9c26396cbdbe0e6da26f037106e" + ] + ], + "timestamp": "2026-07-02T17:47:51.590456", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 3b2582e..c9e938f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -9,6 +9,29 @@ // Global default params, used in configs params { + // Metadata + case_id = '' + sample_id_tumor = '' + sample_id_normal = '' + subject_id = '' + sex = '' + + // Oncoanalyser input parameters + oncoanalyser_config = '' + oncoanalyser_create_stub_placeholders = false + oncoanalyser_nextflow_opts = '' + oncoanalyser_samplesheet = '' + oncoanalyser_mode = '' + oncoanalyser_genome = '' + + // Oncorefiner parameters + oncorefiner_config = '' + oncorefiner_nextflow_opts = '' + + // Oncorefiner parameters + oncorefiner_config = '' + oncorefiner_nextflow_opts = '' + // Boilerplate options outdir = null publish_dir_mode = 'copy' diff --git a/nextflow_schema.json b/nextflow_schema.json index dfbfead..cec6f52 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -5,6 +5,108 @@ "description": "Pipeline cascade of nf-core/oncoanalyser + Clinical-Genomics/oncorefiner, written in Nextflow.", "type": "object", "$defs": { + "metadata": { + "title": "Metadata", + "type": "object", + "description": "", + "default": "", + "fa_icon": "fas fa-info-circle", + "properties": { + "case_id": { + "type": "string", + "description": "Case ID." + }, + "sample_id_tumor": { + "type": "string", + "description": "Sample id of the tumor sample." + }, + "sample_id_normal": { + "type": "string", + "description": "Sample id of the normal sample." + }, + "subject_id": { + "type": "string", + "description": "Subject ID of the patient." + }, + "sex": { + "type": "string", + "enum": ["female", "male", "unknown"], + "description": "Sex of the patient." + } + }, + "required": ["case_id", "sample_id_tumor", "sample_id_normal", "subject_id", "sex"] + }, + "oncoanalyser": { + "title": "Oncoanalyser", + "type": "object", + "description": "Input files and nextflow options for running nf-core/oncoanlyser.", + "default": "", + "properties": { + "oncoanalyser_config": { + "type": "string", + "description": "Path to config file for nf-core/oncoanlyser (optional).", + "format": "file-path", + "exists": true, + "fa_icon": "far fa-file" + }, + "oncoanalyser_create_stub_placeholders": { + "type": "boolean", + "description": "Create placeholders for reference data during stub run. Used for creating the params file for oncoanalyser.", + "default": false, + "fa_icon": "fas fa-diagram-project" + }, + "oncoanalyser_genome": { + "type": "string", + "description": "Name of genome reference. Used for creating the params file for oncoanalyser.", + "fa_icon": "fas fa-book" + }, + "oncoanalyser_mode": { + "type": "string", + "description": "Workflow run mode. Used for creating the params file for oncoanalyser.", + "fa_icon": "fas fa-diagram-project", + "pattern": "^(wgts|targeted|purity_estimate|panel_resource_creation|prepare_reference)" + }, + "oncoanalyser_nextflow_opts": { + "type": "string", + "description": "Nextflow options for running nf-core/oncoanlyser.", + "fa_icon": "fas fa-terminal" + }, + "oncoanalyser_samplesheet": { + "type": "string", + "description": "Path to csv samplesheet file for nf-core/oncoanalyser.", + "format": "file-path", + "mimetype": "text/csv", + "pattern": "^\\S+\\.csv$", + "exists": true, + "fa_icon": "fas fa-file-csv", + "help_text": "" + } + }, + "required": ["oncoanalyser_nextflow_opts", "oncoanalyser_genome", "oncoanalyser_mode"], + "fa_icon": "fas fa-file-import" + }, + "oncorefiner": { + "title": "Oncorefiner", + "type": "object", + "description": "Input files and nextflow options for running Clinical-Genomics/oncorefiner.", + "default": "", + "properties": { + "oncorefiner_config": { + "type": "string", + "description": "Path to config file for Clinical-Genomics/oncorefiner (optional).", + "format": "file-path", + "exists": true, + "fa_icon": "far fa-file" + }, + "oncorefiner_nextflow_opts": { + "type": "string", + "description": "Nextflow options for running Clinical-Genomics/oncorefiner.", + "fa_icon": "fas fa-terminal" + } + }, + "required": ["oncorefiner_nextflow_opts"], + "fa_icon": "fas fa-file-import" + }, "input_output_options": { "title": "Input/output options", "type": "object", @@ -153,6 +255,15 @@ } }, "allOf": [ + { + "$ref": "#/$defs/metadata" + }, + { + "$ref": "#/$defs/oncoanalyser" + }, + { + "$ref": "#/$defs/oncorefiner" + }, { "$ref": "#/$defs/input_output_options" }, diff --git a/subworkflows/local/utils_nfcore_oncoflow_pipeline/main.nf b/subworkflows/local/utils_nfcore_oncoflow_pipeline/main.nf index 3a2ac41..8b7222b 100644 --- a/subworkflows/local/utils_nfcore_oncoflow_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_oncoflow_pipeline/main.nf @@ -208,3 +208,43 @@ def methodsDescriptionText(mqc_methods_yaml) { return description_html.toString() } +// +// Generate params lists for each pipeline +// +def getOncoanalyserParamsList(val_oncoanalyser_mode, val_oncoanalyser_genome, val_oncoanalyser_create_stub_placeholders) { + return [ + "mode: $val_oncoanalyser_mode", + "genome: $val_oncoanalyser_genome", + "create_stub_placeholders: $val_oncoanalyser_create_stub_placeholders" + ] +} + +// +// Generate params lists for each pipeline +// +def getOncorefinerParamsList(case_id, ch_oncoanalyser_output, sample_id_normal, sample_id_tumor, sex, subject_id) { + // Generate a parameters file for the oncorefiner pipeline based on metadata parameters and the output of the oncoanalyser pipeline. + + ch_oncoanalyser_output.map { oncoanalyser_output_dir -> + def bam_normal_path = sample_id_normal ? oncoanalyser_output_dir.resolve("${subject_id}/alignments/dna/${subject_id}.normal.redux.bam") : '' + def bai_normal_path = sample_id_normal ? oncoanalyser_output_dir.resolve("${subject_id}/alignments/dna/${subject_id}.normal.redux.bam.bai") : '' + def bam_tumor_path = oncoanalyser_output_dir.resolve("${subject_id}/alignments/dna/${subject_id}.tumor.redux.bam") + def bai_tumor_path = oncoanalyser_output_dir.resolve("${subject_id}/alignments/dna/${subject_id}.tumor.redux.bam.bai") + def snv_vcf_path = oncoanalyser_output_dir.resolve("${subject_id}/purple/${subject_id}.tumor.purple.somatic.vcf.gz") + def sv_vcf_path = oncoanalyser_output_dir.resolve("${subject_id}/purple/${subject_id}.tumor.purple.sv.vcf.gz") + + return [ + + "case_id: $case_id", + "sample_id_normal: $sample_id_normal", + "sample_id_tumor: $sample_id_tumor", + "sex: $sex", + "bam_normal: $bam_normal_path", + "bai_normal: $bai_normal_path", + "bam_tumor: $bam_tumor_path", + "bai_tumor: $bai_tumor_path", + "snv_vcf: $snv_vcf_path", + "sv_vcf: $sv_vcf_path" + ] + } +} diff --git a/tests/.nftignore b/tests/.nftignore index 73eb92f..cab8d7a 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -1,2 +1,6 @@ .DS_Store -pipeline_info/*.{html,json,txt,yml} +**pipeline_info/*.{html,json,txt,yml} +**/multiqc/** +oncoanalyser/**/*.gz +oncoanalyser/**/*.command.* +oncorefiner/**/vep/*.{html} diff --git a/tests/default.nf.test b/tests/default.nf.test index 4e6c99f..d52159b 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -4,7 +4,7 @@ nextflow_pipeline { script "../main.nf" tag "pipeline" - test("-profile test") { + test("-profile test (stub runs for all pipelines)") { when { params { @@ -14,9 +14,15 @@ nextflow_pipeline { then { // stable_path: All files + folders in ${params.outdir}/ with a stable path (including file name) - def stable_path = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + def stable_path = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['**pipeline_info/*.{html,json,txt}']) // stable_content: All files in ${params.outdir}/ with stable content - def stable_content = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + def stable_content = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore', ignore: ['oncorefiner/oncorefiner_params.yaml']) + + // The oncorefiner params file contains $workDir for NFCORE_ONCOANALYSER, which varies for every run + def oncorefiner_params_file_path = "$outputDir/oncorefiner/oncorefiner_params.yaml" + def oncorefiner_params_file = file(oncorefiner_params_file_path) + def clean_oncorefiner_params_file_content = oncorefiner_params_file.text.replaceAll("$workDir/.*/results", "") + assert workflow.success assertAll( { assert snapshot( @@ -25,7 +31,11 @@ nextflow_pipeline { // All stable path name, with a relative path stable_path, // All files with stable contents - stable_content + stable_content, + // Oncoanalyser params file + file("$outputDir/oncoanalyser/oncoanalyser_params.yaml").text.split("\n"), + // Oncorefiner params file without the run $outputDir path + clean_oncorefiner_params_file_content.split("\n") ).match() } ) } diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap new file mode 100644 index 0000000..018bcdd --- /dev/null +++ b/tests/default.nf.test.snap @@ -0,0 +1,504 @@ +{ + "-profile test (stub runs for all pipelines)": { + "content": [ + null, + [ + "oncoanalyser", + "oncoanalyser/oncoanalyser_params.yaml", + "oncoanalyser/results", + "oncoanalyser/results/pipeline_info", + "oncoanalyser/results/pipeline_info/software_versions.yml", + "oncoanalyser/results/subject_a", + "oncoanalyser/results/subject_a/alignments", + "oncoanalyser/results/subject_a/alignments/dna", + "oncoanalyser/results/subject_a/alignments/dna/subject_a.normal.duplicate_freq.tsv", + "oncoanalyser/results/subject_a/alignments/dna/subject_a.normal.jitter_params.tsv", + "oncoanalyser/results/subject_a/alignments/dna/subject_a.normal.ms_table.tsv.gz", + "oncoanalyser/results/subject_a/alignments/dna/subject_a.normal.redux.bam", + "oncoanalyser/results/subject_a/alignments/dna/subject_a.normal.redux.bam.bai", + "oncoanalyser/results/subject_a/alignments/dna/subject_a.tumor.duplicate_freq.tsv", + "oncoanalyser/results/subject_a/alignments/dna/subject_a.tumor.jitter_params.tsv", + "oncoanalyser/results/subject_a/alignments/dna/subject_a.tumor.ms_table.tsv.gz", + "oncoanalyser/results/subject_a/alignments/dna/subject_a.tumor.redux.bam", + "oncoanalyser/results/subject_a/alignments/dna/subject_a.tumor.redux.bam.bai", + "oncoanalyser/results/subject_a/amber", + "oncoanalyser/results/subject_a/amber/placeholder", + "oncoanalyser/results/subject_a/bamtools", + "oncoanalyser/results/subject_a/bamtools/subject_a_subject_a.normal_bamtools", + "oncoanalyser/results/subject_a/bamtools/subject_a_subject_a.normal_bamtools/subject_a.normal.bam_metric.coverage.tsv", + "oncoanalyser/results/subject_a/bamtools/subject_a_subject_a.normal_bamtools/subject_a.normal.bam_metric.flag_counts.tsv", + "oncoanalyser/results/subject_a/bamtools/subject_a_subject_a.normal_bamtools/subject_a.normal.bam_metric.frag_length.tsv", + "oncoanalyser/results/subject_a/bamtools/subject_a_subject_a.normal_bamtools/subject_a.normal.bam_metric.partition_stats.tsv", + "oncoanalyser/results/subject_a/bamtools/subject_a_subject_a.normal_bamtools/subject_a.normal.bam_metric.summary.tsv", + "oncoanalyser/results/subject_a/bamtools/subject_a_subject_a.tumor_bamtools", + "oncoanalyser/results/subject_a/bamtools/subject_a_subject_a.tumor_bamtools/subject_a.tumor.bam_metric.coverage.tsv", + "oncoanalyser/results/subject_a/bamtools/subject_a_subject_a.tumor_bamtools/subject_a.tumor.bam_metric.flag_counts.tsv", + "oncoanalyser/results/subject_a/bamtools/subject_a_subject_a.tumor_bamtools/subject_a.tumor.bam_metric.frag_length.tsv", + "oncoanalyser/results/subject_a/bamtools/subject_a_subject_a.tumor_bamtools/subject_a.tumor.bam_metric.partition_stats.tsv", + "oncoanalyser/results/subject_a/bamtools/subject_a_subject_a.tumor_bamtools/subject_a.tumor.bam_metric.summary.tsv", + "oncoanalyser/results/subject_a/chord", + "oncoanalyser/results/subject_a/chord/subject_a.tumor.chord.mutation_contexts.tsv", + "oncoanalyser/results/subject_a/chord/subject_a.tumor.chord.prediction.tsv", + "oncoanalyser/results/subject_a/cider", + "oncoanalyser/results/subject_a/cider/subject_a.tumor.cider.bam", + "oncoanalyser/results/subject_a/cider/subject_a.tumor.cider.blastn_match.tsv.gz", + "oncoanalyser/results/subject_a/cider/subject_a.tumor.cider.layout.gz", + "oncoanalyser/results/subject_a/cider/subject_a.tumor.cider.locus_stats.tsv", + "oncoanalyser/results/subject_a/cider/subject_a.tumor.cider.vdj.tsv.gz", + "oncoanalyser/results/subject_a/cider/subject_a.tumor_rna.cider.bam", + "oncoanalyser/results/subject_a/cider/subject_a.tumor_rna.cider.blastn_match.tsv.gz", + "oncoanalyser/results/subject_a/cider/subject_a.tumor_rna.cider.layout.gz", + "oncoanalyser/results/subject_a/cider/subject_a.tumor_rna.cider.locus_stats.tsv", + "oncoanalyser/results/subject_a/cider/subject_a.tumor_rna.cider.vdj.tsv.gz", + "oncoanalyser/results/subject_a/cobalt", + "oncoanalyser/results/subject_a/cobalt/placeholder", + "oncoanalyser/results/subject_a/cuppa", + "oncoanalyser/results/subject_a/cuppa/subject_a.tumor.cuppa.pred_summ.tsv", + "oncoanalyser/results/subject_a/cuppa/subject_a.tumor.cuppa.vis.png", + "oncoanalyser/results/subject_a/cuppa/subject_a.tumor.cuppa.vis_data.tsv", + "oncoanalyser/results/subject_a/cuppa/subject_a.tumor.cuppa_data.tsv.gz", + "oncoanalyser/results/subject_a/esvee", + "oncoanalyser/results/subject_a/esvee/subject_a.tumor.esvee.germline.vcf.gz", + "oncoanalyser/results/subject_a/esvee/subject_a.tumor.esvee.germline.vcf.gz.tbi", + "oncoanalyser/results/subject_a/esvee/subject_a.tumor.esvee.somatic.vcf.gz", + "oncoanalyser/results/subject_a/esvee/subject_a.tumor.esvee.somatic.vcf.gz.tbi", + "oncoanalyser/results/subject_a/esvee/subject_a.tumor.esvee.unfiltered.vcf.gz", + "oncoanalyser/results/subject_a/esvee/subject_a.tumor.esvee.unfiltered.vcf.gz.tbi", + "oncoanalyser/results/subject_a/isofox", + "oncoanalyser/results/subject_a/isofox/placeholder", + "oncoanalyser/results/subject_a/lilac", + "oncoanalyser/results/subject_a/lilac/placeholder", + "oncoanalyser/results/subject_a/linx", + "oncoanalyser/results/subject_a/linx/germline_annotations", + "oncoanalyser/results/subject_a/linx/germline_annotations/placeholder", + "oncoanalyser/results/subject_a/linx/somatic_annotations", + "oncoanalyser/results/subject_a/linx/somatic_annotations/placeholder", + "oncoanalyser/results/subject_a/linx/somatic_plots", + "oncoanalyser/results/subject_a/linx/somatic_plots/all", + "oncoanalyser/results/subject_a/linx/somatic_plots/all/placeholder", + "oncoanalyser/results/subject_a/linx/somatic_plots/reportable", + "oncoanalyser/results/subject_a/linx/somatic_plots/reportable/placeholder", + "oncoanalyser/results/subject_a/linx/subject_a.tumor_linx.html", + "oncoanalyser/results/subject_a/logs", + "oncoanalyser/results/subject_a/logs/subject_a.amber.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.amber.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.amber.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.amber.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.amber.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.chord.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.chord.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.chord.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.chord.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.chord.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.cobalt.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.cobalt.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.cobalt.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.cobalt.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.cobalt.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.cuppa.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.cuppa.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.cuppa.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.cuppa.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.cuppa.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.esvee.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.esvee.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.esvee.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.esvee.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.esvee.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.isofox.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.isofox.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.isofox.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.isofox.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.isofox.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.lilac.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.lilac.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.lilac.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.lilac.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.lilac.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.linx_germline.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.linx_germline.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.linx_germline.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.linx_germline.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.linx_germline.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.linx_somatic.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.linx_somatic.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.linx_somatic.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.linx_somatic.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.linx_somatic.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.linx_visualiser.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.linx_visualiser.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.linx_visualiser.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.linx_visualiser.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.linx_visualiser.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.linxreport.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.linxreport.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.linxreport.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.linxreport.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.linxreport.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.neo_annotate_fusions.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.neo_annotate_fusions.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.neo_annotate_fusions.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.neo_annotate_fusions.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.neo_annotate_fusions.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.neo_finder.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.neo_finder.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.neo_finder.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.neo_finder.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.neo_finder.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.neo_scorer.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.neo_scorer.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.neo_scorer.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.neo_scorer.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.neo_scorer.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.orange.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.orange.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.orange.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.orange.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.orange.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.pave_germline.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.pave_germline.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.pave_germline.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.pave_germline.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.pave_germline.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.pave_somatic.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.pave_somatic.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.pave_somatic.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.pave_somatic.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.pave_somatic.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.peach.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.peach.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.peach.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.peach.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.peach.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.purple.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.purple.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.purple.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.purple.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.purple.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.sage_append_germline.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.sage_append_germline.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.sage_append_germline.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.sage_append_germline.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.sage_append_germline.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.sage_append_somatic.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.sage_append_somatic.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.sage_append_somatic.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.sage_append_somatic.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.sage_append_somatic.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.sage_germline.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.sage_germline.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.sage_germline.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.sage_germline.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.sage_germline.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.sage_somatic.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.sage_somatic.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.sage_somatic.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.sage_somatic.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.sage_somatic.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.sigs.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.sigs.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.sigs.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.sigs.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.sigs.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.teal_pipeline.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.teal_pipeline.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.teal_pipeline.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.teal_pipeline.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.teal_pipeline.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.teal_prep.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.teal_prep.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.teal_prep.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.teal_prep.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.teal_prep.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.virusbreakend.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.virusbreakend.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.virusbreakend.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.virusbreakend.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.virusbreakend.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a.virusinterpreter.command.err", + "oncoanalyser/results/subject_a/logs/subject_a.virusinterpreter.command.log", + "oncoanalyser/results/subject_a/logs/subject_a.virusinterpreter.command.out", + "oncoanalyser/results/subject_a/logs/subject_a.virusinterpreter.command.run", + "oncoanalyser/results/subject_a/logs/subject_a.virusinterpreter.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.normal.bamtools.command.err", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.normal.bamtools.command.log", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.normal.bamtools.command.out", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.normal.bamtools.command.run", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.normal.bamtools.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.normal.redux.command.err", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.normal.redux.command.log", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.normal.redux.command.out", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.normal.redux.command.run", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.normal.redux.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.bamtools.command.err", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.bamtools.command.log", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.bamtools.command.out", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.bamtools.command.run", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.bamtools.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.cider.command.err", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.cider.command.log", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.cider.command.out", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.cider.command.run", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.cider.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.redux.command.err", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.redux.command.log", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.redux.command.out", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.redux.command.run", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor.redux.command.sh", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor_rna.cider.command.err", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor_rna.cider.command.log", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor_rna.cider.command.out", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor_rna.cider.command.run", + "oncoanalyser/results/subject_a/logs/subject_a_subject_a.tumor_rna.cider.command.sh", + "oncoanalyser/results/subject_a/neo", + "oncoanalyser/results/subject_a/neo/annotated_fusions", + "oncoanalyser/results/subject_a/neo/annotated_fusions/subject_a.tumor.isf.neoepitope.tsv", + "oncoanalyser/results/subject_a/neo/finder", + "oncoanalyser/results/subject_a/neo/scorer", + "oncoanalyser/results/subject_a/orange", + "oncoanalyser/results/subject_a/orange/subject_a.tumor.orange.json", + "oncoanalyser/results/subject_a/orange/subject_a.tumor.orange.pdf", + "oncoanalyser/results/subject_a/pave", + "oncoanalyser/results/subject_a/pave/subject_a.tumor.pave.germline.vcf.gz", + "oncoanalyser/results/subject_a/pave/subject_a.tumor.pave.germline.vcf.gz.tbi", + "oncoanalyser/results/subject_a/pave/subject_a.tumor.pave.somatic.vcf.gz", + "oncoanalyser/results/subject_a/pave/subject_a.tumor.pave.somatic.vcf.gz.tbi", + "oncoanalyser/results/subject_a/peach", + "oncoanalyser/results/subject_a/peach/subject_a.normal.peach.events.tsv", + "oncoanalyser/results/subject_a/peach/subject_a.normal.peach.gene.events.tsv", + "oncoanalyser/results/subject_a/peach/subject_a.normal.peach.haplotypes.all.tsv", + "oncoanalyser/results/subject_a/peach/subject_a.normal.peach.haplotypes.best.tsv", + "oncoanalyser/results/subject_a/peach/subject_a.normal.peach.qc.tsv", + "oncoanalyser/results/subject_a/purple", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.cnv.gene.tsv", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.cnv.somatic.tsv", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.driver.catalog.germline.tsv", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.driver.catalog.somatic.tsv", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.germline.vcf.gz", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.germline.vcf.gz.tbi", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.purity.tsv", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.qc", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.somatic.vcf.gz", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.somatic.vcf.gz.tbi", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.sv.germline.vcf.gz", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.sv.germline.vcf.gz.tbi", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.sv.vcf.gz", + "oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.sv.vcf.gz.tbi", + "oncoanalyser/results/subject_a/sage_append", + "oncoanalyser/results/subject_a/sage_append/germline", + "oncoanalyser/results/subject_a/sage_append/germline/subject_a.normal.frag_lengths.tsv.gz", + "oncoanalyser/results/subject_a/sage_append/germline/subject_a.normal.sage.append.vcf.gz", + "oncoanalyser/results/subject_a/sage_append/germline/subject_a.normal.sage.append.vcf.gz.tbi", + "oncoanalyser/results/subject_a/sage_append/germline/subject_a.normal_query.sage.bqr.tsv", + "oncoanalyser/results/subject_a/sage_append/somatic", + "oncoanalyser/results/subject_a/sage_append/somatic/subject_a.tumor.frag_lengths.tsv.gz", + "oncoanalyser/results/subject_a/sage_append/somatic/subject_a.tumor.sage.append.vcf.gz", + "oncoanalyser/results/subject_a/sage_append/somatic/subject_a.tumor.sage.append.vcf.gz.tbi", + "oncoanalyser/results/subject_a/sage_append/somatic/subject_a.tumor_query.sage.bqr.tsv", + "oncoanalyser/results/subject_a/sage_calling", + "oncoanalyser/results/subject_a/sage_calling/germline", + "oncoanalyser/results/subject_a/sage_calling/germline/subject_a.normal.gene.coverage.tsv", + "oncoanalyser/results/subject_a/sage_calling/germline/subject_a.normal.sage.bqr.png", + "oncoanalyser/results/subject_a/sage_calling/germline/subject_a.normal.sage.bqr.tsv", + "oncoanalyser/results/subject_a/sage_calling/germline/subject_a.tumor.sage.bqr.png", + "oncoanalyser/results/subject_a/sage_calling/germline/subject_a.tumor.sage.bqr.tsv", + "oncoanalyser/results/subject_a/sage_calling/germline/subject_a.tumor.sage.germline.vcf.gz", + "oncoanalyser/results/subject_a/sage_calling/germline/subject_a.tumor.sage.germline.vcf.gz.tbi", + "oncoanalyser/results/subject_a/sage_calling/somatic", + "oncoanalyser/results/subject_a/sage_calling/somatic/subject_a.normal.sage.bqr.png", + "oncoanalyser/results/subject_a/sage_calling/somatic/subject_a.normal.sage.bqr.tsv", + "oncoanalyser/results/subject_a/sage_calling/somatic/subject_a.tumor.gene.coverage.tsv", + "oncoanalyser/results/subject_a/sage_calling/somatic/subject_a.tumor.sage.bqr.png", + "oncoanalyser/results/subject_a/sage_calling/somatic/subject_a.tumor.sage.bqr.tsv", + "oncoanalyser/results/subject_a/sage_calling/somatic/subject_a.tumor.sage.somatic.vcf.gz", + "oncoanalyser/results/subject_a/sage_calling/somatic/subject_a.tumor.sage.somatic.vcf.gz.tbi", + "oncoanalyser/results/subject_a/sigs", + "oncoanalyser/results/subject_a/sigs/placeholder", + "oncoanalyser/results/subject_a/teal", + "oncoanalyser/results/subject_a/teal/subject_a.normal.teal.telbam.bam", + "oncoanalyser/results/subject_a/teal/subject_a.normal.teal.telbam.bam.bai", + "oncoanalyser/results/subject_a/teal/subject_a.normal.teal.{tellength.tsv}", + "oncoanalyser/results/subject_a/teal/subject_a.tumor.teal.breakend.tsv.gz", + "oncoanalyser/results/subject_a/teal/subject_a.tumor.teal.telbam.bam", + "oncoanalyser/results/subject_a/teal/subject_a.tumor.teal.telbam.bam.bai", + "oncoanalyser/results/subject_a/teal/subject_a.tumor.teal.tellength.tsv", + "oncoanalyser/results/subject_a/virusbreakend", + "oncoanalyser/results/subject_a/virusbreakend/subject_a.tumor.summary.tsv", + "oncoanalyser/results/subject_a/virusbreakend/subject_a.tumor.virusbreakend.vcf", + "oncoanalyser/results/subject_a/virusinterpreter", + "oncoanalyser/results/subject_a/virusinterpreter/subject_a.tumor.virus.annotated.tsv", + "oncorefiner", + "oncorefiner/oncorefiner_params.yaml", + "oncorefiner/results", + "oncorefiner/results/alignments", + "oncorefiner/results/alignments/subject_a_normal.cram", + "oncorefiner/results/alignments/subject_a_normal.cram.crai", + "oncorefiner/results/alignments/subject_a_tumor.cram", + "oncorefiner/results/alignments/subject_a_tumor.cram.crai", + "oncorefiner/results/multiqc", + "oncorefiner/results/multiqc/multiqc_data", + "oncorefiner/results/multiqc/multiqc_data/.stub", + "oncorefiner/results/multiqc/multiqc_plots", + "oncorefiner/results/multiqc/multiqc_plots/.stub", + "oncorefiner/results/multiqc/multiqc_report.html", + "oncorefiner/results/pipeline_info", + "oncorefiner/results/pipeline_info/oncorefiner_software_mqc_versions.yml", + "oncorefiner/results/process_svs", + "oncorefiner/results/process_svs/test_case_id_clinical.vcf.gz", + "oncorefiner/results/process_svs/test_case_id_clinical.vcf.gz.tbi", + "oncorefiner/results/process_svs/test_case_id_research.vcf.gz", + "oncorefiner/results/process_svs/test_case_id_research.vcf.gz.tbi", + "oncorefiner/results/snv", + "oncorefiner/results/snv/test_case_id_clinical.vcf.gz", + "oncorefiner/results/snv/test_case_id_clinical.vcf.gz.tbi", + "oncorefiner/results/snv/test_case_id_genmod_score.vcf.gz", + "oncorefiner/results/snv/test_case_id_genmod_score.vcf.gz.tbi", + "oncorefiner/results/snv/test_case_id_vcfanno.vcf.gz", + "oncorefiner/results/snv/test_case_id_vcfanno.vcf.gz.tbi", + "oncorefiner/results/snv/test_case_id_vep.vcf.gz", + "oncorefiner/results/snv/test_case_id_vep.vcf.gz.tbi", + "oncorefiner/results/snv/test_case_id_vep_summary.html", + "oncorefiner/results/vcf2cytosure", + "oncorefiner/results/vcf2cytosure/normal.cgh", + "oncorefiner/results/vcf2cytosure/tumor.cgh", + "oncorefiner/results/vep", + "oncorefiner/results/vep/test_case_id_svdbquery_vep.vcf.gz", + "oncorefiner/results/vep/test_case_id_svdbquery_vep.vcf.gz.tbi", + "oncorefiner/results/vep/test_case_id_svdbquery_vep_summary.html", + "pipeline_info", + "pipeline_info/oncoflow_software_versions.yml" + ], + [ + "oncoanalyser_params.yaml:md5,ae88cb695685959dc4d970c61347728d", + "subject_a.normal.duplicate_freq.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.jitter_params.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.redux.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.redux.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.duplicate_freq.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.jitter_params.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.redux.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.redux.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e", + "placeholder:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.bam_metric.coverage.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.bam_metric.flag_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.bam_metric.frag_length.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.bam_metric.partition_stats.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.bam_metric.summary.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.bam_metric.coverage.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.bam_metric.flag_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.bam_metric.frag_length.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.bam_metric.partition_stats.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.bam_metric.summary.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.chord.mutation_contexts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.chord.prediction.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.cider.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.cider.locus_stats.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor_rna.cider.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor_rna.cider.locus_stats.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "placeholder:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.cuppa.pred_summ.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.cuppa.vis.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.cuppa.vis_data.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.esvee.germline.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.esvee.somatic.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.esvee.unfiltered.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "placeholder:md5,d41d8cd98f00b204e9800998ecf8427e", + "placeholder:md5,d41d8cd98f00b204e9800998ecf8427e", + "placeholder:md5,d41d8cd98f00b204e9800998ecf8427e", + "placeholder:md5,d41d8cd98f00b204e9800998ecf8427e", + "placeholder:md5,d41d8cd98f00b204e9800998ecf8427e", + "placeholder:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor_linx.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.isf.neoepitope.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.orange.json:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.orange.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.pave.germline.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.pave.somatic.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.peach.events.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.peach.gene.events.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.peach.haplotypes.all.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.peach.haplotypes.best.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.peach.qc.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.purple.cnv.gene.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.purple.cnv.somatic.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.purple.driver.catalog.germline.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.purple.driver.catalog.somatic.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.purple.germline.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.purple.purity.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.purple.qc:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.purple.somatic.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.purple.sv.germline.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.purple.sv.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.sage.append.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal_query.sage.bqr.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.sage.append.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor_query.sage.bqr.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.gene.coverage.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.sage.bqr.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.sage.bqr.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.sage.bqr.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.sage.bqr.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.sage.germline.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.sage.bqr.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.sage.bqr.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.gene.coverage.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.sage.bqr.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.sage.bqr.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.sage.somatic.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "placeholder:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.teal.telbam.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.teal.telbam.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.normal.teal.{tellength.tsv}:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.teal.telbam.bam:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.teal.telbam.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.teal.tellength.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.summary.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.virusbreakend.vcf:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a.tumor.virus.annotated.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a_normal.cram:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a_normal.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a_tumor.cram:md5,d41d8cd98f00b204e9800998ecf8427e", + "subject_a_tumor.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_case_id_clinical.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_case_id_clinical.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_case_id_research.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_case_id_research.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_case_id_clinical.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_case_id_clinical.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_case_id_genmod_score.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_case_id_genmod_score.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_case_id_vcfanno.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_case_id_vcfanno.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_case_id_vep.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_case_id_vep.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_case_id_vep_summary.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "normal.cgh:md5,d41d8cd98f00b204e9800998ecf8427e", + "tumor.cgh:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_case_id_svdbquery_vep.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_case_id_svdbquery_vep.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + "mode: wgts", + "genome: GRCh38_hmf", + "create_stub_placeholders: true" + ], + [ + "case_id: test_case_id", + "sample_id_normal: test_sample_id_normal", + "sample_id_tumor: test_sample_id_tumor", + "sex: female", + "bam_normal: /subject_a/alignments/dna/subject_a.normal.redux.bam", + "bai_normal: /subject_a/alignments/dna/subject_a.normal.redux.bam.bai", + "bam_tumor: /subject_a/alignments/dna/subject_a.tumor.redux.bam", + "bai_tumor: /subject_a/alignments/dna/subject_a.tumor.redux.bam.bai", + "snv_vcf: /subject_a/purple/subject_a.tumor.purple.somatic.vcf.gz", + "sv_vcf: /subject_a/purple/subject_a.tumor.purple.sv.vcf.gz" + ] + ], + "timestamp": "2026-07-10T10:24:46.667977", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/workflows/oncoflow.nf b/workflows/oncoflow.nf index 80e8f86..18317c7 100644 --- a/workflows/oncoflow.nf +++ b/workflows/oncoflow.nf @@ -3,7 +3,13 @@ IMPORT MODULES / SUBWORKFLOWS / FUNCTIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' +include { CREATE_PARAMS_FILE as CREATE_ONCOANALYSER_PARAMS_FILE } from "../modules/local/createparamsfile/main" +include { CREATE_PARAMS_FILE as CREATE_ONCOREFINER_PARAMS_FILE } from "../modules/local/createparamsfile/main" +include { NEXTFLOW_RUN as CLINICAL_GENOMICS_ONCOREFINER } from '../modules/local/nextflow/run' +include { NEXTFLOW_RUN as NFCORE_ONCOANALYSER } from "../modules/local/nextflow/run" +include { getOncoanalyserParamsList } from '../subworkflows/local/utils_nfcore_oncoflow_pipeline/main' +include { getOncorefinerParamsList } from "../subworkflows/local/utils_nfcore_oncoflow_pipeline" +include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -14,12 +20,66 @@ include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pi workflow ONCOFLOW { take: - outdir + val_case_id // string: [mandatory] Case ID + val_oncoanalyser_config // string: [optional] Config file for oncoanalyser pipeline + val_oncoanalyser_create_stub_placeholders // bool: [mandatory] Create stub placeholders for oncoanalyser pipeline + val_oncoanalyser_genome // string: [mandatory] Genome for oncoanalyser pipeline + val_oncoanalyser_mode // string: [mandatory] Mode for oncoanalyser pipeline + val_oncoanalyser_nextflow_opts // string: [mandatory] Nextflow options for oncoanalyser pipeline + val_oncoanalyser_samplesheet // string: [mandatory] Samplesheet file for oncoanalyser pipeline + val_oncorefiner_config // string: [optional] Config file for oncorefiner pipeline + val_oncorefiner_nextflow_opts // string: [mandatory] Nextflow options for oncorefiner pipeline + val_outdir // string: [mandatory] The output directory where the results will be saved + val_sample_id_tumor // string: [mandatory] Sample ID of the tumor sample + val_sample_id_normal // string: [mandatory] Sample ID of the normal sample + val_subject_id // string: [mandatory] Subject ID + val_sex // string: [mandatory] Sex of the patient main: def ch_versions = channel.empty() + oncoanalyser_params_list = getOncoanalyserParamsList( + val_oncoanalyser_mode, + val_oncoanalyser_genome, + val_oncoanalyser_create_stub_placeholders + ) + + CREATE_ONCOANALYSER_PARAMS_FILE( + oncoanalyser_params_list + ) + + NFCORE_ONCOANALYSER( + 'Clinical-Genomics/oncoanalyser', + val_oncoanalyser_nextflow_opts, + CREATE_ONCOANALYSER_PARAMS_FILE.out.params_file, + val_oncoanalyser_samplesheet, + val_oncoanalyser_config, + workflow.workDir.resolve('nf-core/oncoanalyser').toUriString(), + ) + + def oncorefiner_params_list = getOncorefinerParamsList( + val_case_id, + NFCORE_ONCOANALYSER.out.output, + val_sample_id_normal, + val_sample_id_tumor, + val_sex, + val_subject_id, + ) + + CREATE_ONCOREFINER_PARAMS_FILE( + oncorefiner_params_list + ) + + CLINICAL_GENOMICS_ONCOREFINER( + 'Clinical-Genomics/oncorefiner', + val_oncorefiner_nextflow_opts, + CREATE_ONCOREFINER_PARAMS_FILE.out.params_file, + '', + val_oncorefiner_config, + workflow.workDir.resolve('Clinical-Genomics/oncorefiner').toUriString(), + ) + // // Collate and save software versions // @@ -43,13 +103,18 @@ workflow ONCOFLOW { def ch_collated_versions = softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) .mix(topic_versions_string) .collectFile( - storeDir: "${outdir}/pipeline_info", + storeDir: "${val_outdir}/pipeline_info", name: 'oncoflow_software_' + 'versions.yml', sort: true, newLine: true ) + emit: - versions = ch_versions // channel: [ path(versions.yml) ] + oncoanalyser_output = NFCORE_ONCOANALYSER.out.output // channel: [path(analysis_output_directory)] + oncoanalyser_params_file = CREATE_ONCOANALYSER_PARAMS_FILE.out.params_file // channel: [path(yaml)] + oncorefiner_output = CLINICAL_GENOMICS_ONCOREFINER.out.output // channel: [path(analysis_output_directory)] + oncorefiner_params_file = CREATE_ONCOREFINER_PARAMS_FILE.out.params_file // channel: [path(yaml)] + versions = ch_versions // channel: [path(versions.yml)] } /*