diff --git a/CHANGELOG.md b/CHANGELOG.md index a327c2c..be4206a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,24 @@ 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`, `oncoanalyser_params_file` and `oncoanalyser_samplesheet`. +- [#5](https://github.com/Clinical-Genomics/oncoflow/pull/5) Added `CREATE_ONCOREFINER_PARAMS_FILE` local module. +- [#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 `oncoanalyser` params file using the `CREATE_ONCOREFINER_PARAMS_FILE` local module. +- [#5](https://github.com/Clinical-Genomics/oncoflow/pull/5) Added `CREATE_ONCOREFINER_PARAMS_FILE` module to `ONCOFLOW` workflow. +- [#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. + ### `Fixed` ### `Dependencies` diff --git a/assets/test_oncoflow.config b/assets/test_oncoflow.config new file mode 100644 index 0000000..32aa5e4 --- /dev/null +++ b/assets/test_oncoflow.config @@ -0,0 +1,93 @@ +// +// Oncoanalyser configuration +// + +// TODO + +// +// Oncorefiner configuration +// + +// TODO +params { + // Parameters and options for tools + extra_args_cadd_annotate = '--columns Chrom,Pos,Ref,Alt,-,CADD' + extra_args_snv_clinical_filter = "--include '(INFO/GNOMADAF_grpmax <= 0.001 || INFO/GNOMADAF_grpmax == \".\")'" + extra_args_snv_research_filter = "--include '(INFO/GNOMADAF_grpmax <= 0.001 || INFO/GNOMADAF_grpmax == \".\")'" + extra_args_snv_vep = '' + extra_args_sv_vep = '' + + // Pipeline resource files + // VEP + vep_cache_version = 115 + vep_plugin_files = params.oncoflow_resources_dir + 'vep_plugin.csv' + vep_cache = params.oncoflow_resources_dir + 'VEP' + + // Vcfanno + vcfanno_toml = params.oncoflow_resources_dir + 'grch38_vcfanno_config.toml' + vcfanno_resources = params.oncoflow_resources_dir + 'grch38_vcfanno_resources.txt' + vcfanno_lua = null + + // SVDB + svdb_query_dbs = params.oncoflow_resources_dir + 'grch38_svdb_query_dbs.csv' + + // Reference + fasta = params.oncoflow_resources_dir + 'GRCh38_masked_exclusions_alts_hlas.fasta' + fai = params.oncoflow_resources_dir + 'GRCh38_masked_exclusions_alts_hlas.fasta.fai' +} + + +process { + + withName: '.*:GENERATE_CYTOSURE_FILES:VCF2CYTOSURE' { + errorStrategy = 'ignore' + } + + withName:'.*PROCESS_SNVS:BCFTOOLS_VIEW_RESEARCH' { + ext.args = { [ + "${params.extra_args_snv_research_filter}", + "--output-type z", + "--write-index=tbi", + ].join(' ') } + } + + withName: '.*PROCESS_SNVS:ENSEMBLVEP_VEP' { + maxForks = 8 + memory = { 10.GB * task.attempt } + cpus = { 2 * task.attempt } + time = { 4.h * task.attempt } + } + + + withName: '.*PROCESS_SVS:ENSEMBLVEP_VEP' { + maxForks = 8 + memory = { 10.GB * task.attempt } + cpus = { 2 * task.attempt } + time = { 4.h * task.attempt } + } + + withName: '.*ANNOTATE_CADD:CADD' { + memory = { 30.GB * task.attempt } + cpus = { 1 * task.attempt } + time = { 1.h * task.attempt } + } + + withName: '.*ANNOTATE_CADD:RENAME_CHR_CADD' { + memory = { 1.GB * task.attempt } + cpus = { 1 * task.attempt } + time = { 1.h * task.attempt } + } + + withName: '.*ANNOTATE_CADD:ANNOTATE_INDELS' { + memory = { 1.GB * task.attempt } + cpus = { 1 * task.attempt } + time = { 1.h * task.attempt } + } + + withName: '.*ANNOTATE_CADD:BCFTOOLS_VIEW' { + memory = { 1.GB * task.attempt } + cpus = { 1 * task.attempt } + time = { 1.h * task.attempt } + } + +} diff --git a/assets/test_oncoflow_params.yaml b/assets/test_oncoflow_params.yaml new file mode 100644 index 0000000..714e076 --- /dev/null +++ b/assets/test_oncoflow_params.yaml @@ -0,0 +1,8 @@ +case_id: "test_case_id" +sample_id_tumor: "test_sample_id_tumor" +sample_id_normal: "test_sample_id_normal" +sex: "female" + +oncoanalyser_create_stub_placeholders: true +oncoanalyser_genome: "GRCh38_hmf" +oncoanalyser_mode: "wgts" diff --git a/conf/test.config b/conf/test.config index 74c7407..7d1582e 100644 --- a/conf/test.config +++ b/conf/test.config @@ -19,11 +19,19 @@ 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 sample sheet of the test data of the oncoanalyser pipeline + sex = 'female' + + // Oncoanalyser input parameters + 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..de1d5b6 100644 --- a/docs/parameters.md +++ b/docs/parameters.md @@ -2,6 +2,38 @@ 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_nextflow_opts` | Nextflow options for running nf-core/oncoanlyser. | `string` | | True | | +| `oncoanalyser_params_file` | Path to params file for nf-core/oncoanlyser. | `string` | | | | +| `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..e958f6e 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,18 @@ 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_nextflow_opts // string: [mandatory] Nextflow options for oncoanalyser pipeline + val_oncoanalyser_params_file // string: [mandatory] Parameters file 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 +46,24 @@ workflow CLINICALGENOMICS_ONCOFLOW { // WORKFLOW: Run pipeline // ONCOFLOW ( - outdir, + val_case_id, + val_oncoanalyser_config, + val_oncoanalyser_nextflow_opts, + val_oncoanalyser_params_file, + val_oncoanalyser_samplesheet, + val_oncorefiner_config, + val_oncorefiner_nextflow_opts, + val_sample_id_tumor, + val_sample_id_normal, + val_subject_id, + val_sex, + val_outdir ) + + emit: + oncoanalyser_output = ONCOFLOW.out.oncoanalyser_output // channel: [path(analysis_output_directory)] + oncorefiner_output = ONCOFLOW.out.oncorefiner_output // channel: [path(analysis_output_directory)] + oncorefiner_params_file = ONCOFLOW.out.oncorefiner_params_file // channel: [path(yaml)] } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -66,6 +92,17 @@ workflow { // WORKFLOW: Run main workflow // CLINICALGENOMICS_ONCOFLOW ( + params.case_id, + params.oncoanalyser_config, + params.oncoanalyser_nextflow_opts, + params.oncoanalyser_params_file, + params.oncoanalyser_samplesheet, + params.oncorefiner_config, + params.oncorefiner_nextflow_opts, + params.sample_id_tumor, + params.sample_id_normal, + params.subject_id, + params.sex, params.outdir ) @@ -79,6 +116,23 @@ workflow { params.outdir, params.monochrome_logs, ) + + publish: + oncoanalyser_output = CLINICALGENOMICS_ONCOFLOW.out.oncoanalyser_output + oncorefiner_output = CLINICALGENOMICS_ONCOFLOW.out.oncorefiner_output + oncorefiner_params_file = CLINICALGENOMICS_ONCOFLOW.out.oncorefiner_params_file +} + +output { + oncoanalyser_output { + path "oncoanalyser" + } + oncorefiner_output { + path "oncorefiner" + } + oncorefiner_params_file { + path "oncorefiner" + } } /* diff --git a/modules/local/createoncorefinerparamsfile/main.nf b/modules/local/createoncorefinerparamsfile/main.nf new file mode 100644 index 0000000..0742121 --- /dev/null +++ b/modules/local/createoncorefinerparamsfile/main.nf @@ -0,0 +1,55 @@ +process CREATE_ONCOREFINER_PARAMS_FILE { + tag 'oncorefiner' + label 'process_single' + + input: + val case_id + val subject_id + val sample_id_tumor + val sample_id_normal + val sex + path oncoanalyser_results_dir + val outdir + + output: + + path "oncorefiner_params.yaml", emit: params_file + // WARN: Please update version string when the module is updated. + tuple val("${task.process}"), val('createoncorefinerparamsfile'), val('1.0'), topic: versions, emit: versions_createoncorefinerparamsfile + + when: + task.ext.when == null || task.ext.when + + script: + def oncoanalyser_output_dir = file(outdir).resolve("oncoanalyser/${oncoanalyser_results_dir}") + + 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") + 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 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 oncorefiner_params_file = + [ + "case_id: ${case_id}", + "sample_id_tumor: ${sample_id_tumor}", + "sample_id_normal: ${sample_id_normal}", + "sex: ${sex}", + "snv_vcf: ${snv_vcf_path}", + "sv_vcf: ${sv_vcf_path}", + "bam_tumor: ${bam_tumor_path}", + "bai_tumor: ${bai_tumor_path}", + "bam_normal: ${bam_normal_path}", + "bai_normal: ${bai_normal_path}" + ].join("\\n") + + """ + printf "$oncorefiner_params_file" > oncorefiner_params.yaml + """ + + stub: + """ + touch oncorefiner_params.yaml + """ +} diff --git a/modules/local/createoncorefinerparamsfile/meta.yml b/modules/local/createoncorefinerparamsfile/meta.yml new file mode 100644 index 0000000..f158896 --- /dev/null +++ b/modules/local/createoncorefinerparamsfile/meta.yml @@ -0,0 +1,61 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "createoncorefinerparamsfile" +description: Generate a parameters file for the oncorefiner pipeline based on the output of the oncoanalyser pipeline. +keywords: + - samplesheet + - oncoanalyser + - oncorefiner + +input: + - case_id: + type: string + description: Case ID + - subject_id: + type: string + description: Subject 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 + - sex: + type: string + description: Sex of the patient + - oncoanalyser_results_dir: + type: directory + description: Path to the output directory of the oncoanalyser pipeline + - outdir: + type: string + description: Output directory for pipeline output files +output: + parameters_file: + - "oncorefiner_params.yaml": + type: file + description: Parameters file for the oncorefiner pipeline + pattern: "oncorefiner_params.yaml" + versions_createoncorefinerparamsfile: + - - ${task.process}: + type: string + description: The name of the process + - createoncorefinerparamsfile: + 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 + - createoncorefinerparamsfile: + 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/createoncorefinerparamsfile/tests/main.nf.test b/modules/local/createoncorefinerparamsfile/tests/main.nf.test new file mode 100644 index 0000000..0feb2f4 --- /dev/null +++ b/modules/local/createoncorefinerparamsfile/tests/main.nf.test @@ -0,0 +1,127 @@ +nextflow_process { + + name "Test Process CREATE_ONCOREFINER_PARAMS_FILE" + script "../main.nf" + process "CREATE_ONCOREFINER_PARAMS_FILE" + + tag "modules" + tag "create_oncorefiner_params_file" + + test("Tumor Normal") { + + when { + process { + """ + input[0] = "test_case_id" + input[1] = "test_subject_id" + input[2] = "test_sample_id_tumor" + input[3] = "test_sample_id_normal" + input[4] = "female" + input[5] = "$projectDir" + input[6] = "$outputDir" + """ + } + } + + then { + // The oncorefiner params file contains $outputDir (includes the full path to the nf-test work directory), which varies for every test run + def oncorefiner_params_file = file(process.out.params_file[0]) + def clean_oncorefiner_params_file_content = oncorefiner_params_file.text.replace("$outputDir", "") + + assert process.success + assertAll( + { assert snapshot( + process.out.versions_createoncorefinerparamsfile, + clean_oncorefiner_params_file_content.split("\n") + ).match() } + ) + } + + } + + test("Tumor Normal -stub") { + + options "-stub" + + when { + process { + """ + input[0] = "test_case_id" + input[1] = "test_subject_id" + input[2] = "test_sample_id_tumor" + input[3] = "test_sample_id_normal" + input[4] = "female" + input[5] = "$projectDir" + input[6] = "$outputDir" + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match() } + ) + } + + } + + test("Tumor Only") { + + when { + process { + """ + input[0] = "test_case_id" + input[1] = "test_subject_id" + input[2] = "test_sample_id_tumor" + input[3] = "" + input[4] = "female" + input[5] = "$projectDir" + input[6] = "$outputDir" + """ + } + } + + then { + // The oncorefiner params file contains $outputDir (includes the full path to the nf-test work directory), which varies for every test run + def oncorefiner_params_file = file(process.out.params_file[0]) + def clean_oncorefiner_params_file_content = oncorefiner_params_file.text.replace("$outputDir", "") + + assert process.success + assertAll( + { assert snapshot( + process.out.versions_createoncorefinerparamsfile, + clean_oncorefiner_params_file_content.split("\n") + ).match() } + ) + } + + } + + test("Tumor Only -stub") { + + options "-stub" + + when { + process { + """ + input[0] = "test_case_id" + input[1] = "test_subject_id" + input[2] = "test_sample_id_tumor" + input[3] = "" + input[4] = "female" + input[5] = "$projectDir" + input[6] = "$outputDir" + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match() } + ) + } + + } +} diff --git a/modules/local/createoncorefinerparamsfile/tests/main.nf.test.snap b/modules/local/createoncorefinerparamsfile/tests/main.nf.test.snap new file mode 100644 index 0000000..efc9e58 --- /dev/null +++ b/modules/local/createoncorefinerparamsfile/tests/main.nf.test.snap @@ -0,0 +1,120 @@ +{ + "Tumor Normal -stub": { + "content": [ + { + "0": [ + "oncorefiner_params.yaml:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "1": [ + [ + "CREATE_ONCOREFINER_PARAMS_FILE", + "createoncorefinerparamsfile", + "1.0" + ] + ], + "params_file": [ + "oncorefiner_params.yaml:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "versions_createoncorefinerparamsfile": [ + [ + "CREATE_ONCOREFINER_PARAMS_FILE", + "createoncorefinerparamsfile", + "1.0" + ] + ] + } + ], + "timestamp": "2026-07-08T10:54:19.476191", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "Tumor Normal": { + "content": [ + [ + [ + "CREATE_ONCOREFINER_PARAMS_FILE", + "createoncorefinerparamsfile", + "1.0" + ] + ], + [ + "case_id: test_case_id", + "sample_id_tumor: test_sample_id_tumor", + "sample_id_normal: test_sample_id_normal", + "sex: female", + "snv_vcf: /oncoanalyser/oncoflow/test_subject_id/purple/test_subject_id.tumor.purple.somatic.vcf.gz", + "sv_vcf: /oncoanalyser/oncoflow/test_subject_id/purple/test_subject_id.tumor.purple.sv.vcf.gz", + "bam_tumor: /oncoanalyser/oncoflow/test_subject_id/alignments/dna/test_subject_id.tumor.redux.bam", + "bai_tumor: /oncoanalyser/oncoflow/test_subject_id/alignments/dna/test_subject_id.tumor.redux.bam.bai", + "bam_normal: /oncoanalyser/oncoflow/test_subject_id/alignments/dna/test_subject_id.normal.redux.bam", + "bai_normal: /oncoanalyser/oncoflow/test_subject_id/alignments/dna/test_subject_id.normal.redux.bam.bai" + ] + ], + "timestamp": "2026-07-08T10:54:15.18238", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "Tumor Only": { + "content": [ + [ + [ + "CREATE_ONCOREFINER_PARAMS_FILE", + "createoncorefinerparamsfile", + "1.0" + ] + ], + [ + "case_id: test_case_id", + "sample_id_tumor: test_sample_id_tumor", + "sample_id_normal: ", + "sex: female", + "snv_vcf: /oncoanalyser/oncoflow/test_subject_id/purple/test_subject_id.tumor.purple.somatic.vcf.gz", + "sv_vcf: /oncoanalyser/oncoflow/test_subject_id/purple/test_subject_id.tumor.purple.sv.vcf.gz", + "bam_tumor: /oncoanalyser/oncoflow/test_subject_id/alignments/dna/test_subject_id.tumor.redux.bam", + "bai_tumor: /oncoanalyser/oncoflow/test_subject_id/alignments/dna/test_subject_id.tumor.redux.bam.bai", + "bam_normal: ", + "bai_normal: " + ] + ], + "timestamp": "2026-07-08T15:36:03.021214", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "Tumor Only -stub": { + "content": [ + { + "0": [ + "oncorefiner_params.yaml:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "1": [ + [ + "CREATE_ONCOREFINER_PARAMS_FILE", + "createoncorefinerparamsfile", + "1.0" + ] + ], + "params_file": [ + "oncorefiner_params.yaml:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + "versions_createoncorefinerparamsfile": [ + [ + "CREATE_ONCOREFINER_PARAMS_FILE", + "createoncorefinerparamsfile", + "1.0" + ] + ] + } + ], + "timestamp": "2026-07-08T10:55:32.388213", + "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..0c20ce5 100644 --- a/nextflow.config +++ b/nextflow.config @@ -9,6 +9,23 @@ // 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_nextflow_opts = '' + oncoanalyser_params_file = '' + oncoanalyser_samplesheet = '' + + // 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..cf20149 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -5,6 +5,98 @@ "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": ["sex", "subject_id", "sample_id_normal", "sample_id_tumor", "case_id"] + }, + "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_nextflow_opts": { + "type": "string", + "description": "Nextflow options for running nf-core/oncoanlyser.", + "fa_icon": "fas fa-terminal" + }, + "oncoanalyser_params_file": { + "type": "string", + "description": "Path to params file for nf-core/oncoanlyser.", + "format": "file-path", + "pattern": "^\\S+\\.(json|ya?ml)$", + "exists": true, + "fa_icon": "fas fa-file" + }, + "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" + } + }, + "required": ["oncoanalyser_nextflow_opts"], + "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 +245,15 @@ } }, "allOf": [ + { + "$ref": "#/$defs/metadata" + }, + { + "$ref": "#/$defs/oncoanalyser" + }, + { + "$ref": "#/$defs/oncorefiner" + }, { "$ref": "#/$defs/input_output_options" }, 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..b6a15e0 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 $outputDir (includes the full path to the nf-test work directory), which varies for every test 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.replace("$outputDir", "") + assert workflow.success assertAll( { assert snapshot( @@ -25,7 +31,9 @@ nextflow_pipeline { // All stable path name, with a relative path stable_path, // All files with stable contents - stable_content + stable_content, + // 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..33fdd69 --- /dev/null +++ b/tests/default.nf.test.snap @@ -0,0 +1,497 @@ +{ + "-profile test (stub runs for all pipelines)": { + "content": [ + null, + [ + "oncoanalyser", + "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" + ], + [ + "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" + ], + [ + "case_id: test_case_id", + "sample_id_tumor: test_sample_id_tumor", + "sample_id_normal: test_sample_id_normal", + "sex: female", + "snv_vcf: /oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.somatic.vcf.gz", + "sv_vcf: /oncoanalyser/results/subject_a/purple/subject_a.tumor.purple.sv.vcf.gz", + "bam_tumor: /oncoanalyser/results/subject_a/alignments/dna/subject_a.tumor.redux.bam", + "bai_tumor: /oncoanalyser/results/subject_a/alignments/dna/subject_a.tumor.redux.bam.bai", + "bam_normal: /oncoanalyser/results/subject_a/alignments/dna/subject_a.normal.redux.bam", + "bai_normal: /oncoanalyser/results/subject_a/alignments/dna/subject_a.normal.redux.bam.bai" + ] + ], + "timestamp": "2026-07-08T11:12:38.15633", + "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..ac85ba0 100644 --- a/workflows/oncoflow.nf +++ b/workflows/oncoflow.nf @@ -3,7 +3,10 @@ IMPORT MODULES / SUBWORKFLOWS / FUNCTIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' +include { CREATE_ONCOREFINER_PARAMS_FILE } from "../modules/local/createoncorefinerparamsfile/main" +include { NEXTFLOW_RUN as CLINICAL_GENOMICS_ONCOREFINER } from '../modules/local/nextflow/run' +include { NEXTFLOW_RUN as NFCORE_ONCOANALYSER } from "../modules/local/nextflow/run/main" +include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -14,12 +17,51 @@ 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_nextflow_opts // string: [mandatory] Nextflow options for oncoanalyser pipeline + val_oncoanalyser_params_file // string: [mandatory] Parameters file 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() + NFCORE_ONCOANALYSER( + 'Clinical-Genomics/oncoanalyser', + val_oncoanalyser_nextflow_opts, + val_oncoanalyser_params_file, + val_oncoanalyser_samplesheet, + val_oncoanalyser_config, + workflow.workDir.resolve('nf-core/oncoanalyser').toUriString(), + ) + + CREATE_ONCOREFINER_PARAMS_FILE( + val_case_id, + val_subject_id, + val_sample_id_tumor, + val_sample_id_normal, + val_sex, + NFCORE_ONCOANALYSER.out.output, + val_outdir + ) + + 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 +85,17 @@ 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)] + 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)] } /*